Author: evancheng
Date: Thu Jan 17 19:47:03 2008
New Revision: 46157
URL: http://llvm.org/viewvc/llvm-project?rev=46157&view=rev
Log:
Do not pass zero sized array, struct, or class using byval attribute. This is
true on both x86-32 and x86-64.
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=46157&r1=46156&r2=46157&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 Jan 17 19:47:03
2008
@@ -62,10 +62,13 @@
} \
}
+extern bool llvm_x86_is_zero_sized_aggregate(tree);
extern bool llvm_x86_64_should_pass_aggregate_in_memory(tree);
#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X) \
- (!TARGET_64BIT || llvm_x86_64_should_pass_aggregate_in_memory(X))
+ (!llvm_x86_is_zero_sized_aggregate(X) && \
+ (!TARGET_64BIT || \
+ llvm_x86_64_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=46157&r1=46156&r2=46157&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 Thu Jan 17 19:47:03 2008
@@ -664,6 +664,15 @@
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. */
_______________________________________________
llvm-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits