如何在LLVM IR中声明全局整数实例?

时间:2014-09-17 17:47:06

标签: c++ llvm llvm-ir llvm-c++-api

我想知道是否有人知道如何在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.

1 个答案:

答案 0 :(得分:2)

这是由于错误的类型。您可以查看Type::getPrimitiveType实施here。简而言之,那不是您建议使用的API;对于IntegerType,它返回nullptr。此外,在llvm/IR/Type.hTypeID的定义中,有评论:

  

///注意:如果向此添加元素,则需要在中添加元素     ///键入:: 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 -