[Bug target/94452] New: I386 ABI: How to determine the alignment of struct or union determined when passes them on stack?

2020-04-01 Thread chen3.liu at intel dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94452

Bug ID: 94452
   Summary: I386 ABI: How to determine the alignment of struct or
union determined when passes them on stack?
   Product: gcc
   Version: unknown
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: target
  Assignee: unassigned at gcc dot gnu.org
  Reporter: chen3.liu at intel dot com
  Target Milestone: ---

For example:

#include 

typedef __attribute__((aligned(16))) int alignedint;
struct __attribute__((aligned(64))) X {
int x;
//__m128 y;
// alignedint y;
};

void g(int x, struct X);
_Static_assert(_Alignof(struct X) == 64);

struct X gx;

void f() {
g(1, gx);
}

In this case, the gx  will align to 4 byte. If we uncomment either the __m128
or alignedint y, and  gcc aligns to 64 bytes.

The logic of gcc alignment we now think is as below: 

StackAlignmentForType(T):
1.  If T's alignment is < 16 bytes(any type, including struct and union),
return 4.
2.  If T is a struct/union/array type, then:
•   recursively calculate on each member's type ( ignores any
attribute((aligned(N))) directly on the fields of a struct, but not those that
appear on typedefs, or the underlying types ?).
•   If all of those calls return alignments < 16, then return 4.
3.  Otherwise, return the alignment of T.

Is this logic correct for gcc?  We want to make clang compatible with gcc.

Thanks.

[Bug target/94452] I386 ABI: How to determine the alignment of struct or union determined when passes them on stack?

2020-04-02 Thread chen3.liu at intel dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94452

--- Comment #2 from ChenLiu  ---
(In reply to Richard Biener from comment #1)
> I see gx aligned to 64 bytes (as I expected).  Can you be more specific as
> to what target you tested?

I tested on i386 target. I think you may misunderstand what I mean. The gx will
align to 4 byte when passing it on stack. I think this should belong to calling
conventions.

[Bug target/94452] I386 ABI: How to determine the alignment of struct or union determined when passes them on stack?

2020-04-02 Thread chen3.liu at intel dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94452

--- Comment #3 from ChenLiu  ---
(In reply to Richard Biener from comment #1)
> I see gx aligned to 64 bytes (as I expected).  Can you be more specific as
> to what target you tested?

The gcc version I use is 7.3.0 and only one option was used: -m32.

[Bug target/94452] I386 ABI: How to determine the alignment arguments on the stack of struct or union for argument passing

2020-04-02 Thread chen3.liu at intel dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94452

--- Comment #5 from ChenLiu  ---
(In reply to Richard Biener from comment #4)
> (In reply to ChenLiu from comment #2)
> > (In reply to Richard Biener from comment #1)
> > > I see gx aligned to 64 bytes (as I expected).  Can you be more specific as
> > > to what target you tested?
> > 
> > I tested on i386 target. I think you may misunderstand what I mean. The gx
> > will align to 4 byte when passing it on stack. I think this should belong to
> > calling conventions.
> 
> Ah, OK.  IIRC the psABI does not factor in over/under alignment but only
> size and kind of (sub-)objects so eventually extra copy-in/out is required
> to have the callee see arguments of the desired alignment.
> 
> HJ can probably clarify.
> 
> Note bugzilla isn't really for this kind of questions, there's a psABI
> mailing list somewhere.

Thanks for your help.