[LLVMdev] [LLVMDEV]How could I get function name in this situation?

John Criswell criswell at illinois.edu
Wed Jan 26 13:03:04 PST 2011


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
>>
>




More information about the llvm-dev mailing list