LLVM language 参考手册(译)(6)
模块级内联汇编(Module-Level Inline Assembly)
模块包含“module-level inline assembly”块,这与GCC中的“file scope inline asm”块的相同的。这些块将被LLVM内部链接并当作一个单独的单元,但如果希望的话,它们在.ll 文件中可以是分开的。它的语法十分简单:
module asm "inline asm code goes here"
module asm "more can go here"
这个字符串可以通过非输出字符转义包含任意字符。这个转义序列是“\xx”形式的,这个“xx”是两个十六位的数字。
当汇编代码生成时,这份内联汇编代码十分容易打印为机器代码 .s 文件
数据布局(Data Layout)
模块可以指定一个目标平台指定的数据布局的字符串,它指定数据在内存中是如何布局的。数据布局的语法很简单:
target datalayout = "layout specification"
布局规格由减号字符(' - ')分隔的列表组成 。每种规格以一个字母开头,并且可以包含在这个字母定义了某些方面的数据布局之后的其他星系。被接受的规格如下:
- E
- 表明,目标平台在数据布局中使用big-endian格式。高字节在低地址,低字节在高地址。
- e
- 表明,目标平台在数据布局中使用little-endian格式。低字节在低地址,高字节在高地址。
- S<size>
- 指定堆栈中的bit的自然对齐。栈变量的对齐提升被限制到这个自然的栈对齐而避免动态栈重对齐。这个栈的对齐长度必须是8位的倍数。如果省略,自然栈对齐默认为“未指定” ,这并不妨碍任何对齐提升。
- p[n]:<size>:<abi>:<pref>
- 这指定一个指针的大小和它对于地址空间 n 的<abi>和<pref>对齐误差。所有长度单位都为bit。这个地址空间,n 是可选的,如果未指定,则表示缺省地址空间0。n 的值必须在范围[1,2^23). 。
- i<size>:<abi>:<pref>
- 这表明一个整数类型以bit <size>对齐, <size>的值必须为[1,2^23)
- v<size>:<abi>:<pref>
- 这表明一个向量类型以bit <size>对齐。
- f<size>:<abi>:<pref>
- 这表明一个浮点类型以bit <size>对齐。仅当<size>的值被目标平台支持才会工作。32(float)和64(double)被所有目标平台所支持。80 或 128(不同于long double)也被某些平台支持。
- a:<abi>:<pref>
- 这表明对象集合类型的对齐。
- m:<mangling>
- 如果这个属性存在,就表明了LLVM的名称将会在输出的时候被校正,有以下选项:
- e: ELF校正:private 符号会带上一个 .L 前缀
- m: Mips校正:private 符号会带上一个 $ 前缀
- o: Mach-O校正:private 符号会带上一个 L 前缀。其他符号将带上一个 _ 前缀
- w: Window COFF前缀:与Mach-O相似,但stdcall 与 fastcall 函数将会带有一个基于帧大小的后缀。
- n<size1>:<size2>:<size3>...
- 这指明了目标平台的一个以bit为单位的本地整数宽度集。例如,对于32-bit PowerPC有 n32 ,对于PowerPC 64有 n32:64,或者对于X86-64有 n8:16:32:64。这个集合里的元素被认为是有效地支持最普遍的算术运算。
- 在每一个带有 <abi>:<pref> 的标识中,指明 <pref> 对齐是可选的。如果 <pref> 被省略,那么这个冒号 :也应该被省略,并且 <pref> 将与 <abi> 相等。
- 当为一个给定的目标平台构造数据布局的时候,LLVM将会开始于一组默认标识的集合,但这组集合可以被 datalayout 关键字指明的标识重写。默认的标识将在以下这个列表中给定:
- E - big endian
- p:64:64:64 - 64bit的指针将有64bit的对齐。
- p[n]:64:64:64 - 其他地址空间被认为与默认地址空间是相同。
- S0 - 自然堆栈对齐是未指定的
- i1:8:8 - i1 是8bit(byte)对齐的
- i8:8:8 - i8 是8bit(byte)对齐的
- i16:16:16 - i16 是16bit对齐的
- i32:32:32 - i32 是32bit对齐的
- i64:32:64 - i64 要求32bit的ABI对齐,但64bit对齐是更好的选择
- f16:16:16 - half 是16bit对齐的
- f32:32:32 - float 是32bit对齐的
- f64:64:64 - double 是64bit对齐的
- f128:128:128 - quad 是128bit对齐的
- v64:64:64 - 64bit的vector是64bit对齐的
- v128:128:128 - 128bit的vector是128bit对齐的
- a:0:64 - 集合是64bit对齐的
- 当LLVM决定一个给定类型的对齐属性的时候,它将会使用以下规则:
- 1、如果类型查找明确匹配到了这些标识的其中一个,这个标识将会被使用。
- 2、如果没有找到匹配,并且这个类型查找确定是一个整数类型,那么将大于这个被使用的查找类型的位宽的最小整数类型将会被使用。如果这些标识中没有一个大于这个位宽,那么最大的整数类型将被使用,例如,给定上述的默认标识,i7类型将会使用i8(下一个最大值)的对齐属性,同样的i65和i256都将使用i64的对齐属性(可指定的最大值)。
- 3、如果没有找到匹配,并且被查找的类型是一个vector类型,那么小于这个被查找的vector最大vector类型将会被用作回落。这是根据<128 x double>可以被64 <2 x double>的组合代替。
数据布局字符串的函数可能不是你所期望的。值得注意的是,这并不是说,指定代码生成器应使用的对齐属性的标识取决于前端代码。
相反,如果被指定,目标平台的数据布局将被要求匹配到最终的代码生成器所期望的形式。这个字符串是被用于mid-level优化器来提升代码的,并且只有这个字符串与最终的代码生成器所使用的形式相匹配时,这个字符串才会被使用。如果你想要生成IR,而不希望这些平台相关的细节嵌入到这个IR中,那么你不需要指定这个字符串。这将会禁用某些需要精确布局信息的优化,但这也防止这些优化插入这些平台相关的细节到IR中。
LLVM language 参考手册(译)(6)的更多相关文章
- LLVM language 参考手册 翻译停止相关
再翻译LLVM language 参考手册的时候,个人感觉很多东西都不是很懂,因此打算学习完编译原理后再去继续研究翻译,多有不便望见谅
- LLVM language 参考手册(译)(1)
LLVM Language Reference Manual 摘要 这个文档是一个LLVM汇编语言的参考手册.LLVM是一个基于Static Single Assignment(SSA - 静态单赋值 ...
- LLVM language 参考手册(译)(3)
可见性模式(Visibility Styles) 所有全局变量和函数具有以下的可见性模式之一: “default” - Default style 在那些使用ELF object file格式的平台( ...
- LLVM language 参考手册(译)(5)
垃圾回收器名称(Garbage Collector Names) 每一个函数可以制定一个垃圾回收期的名称,这个名称是一个简单的字符串: define void @f() gc "name&q ...
- LLVM language 参考手册(译)(4)
函数(Functions) LLVM函数定义由“define” 关键字,一个可选的链接标识,一个可选的可见性模式,一个可选的DLL存储类别,一个可选的调用约定,一个可选的 unnamed_addr 属 ...
- LLVM language 参考手册(译)(2)
调用约定(Calling Conventions) LLVM functions, calls and invokes 可以带有一个可选的调用约定来指明调用方式.每一对 caller/callee(调 ...
- Lua 5.1 参考手册
Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes 云风 译 www.codingno ...
- [SQL]SQL语言入门级教材_SQL语法参考手册(三)
SQL 语法参考手册 DB2 提供了关连式资料库的查询语言 SQL (Structured Query Language),是一种非常口语化.既易学又易懂的语法. 此语言几乎是每个资料库系统都必须提供 ...
- Lua参考手册
英文原版: http://www.lua.org/manual/5.1/ 中文版下面2个地址都有:一样的 manual.luaer.cn lua在线手册 lua参考手册Lua参考手册的中文翻译(云风翻 ...
随机推荐
- 在应用程序中实现对NandFlash的操作
以TC58NVG2S3ETA00 为例: 下面是它的一些物理参数: 图一 图二 图三 图四 图五 图6-0 图6-1 说明一下,在图6-1中中间的那个布局表可以看做是实际的NandFlash一页数据的 ...
- Makefile中指示符“include”、“-include”和“sinclude”的区别
转:http://www.cnblogs.com/xmphoenix/archive/2012/02/22/2363335.html 指示符“include”.“-include”和“sinclude ...
- 我的Blog开张啦,欢迎大家赏脸
Blog开张,以后会慢慢更新工作.学习遇到的问题,总结一些经验,观众老爷们多多支持!!! ^_^
- 自定义带有uitableview的alertview对话框
#import <UIKit/UIKit.h> typedef void(^MyCompleteHandler) (NSString *selectString); @interface ...
- 懒加载异常:org.hibernate.LazyInitializationException: could not initialize proxy - no Session
病症:这是一个lazy使用后的Exception,使用迟时加载,在session(hibernate里的session),关闭后使用该对象的未加载变量,也就是说session已经关闭,没有保存到内存中 ...
- 『创意欣赏』30幅逼真的 3D 虚拟现实环境呈现
又到周末了,给大家分享30幅漂亮的 3D 虚拟现实环境呈现,放松一下.这些创造性的场景都是通过 3D 图形设计软件,结合三维现实环境渲染制作出来的.一起欣赏:) 您可能感兴趣的相关文章 20幅温馨浪漫 ...
- css中内容生成器
一,内容生成器:content 补充before和after伪类选择器: 1):将内容添加到某个选择器定义的单个或者多个元素的每一个实例之前或者之后 2)与before选择器配合使用(同理大家想下会不 ...
- Git 对象
Git 提供了很多方法可以方便地访问 Git 库中的对象: ♦ 采用不分的 SHA1 哈希值.不必把 40 位的哈希值写全,只采用开头的部分(4 位以上),只要不与现有的其他哈希值冲突即可. ♦ 使用 ...
- 如何解决sql server 2008附加数据库失败
MDF文件是数据库存贮数据的文件,可以通过附加的方法添加到数据库,在添加mdf文件的时候遇到附加数据库失败,具体提示如下: microsoft SQL server,错误5120 最初以为是附加权限的 ...
- 02. SQL表达式的灵活使用
什么是SQL表达式?在SQL语句中,表达式可以是函数,也可以是列和列之间的混合运算.很多时候,对于表达式的使用,可以比单独操作表上的列,带来更多方便. 一. 在HAVING中使用表达式 --drop ...