[LLVMdev] Problem in llvm gcc back-end
Chris Lattner
sabre at nondot.org
Wed May 30 23:25:21 PDT 2007
On Mon, 28 May 2007, quho wrote:
> While I testing some code, I found some problem on Union handling.
> I've wrte following test code, and it has union assignment.
BTW, this is fixed in mainline now. Thanks for the report.
-Chris
> The code's output is
>
> from pointerToUnion: chars mystring, length 64
> from original: chars mystring, length 8000
>
> It's caused by second char member(charlength) of LongestMember.
>
> For union assignment, llvm-backend seems generates assigning each
> member of largest union member. (I've checked it on llvm assembly
> level..)
> But sometimes there is padding between members and it's different for members.
>
> So in my opinion you should handle union assignment as pseudo array of
> word(or byte).
> (it's same for argument passing..)
>
>
> =====================================================
> #include <stdio.h>
>
> struct MyString {
> char *chars;
> int length;
> };
>
> struct LongestMember {
> char *chars;
> char charlength;
> int empty1;
> int empty2;
> };
>
> typedef union {
> MyString string;
> LongestMember mt;
> } UnionType;
>
>
> int main() {
> UnionType original;
> UnionType *pointerToUnion;
> UnionType buffer;
>
> pointerToUnion = &buffer;
>
> original.string.chars = "mystring";
> original.string.length = 8000;
>
> *pointerToUnion = original;
>
> printf("from pointerToUnion: chars %s, length %d\n",
> pointerToUnion->string.chars, pointerToUnion->string.length);
> printf("from original: chars %s, length %d\n",
> original.string.chars, original.string.length);
> }
> =====================================================
>
>
> Thanks,
> Quho.
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-Chris
--
http://nondot.org/sabre/
http://llvm.org/
More information about the llvm-dev
mailing list