songlh at cs.wisc.edu
2011-Jan-26 20:40 UTC
[LLVMdev] [LLVMDEV]How could I get function name in this situation?
thanks! After I check the ll file, I find this: %1 = load %struct.nsAString** %aBuf_addr, align 4, !dbg !2048 %2 = getelementptr inbounds %struct.nsAString* %1, i32 0, i32 0, !dbg !2048 %3 = getelementptr inbounds %struct.nsISupports* %2, i32 0, i32 0, !dbg !2048 %4 = load i32 (...)*** %3, align 4, !dbg !2048 %5 = getelementptr inbounds i32 (...)** %4, i32 10, !dbg !2048 %6 = load i32 (...)** %5, align 1, !dbg !2048 %7 = bitcast i32 (...)* %6 to void (%struct.nsAString*, i32)*, !dbg !2048 %8 = load %struct.nsAString** %aBuf_addr, align 4, !dbg !2048 call void %7(%struct.nsAString* %8, i32 0) nounwind, !dbg !2048 The last line is the CallInst I find. I feel it is using memory address to get the function. Is there someway I can do this in my c++ code?? thanks a lot!> On 1/26/11 2:07 PM, songlh at cs.wisc.edu wrote: >> Hi: >> >> My llvm code is: >> >> for( BasicBlock::iterator i = b->begin() , ie = b->end(); >> b != be ; b ++ ){ >> if( CallInst * pCall = dyn_cast<CallInst>(i)){ >> >> pCall->dump(); // >> Function * pFunction = pCall->getCalledFunction(); >> if( !pFunction ){ >> >> } >> std::string fname = pFunction->getName(); >> } >> } >> >> The dump result of the function call I want to find is : >> >> call void %7(%struct.nsAString* %8, i32 0) nounwind, !dbg !1565 > > This is a call using a function pointer. There is no function name to > retrieve. You can check the called value (pcall->getCalledValue()) and > see if it's something like a cast instruction that casts a constant > function value, but that case is probably unlikely. > > -- John T. > >> it returns null from pCall->getCalledFunction(), and I cannot get the >> function name. >> >> How could I get the function name in this situation? >> >> thanks a lot! >> >> Linhai >> >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >
John Criswell
2011-Jan-26 20:55 UTC
[LLVMdev] [LLVMDEV]How could I get function name in this situation?
On 1/26/11 2:40 PM, songlh at cs.wisc.edu wrote:> thanks! > > After I check the ll file, I find this: > > %1 = load %struct.nsAString** %aBuf_addr, align 4, !dbg !2048 > %2 = getelementptr inbounds %struct.nsAString* %1, i32 0, i32 0, !dbg !2048 > %3 = getelementptr inbounds %struct.nsISupports* %2, i32 0, i32 0, !dbg !2048 > %4 = load i32 (...)*** %3, align 4, !dbg !2048 > %5 = getelementptr inbounds i32 (...)** %4, i32 10, !dbg !2048 > %6 = load i32 (...)** %5, align 1, !dbg !2048 > %7 = bitcast i32 (...)* %6 to void (%struct.nsAString*, i32)*, !dbg !2048 > %8 = load %struct.nsAString** %aBuf_addr, align 4, !dbg !2048 > call void %7(%struct.nsAString* %8, i32 0) nounwind, !dbg !2048 > > The last line is the CallInst I find. > > I feel it is using memory address to get the function. Is there someway I > can do this in my c++ code??Yes, the code is loading a pointer to a function from memory and calling it. I don't understand your question, though. -- John T.> thanks a lot! > >> On 1/26/11 2:07 PM, songlh at cs.wisc.edu wrote: >>> Hi: >>> >>> My llvm code is: >>> >>> for( BasicBlock::iterator i = b->begin() , ie = b->end(); >>> b != be ; b ++ ){ >>> if( CallInst * pCall = dyn_cast<CallInst>(i)){ >>> >>> pCall->dump(); // >>> Function * pFunction = pCall->getCalledFunction(); >>> if( !pFunction ){ >>> >>> } >>> std::string fname = pFunction->getName(); >>> } >>> } >>> >>> The dump result of the function call I want to find is : >>> >>> call void %7(%struct.nsAString* %8, i32 0) nounwind, !dbg !1565 >> This is a call using a function pointer. There is no function name to >> retrieve. You can check the called value (pcall->getCalledValue()) and >> see if it's something like a cast instruction that casts a constant >> function value, but that case is probably unlikely. >> >> -- John T. >> >>> it returns null from pCall->getCalledFunction(), and I cannot get the >>> function name. >>> >>> How could I get the function name in this situation? >>> >>> thanks a lot! >>> >>> Linhai >>> >>> _______________________________________________ >>> LLVM Developers mailing list >>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> >
songlh at cs.wisc.edu
2011-Jan-26 21:00 UTC
[LLVMdev] [LLVMDEV]How could I get function name in this situation?
> On 1/26/11 2:40 PM, songlh at cs.wisc.edu wrote: >> thanks! >> >> After I check the ll file, I find this: >> >> %1 = load %struct.nsAString** %aBuf_addr, align 4, !dbg !2048 >> %2 = getelementptr inbounds %struct.nsAString* %1, i32 0, i32 0, !dbg >> !2048 >> %3 = getelementptr inbounds %struct.nsISupports* %2, i32 0, i32 0, !dbg >> !2048 >> %4 = load i32 (...)*** %3, align 4, !dbg !2048 >> %5 = getelementptr inbounds i32 (...)** %4, i32 10, !dbg !2048 >> %6 = load i32 (...)** %5, align 1, !dbg !2048 >> %7 = bitcast i32 (...)* %6 to void (%struct.nsAString*, i32)*, !dbg >> !2048 >> %8 = load %struct.nsAString** %aBuf_addr, align 4, !dbg !2048 >> call void %7(%struct.nsAString* %8, i32 0) nounwind, !dbg !2048 >> >> The last line is the CallInst I find. >> >> I feel it is using memory address to get the function. Is there someway >> I >> can do this in my c++ code?? > > Yes, the code is loading a pointer to a function from memory and calling > it. > > I don't understand your question, though. > > -- John T. >I mean how do I realize this in a c++ pass code? thanks a lot! Linhai>> thanks a lot! >> >>> On 1/26/11 2:07 PM, songlh at cs.wisc.edu wrote: >>>> Hi: >>>> >>>> My llvm code is: >>>> >>>> for( BasicBlock::iterator i = b->begin() , ie = b->end(); >>>> b != be ; b ++ ){ >>>> if( CallInst * pCall = dyn_cast<CallInst>(i)){ >>>> >>>> pCall->dump(); // >>>> Function * pFunction = pCall->getCalledFunction(); >>>> if( !pFunction ){ >>>> >>>> } >>>> std::string fname = pFunction->getName(); >>>> } >>>> } >>>> >>>> The dump result of the function call I want to find is : >>>> >>>> call void %7(%struct.nsAString* %8, i32 0) nounwind, !dbg !1565 >>> This is a call using a function pointer. There is no function name to >>> retrieve. You can check the called value (pcall->getCalledValue()) and >>> see if it's something like a cast instruction that casts a constant >>> function value, but that case is probably unlikely. >>> >>> -- John T. >>> >>>> it returns null from pCall->getCalledFunction(), and I cannot get >>>> the >>>> function name. >>>> >>>> How could I get the function name in this situation? >>>> >>>> thanks a lot! >>>> >>>> Linhai >>>> >>>> _______________________________________________ >>>> LLVM Developers mailing list >>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >>> >> > >
Possibly Parallel Threads
- [LLVMdev] [LLVMDEV]How could I get function name in this situation?
- [LLVMdev] [LLVMDEV]How could I get function name in this situation?
- [LLVMdev] [LLVMDEV]How could I get function name in this situation?
- [LLVMdev] [LLVMDEV]How could I get function name in this situation?
- [LLVMdev] [LLVMDEV]How could I get function name in this situation?