通过 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;
}