[llvm-dev] Parse LLVM IR

div code via llvm-dev llvm-dev at lists.llvm.org
Mon Dec 10 02:42:52 PST 2018


Thank you Alex. Yes, it works as expected..

Regards,
Irene

On Mon, Dec 10, 2018 at 11:23 AM Alex Denisov <1101.debian at gmail.com> wrote:

> At a first glance your usage looks correct.
> Though, it seems like you are misusing the sizeof: I assume you want to
> see the number of functions in the module, while sizeof returns size of the
> iterator itself.
> Then, it seems there are no functions in the module, therefore you are
> dereferencing an iterator that points to invalid location, then your
> program terminates.
>
> One reason the module can be empty:
>
>     Module *m = parseIRFile("t.ll", error, context).get();
>
> In this line, parseIRFile returns std::unique_ptr<Module>, but the result
> is not stored anywhere, the instance of unique_ptr deallocated right after
> the call to .get() at the end of the line.
> When you use the Module *m later on it already points to a deallocated
> memory.
>
> I hope it helps.
>
> Cheers,
> Alex.
>
> > On 10. Dec 2018, at 09:36, div code via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
> >
> > 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
> > _______________________________________________
> > LLVM Developers mailing list
> > llvm-dev at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
> --
> AlexDenisov
> Software Engineer, https://lowlevelbits.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181210/7e24d20e/attachment.html>


More information about the llvm-dev mailing list