LLVM создает функцию с типом «Инструкция *»

#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 * объект)