/* 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;
}
