全局变量
@.str.9 = private unnamed_addr constant [12 x i8] c"jinjingTest\00", section "__TEXT,__cstring,cstring_literals", align 1
@表示全局变量 与之相对应的%表示局部变量,以%前缀
private 表示私有的
unnamed_addr 表示地址不重要,只有内容.被标记成这样的常量如果拥有相同的初始化器,可以合并. 比如说上面的 "jinjingTest"可以和其他的内容为"jinjingTest"的常量合并.local_unnamed_addr表示地址在模块中被认为是不重要的
constant 表示常量
[12 x i8] 表示12个1字节(i8为8位)的数组,也可表示字符串,这里包括分隔符\00
c"jinjingTest\00" 为llvm里的初始化器,表示c字符串,\00为结尾符
section 表示存储在Mach-o中的section地方
align 1 表示内存对齐为1,就是其中不足1的按照1对齐
语法如下:
@<GlobalVarName> = [Linkage] [PreemptionSpecifier] [Visibility]
[DLLStorageClass] [ThreadLocal]
[(unnamed_addr|local_unnamed_addr)] [AddrSpace]
[ExternallyInitialized]
<global | constant> <Type>[<InitializerConstant>]
[, section "name"] [, comdat [($name)]]
[, align <Alignment>] (, !name !N)*
Linkage 链接类型
PreemptionSpecifier 运行抢占说明
Visibility 可见性规则
DLLStorageClass DLL存储类别
ThreadLocal 线程存储模型
[(unnamed_addr|local_unnamed_addr)] 地址不重要或模块中地址不重要
[AddrSpace] 地址空间?
[ExternallyInitialized] 外部已经初始化?
<global | constant> 全局或常量
Type 类型
InitializerConstant 初始化器,即初始化值
,section "name" 存放的section段,前面有","和前面分割
,align <Alignment> 对齐类型, 前面有","和前面分割
getelementptr 语法
getelementptr 取出来的如果是指针类型,则下一个下标,表示从该指针偏移多少个元素.
%MyStruct = uninitialized global { float*, i32 }
...
%idx = getelementptr { float, i32 }, { float, i32 }* %MyStruct, i64 0, i32 1
取出来的是MyStruct *,所以i64 0 从该指针偏移0个元素
i32 1 表示取结构体第二个元素 即i32元素
%MyVar = uninitialized global { [40 x i32 ]* }
...
%idx = getelementptr { [40 x i32] }, { [40 x i32] }* %MyVar, i64 0, i32 0, i64 0, i64 17
GetElementPtr 无法取地址的值,不会以任何方式访问内存,所以上面的是错的,下面才是正确的
%idx = getelementptr { [40 x i32] }, { [40 x i32] }* %, i64 0, i32 0
%arr = load [40 x i32], [40 x i32]* %idx
%idx = getelementptr [40 x i32], [40 x i32]* %arr, i64 0, i64 17
参考链接:
https://llvm.org/docs/GetElem...
https://llvm.liuxfe.com/docs/...
https://llvm.liuxfe.com/docs/...
https://llvm.org/docs/LangRef...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。