Проанализировать инструкцию магазина, состоящую из inttoptr в LLVM - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь проанализировать байт-код, состоящий из инструкции сохранения, с помощью inttoptr . У меня возникли проблемы с определением, имеет ли инструкция магазина значение inttoptr в качестве операнда значения (3-я инструкция в следующем коде в записи BB). Мой код операции выглядит следующим образом:

define dso_local i32 @test(i32* %p) #0 {
entry:
  %p.addr = alloca i32*, align 8
  store i32* %p, i32** %p.addr, align 8
  store i32* inttoptr (i64 1000 to i32*), i32** %p.addr, align 8
  %0 = load i32*, i32** %p.addr, align 8
  %1 = load i32, i32* %0, align 4
  ret i32 %1
}

Я пытаюсь проанализировать инструкцию магазина и пытаюсь определить, находится ли inttoptr в инструкции магазина, используя classof method и с dyn_cast , как в следующем коде:

  StoreInst *store = dyn_cast<StoreInst>(I);
  Value *vv = store->getValueOperand();
  Value *vp = store->getPointerOperand();
  if(IntToPtrInst::classof(vv)){
    outs() << "Inttoptr found\n";
  }
  if(Instruction *inp = dyn_cast<IntToPtrInst>(vv)){
    outs() << "Inttoptr found\n";
  }

Кажется, я не могу обнаружить inttoptr ни с одним из методов. Я знаю, что байт-код не создает отдельную инструкцию для inttoptr , но он сливается с инструкцией сохранения. Было бы здорово, если бы кто-нибудь указал мне, что мне не хватает и как я могу обнаружить inttoptr в инструкции магазина.

1 Ответ

1 голос
/ 01 апреля 2020

Интересующее вас приведение - это не инструкция, а постоянное приведение от константного целого числа 1000 к указателю . Вы можете обнаружить его с помощью теста, подобного isa<ConstantExpr>(foo->getPointerOperand()) && cast<ConstantExpr>(foo->getPointerOperand())->getOpcode() == ConstantExpr::IntToPtrCast, но я набрал его из памяти, и я уверен, что есть опечатки.

Когда вы читаете IR, инструкции всегда находятся на отдельной строке, а константы встроены в качестве аргументов или инициализаторов, даже довольно сложные константы создаются с использованием ConstantExpr .

...