[LLVMdev] Proposed: first class packed structures

Chris Lattner clattner at apple.com
Thu Dec 7 22:17:55 PST 2006


On Dec 6, 2006, at 1:58 PM, Andrew Lenharth wrote:

> The attached patch (gcc.patch) implements the gcc portion of packed
> types.  I have only tested this on a few examples, so I may be missing
> some type conversions somewhere.
>
> The gcc patch requires llvm_extra.patch, not included in the  
> previous emails.
>
> Andrew
> <llvm_extra.patch>

llvm_extra.patch is fine, it can go in with the rest.

> <gcc.patch>

This patch isn't sufficient for two reasons: 1) it will turn structs  
that don't need to be packed into packed llvm structs.  2) it won't  
turn some that should be packed llvm structs into packed structs  
(e.g. strange ABI considerations force a field to be unaligned, not  
an attribute at the source level).

Here's an example of #1:
   extern struct { int x;  int y;  int z; } __attribute((packed)) foos;;
This should just be {int,int,int}, not <{int,int,int}>.


The approach I'd like to see is:

StructTypeConversionInfo should have a bool field "Packed" that is  
initialized to false.

As fields are added to StructTypeConversionInfo, there are three cases:

1. GCC wants the field to be at an offset equal to where LLVM would  
place it.  Just add the field.
2. GCC wants to place the field at an offset further from where llvm  
would place it.  Just add enough dummy fields to pad it over to where  
it needs to be.
3. GCC wants to place the field at an offset closer to where LLVM  
would place it.  When this happens, the current struct is marked  
packed and the existing fields have 'spacers' put in between them if  
necessary.

This ensures we only make things 'llvm packed' if needed, and should  
allow the logic to be significantly simplified.

Seem reasonable?

-Chris


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20061207/ba8080b0/attachment.html>


More information about the llvm-dev mailing list