Hi,<br><br>   As you told that function ends up returning void, I just confirmed it in the IR, the function is defined as:<br><br>define <b>void</b> @_Z3sum2A1S_(<b>%struct.A1* noalias sret %agg.result</b>, %struct.A1* byval align 4 %one, %struct.A1* byval align 4 %two).<br>
<br>But when i checked the register values in g++, eax contains an address of stack, which points to the value (object) returned by sum. That is if we print the contents of the address stored in eax and contents of (address stored in eax)+4, we get the correct value of sum. And GDB seems to print from this only when we give the command print sum(one,two). { for clang compiled code eax has some other value}<br>
<br>So is this just a coincidence for g++ that eax points to this address and gdb prints the right value on the command  print sum(one,two)??<br><br><br><br><div class="gmail_quote">On Sat, Dec 1, 2012 at 9:42 PM, James Molloy <span dir="ltr"><<a href="mailto:James.Molloy@arm.com" target="_blank">James.Molloy@arm.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
Structures are passed by pointer, so the return value is not actually in eax. That code gets transformed into something like:<br>
<br>
void sum(A1 *out, const A1 one, const A1 two) {<br>
  out->x = one.x + two.x<br>
  out->y = one.y + two.y<br>
}<br>
<br>
So actually the function ends up returning void and operating on a hidden parameter, so %eax is dead at the end of the function and should not be being relied upon by the calling code.<br>
<br>
I believe this is a red-herring to whatever your actual bug is.<br>
<br>
Cheers,<br>
<br>
James<br>
________________________________________<br>
From: <a href="mailto:llvmdev-bounces@cs.uiuc.edu">llvmdev-bounces@cs.uiuc.edu</a> [<a href="mailto:llvmdev-bounces@cs.uiuc.edu">llvmdev-bounces@cs.uiuc.edu</a>] On Behalf Of Mayur Pandey [<a href="mailto:mayurthebond@gmail.com">mayurthebond@gmail.com</a>]<br>

Sent: 01 December 2012 11:13<br>
To: <a href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a><br>
Subject: Re: [LLVMdev] operator overloading fails while debugging with gdb      for i386<br>
<div class="HOEnZb"><div class="h5"><br>
Problem seems not only with operator overloading,  It occurs with struct value returning also.<br>
<br>
gdb while debugging expects the return value in eax, gcc does returns in eax, But Clang returns in edx(it can be checked in gdb by printing the contents of edx).<br>
<br>
Code(sample code)<br>
<br>
struct A1 {<br>
  int x;<br>
  int y;<br>
};<br>
<br>
A1 sum(const A1 one, const A1 two)<br>
{<br>
 A1 plus = {0,0};<br>
 plus.x = one.x + two.x;<br>
 plus.y = one.y + two.y;<br>
<br>
 return (plus);<br>
}<br>
<br>
<br>
int main (void)<br>
{<br>
 A1 one= {2,3};<br>
 A1 two= {4,5};<br>
 A1 three = sum(one,two);<br>
 return 0;<br>
}<br>
<br>
<br>
gcc assembley (snippet of sum function)<br>
<br>
_Z3sum2A1S_:<br>
    .loc 1 8 0<br>
    pushl    %ebp<br>
    movl    %esp, %ebp<br>
    .loc 1 9 0<br>
    movl    8(%ebp), %eax<br>
    movl    $0, (%eax)<br>
    movl    8(%ebp), %eax<br>
    movl    $0, 4(%eax)<br>
    .loc 1 10 0<br>
    movl    12(%ebp), %edx<br>
    movl    20(%ebp), %eax<br>
    addl    %eax, %edx<br>
    movl    8(%ebp), %eax<br>
    movl    %edx, (%eax)<br>
    .loc 1 11 0<br>
    movl    16(%ebp), %edx<br>
    movl    24(%ebp), %eax<br>
    addl    %eax, %edx<br>
    movl    8(%ebp), %eax<br>
    movl    %edx, 4(%eax)<br>
.LBE2:<br>
    .loc 1 14 0<br>
    movl    8(%ebp), %eax<br>
    popl    %ebp<br>
    ret    $4<br>
<br>
clang assembly (snippet of sum function)<br>
_Z3sum2A1S_:<br>
   .loc    1 8 0<br>
    pushl    %edi<br>
    pushl    %esi<br>
    leal    24(%esp), %eax<br>
    leal    16(%esp), %ecx<br>
    movl    12(%esp), %edx<br>
    .loc    1 9 17 prologue_end<br>
    movl    $0, 4(%edx)<br>
    movl    $0, (%edx)<br>
    .loc    1 10 2<br>
    movl    (%ecx), %esi<br>
    movl    (%eax), %edi<br>
    addl    %edi, %esi<br>
    movl    %esi, (%edx)<br>
    .loc    1 11 2<br>
    movl    4(%ecx), %ecx<br>
    movl    4(%eax), %eax<br>
    addl    %eax, %ecx<br>
    movl    %ecx, 4(%edx)<br>
    .loc    1 13 2<br>
    popl    %esi<br>
    popl    %edi<br>
    ret    $4<br>
<br>
<br>
But while returning int value clang returns with eax... as expect. Problem comes with when used struct/class<br>
<br>
Is the behaviour of llvm as per the standards or is this a bug??<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
</div></div><div class="HOEnZb"><div class="h5">On Thu, Nov 29, 2012 at 12:40 PM, Mayur Pandey <<a href="mailto:mayurthebond@gmail.com">mayurthebond@gmail.com</a><mailto:<a href="mailto:mayurthebond@gmail.com">mayurthebond@gmail.com</a>>> wrote:<br>

<br>
<br>
For the given test:<br>
<br>
class A1 {<br>
  int x;<br>
  int y;<br>
<br>
  public:<br>
<br>
  A1(int a, int b)<br>
  {<br>
   x=a;<br>
   y=b;<br>
  }<br>
<br>
A1 operator+(const A1&);<br>
};<br>
<br>
<br>
A1 A1::operator+(const A1& second)<br>
{<br>
 A1 sum(0,0);<br>
 sum.x = x + second.x;<br>
 sum.y = y + second.y;<br>
<br>
 return (sum);<br>
}<br>
<br>
<br>
int main (void)<br>
{<br>
 A1 one(2,3);<br>
 A1 two(4,5);<br>
<br>
 return 0;<br>
}<br>
<br>
<br>
when the exectable of this code is debugged in gdb for i386, we dont get the<br>
expected results.<br>
<br>
when we break at return 0; and give the command: print one + two, the result<br>
should be $1 = {x = 6, y = 8}, but the result obtained is $1 = {x = 2, y = 3}.<br>
<br>
This is related to debug information generated, as normally the overloading is<br>
occuring.<br>
eg: A1 three = one + two results {x = 6, y = 8}.<br>
<br>
<br>
On checking the assembly, a suspicious entry is found which may be related for<br>
the failure:<br>
<br>
    #DEBUG_VALUE: operator+:this <- undef<br>
    #DEBUG_VALUE: operator+:second <- undef<br>
<br>
<br>
--<br>
Thanx & Regards<br>
Mayur Pandey<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
--<br>
Thanx & Regards<br>
Mayur Pandey<br>
<br>
<br>
<br>
<br>
<br>
<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><div>Thanx & Regards <br></div>
<div><b>Mayur Pandey </b><br></div>
<div style="color:rgb(0,0,0)">Senior Software Engineer</div>
<div>Samsung India Software Operations<br>Bangalore<br>+91-9742959541<br><font color="#3333ff"></font><font color="#3333ff"> <br></font></div>
<div> </div>
<div> </div><br>