#llvm #llvm-ir #llvm-c -api
#llvm #llvm-ir #llvm-c -api
Вопрос:
Я хочу использовать Function::Create
метод для создания функции, тип входного параметра llvm::Instruction*
которой равен, но я не нашел никакого прямого метода class Type
для этого. Кто-нибудь может дать мне несколько советов?
Также для конкретного сравнения Instruction *pi
я попробовал pi->getType()->print(errs())
, и он вернул меня i1
как тип. Но когда я написал функцию int externalCall(Instruction *p)
в другом cpp-файле и скомпилировал в IR. В этом IR указывается тип class.llvm::Instruction
. Почему эти два отличаются и как я могу получить последний из API?
Комментарии:
1. Не могли бы вы привести пример того, как вы ожидаете, что IR будет выглядеть в конце, и как вы ожидаете, что вызов этой функции будет выглядеть в IR?
2. что-то вроде
call void @foo('class.llvm::Instruction' p)
3. Что касается битового кода LLVM, в нем нет ничего особенного
llvm::Instruction
, это просто тип C . Так что этот вопрос может быть так же хорош для любого другого типа. В частности, вы определенно не найдете какой-либо специальной обработки этого типа. Поэтому я предлагаю поискать общие способы создания типа в LLVM.
Ответ №1:
Пока вы используете связывание в стиле c, тип указателя в значительной степени не имеет значения:
- приведение к указателю на i8 на стороне llvm
- получите любой тип, который вы хотите, на стороне вызываемого c / c .
Instruction *
все в порядке
(Просто используйте BitcastInst
регистр to на стороне llvm, например:
BitCastInst *bitcast = new BitCastInst(value, PointerType::get(IntegerType::get(context, 8), 0));
(… где value
ваш Instruction *
объект)