LLVM language 参考手册(译)(6)

模块级内联汇编(Module-Level Inline Assembly)

模块包含“module-level inline assembly”块,这与GCC中的“file scope inline asm”块的相同的。这些块将被LLVM内部连接并看成一个单独的单元,但若是但愿的话,它们在.ll 文件中能够是分开的。它的语法十分简单:html

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决定一个给定类型的对齐属性的时候,它将会使用如下规则:
一、若是类型查找明确匹配到了这些标识的其中一个,这个标识将会被使用。
二、若是没有找到匹配,而且这个类型查找肯定是一个整数类型,那么将大于这个被使用的查找类型的位宽的最小整数类型将会被使用。若是这些标识中没有一个大于这个位宽,那么最大的整数类型将被使用,例如,给定上述的默认标识,i7类型将会使用i8(下一个最大值)的对齐属性,一样的i65和i256都将使用i64的对齐属性(可指定的最大值)。
三、若是没有找到匹配,而且被查找的类型是一个vector类型,那么小于这个被查找的vector最大vector类型将会被用做回落。这是根据<128 x double>能够被64 <2 x double>的组合代替。

数据布局字符串的函数可能不是你所指望的。值得注意的是,这并非说,指定代码生成器应使用的对齐属性的标识取决于前端代码。spa

相反,若是被指定,目标平台的数据布局将被要求匹配到最终的代码生成器所指望的形式。这个字符串是被用于mid-level优化器来提高代码的,而且只有这个字符串与最终的代码生成器所使用的形式相匹配时,这个字符串才会被使用。若是你想要生成IR,而不但愿这些平台相关的细节嵌入到这个IR中,那么你不须要指定这个字符串。这将会禁用某些须要精确布局信息的优化,但这也防止这些优化插入这些平台相关的细节到IR中。指针

相关文章
相关标签/搜索