Если вы имеете в виду 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/ - так я сгенерировал код для этого ответа.