1// { dg-do run { target i?86-*-linux* x86_64-*-linux* i?86-*-freebsd* } } 2// { dg-require-effective-target ilp32 } 3// { dg-options "-malign-double" } 4// Origin: Alex Samuel <samuel@codesourcery.com> 5 6/* Test the data layout of C aggregates by checking aggregate size and 7 alignment and field offsets for compliance with the IA-64 ABI. */ 8 9template<typename T> 10inline unsigned 11alignmentof () 12{ 13 struct S 14 { 15 char start_; 16 T object_; 17 }; 18 19 return (unsigned) & ((S *) 0)->object_; 20} 21 22/* Computes the alignment, in bytes, of TYPE. */ 23 24#define alignof(type) (alignmentof<type> ()) 25 26/* Computes the offset of FIELD in AGGREGATE. */ 27 28#define offsetof(aggregate, field) \ 29 ((unsigned) (& ((aggregate*) 0)->field)) 30 31 32/* Structs S1, S2, S3, S4, and union U5 are taken from Intel, "IA-64 33 Software Conventions and Runtime Architecture Guide", version of 34 August 1999. */ 35 36struct S1 37{ 38 char c; 39}; 40 41struct S2 42{ 43 char c; 44 char d; 45 short s; 46 int n; 47}; 48 49struct S3 50{ 51 char c; 52 short s; 53}; 54 55struct S4 56{ 57 char c; 58 double d; 59 short s; 60}; 61 62union U5 63{ 64 char c; 65 short s; 66 int j; 67}; 68 69 70 71int 72main () 73{ 74 if (sizeof (struct S1) != 1) 75 return 1; 76 if (alignof (struct S1) != 1) 77 return 2; 78 if (offsetof (struct S1, c) != 0) 79 return 3; 80 81 if (sizeof (struct S2) != 8) 82 return 4; 83 if (alignof (struct S2) != 4) 84 return 5; 85 if (offsetof (struct S2, c) != 0) 86 return 6; 87 if (offsetof (struct S2, d) != 1) 88 return 7; 89 if (offsetof (struct S2, s) != 2) 90 return 8; 91 if (offsetof (struct S2, n) != 4) 92 return 9; 93 94 if (sizeof (struct S3) != 4) 95 return 10; 96 if (alignof (struct S3) != 2) 97 return 11; 98 if (offsetof (struct S3, c) != 0) 99 return 12; 100 if (offsetof (struct S3, s) != 2) 101 return 13; 102 103 if (sizeof (struct S4) != 24) 104 return 14; 105 if (alignof (struct S4) != 8) 106 return 15; 107 if (offsetof (struct S4, c) != 0) 108 return 16; 109 if (offsetof (struct S4, d) != 8) 110 return 17; 111 if (offsetof (struct S4, s) != 16) 112 return 18; 113 114 if (sizeof (union U5) != 4) 115 return 19; 116 if (alignof (union U5) != 4) 117 return 20; 118 if (offsetof (union U5, c) != 0) 119 return 21; 120 if (offsetof (union U5, s) != 0) 121 return 22; 122 if (offsetof (union U5, j) != 0) 123 return 23; 124 125 return 0; 126} 127