我想知道是否有人知道如何在LLVM IR中声明全局整数实例。到目前为止,我一直在做以下事情:
// Create symbol to identify previous block. Added by Justin.
llvm::Type::TypeID stupidTypeID = llvm::Type::IntegerTyID;
llvm::Type* typePtr = llvm::Type::getPrimitiveType(_context, stupidTypeID);
llvm::GlobalVariable* prevBlockID = new llvm::GlobalVariable(typePtr,
false,
llvm::GlobalValue::LinkerPrivateLinkage,
NULL,
"PREV_BLOCK_ID");
当我尝试运行时,出现以下错误:
static llvm::PointerType* llvm::PointerType::get(llvm::Type*, unsigned int): Assertion `EltTy && "Can't get a pointer to <null> type!"' failed.
答案 0 :(得分:2)
这是由于错误的类型。您可以查看Type::getPrimitiveType
实施here。简而言之,那不是您建议使用的API;对于IntegerType,它返回nullptr。此外,在llvm/IR/Type.h中TypeID
的定义中,有评论:
///注意:如果向此添加元素,则需要在中添加元素 ///键入:: getPrimitiveType函数,否则事情就会中断!
基本上你可以用2种方法生成类型:
指定类型的静态get
API
在你的情况下,
IntegerType *iTy = IntegerType::get(ctx, 32); // if it's 32bit INT
一个名为TypeBuilder
的助手类
它使类型生成更容易和普遍。当您需要定义更复杂的类型时,TypeBuilder
特别有用且直观,例如FunctionType
,当然需要慢慢编译源代码的成本(如果您关心?)。
IntegerType *intType = TypeBuilder<int, false>::get(ctx); // normal C int
IntegerType *intTy = TypeBuilder<types::i<32>, false>::get(ctx); // if it's 32bit INT
BTW,您也可以尝试ELLCC online compiler获取相应的C ++代码,用于生成当前c / c ++ src的LLVM IR,您需要选择输出选项的目标为< strong> LLVM C ++ API代码。或者,您可以在您的机器上自己尝试(因为在线编译器内部只调用llc
):
llc input.ll -march=cpp -o -