[llvm-commits] [llvm-gcc-4.2] r46164 - in /llvm-gcc-4.2/trunk/gcc/config/i386: llvm-i386-target.h llvm-i386.cpp
Evan Cheng
evan.cheng at apple.com
Fri Jan 18 10:35:19 PST 2008
Author: evancheng
Date: Fri Jan 18 12:35:18 2008
New Revision: 46164
URL: http://llvm.org/viewvc/llvm-project?rev=46164&view=rev
Log:
i32 / i64 all integer structs are not passed byval.
Modified:
llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h
llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp
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=46164&r1=46163&r2=46164&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 Fri Jan 18 12:35:18 2008
@@ -62,13 +62,10 @@
} \
}
-extern bool llvm_x86_is_zero_sized_aggregate(tree);
-extern bool llvm_x86_64_should_pass_aggregate_in_memory(tree);
+extern bool llvm_x86_should_pass_aggregate_in_memory(tree);
#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X) \
- (!llvm_x86_is_zero_sized_aggregate(X) && \
- (!TARGET_64BIT || \
- llvm_x86_64_should_pass_aggregate_in_memory(X)))
+ llvm_x86_should_pass_aggregate_in_memory(X)
/* LLVM LOCAL end (ENTIRE FILE!) */
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=46164&r1=46163&r2=46164&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 Jan 18 12:35:18 2008
@@ -664,23 +664,43 @@
extern "C" enum machine_mode ix86_getNaturalModeForType(tree);
extern "C" int ix86_HowToPassArgument(enum machine_mode, tree, int, int*, int*);
-/* Target hook for llvm-abi.h. It returns true if the specified type is a
- zero sized array, struct, or class. */
-bool llvm_x86_is_zero_sized_aggregate(tree type) {
- enum machine_mode Mode = ix86_getNaturalModeForType(type);
- HOST_WIDE_INT Bytes =
- (Mode == BLKmode) ? int_size_in_bytes(type) : (int) GET_MODE_SIZE(Mode);
- return Bytes == 0;
-}
-
/* Target hook for llvm-abi.h. It returns true if an aggregate of the
specified type should be passed in memory. This is only called for
x86-64. */
-bool llvm_x86_64_should_pass_aggregate_in_memory(tree type) {
+static bool llvm_x86_64_should_pass_aggregate_in_memory(tree type,
+ enum machine_mode Mode){
int IntRegs, SSERegs;
- enum machine_mode Mode = ix86_getNaturalModeForType(type);
/* If ix86_HowToPassArgument return 0, then it's passed byval in memory.*/
return !ix86_HowToPassArgument(Mode, type, 0, &IntRegs, &SSERegs);
}
+/* Target hook for llvm-abi.h. It returns true if an aggregate of the
+ specified type should be passed in memory. */
+bool llvm_x86_should_pass_aggregate_in_memory(tree type) {
+ enum machine_mode Mode = ix86_getNaturalModeForType(type);
+ HOST_WIDE_INT Bytes =
+ (Mode == BLKmode) ? int_size_in_bytes(type) : (int) GET_MODE_SIZE(Mode);
+
+ // Zero sized array, struct, or class, not passed in memory.
+ if (Bytes == 0)
+ return false;
+
+ if (Bytes == GET_MODE_SIZE(SImode) || Bytes == GET_MODE_SIZE(DImode)) {
+ // 32-bit or 64-bit and all elements are integers, not passed in memory.
+ bool AllIntegers = true;
+ const Type *Ty = ConvertType(type);
+ for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end();
+ I != E; ++I)
+ if (!I->get()->isIntOrIntVector()) {
+ AllIntegers = false;
+ break;
+ }
+ if (AllIntegers)
+ return false;
+ }
+ if (!TARGET_64BIT)
+ return true;
+ return llvm_x86_64_should_pass_aggregate_in_memory(type, Mode);
+}
+
/* LLVM LOCAL end (ENTIRE FILE!) */
More information about the llvm-commits
mailing list