Создание новых типов в LLVM (в частности, указатель на тип функции) - PullRequest
5 голосов
/ 24 февраля 2012

Я хотел бы создать следующий тип,

  void (i8*)*

Я пытался использовать класс Type для создания указанного выше типа, но я не нашел прямого метода, который бы делал то же самое.
Кто-то Пожалуйста, предложите мне метод для создания вышеуказанного типа.
Заранее спасибо.

1 Ответ

5 голосов
/ 25 февраля 2012

Если вы имеете в виду i8** (указатель на указатель на i8), то:

// This creates the i8* type
PointerType* PointerTy = PointerType::get(IntegerType::get(mod->getContext(), 8), 0);
// This creates the i8** type
PointerType* PointerPtrTy = PointerType::get(PointerTy, 0);

Если вам нужен указатель на функцию, которая ничего не возвращает и принимает i8*, то:

// This creates the i8* type
PointerType* PointerTy = PointerType::get(IntegerType::get(mod->getContext(), 8), 0);

// Create a function type. Its argument types are passed as a vector
std::vector<Type*>FuncTy_args;
FuncTy_args.push_back(PointerTy);                 // one argument: char*
FunctionType* FuncTy = FunctionType::get(
  /*Result=*/Type::getVoidTy(mod->getContext()),  // returning void
  /*Params=*/FuncTy_args,                         // taking those args
  /*isVarArg=*/false);

// Finally this is the pointer to the function type described above
PointerType* PtrToFuncTy = PointerType::get(FuncTy, 0);

Более общий ответ: вы можете использовать бэкэнд API C ++ LLVM для генерации кода C ++, необходимого для создания любого типа IR. Это удобно сделать с помощью онлайн-демонстрации LLVM - http://llvm.org/demo/ - так я сгенерировал код для этого ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...