通过 LLVM C 接口创建和引用字符串文字
Create and reference a string literal via LLVM C interface
我正在尝试通过 LLVM C API 创建字符串文字,并获取指向其第一个成员的 C 样式指针。 LLVMBuildGlobalStringPtr
做得很好,但我不能使用它,因为我的源字符串可能包含空值。
我似乎找不到有关如何创建初始化的、未命名的常量全局字符串的文档。
我试过使用 LLVMConstString
创建字符串并使用 LLVMConstIntToPtr
获取其地址(然后使用 GetElementPointer 转换为 i8*
)。我可以让 LLVM 对其进行编译,但生成的目标文件不包含字符串,代码 returns 似乎是随机的指针。
我找到了答案。以下代码段似乎可以解决问题:
LLVMValueRef defineStringLiteral( const char *sourceString, size_t size ) {
LLVMTypeRef strType = LLVMArrayType( LLVMInt8Type(), size );
LLVMValueRef str = LLVMAddGlobal(module->getLLVMModule(), strType, "");
LLVMSetInitializer(str, LLVMConstString( sourceString, size, true ));
LLVMSetGlobalConstant(str, true);
LLVMSetLinkage(str, LLVMPrivateLinkage);
LLVMSetUnnamedAddress(str, LLVMGlobalUnnamedAddr);
LLVMSetAlignment(str, 1);
LLVMValueRef zeroIndex = LLVMConstInt( LLVMInt64Type(), 0, true );
LLVMValueRef indexes[2] = { zeroIndex, zeroIndex };
LLVMValueRef gep = LLVMBuildInBoundsGEP2(builder, strType, str, indexes, 2, "");
return gep;
}
我正在尝试通过 LLVM C API 创建字符串文字,并获取指向其第一个成员的 C 样式指针。 LLVMBuildGlobalStringPtr
做得很好,但我不能使用它,因为我的源字符串可能包含空值。
我似乎找不到有关如何创建初始化的、未命名的常量全局字符串的文档。
我试过使用 LLVMConstString
创建字符串并使用 LLVMConstIntToPtr
获取其地址(然后使用 GetElementPointer 转换为 i8*
)。我可以让 LLVM 对其进行编译,但生成的目标文件不包含字符串,代码 returns 似乎是随机的指针。
我找到了答案。以下代码段似乎可以解决问题:
LLVMValueRef defineStringLiteral( const char *sourceString, size_t size ) {
LLVMTypeRef strType = LLVMArrayType( LLVMInt8Type(), size );
LLVMValueRef str = LLVMAddGlobal(module->getLLVMModule(), strType, "");
LLVMSetInitializer(str, LLVMConstString( sourceString, size, true ));
LLVMSetGlobalConstant(str, true);
LLVMSetLinkage(str, LLVMPrivateLinkage);
LLVMSetUnnamedAddress(str, LLVMGlobalUnnamedAddr);
LLVMSetAlignment(str, 1);
LLVMValueRef zeroIndex = LLVMConstInt( LLVMInt64Type(), 0, true );
LLVMValueRef indexes[2] = { zeroIndex, zeroIndex };
LLVMValueRef gep = LLVMBuildInBoundsGEP2(builder, strType, str, indexes, 2, "");
return gep;
}