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 llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits