[llvm-commits] [llvm-gcc-4.2] r86892 - /llvm-gcc-4.2/trunk/gcc/llvm-abi.h

Bob Wilson bob.wilson at apple.com
Thu Nov 12 17:14:04 PST 2009


On Nov 12, 2009, at 5:08 PM, Dale Johannesen wrote:

>
> On Nov 12, 2009, at 4:44 PMPST, Dale Johannesen wrote:
>
>>
>> On Nov 11, 2009, at 3:05 PMPST, Bob Wilson wrote:
>>
>>> Author: bwilson
>>> Date: Wed Nov 11 17:05:45 2009
>>> New Revision: 86892
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=86892&view=rev
>>> Log:
>>> Fix pr5406: When passing an aggregate in integer registers, the  
>>> data cannot
>>> be split up into integer types smaller than the target registers.   
>>> Most of
>>> the data is put into an array of i32 or i64 values, and that part  
>>> is OK.  But,
>>> if the size is not a multiple of 32 or 64, there may be some  
>>> leftover bytes
>>> to be passed separately.  Change to pass those leftover bytes in a  
>>> single
>>> integer.  The x86_64 target already does this in target-specific  
>>> code.
>>> This also fixes radars 7226380 and 7226213.
>>
>> This patch broke binary compatibility on Darwin PPC, as shown by  
>> running gcc's struct-layout-1 tests to compare against the  
>> installed compiler.   (The last 2 bytes of a 6-byte struct (for  
>> example) are passed left justified within a word on that target.)
>
> Also, can't this result in reading bytes off the end of the struct?   
> That isn't safe if the load crosses a page boundary.
>

You may very well be right.  I was following the precedent of the  
x86-64 code, which has this comment:

/// .... This means we'll be loading bytes off the end of the object
/// in some cases.  That's what gcc does, so it must be OK, right?   
Right?

(before the llvm_x86_should_pass_aggregate_in_integer_regs function).



More information about the llvm-commits mailing list