[llvm-dev] Parse LLVM IR

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

[llvm-dev] Parse LLVM IR

Alex L via llvm-dev
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
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Reply | Threaded
Open this post in threaded view
|

Re: [llvm-dev] Parse LLVM IR

Alex L via llvm-dev
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 <[hidden email]> 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
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Reply | Threaded
Open this post in threaded view
|

Re: [llvm-dev] Parse LLVM IR

Alex L via llvm-dev
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 <[hidden email]> 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 <[hidden email]> 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
> [hidden email]
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
--
AlexDenisov
Software Engineer, https://lowlevelbits.org


_______________________________________________
LLVM Developers mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

signature.asc (499 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: [llvm-dev] Parse LLVM IR

Alex L via llvm-dev
Thank you Alex. Yes, it works as expected.. 

Regards,
Irene

On Mon, Dec 10, 2018 at 11:23 AM Alex Denisov <[hidden email]> 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 <[hidden email]> 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 <[hidden email]> 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
> [hidden email]
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

--
AlexDenisov
Software Engineer, https://lowlevelbits.org


_______________________________________________
LLVM Developers mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev