Если у вас есть опыт работы с LLVM, вы знаете, где искать код. До тех пор, пока вы не получите такой опыт, вы можете использовать бэкэнд C ++ для генерации вызовов API, эквивалентных заданному IR для вас.
Один из способов сделать это - скомпилировать IR с llc
с помощью бэкэнда C ++.Например, я возьму этот упрощенный IR:
define void @DriverInit() {
EntryBlock:
%0 = zext i32 1 to i64
%1 = mul i64 %0, ptrtoint (i1** getelementptr (i1** null, i32 1) to i64)
ret void
}
Сохраните его в файл с именем z.ll
и запустите:
llc -march=cpp -O0 -cppgen=program z.ll
Вам необходимо установить или собрать LLVM где-нибудьдоступ к llc
.Он создает z.cpp
, в котором есть вызовы API C ++ для создания всего модуля.Соответствующая часть для базового блока EntryBlock
:
// Function: DriverInit (func_DriverInit)
{
BasicBlock* label_EntryBlock = BasicBlock::Create(mod->getContext(), "EntryBlock",func_DriverInit,0);
// Block EntryBlock (label_EntryBlock)
CastInst* int64_6 = new ZExtInst(const_int32_1, IntegerType::get(mod->getContext(), 64), "", label_EntryBlock);
BinaryOperator* int64_7 = BinaryOperator::Create(Instruction::Mul, int64_6, const_int64_2, "", label_EntryBlock);
ReturnInst::Create(mod->getContext(), label_EntryBlock);
}
, в которой вы видите, как правильно использовать конструктор zExtInstr
, а затем BinaryOperator::Create
для генерации этого IR.