iVar在LLVMIR中显示为私有全球

时间:2016-12-14 05:29:59

标签: objective-c xcode clang llvm llvm-ir

我在课堂上宣布了一个iVar:

-tableView:viewForTableColumn:row:

当我检查LLVM IR时,它会告诉我:

@implementation LLVMIRTest{
    NSString* ivarTest;
}

我不得不问为什么它是LLVM IR中的私人全球提及。为什么不只是私人?

这是完整的模块LLVM IR:

@OBJC_METH_VAR_NAME_ = private global [9 x i8] c"ivarTest\00", section "__TEXT,__objc_methname,cstring_literals", align 1
@OBJC_METH_VAR_TYPE_ = private global [12 x i8] c"@\22NSString\22\00", section "__TEXT,__objc_methtype,cstring_literals", align 1

1 个答案:

答案 0 :(得分:0)

全局变量被视为模块作用域,在编译时与运行时进行初始化。

LLVM的大多数前端都将字符串放在模块范围内,并且需要globalconstant标记。有一种方法可以在堆栈上存储字符串,但这在我的经验中很少见。我通常创建字符串

@somename = internal constant...

private指示不要在模块外部公开符号。

我认为这就是Objective-C为类添加类型和工具支持的方式。如果查看输出的其余部分,可能会在调用之前将指向这些字符串的指针传递到RT库(例如%x = load ...)。

OP添加列表后更新

您列出的是“静态”字样。代表你的类的模块级构造。如果仔细观察,类声明包含许多嵌入式结构和字符串。因为这些声明是在模块级别,所以它们被声明为global,正如您所期望的那样,它们将它们放在数据段中,因为它是数据后跟而不是方法实现。您可以将您的课程视为structure,不仅包含变量“iVar”的空间,还包含Objective-C RT所需的其他信息。

因此,类及其变量被视为模块级声明,它们在模块级别表示为数据结构,由LLVM标准标记为global。请参阅LLVM Global Variable文档。