Как привести указатель функции к значению LLVM, чтобы я мог вызывать его в своем IR?

Я работаю над чем-то вроде JIT. У меня такой код:

Obj doSomething(Obj o, Selector sel){
    ...
}

И у меня есть указатель на эту функцию, мой вопрос в том, как мне обернуть указатель в LLVM:Value, чтобы я мог вставить его в свой ИК-порт, используя IRBuilder.CreateCall. Что мне нужно делать?


person Boyu Fang    schedule 04.11.2014    source источник
comment
Для функции с типами void процедура объясняется здесь. Однако ваш случай значительно сложнее, потому что вам нужно создать правильные типы, а не просто использовать Type::getVoidTy. Кажется, в сети нет хороших примеров, показывающих, как это сделать. Если возможно, вы можете использовать указатели (желательно void *) и функцию-оболочку, чтобы упростить случай.   -  person antipattern    schedule 04.11.2014


Ответы (1)


(Я понял ваш вопрос так: у меня есть указатель C ++ на функцию LLVM, и мне нужно создать к ней вызов; если я ошибся, поясните это в сообщении или в комментариях ниже)

Большинство классов LLVM являются производными от llvm::Value, когда вы делаете что-то вроде

llvm::Function *theFunction = llvm::Function::Create(...);

llvm :: Function является подклассом llvm::Value, и вы можете использовать его в CreateCall

Value *result = Builder.CreateCall(theFunction, ...); // This is the call instruction
person Marco A.    schedule 04.11.2014