| /* APPLE LOCAL file Macintosh alignment */ |
| |
| /* { dg-do run } */ |
| /* { dg-options "-Wno-long-long" } */ |
| |
| /* |
| * Macintosh compiler alignment test for alignment extensions in GCC 3. |
| * Fred Forsman |
| * Apple Computer, Inc. |
| */ |
| |
| /* Check whether we are testing GCC 3 or later. */ |
| #ifdef __GNUC__ |
| #if __GNUC__ >= 3 |
| #define GCC3 1 |
| #endif |
| #endif |
| |
| #include <stdio.h> |
| #include <stddef.h> |
| #include <string.h> |
| |
| #define Q(x) #x, x |
| |
| typedef unsigned char UINT8; |
| typedef unsigned long UINT32; |
| |
| static int bad_option = 0; |
| static int flag_verbose = 0; |
| static int nbr_failures = 0; |
| |
| /* === alignment modes === */ |
| |
| typedef struct S1 { |
| UINT8 f1; |
| } S1; |
| |
| #ifndef __LP64__ |
| #pragma options align=mac68k |
| |
| typedef struct S2 { |
| UINT8 f1; |
| } S2; |
| #endif |
| |
| #pragma options align=native |
| |
| typedef struct S3 { |
| UINT8 f1; |
| } S3; |
| |
| #pragma options align=reset |
| /* Should be mac68k mode here. */ |
| |
| #ifndef __LP64__ |
| #pragma options align=reset |
| #endif |
| /* Should be power mode here. */ |
| |
| typedef struct S4 { |
| UINT8 f1; |
| double f2; |
| } S4; |
| |
| #pragma options align=natural |
| |
| typedef struct S5 { |
| UINT8 f1; |
| double f2; |
| } S5; |
| |
| typedef struct S6 { |
| UINT8 f1; |
| double f2; |
| UINT8 f3; |
| } S6; |
| |
| #pragma options align=reset |
| /* Should be power mode here. */ |
| |
| #pragma options align=packed |
| |
| typedef struct S7 { |
| UINT8 f1; |
| UINT32 f2; |
| } S7; |
| |
| #pragma options align=reset |
| /* Should be power mode here. */ |
| |
| typedef struct S8 { |
| UINT8 f1; |
| UINT32 f2; |
| } S8; |
| |
| static void check(char * rec_name, int actual, int expected32, int expected64, |
| int expected_ia32, char * comment) |
| { |
| int expected; |
| #ifdef __i386__ |
| expected = expected_ia32; |
| #else |
| expected = ((sizeof(char *) == 8) ? expected64 : expected32); |
| #endif |
| if (flag_verbose || (actual != expected)) { |
| printf("%-20s = %2d (%2d) ", rec_name, actual, expected); |
| if (actual != expected) { |
| printf("*** FAIL"); |
| nbr_failures++; |
| } else |
| printf(" PASS"); |
| printf(": %s\n", comment); |
| } |
| } |
| |
| static void check_option(char *option) |
| { |
| if (*option == '-') { |
| if (strcmp(option, "-v") == 0) |
| flag_verbose = 1; |
| else { |
| fprintf(stderr, "*** unrecognized option '%s'.\n", option); |
| bad_option = 1; |
| } |
| } else { |
| fprintf(stderr, "*** unrecognized option '%s'.\n", option); |
| bad_option = 1; |
| } |
| } |
| |
| int main(int argc, char *argv[]) |
| { |
| int i; |
| |
| for (i = 1; i < argc; i++) |
| check_option(argv[i]); |
| |
| if (bad_option) |
| return 1; |
| |
| #ifndef GCC3 |
| printf("This test requires GCC 3"); |
| return 1; |
| #endif |
| |
| check(Q(sizeof(S1)), 1, 1, 1, "struct with 1 char; power mode"); |
| #ifndef __LP64__ |
| check(Q(sizeof(S2)), 2, 2, 2, "struct with 1 char; mac68k mode"); |
| #endif |
| check(Q(sizeof(S3)), 1, 1, 1, "struct with 1 char; native mode"); |
| check(Q(sizeof(S4)), 12, 16, 12, "struct with char, double; power/natural mode"); |
| check(Q(offsetof(S4, f2)), 4, 8, 4, "offset of double in a struct with char, double; power/natural mode"); |
| check(Q(sizeof(S5)), 16, 16, 12, "struct with char, double; natural mode"); |
| check(Q(offsetof(S5, f2)), 8, 8, 4, "offset of double in a struct with char, double; natural mode"); |
| check(Q(sizeof(S6)), 24, 24, 16, "struct with char, double, char; natural mode"); |
| check(Q(sizeof(S7)), 5, 9, 5, "struct with char, long; packed mode"); |
| check(Q(sizeof(S8)), 8, 16, 8, "struct with char, long; power/natural mode"); |
| |
| if (nbr_failures > 0) |
| return 1; |
| else |
| return 0; |
| } |