[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