Как dyn_cast в LLVM, чтобы идентифицировать StoreInst? - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь идентифицировать StoreInst. Я прочитал руководство по LLVM и попытался использовать dyn_cast для этого. Но следующая программа возвращает очень странный результат.

bool runOnFunction(Function &F) override{
    for (const BasicBlock &BB : F){
        for (const Instruction &I : BB){
            const char *s = I.getOpcodeName();
            std::string str(s);
            errs()<<"at the instruction of "<<str<<"\n";
            if (const StoreInst *SI = dyn_cast<StoreInst>(&I))
                    errs()<<"FOUND STORE\n";
        }
    }
    return true;
}

Результат следующий. dyn_cast так или иначе возвращает true, когда инструкция на самом деле является CallInst. Кто-нибудь знает, почему это произошло? И как я могу это исправить? Кстати, я установил несколько старых версий LLVM на той же машине, но мне кажется, что я скомпилировал проход под LLVM-7.0.0 и получил файл .ll, используя clang-7.0.0 clang-7 -O0 -S -emit-llvm HelloWorld.cpp. Повлияют ли предыдущие установленные версии на эту версию? Спасибо !!

at the instruction of call
at the instruction of call
at the instruction of ret
at the instruction of alloca
FOUND STORE
at the instruction of alloca
FOUND STORE
at the instruction of alloca
FOUND STORE 
at the instruction of store
at the instruction of store
at the instruction of store
at the instruction of call
at the instruction of call
at the instruction of ret
at the instruction of call
at the instruction of ret

1 Ответ

0 голосов
/ 17 февраля 2020

Я подозреваю, что поскольку ваш пропуск FunctionPass, он выполняется параллельно для нескольких функций, поэтому ваши сообщения журнала распечатываются не по порядку.

...