Вставка инструкции нулевого расширения в базовый блок - PullRequest
1 голос
/ 23 февраля 2012

Я хочу вставить нулевую инструкцию расширения и инструкцию умножения в базовый блок.Ввод:

define void @DriverInit() {
    EntryBlock:
      %abc = call i32 @cuInit(i32 0)
      ret void
    }

Я хочу преобразовать его в

define void @DriverInit() {
        EntryBlock:
          %abc = call i32 @cuInit(i32 0)
          %2 = zext i32 1 to i64
     %3 = mul i64 %2, ptrtoint (i1** getelementptr (i1** null, i32 1) to i64)
          ret void
        }

Как это сделать с помощью LLVM C ++ API?Я использую приведенный ниже код для создания инструкции нулевого расширения, но я не могу это сделать.

IRBuilder<> builder(BB);
Value *One = builder.getInt32(1);

Value *zer=builder.CreateZExt(One, IntegerType::getInt64Ty(M.getContext()),"1");

Второй аргумент для CreateZExt - это тип назначения, к которому я хочу расширить до нуля.Я не прав.

Я новичок в LLVM, и мне сложно получить информацию о том, какие функции использовать в проходах.Какие ресурсы доступны, кроме документации по doxygen для исходного кода?

1 Ответ

1 голос
/ 27 февраля 2012

Если у вас есть опыт работы с 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.

...