More C ABI questions with Clang

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

More C ABI questions with Clang

David Blaikie via cfe-dev
1. In x86 it seems like a lost opportunity not to lower a union like

> union Foo
> {
>   char x;
>   int y;
>   float z;
> };

To a float, since

> struct Foo
> {
>    float z;
> }

would be. Is it just an omission or what?

2. Is this ABI lowering reasonable on x64? Doesn’t the bitcast and consequent i64 load strictly speaking load things beyond the end of struct Foo as allocated in a?

> struct Foo
> {
>   int a;
>   char b;
> };
>
> struct Foo getFoo(int x)
> {
>   struct Foo a;
>   return a;
> }

To

> %struct.Foo = type { i32, i8 }
>
> define dso_local i64 @getFoo(i32 %0) #0 !dbg !7 {
>   %2 = alloca %struct.Foo, align 4
>   %3 = alloca i32, align 4
>   store i32 %0, i32* %3, align 4
>   %4 = bitcast %struct.Foo* %2 to i64*, !dbg !21
>   %5 = load i64, i64* %4, align 4, !dbg !21
>   ret i64 %5, !dbg !21
> }


/Christoffer

_______________________________________________
cfe-dev mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev