LLVM学习笔记④

TLS(Thread Local Storage)
线程本地存储模型:一个变量可以被定义为thread_local,然后这个变量不能被线程共享(每个线程享有独立的变量副本)并非所有的目标都支持TLS。
一个TLS变量可以被指定为以下的TLS模型之一:
①loacaldynamic
仅在当前共享库中使用的变量
②initialexec
不会被动态加载的模块中的变量
③localexec
在可执行文件中定义的变量,并且仅能在这个可执行文件中使用。
如果没有指出明确的模型,则采用“general dynamic”模型。
这里的TLS模型与ELF中的TLS模型相对应。
可以指定别名的模型,但是它仅控制别名的访问方式,对别名没有任何影响。
对于不支持ELF TLS模型的连接器的平台,-femulated-tls标志可以用来生成与GCC兼容的模拟TLS代码。
运行时抢占说明符
全局变量、函数、别名可以有一个可选的运行时抢占说明符。如果未显式给出抢占说明符,则假定符号为so_preemptable。
①dso_preemptable
指示函数或变量可在运行时由链接单元外部的符号替换。
②dso_local
编译器可以假设标记为dso_local的函数或变量将解析为同一链接单元中的符号。即使定义不在这个编译单元内,也会生成直接访问。
结构体类型
在LLVM IR中,可以定义“identified” 和“literal”结构体类型,“literal”结构体类型在结构上是独一无二的,而“identified”结构体类型却从来都不是独一无二的,一个不透明的结构类型也可以用来向前声明一个上不可用的类型。

%mytype = type { %mytype*, i32 }

在LLVM 3.0之前,“identified”类型在结构上是独一无二的。在最近的LLVM版本中,只有“literal”类型是唯一的。
非整数指针类型
非整型指针类型还在研究中,目前应该将其视为实验性的。
LLVM IR允许编译器前端通过datalayout string(后面会有介绍)将某些地址空间中的指针表示为“非整数”。非整数指针类型表示具有未指定的按位表示的指针; 也就是说,整数表示可以是目标依赖的或不稳定的(不受固定整数的支持)。
Inttoptr和ptrtoint指令与整型指针(即普通指针)具有相同的语义,因为它们将整型与相应的指针类型进行转换,但还有一些需要注意的附加含义。
因为非整型指针的位表示可能不稳定,所以对相同操作数的两次相同类型转换可能返回也可能不返回相同的值。换句话说,与非整型的转换或与非整型的转换取决于实现定义方式中的环境状态。
如果前端希望在强制转换之后观察一个特定的值,那么生成的IR必须以一种实现定义的方式与底层环境隔离。(在实践中,这往往需要此类操作的非内联例程。)
从优化器的角度来看,非整型的inttoptr和ptrtoint类似于整型的inttoptr和ptrtoint,只是有一个关键不同:优化器通常不会插入新的动态类型强制转换。如果插入新的强制转换,优化器需要确保a)所有可能的值都是有效的,或者b)插入了适当的fencing。因为适当的防护是需要实现定义的,所以优化器不能做后者。前者是一个挑战,因为许多常见的属性,如ptrtoint(v)-ptrtoint(v) == 0,对非整型不成立。

你可能感兴趣的:(LLVM,llvm)