Dipanjan Das via llvm-dev
2017-May-03 21:58 UTC
[llvm-dev] How to instrument a module to spit out the addresses of global variables during initialization?
My objective is to instrument a module such that the addresses of all global variables are printed out BEFORE even any real code is executed, i.e. during module initialization. I slipped in the following code snippet in the doIntialization() method of a FunctionPass. Unfortunately, I can't see any code inserted in the IR generated. =================================================================== bool doInitialization(Module &M) override { for (auto &global : M.getGlobalList()) { if (isa<GlobalVariable>(global)) { errs() << "[global]: " << global << '\n'; auto &Ctx = M.getContext(); IRBuilder<> builder(Ctx); Constant *instrument_func M.getOrInsertFunction("instrument_global_variable", Type::getVoidTy(Ctx), Type::getInt64Ty(Ctx), NULL); Value* args[] = {global.getOperand(0)}; builder.CreateCall(instrument_func, args); } } } =================================================================== The code above yields a pass which, when executed against application bitcode, prints out all the global variables (because of the errs() statement) correctly. However, I can't collect the address information at run-time. -- Thanks & Regards, Dipanjan -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170503/d2f6c4d0/attachment.html>
Dipanjan Das via llvm-dev
2017-May-03 22:50 UTC
[llvm-dev] How to instrument a module to spit out the addresses of global variables during initialization?
To be precise, I am not being able to insert any appropriate builder.SetInsertPoint() call inside doInitialization() method. On 3 May 2017 at 14:58, Dipanjan Das <mail.dipanjan.das at gmail.com> wrote:> > My objective is to instrument a module such that the addresses of all > global variables are printed out BEFORE even any real code is executed, > i.e. during module initialization. I slipped in the following code snippet > in the doIntialization() method of a FunctionPass. Unfortunately, I can't > see any code inserted in the IR generated. > > ===================================================================> > bool doInitialization(Module &M) override { > for (auto &global : M.getGlobalList()) { > if (isa<GlobalVariable>(global)) { > errs() << "[global]: " << global << '\n'; > auto &Ctx = M.getContext(); > IRBuilder<> builder(Ctx); > Constant *instrument_func = M.getOrInsertFunction("instrument_global_variable", > Type::getVoidTy(Ctx), Type::getInt64Ty(Ctx), NULL); > Value* args[] = {global.getOperand(0)}; > builder.CreateCall(instrument_func, args); > } > } > } > > ===================================================================> > The code above yields a pass which, when executed against application > bitcode, prints out all the global variables (because of the errs() > statement) correctly. However, I can't collect the address information at > run-time. > > -- > > Thanks & Regards, > Dipanjan >-- Thanks & Regards, Dipanjan -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170503/b41c9899/attachment.html>