llvm вызывает внешнюю функцию с аргументом char * - PullRequest
1 голос
/ 21 июня 2019

Я хочу вызвать внешнюю функцию с символом * в качестве аргумента в созданном вызове, но у меня возникли трудности.

Я попытался просмотреть документы, но он показывает только, как передавать константы целых чисел.

Вот соответствующая часть кода:

// not sure if the line below is correct. I am trying to call an external function: FPRCLAP_path(char * string)
std::vector<llvm::Type*> arg_types = {llvm::Type::getInt8PtrTy(context)};

llvm::FunctionType *function_type = llvm::FunctionType::get(llvm::Type::getVoidTy(context), arg_types, false);
llvm::FunctionCallee instrumentation_function = function.getParent()->getOrInsertFunction("FPRCLAP_path", function_type);

llvm::IRBuilder<> builder(&instruction);
builder.SetInsertPoint(&basic_block, ++builder.GetInsertPoint());
// I want to pass a string for instrumentation but I am not sure how to do it using llvm. I think I am supposed to allocate a string or reference an existing string.
llvm::ArrayRef<llvm::Value*> arguments = {???};
builder.CreateCall(instrumentation_function, arguments);

1 Ответ

1 голос
/ 24 июня 2019

Учитывая ваш код

llvm::IRBuilder<> builder(&instruction);
builder.SetInsertPoint(&basic_block, ++builder.GetInsertPoint());
// I want to pass a string for instrumentation but I am not sure how to do it using llvm. I think I am supposed to allocate a string or reference an existing string.
llvm::ArrayRef<llvm::Value*> arguments = {???};
builder.CreateCall(instrumentation_function, arguments);

Следующий фрагмент должен делать то, что вы хотите

Оптимизация LLVM сделает строку локальной, если она запущена. Если вы генерируете IR без оптимизации, вам может быть немного небрежно.

//str is a char*
 llvm::Value *strPointer = program->builder.CreateGlobalStringPtr(str);
//Using a Vector instead of ArrayRef
 const std::vector<llvm::Value *> args{strPointer};
 builder.CreateCall(instrumentation_function, args);
...