[LLVMdev] fields in structure re-arranged for alignment?

Chris Lattner sabre at nondot.org
Mon Jul 16 11:36:09 PDT 2007


On Mon, 16 Jul 2007, Kean Lau wrote:
> Bear with me, I'm a newbie to LLVM.

Welcome,

> I've read the language reference and the mailing list archive. One area of
> the semantics of the Structure type that hasn't been discussed is whether
> fields in the structure get re-arranged to better suit the target machine's
> natural alignment, ala what happens in C.

> For example would this structure on a 32-bit machine:
> { i16, i32, i16 }
> get re-arranged to
> { i16, i16, i32 } or { i32, i16, i16 }

Ok.

> Does LLVM guarantee a consistent code generation in this case for all
> platforms, or is this considered target-specific and a decision left up to
> the back-end of the target platform?

There are two issues: codegen of a specific GEP/type and optimization. 
The code generator currently does very trivial structure layout.  If a 
struct is not "packed", it basically assigns fields sequentially 
consequtive addresses with internal and external padding to make 
alignment.  If the struct is packed, it does the same thing, but inserts 
no padding.

The LLVM optimizer guarantees that it preserves the semantics of the input 
code.  It would be valid for the optimizer to reorder fields, but only 
when it can tell that "noone will notice" (for example, the optimizer 
is not allowed to change the layout of memory-mapped io structs).

> Furthermore if re-arrangement does occur, how does this affect the semantics
> of GetElementPtr when it is used for pointer calculation of a Structure? For
> example if I had:
>
> %BLAH = type { i16, i32, i16 }
> ...
> %firstField = getelementptr %BLAH* %instance, i32 1, i32 0
>
> In this example I want to access the first 16-bit integer field of Structure
> BLAH, so the last argument to GetElementPtr is index 0, but if the fields
> gets re-arranged, how do I know which index to use?

If the optimizer rearranges a struct, it will rewrite all the GEPs to be 
consistent.

-Chris

-- 
http://nondot.org/sabre/
http://llvm.org/



More information about the llvm-dev mailing list