[llvm-dev] Parse LLVM IR (original) (raw)

div code via llvm-dev llvm-dev at lists.llvm.org
Sun Dec 9 07:40:19 PST 2018


Hello,

I am a newbie to LLVM and right now I am on the hook to parse some IR code and do some instrumentations. However, my problem is that no matter how I tweak my parsing code, it simply cannot print out anything.

So here is my C code:

int your_fun(int arg2) { int x = arg2; return x+2; }

And here is my parsing code:

#include <llvm/IR/Module.h> #include <llvm/IRReader/IRReader.h> #include <llvm/IR/LLVMContext.h> #include <llvm/Support/SourceMgr.h> #include #include <llvm/Support/raw_ostream.h>

using namespace llvm; int main() { LLVMContext context; SMDiagnostic error; Module *m = parseIRFile("t.ll", error, context).get(); if(!m) { return 0; } std::cout << error.getMessage().str() << std::endl; std::cout << sizeof(m->getFunctionList()) << std::endl; auto iter1 = m->getFunctionList().begin(); std::cout << " Function: " << (*iter1).getName().str() << std::endl;

for (auto iter1 = m->getFunctionList().begin(); iter1 != m->getFunctionList().end(); iter1++) { Function &f = *iter1; std::cout << " Function: " << std::endl; std::cout << " Function: " << f.getName().str() << std::endl; for (auto iter2 = f.getBasicBlockList().begin(); iter2 != f.getBasicBlockList().end(); iter2++) { BasicBlock &bb = *iter2; std::cout << " BasicBlock: " << bb.getName().str() << std::endl; for (auto iter3 = bb.begin(); iter3 != bb.end(); iter3++) { Instruction &inst = *iter3; std::cout << " Instruction " << &inst << " : " << inst.getOpcodeName();

        unsigned int  i = 0;
        unsigned int opnt_cnt = inst.getNumOperands();
           for(; i < opnt_cnt; ++i)
           {
             Value *opnd = inst.getOperand(i);
             std::string o;
             if (opnd->hasName()) {
               o = opnd->getName();
               std::cout << " " << o << "," ;
             } else {
               std::cout << " ptr" << opnd << ",";
             }
           }
           std:: cout << std::endl;
         }
       }

} return 1;

}

And this is my output:

➜ test git:(develop) ✗ clang -S -emit-llvm t.c ➜ test git:(develop) ✗ clang++ parse.cpp -o reader llvm-config --cxxflags --libs --ldflags --system-libs -g warning: unknown warning option '-Wno-maybe-uninitialized'; did you mean '-Wno-uninitialized'? [-Wunknown-warning-option] 1 warning generated. ➜ test git:(develop) ✗ ./reader

16 Function: ➜ test git:(develop) ✗ clang --version clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final) Target: x86_64-pc-linux-gnu Thread model: posix InstalledDir: /usr/bin

As you can see, I basically cannot get anything meaningful here. Could anyone shed some light on this? Thanks a lot.

Irene -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181209/09ea248e/attachment.html>



More information about the llvm-dev mailing list