[llvm-commits] [llvm-gcc-4.2] r130406 - in /llvm-gcc-4.2/trunk/gcc: config/arm/llvm-arm-target.h config/arm/llvm-arm.cpp config/i386/llvm-i386-target.h config/mips/llvm-mips-target.h config/rs6000/rs6000.h config/sparc/sparc.h llvm-abi-default.cpp llvm-abi.h llvm-convert.cpp

Stuart Hastings stuart at apple.com
Thu Apr 28 09:59:08 PDT 2011


Author: stuart
Date: Thu Apr 28 11:59:08 2011
New Revision: 130406

URL: http://llvm.org/viewvc/llvm-project?rev=130406&view=rev
Log:
Enable byval for ARM in LLVM-GCC.  rdar://problem/7662569

Modified:
    llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm-target.h
    llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp
    llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h
    llvm-gcc-4.2/trunk/gcc/config/mips/llvm-mips-target.h
    llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h
    llvm-gcc-4.2/trunk/gcc/config/sparc/sparc.h
    llvm-gcc-4.2/trunk/gcc/llvm-abi-default.cpp
    llvm-gcc-4.2/trunk/gcc/llvm-abi.h
    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm-target.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm-target.h?rev=130406&r1=130405&r2=130406&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm-target.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm-target.h Thu Apr 28 11:59:08 2011
@@ -98,6 +98,14 @@
 #define LLVM_SHOULD_NOT_USE_SHADOW_RETURN(X, CC) \
     llvm_arm_should_pass_or_return_aggregate_in_regs((X), (CC))
 
+extern
+bool llvm_arm_should_pass_aggregate_using_byval_attr(tree, const Type *,
+                                                     CallingConv::ID &CC);
+
+#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY, CC)        \
+    (llvm_arm_should_pass_aggregate_using_byval_attr((X), (TY), (CC)))
+
+
 /* Vectors bigger than 128 are returned using sret.  */
 #define LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW(X, isBuiltin) \
   (TREE_INT_CST_LOW(TYPE_SIZE(X)) > 128)

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp?rev=130406&r1=130405&r2=130406&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp Thu Apr 28 11:59:08 2011
@@ -2873,4 +2873,19 @@
   return result && !TREE_ADDRESSABLE(TreeType);
 }
 
+/* Target hook for llvm-abi.h. It returns true if an aggregate of the
+   specified type should be passed with the 'byval' attribute. */
+bool llvm_arm_should_pass_aggregate_using_byval_attr(tree TreeType,
+                                                     const Type *Ty,
+                                                     CallingConv::ID &CC) {
+  if (CC == CallingConv::ARM_APCS) {
+    enum machine_mode Mode = TYPE_MODE(TreeType);
+    HOST_WIDE_INT Bytes =
+      (Mode == BLKmode) ? int_size_in_bytes(TreeType) : (int) GET_MODE_SIZE(Mode);
+
+    return Bytes > 32;
+  } else
+    return false;
+}
+
 /* LLVM LOCAL end (ENTIRE FILE!)  */

Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h?rev=130406&r1=130405&r2=130406&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h Thu Apr 28 11:59:08 2011
@@ -227,7 +227,7 @@
 
 extern bool llvm_x86_should_pass_aggregate_in_memory(tree, const Type *);
 
-#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY)      \
+#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY, CC)     \
   llvm_x86_should_pass_aggregate_in_memory(X, TY)
 
 

Modified: llvm-gcc-4.2/trunk/gcc/config/mips/llvm-mips-target.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/mips/llvm-mips-target.h?rev=130406&r1=130405&r2=130406&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/mips/llvm-mips-target.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/mips/llvm-mips-target.h Thu Apr 28 11:59:08 2011
@@ -27,7 +27,7 @@
 /* LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR - Return true if this aggregate
    value should be passed by value, i.e. passing its address with the byval
    attribute bit set. The default is false.  */
-#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY) \
+#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY, CC)     \
   llvm_mips_should_pass_aggregate_in_memory(X, TY)
 
 extern bool

Modified: llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h?rev=130406&r1=130405&r2=130406&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h Thu Apr 28 11:59:08 2011
@@ -3499,7 +3499,7 @@
 
 extern bool llvm_rs6000_should_pass_aggregate_byval(tree, const Type *);
 
-#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY)      \
+#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY, CC)     \
   llvm_rs6000_should_pass_aggregate_byval((X), (TY))
 
 extern bool llvm_rs6000_should_pass_vector_in_integer_regs(tree);

Modified: llvm-gcc-4.2/trunk/gcc/config/sparc/sparc.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/sparc/sparc.h?rev=130406&r1=130405&r2=130406&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/sparc/sparc.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/sparc/sparc.h Thu Apr 28 11:59:08 2011
@@ -2488,7 +2488,7 @@
  */
 #define LLVM_TARGET_NAME Sparc
 
-#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY) \
+#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY, CC)     \
   true
 
 #endif /* ENABLE_LLVM */

Modified: llvm-gcc-4.2/trunk/gcc/llvm-abi-default.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-abi-default.cpp?rev=130406&r1=130405&r2=130406&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-abi-default.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-abi-default.cpp Thu Apr 28 11:59:08 2011
@@ -117,7 +117,7 @@
 	  Attribute::constructAlignmentFromInt(LLVM_BYVAL_ALIGNMENT(type));
       }
     }
-  } else if (LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(type, Ty)) {
+  } else if (LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(type, Ty, C.getCallingConv())) {
     C.HandleByValArgument(Ty, type);
     if (Attributes) {
       *Attributes |= Attribute::ByVal;
@@ -144,7 +144,7 @@
 	// (We know there currently are no other such cases active because
 	// they would hit the assert in FunctionPrologArgumentConversion::
 	// HandleByValArgument.)
-	if (!LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(Ftype, FTy)) {
+	if (!LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(Ftype, FTy, C.getCallingConv())) {
 	  C.EnterField(FNo, Ty);
 	  HandleArgument(getDeclaredType(Field), ScalarElts);
 	  C.ExitField();

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=130406&r1=130405&r2=130406&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-abi.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-abi.h Thu Apr 28 11:59:08 2011
@@ -274,7 +274,7 @@
 // value should be passed by value, i.e. passing its address with the byval
 // attribute bit set. The default is false.
 #ifndef LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR
-#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY) \
+#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY, CC)     \
     false
 #endif
 

Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=130406&r1=130405&r2=130406&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Thu Apr 28 11:59:08 2011
@@ -437,7 +437,7 @@
 static bool isPassedByVal(tree type, const Type *Ty,
                           std::vector<const Type*> &ScalarArgs,
                           CallingConv::ID &CC) {
-  if (LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(type, Ty))
+  if (LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(type, Ty, CC))
     return true;
 
   std::vector<const Type*> Args;





More information about the llvm-commits mailing list