Как определить любой тип инструкции в LLVM / C ++? - PullRequest
0 голосов
/ 11 мая 2018

Меня попросили сделать функцию LLVM, которая позволяет мне находить: переход / переход, загрузка / сохранение, вызов, "арифметические и другие инструкции типа".

Насколько мне удалосьЯ смог найти CallInst, LoadInst, StoreInst и BranchInst, выполнив следующий код с dyn_cast:

for (const Function &F : *M) 
    for (const BasicBlock &BB : F) 
        for (const Instruction &I : BB) 
            if (const StoreInst *SI = dyn_cast<StoreInst>(&I)) 
                 count++;;

Я изо всех сил пытаюсь найти способ извлечь всю арифметику и 'другой тип' инструкции.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 30 марта 2019

Вы можете увидеть здесь

Используйте

if (llvm::isa <llvm::LoadInst> (I))

или llvm::StoreInst и т. Д.

Для инструкций, содержащих бинарные операторы, llvm::isa <llvm::BinaryOperator> (I) не может их дифференцировать. Используйте

if (!strncmp(I.getOpcodeName(), "add", 4))

или

if (I.getOpcode == llvm::Add)

Вы можете найти OpcodeNames и Opcode здесь и здесь

...