New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CBE miscompiles common C++ Code (bigfib, tramp3d, etc) #2030
Comments
Hrm :) |
ugly huh? |
*** Bug llvm/llvm-bugzilla-archive#2125 has been marked as a duplicate of this bug. *** |
Does sret fix this? Or multiple value ret? |
Nope. |
*** Bug llvm/llvm-bugzilla-archive#3504 has been marked as a duplicate of this bug. *** |
The C backend was removed from svn trunk and is no longer maintained. Closing the bug. |
mentioned in issue llvm/llvm-bugzilla-archive#2125 |
mentioned in issue llvm/llvm-bugzilla-archive#3504 |
Extended Description
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:
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
The text was updated successfully, but these errors were encountered: