First Last Prev Next    No search results available
Details
: CBE miscompiles common C++ Code
Bug#: 1658
: libraries
: Backend: C
Status: NEW
Resolution:
: PC
: All
: 1.0
: P2
: normal
: ---

:
: miscompilation
:
:
  Show dependency tree - Show dependency graph
People
Reporter: Chris Lattner <sabre@nondot.org>
Assigned To: Unassigned LLVM Bugs <unassignedbugs@nondot.org>
:

Attachments


Note

You need to log in before you can comment on or make changes to this bug.

Related actions


Description:   Opened: 2007-09-14 12:30
Consider this code:

struct ctor {
  void *foo;
  ctor(const ctor &X);
  ctor() {}
};

struct test {
  unsigned char *field0;
};

test foo();
ctor bar();  

void testfunc() {
  test xx;
  ctor yy;  

  xx = foo();
  yy = bar();
}

In the GCC abi, single element structs are returned as registers, larger
structs and any struct with a copy ctor are returned by passing a hidden "sret"
pointer to the struct.  llvm-gcc compiles this to:

        %tmp2 = call i8* @_Z3foov( )            ; <i8*> [#uses=0]
        call void @_Z3barv( %struct.ctor* %tmp1 sret  )

which is correct.  The problem is that the CBE doesn't know about this.  When
run through the CBE, we get:

struct l_struct_2E_ctor {
  unsigned char *field0;
};
...
  struct l_struct_2E_ctor llvm_cbe_tmp1;    /* Address-exposed local */
  *((&llvm_cbe_tmp1)) = _Z3barv();
 ...

Suddenly the the C compiler compiling the CBE output will return the struct in
a register, instead of passing it by dummy argument.  This causes
miscompilation of Misc-C++/bigfib and probably a lot of other stuff because
this affects std::string.

-Chris
------- Comment #1 From Anton Korobeynikov 2007-09-14 12:53:23 -------
Hrm :) 
------- Comment #2 From Chris Lattner 2007-09-14 12:57:27 -------
ugly huh?
------- Comment #3 From Chris Lattner 2008-03-07 00:14:54 -------
*** Bug 2125 has been marked as a duplicate of this bug. ***
------- Comment #4 From Nick Lewycky 2008-03-07 00:19:12 -------
Does sret fix this? Or multiple value ret?
------- Comment #5 From Chris Lattner 2008-03-07 00:22:05 -------
Nope.

First Last Prev Next    No search results available