[LLVMdev] an llvm-gcc bug

Duncan Sands baldrick at free.fr
Tue Feb 12 23:35:19 PST 2008


Hi Dale,

> Here's a cute bug in llvm-gcc's struct translation:
> 
> struct S242 { char * a;int b[1]; } ;
> struct S93 { __attribute__((aligned (8))) void * a; } ;
> 
> The second example is padded out to 8 bytes, so both of these look like
> { i8 *, [1 x i32] }
> This leads the "struct type factory" StructType::get to think they are  
> the same.
> But, the second field is marked as Padding in the second case but not  
> the first,
> and CopyAggregate does not copy Padding.  When the second type
> goes through ConvertType, it is converted to the same llvm Type as the  
> first type,
> and the StructTypeConversionInfo info is replaced; later copies of the  
> first type
> then think they don't have to copy the padding, producing wrong code.

there's some mucking around with padding in ConvertUNION presumably
because someone noticed a problem of this kind there.

> I'm inclined to remove skipping the Padding in CopyAggregate; that's  
> at best an unimportant optimization, and could result in code that's  
> slower than doing a straightforward rep;movsl or equivalent.

The padding info is used when doing an element by element copy instead
of a memcpy (done for small objects in the hope of being faster).

> Alternatively I can take the Padding bit into account in the  
> StructType::get code somehow.  Anyone have a strong opinion?

Shouldn't it be a map from the gcc type to the padding info?
That said, you can get rid of the padding info as far as I'm
concerned.  However Chris might have a different opinion - I
think he introduced it.

Ciao,

Duncan.



More information about the llvm-dev mailing list