LLVM: Как установить аргумент CreateCall для имени BasicBlock? - PullRequest
0 голосов
/ 20 января 2019

Я хочу создать внешний вызов функции, и эта функция получает аргументы в виде 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)};

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

1 Ответ

0 голосов
/ 21 января 2019

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

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

на

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

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

...