15102925731
2012-Apr-07 02:50 UTC
[LLVMdev] How to insert a self-written function to a piece of programme
Hi all,
I wrote a function pass. In the pass, it ran through all the
instruction that call to functions. When arriving at the exact function that I m
interested in, it would insert a self-made function.
Now I've finished the pass, the compilation is successful. The pass
can find the function I like and can insert the CallInst to call my check
function. BUT, when running the pass, it breaks down. The Diagnose is as follow,
************************************************************************************
Referencing function in another module!
%CallCheck = call i32 @check()
Broken module found, compilation aborted!
0 opt 0x087aa95b
1 opt 0x087aa6e8
2 0x00d54400 __kernel_sigreturn + 0
3 libc.so.6 0x009c2a82 abort + 386
4 opt 0x08756f15
5 opt 0x08756c2d
6 opt 0x0873a18a llvm::FPPassManager::runOnFunction(llvm::Function&)
+ 306
7 opt 0x0873a34a llvm::FPPassManager::runOnModule(llvm::Module&) +
114
8 opt 0x0873a62a llvm::MPPassManager::runOnModule(llvm::Module&) +
400
9 opt 0x0873aae0 llvm::PassManagerImpl::run(llvm::Module&) + 122
10 opt 0x0873ada5 llvm::PassManager::run(llvm::Module&) + 39
11 opt 0x0827cec3 main + 4475
12 libc.so.6 0x009abbd6 __libc_start_main + 230
13 opt 0x0826e811
Stack dump:
0. Program arguments: opt -load ../../../Debug+Asserts/lib/Hello.so -hello
1. Running pass 'Function Pass Manager' on module
'<stdin>'.
2. Running pass 'Module Verifier' on function '@main'
*****************************************************************************************************************
*****************************************************************************************************************
The source code is like,
// my "check function"
int check()
{
printf("Hello me!!\n");
return 0;
}
//Create a function prototype exactly like "int check()", then create
a call instruction to that function.
Module * M;
LLVMContext Context;
FunctionType *STy=FunctionType::get(Type::getInt32Ty(Context), false);
Function *check = Function::Create(STy, Function::InternalLinkage,
"check" ,M);
CallInst *callcheck = CallInst::Create(check,"CallCheck");
namespace {
struct Hello : public FunctionPass
{
static char ID;
Hello() : FunctionPass(ID) {}
virtual bool runOnFunction(Function &F)
{
// run through all the instruction and find the one that call
"puts
for (Function::iterator BI = F.begin(), BE =
F.end(); BI != BE; ++BI)
{
for(BasicBlock::iterator II = BI->begin(),IE
= BI->end();II != IE; ++II)
{
if(CallInst * III =
dyn_cast<CallInst>(II))
{
if(III->getCalledFunction()!=NULL&&III->getCalledFunction()->getName()=="puts")
{
errs()
<<III->getCalledFunction()->getName()<<" function
found!\n";
callcheck->insertBefore(II);
errs()
<<"INSERT SUCCEEDED!!!!!!!!\n";
}
else
{
errs() <<"it's
not main function!\n"<<"it
is:"<<III->getCalledFunction()->getName()<<'\n';
}
}/**/
}
************************************************************************************************************************************************************************************************************************************************************************************************
QUESTION: IS IT BECAUSE THE PASS CAN'T RECOGNIZE MY CHECK FUNCTION OR WHAT??
HOW TO MAKE THE PASS WORK AS EXPECTED???
THANK YOU!!
--
祝好!
甄凯
------------------------------------------------------------------------------------------------------
2012-04-07
------------------------------------------------------------------------------------------------------
Name: 甄凯(ZhenKai)
Homepage:http://www.renren.com/262729393
Email: zhenkaixd at 126.com or 846227103 at qq.com
TEL: 15810729006(Beijing)
Address: Room I-406, Central Building, Tsinghua University, Beijing, China.
100084.
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20120407/821935d4/attachment.html>
Duncan Sands
2012-Apr-07 07:28 UTC
[LLVMdev] How to insert a self-written function to a piece of programme
Hi 15102925731,> *Referencing function in another module! > %CallCheck = call i32 @check() > Broken module found, compilation aborted!*> *//Create a function prototype exactly like "int check()", then create a call > instruction to that function.* > Module * M; > LLVMContext Context; > FunctionType *STy=FunctionType::get(Type::getInt32Ty(Context), false); > Function *check = Function::Create(STy, Function::InternalLinkage, "check" ,M);So here M is passed in uninitialized; same with Context? Ciao, Duncan.> CallInst *callcheck = CallInst::Create(check,"CallCheck"); > > namespace { > struct Hello : public FunctionPass > { > static char ID; > Hello() : FunctionPass(ID) {} > virtual bool runOnFunction(Function &F) > { > *// run through all the instruction and find the one that call > "puts* > for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE; ++BI) > { > for(BasicBlock::iterator II = BI->begin(),IE = BI->end();II != IE; ++II) > { > if(CallInst * III = dyn_cast<CallInst>(II)) > { > > if(III->getCalledFunction()!=NULL&&III->getCalledFunction()->getName()=="puts") > { > errs() <<III->getCalledFunction()->getName()<<" function found!\n"; > callcheck->insertBefore(II); > errs() <<"INSERT SUCCEEDED!!!!!!!!\n"; > } > else > { > errs() <<"it's not main function!\n"<<"it > is:"<<III->getCalledFunction()->getName()<<'\n'; > } > }/**/ > > } > ************************************************************************************************************************************************************************************************************************************************************************************************ > QUESTION: IS IT BECAUSE THE PASS CAN'T RECOGNIZE MY CHECK FUNCTION OR WHAT?? HOW > TO MAKE THE PASS WORK AS EXPECTED??? > THANK YOU!! > > -- > 祝好! > 甄凯 > ------------------------------------------------------------------------------------------------------ > > 2012-04-07 > ------------------------------------------------------------------------------------------------------ > > Name: 甄凯(ZhenKai) > Homepage:http://www.renren.com/262729393 > Email: zhenkaixd at 126.com <mailto:zhenkaixd at 126.com> or 846227103 at qq.com > <mailto:846227103 at qq.com> > TEL: 15810729006(Beijing) > Address: Room I-406, Central Building, Tsinghua University, Beijing, China. 100084. > > > > > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Apparently Analagous Threads
- [LLVMdev] How to explain this weird phenomenon????????
- [LLVMdev] How to explain this weird phenomenon????????
- [LLVMdev] How to instrument a this function using insertBefore instruction???
- [LLVMdev] How to instrument a this function using insertBefore instruction???
- [LLVMdev] How to instrument a this function using insertBefore instruction???