LLVM: Как установить аргумент CreateCall для имени BasicBlock?

Я хочу создать вызов внешней функции, и эта функция получает аргументы как int и const char* (ОСОБЕННО ИМЯ БАЗОВОГО БЛОКА, а не настраиваемая строка) (или std::string может подойти).

Но я понятия не имею, как установить аргумент функции как const char* или std::string. Единственное, что я понял, это то, что строка обрабатывается как Int8PtrTy в LLVM.

  LLVMContext &ctx = F->getContext();
  Constant *countfunc = F->getParent()->getOrInsertFunction(
        "bbexectr", Type::getVoidTy(ctx), Type::getInt32Ty(ctx), Type::getInt8PtrTy(ctx));

  for (Function::iterator ibb = ifn->begin(); ibb != ifn->end(); ++ibb)
  {
    BasicBlock *B = &*ibb;

    IRBuilder<> builder(B);
    builder.SetInsertPoint(B->getTerminator());

    std::string str = B->getName().str();
    const char* strVal = str.c_str();

    Value *args[] = {builder.getInt32(index), builder.getInt8PtrTy(*strVal)};
    builder.CreateCall(countfunc, args);

Я попробовал верхний код, но он дал мне сообщение об ошибке, как показано ниже.

error: cannot convert ‘llvm::PointerType*’ to ‘llvm::Value*’ in initialization
Value *args[] = {builder.getInt32(index), builder.getInt8PtrTy(*strVal)};

Есть ли способ устранить ошибку или есть лучший способ установить аргумент функции как имя базового блока ???


person MangoTatsy    schedule 20.01.2019    source источник


Ответы (1)


Типы и значения в LLVM разные. llvm :: Type представляет типы, а llvm :: Value представляет значения. Так как Type и Value принадлежат разным иерархиям классов, llvm :: Value * args [] не может быть инициализирован подклассами иерархии llvm :: Type. Вместо этого вы можете захотеть изменить

Value *args[] = {builder.getInt32(index), builder.getInt8PtrTy(*strVal)};

To

 llvm::Value *strVal = builder.CreateGlobalStringPtr(str.c_str());
 llvm::Value *args[] = {builder.getInt32(index), strVal};

CreateGlobalStringPtr () создаст глобальную строку и вернет указатель типа Int8PtrTy.

person JKRT    schedule 20.01.2019