[LLVMdev] Value of structure passed byval to a recurse function not initialized when accessed through GDB

Karthik Bhat karthikthecool at gmail.com
Wed Dec 5 02:23:45 PST 2012

The problem seems to be that in case we have a structure as argument
we pass the value indirectly via a hidden pointer.

Since we are passing value via a pointer we need to do a load in
X86TargetLowering::LowerFormalArguments i.e.

    // If value is passed via pointer - do a load.
    if (VA.getLocInfo() == CCValAssign::Indirect)
      ArgValue = DAG.getLoad(VA.getValVT(), dl, Chain, ArgValue,
                             MachinePointerInfo(), false, false, false, 0);

this part of code should have been executed.
But currently we are getting VA.getLocInfo() as CCValAssign::Full as a
result a load does not happen even though we have passed the value via
a hidden pointer.

Currently this seems to be the problem but i'm not sure as i'm a bit
new to the code. Would like to get input from community if the
analysis is correct and how to go ahead to fix this issue.


On Wed, Dec 5, 2012 at 10:49 AM, Karthik Bhat <karthikthecool at gmail.com> wrote:
> Hi Relph,
> I'm trying to print the value of 'a' while executing  a.s = --depth; I
> have used break line number instead of break function so that the
> initial prologue part gets executed.
> The problem seems to be happening when parameters are pushed into
> stack and we call a function recursively.
> For example in the code when we have a int s; inside the struct
> instead of short s; gdb is able to print the structure value properly.
> The difference is when we have a short inside struct we are treating
> it as byval parameter object inside
> X86TargetLowering::LowerMemArgument were as when we have an "int" it
> doesn't treat it as byval.
> Thanks
> On Tue, Dec 4, 2012 at 9:26 PM, Relph, Richard <Richard.Relph at amd.com> wrote:
>> Karthik,
>>     At what point within recurse() are you asking gdb to display the value of argument a?
>>     What I'm wondering about is if the debug information gdb is using to get at a might not be correct at the particular point you are checking a, particularly if that is before the prolog has completed execution.
>>     The way debug information for arguments pushed on the stack is represented in DWARF requires some effort to get right at every instruction boundary, and the fact that what's being passed is a structure, but one that is less than an integer in size, may be exposing a bug in DWARF generation, not code generation.
>>     Just a thought.
>> Richard
>> On Dec 4, 2012, at 5:34 AM, Karthik Bhat <karthikthecool at gmail.com> wrote:
>>> Hi All,
>>> I was debugging a clang binary when i found this problem. The
>>> following code is complied with clang.
>>> typedef struct s
>>> {
>>>  short s;
>>> } SVAL;
>>> void recurse (SVAL a, int depth)
>>> {
>>>  a.s = --depth;
>>>  if (depth == 0)
>>>    return;
>>>  else
>>>   recurse(a,depth);
>>> }
>>> int main ()
>>> {
>>>  SVAL s; s.s = 5;
>>>  recurse (s, 5);
>>>  return 0;
>>> }
>>> When i try to access value of a.s in function recurse through gdb(i.e
>>> gdb > p a.s) it gives me an uninitialized value.
>>> The problem occurs only when we have a function call within function
>>> to which we have passed a structure.
>>> Could someone guide me were can i look to fix this issue.
>>> I have started with LowerFormalArguments in X86ISelLowering.cpp file.
>>> Thanks
>>> Karthik
>>> _______________________________________________
>>> 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