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 >>> >> > >
John Criswell
2011-Jan-26 21:03 UTC
[LLVMdev] [LLVMDEV]How could I get function name in this situation?
On 1/26/11 3:00 PM, songlh at cs.wisc.edu wrote:>> 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?You're still not making sense. Are you asking what sort of C++ code will generate the use of a function pointer when compiled into LLVM IR, or are you asking how to determine, within an LLVM pass, what the possible target(s) of an indirect function call might be? -- John T.> 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 >> >
songlh at cs.wisc.edu
2011-Jan-26 21:06 UTC
[LLVMdev] [LLVMDEV]How could I get function name in this situation?
> On 1/26/11 3:00 PM, songlh at cs.wisc.edu wrote: >>> 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? > > You're still not making sense. Are you asking what sort of C++ code > will generate the use of a function pointer when compiled into LLVM IR, > or are you asking how to determine, within an LLVM pass, what the > possible target(s) of an indirect function call might be? > > -- John T.Sorry, I am asking the second question. " how to determine, within an LLVM pass, what the possible target(s) of an indirect function call might be? " thanks a lot! Linhai> >> 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 >>> >> > >
Maybe Matching 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?