[llvm-commits] [llvm-gcc-4.2] r49225 - in /llvm-gcc-4.2/trunk/gcc: config/i386/i386.c config/i386/llvm-i386.cpp config/rs6000/llvm-rs6000.cpp config/rs6000/rs6000.c llvm-abi.h
Devang Patel
dpatel at apple.com
Fri Apr 4 11:37:07 PDT 2008
Author: dpatel
Date: Fri Apr 4 13:37:07 2008
New Revision: 49225
URL: http://llvm.org/viewvc/llvm-project?rev=49225&view=rev
Log:
Move target specific FIXMEs, regarding struct should be returned in memor or not, in GCC's target hooks.
Modified:
llvm-gcc-4.2/trunk/gcc/config/i386/i386.c
llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp
llvm-gcc-4.2/trunk/gcc/config/rs6000/llvm-rs6000.cpp
llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.c
llvm-gcc-4.2/trunk/gcc/llvm-abi.h
Modified: llvm-gcc-4.2/trunk/gcc/config/i386/i386.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/i386.c?rev=49225&r1=49224&r2=49225&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/i386.c (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/i386.c Fri Apr 4 13:37:07 2008
@@ -4261,6 +4261,14 @@
int needed_intregs, needed_sseregs, size;
enum machine_mode mode = type_natural_mode (type);
+ /* LLVM LOCAL begin strcut return check */
+ /* FIXME without this, 64-bit _Complex long double crashes if not returned in
+ memory. With it, we just produce incorrect code. */
+ if (TARGET_64BIT && TREE_CODE(type) == COMPLEX_TYPE &&
+ TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type)) > 8)
+ return 1;
+ /* LLVM LOCAL end strcut return check */
+
if (TARGET_64BIT)
return !examine_argument (mode, type, 1, &needed_intregs, &needed_sseregs);
Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp?rev=49225&r1=49224&r2=49225&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Fri Apr 4 13:37:07 2008
@@ -676,14 +676,6 @@
/* Returns true if TYPE should be passed as scalar. */
bool llvm_x86_should_return_struct_as_scalar(tree type) {
- // FIXME without this, 64-bit _Complex long double crashes. With it, we
- // just produce incorrect code.
- if (!TARGET_64BIT)
- return true;
- if (TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type)) <= 8)
- return true;
- if (TREE_CODE(type) != COMPLEX_TYPE)
- return true;
return false;
}
Modified: llvm-gcc-4.2/trunk/gcc/config/rs6000/llvm-rs6000.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/rs6000/llvm-rs6000.cpp?rev=49225&r1=49224&r2=49225&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/rs6000/llvm-rs6000.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/config/rs6000/llvm-rs6000.cpp Fri Apr 4 13:37:07 2008
@@ -489,17 +489,6 @@
/* Returns true if TYPE should be passed as scalar. */
bool llvm_rs6000_should_return_struct_as_scalar(tree type) {
- // FIXME darwin ppc64 often returns structs partly in memory and partly
- // in regs. The binary interface of return_in_memory (which does the
- // work for aggregate_value_p) is not a good match for this; in fact
- // this target returns false if any part of it goes in registers. Which
- // means aggregate_value_p is not useful on this target for this purpose.
- // This is a big nasty longterm problem. For now put things back the
- // way they used to be (wrong, but fewer crashes).
- if (!TARGET_64BIT)
- return true;
- if (TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type))<=8)
- return true;
return false;
}
/* LLVM LOCAL end (ENTIRE FILE!) */
Modified: llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.c?rev=49225&r1=49224&r2=49225&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.c (original)
+++ llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.c Fri Apr 4 13:37:07 2008
@@ -4898,6 +4898,18 @@
static bool
rs6000_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
{
+ /* LLVM LOCAL begin strcut return check */
+ // FIXME darwin ppc64 often returns structs partly in memory and partly
+ // in regs. The binary interface of return_in_memory (which does the
+ // work for aggregate_value_p) is not a good match for this; in fact
+ // this target returns false if any part of it goes in registers. Which
+ // means aggregate_value_p is not useful on this target for this purpose.
+ // This is a big nasty longterm problem. For now put things back the
+ // way they used to be (wrong, but fewer crashes).
+ if (TARGET_64BIT && TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type)) > 8)
+ return true;
+ /* LLVM LOCAL end strcut return check */
+
/* In the darwin64 abi, try to use registers for larger structs
if possible. */
if (rs6000_darwin64_abi
Modified: llvm-gcc-4.2/trunk/gcc/llvm-abi.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-abi.h?rev=49225&r1=49224&r2=49225&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-abi.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-abi.h Fri Apr 4 13:37:07 2008
@@ -287,8 +287,7 @@
} else if (Ty->isFirstClassType() || Ty == Type::VoidTy) {
// Return scalar values normally.
C.HandleScalarResult(Ty);
- } else if (doNotUseShadowReturn(type, fn)
- && LLVM_SHOULD_RETURN_STRUCT_AS_SCALAR(type)) {
+ } else if (doNotUseShadowReturn(type, fn)) {
tree SingleElt = LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR(type);
if (SingleElt && TYPE_SIZE(SingleElt) &&
TREE_CODE(TYPE_SIZE(SingleElt)) == INTEGER_CST &&
More information about the llvm-commits
mailing list