Clang / LLVM 中的 CodeModel 指的是什么?

What does the CodeModel in Clang / LLVM refer to?

我一直在查看 Clang / LLVM 源代码,我遇到了 CodeModel 属性 of CodeGenOptions

基于 this method,有效值似乎是:"small""kernel""medium""large"

这个属性控制什么?

如何为我的应用程序选择正确的值?

代码模型是 AMD64 ABI 中的一个术语(有关详细信息,请参阅 https://software.intel.com/sites/default/files/article/402129/mpx-linux64-abi.pdf 中的 3.5.1)。

简而言之 - x64-64 指令中的大部分偏移量都是 PC 相关的,但是指令中的立即字段只有 32 位长。因此,如果数据位于代码中的 "far"(相距超过 32 位),则不能使用指令中的立即数字段来有效地编码偏移量,而应该显式计算地址。代码模型对代码和数据的相对位置提供了各种限制。

如果您正在静态编译所有内容,那么 'small' 是安全的(也是默认的)。如果您正在使用 JIT,那么一切皆有可能,尤其是在启用了 ASLR 并且您需要使用中型/大型代码模型的情况下。