[llvm-dev] Parse LLVM IR

div code via llvm-dev llvm-dev at lists.llvm.org
Mon Dec 10 00:36:06 PST 2018


Any suggestions on this? I am sorry for the trouble this has caused, but
the inconsistent APIs cause me a bunch of confusions..

Best,
Irene

On Sun, Dec 9, 2018 at 4:40 PM div code <divsubmission at gmail.com> wrote:

> 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 <iostream>
> #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/20181210/97a7d701/attachment.html>


More information about the llvm-dev mailing list