[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