[LLVMbugs] [Bug 1658] New: CBE miscompiles common C++ Code

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Fri Sep 14 10:30:22 PDT 2007


http://llvm.org/bugs/show_bug.cgi?id=1658

           Summary: CBE miscompiles common C++ Code
           Product: libraries
           Version: 1.0
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Backend: C
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: sabre at nondot.org
                CC: llvmbugs at cs.uiuc.edu


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


-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list