EricWF marked 2 inline comments as done.
EricWF added a comment.

@jyknight wrote:

> And then use that to determine whether to add float128 to the union?


Note that `max_align_t` isn't a union of these types, but a struct containing 
all of them. This seems like a bug to me, but it's what GNU happens to do. God 
knows why?



================
Comment at: lib/Headers/__stddef_max_align_t.h:40
       __attribute__((__aligned__(__alignof__(long double))));
+#ifdef __i386__
+  __float128 __clang_max_align_nonce3
----------------
jyknight wrote:
> uweigand wrote:
> > jyknight wrote:
> > > Can you fix clang to consistently define `__SIZEOF_FLOAT128__` in 
> > > InitPreprocessor alongside the rest of the SIZEOF macros?
> > > 
> > > And then use that to determine whether to add float128 to the union? This 
> > > change, as is, will break on any target which is i386 but doesn't define 
> > > __float128, e.g. i386-unknown-unknown.
> > > 
> > > The only additional target which will be modified with that (that is: the 
> > > only other target which has a float128 type, but for which max_align 
> > > isn't already 16) is systemz-*-linux.
> > > 
> > > But I think that's actually indicating a pre-existing bug in the SystemZ 
> > > config -- it's configured for a 16-byte long double, with 8-byte 
> > > alignment, but the ABI doc seems to call for 16-byte alignment. +Ulrich 
> > > for comment on that.
> > That's a bug in the ABI doc which we'll fix once we get around to releasing 
> > an updated version.
> > 
> > long double on SystemZ must be 8-byte aligned, which is the maximum 
> > alignment of all standard types on Z, and this was chosen because 
> > historically the ABI only guarantees an 8-byte stack alignment, so 16-byte 
> > aligned standard types would be awkward.
> Then perhaps it's a bug that `__alignof__(__float128)` returns 16 with 
> `-target systemz-linux`?
@jyknight Ack. I'll add `__SIZEOF_FLOAT128__`.


================
Comment at: lib/Headers/__stddef_max_align_t.h:44
+#endif
 } max_align_t;
 #endif
----------------
rsmith wrote:
> I don't want to hold up the immediate fix in this patch for this, but... we 
> should move the definition of this type from the header into clang itself, 
> like we do for (say) `__builtin_va_list`, and here just define
> 
> `typedef __builtin_max_align_t max_align_t;`
> 
> That way Clang can synthesize a struct of whatever size and alignment 
> appropriate from an ABI perspective (or can use the relevant builtin type for 
> platforms that typedef `max_align_t` to a builtin type). That'd also remove 
> the need for an awkward factored-out header file here.
I'll try to implement this over the weekend. As long as I can land the Clang 
fix required for libc++ cleanup before the next release.


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D55057/new/

https://reviews.llvm.org/D55057



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to