align-test-4.c
来自「Mac OS X 10.4.9 for x86 Source Code gcc」· C语言 代码 · 共 234 行
C
234 行
/* APPLE LOCAL file Macintosh alignment *//* { dg-do run } *//* { dg-options "-Wno-long-long" } *//* * GCC alignment test for bit-fields. * This came up initially as an alignment problem in the kernel. * Fred Forsman * Apple Computer, Inc. */ /* Check whether we are testing GCC 3 or later. */#ifdef __GNUC__#if __GNUC__ >= 3#define GCC3 1#else#define GCC3 0#endif#endif#include <stdio.h>#include <stddef.h>#include <string.h>/* * The following defined determines whether we should compare against * the values produced by GCC 2.95 or against the values I expect given * my understanding of the alignment rules. */#define USE_GCC2_VALUES 1#define NAME2(name,mode) mode##_##name#define NAME(name,mode) NAME2(name,mode)#define STR(s) #s#define SIZEOF3(name) STR(sizeof(name)), sizeof(name)#define SIZEOF2(name,mode) SIZEOF3(mode##_##name)#define SIZEOF(name,mode) SIZEOF2(name,mode)#define OFFSETOF3(name,field) STR(offsetof(name,field)), offsetof(name,field)#define OFFSETOF2(name,mode,field) OFFSETOF3(mode##_##name,field)#define OFFSETOF(name,mode,field) OFFSETOF2(name,mode,field)typedef unsigned char UINT8;typedef unsigned long UINT32;static int bad_option = 0;static int flag_verbose = 0;static int nbr_failures = 0;/* === mac68k alignment problem in kernel === */typedef unsigned PEF_UBits32, ByteCount;typedef short SInt16;/* === power === */#pragma options align=power#define MODE power#include "align-test-4.h"#ifndef __LP64__/* === mac68k === */#pragma options align=mac68k#undef MODE#define MODE mac68k#include "align-test-4.h"#endif/* === pack(2) === */#pragma pack(2)#undef MODE#define MODE pack2#include "align-test-4.h"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("%-30s = %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;#undef MODE#define MODE power#if USE_GCC2_VALUES check(SIZEOF(LoaderExport, MODE), 12, 12, 12, "kernel struct"); check(OFFSETOF(LoaderExport, MODE, offset), 4, 4, 4, "offset of offset"); check(OFFSETOF(LoaderExport, MODE, sectionNumber), 8, 8, 8, "offset of sectionNumber"); check(SIZEOF(S1, MODE), 8, 8, 8, "bitfields & char"); check(SIZEOF(S2, MODE), 8, 8, 8, "int & char"); check(SIZEOF(S3, MODE), 12, 12, 12, "char, bitfields(32), char"); check(OFFSETOF(S3, MODE, f3), 8, 8, 8, "offset of 2nd char"); check(SIZEOF(S4, MODE), 8, 8, 8, "char, bitfields(32), char"); check(OFFSETOF(S4, MODE, f3), 7, 7, 7, "offset of 2nd char"); check(SIZEOF(S5, MODE), 4, 4, 4, "char, bitfields(16), char"); check(OFFSETOF(S5, MODE, f3), 3, 3, 3, "offset of 2nd char"); check(SIZEOF(S6, MODE), 4, 4, 4, "char, bitfields(8), char"); check(OFFSETOF(S6, MODE, f3), 2, 2, 2, "offset of 2nd char");#else check(SIZEOF(LoaderExport, MODE), 12, 12, "kernel struct"); check(OFFSETOF(LoaderExport, MODE, offset), 4, 4, "offset of offset"); check(OFFSETOF(LoaderExport, MODE, sectionNumber), 8, 8, "offset of sectionNumber"); check(SIZEOF(S1, MODE), 8, 8, "bitfields & char"); check(SIZEOF(S2, MODE), 8, 8, "int & char"); check(SIZEOF(S3, MODE), 12, 12, "char, bitfields(32), char"); check(OFFSETOF(S3, MODE, f3), 8, 8, "offset of 2nd char"); check(SIZEOF(S4, MODE), 12, 12, "char, bitfields(32), char"); check(OFFSETOF(S4, MODE, f3), 8, 8, "offset of 2nd char"); check(SIZEOF(S5, MODE), 12, 12, "char, bitfields(16), char"); check(OFFSETOF(S5, MODE, f3), 8, 8, "offset of 2nd char"); check(SIZEOF(S6, MODE), 12, 12, "char, bitfields(8), char"); check(OFFSETOF(S6, MODE, f3), 8, 8, "offset of 2nd char");#endif#ifndef __LP64__#undef MODE#define MODE mac68k#if USE_GCC2_VALUES check(SIZEOF(LoaderExport, MODE), 10, 10, 10, "kernel struct"); check(OFFSETOF(LoaderExport, MODE, offset), 4, 4, 4, "offset of offset"); check(OFFSETOF(LoaderExport, MODE, sectionNumber), 8, 8, 8, "offset of sectionNumber");#if 1 // GCC 2 is wrong on the following. check(SIZEOF(S1, MODE), 6, 6, 6, "bitfields & char");#else check(SIZEOF(S1, MODE), 8, 8, "bitfields & char");#endif check(SIZEOF(S2, MODE), 6, 6, 6, "int & char"); check(SIZEOF(S3, MODE), 6, 6, 6, "char, bitfields(32), char"); check(OFFSETOF(S3, MODE, f3), 5, 5, 5, "offset of 2nd char"); check(SIZEOF(S4, MODE), 6, 6, 6, "char, bitfields(32), char"); check(OFFSETOF(S4, MODE, f3), 5, 5, 5, "offset of 2nd char"); check(SIZEOF(S5, MODE), 4, 4, 4, "char, bitfields(16), char"); check(OFFSETOF(S5, MODE, f3), 3, 3, 3, "offset of 2nd char"); check(SIZEOF(S6, MODE), 4, 4, 4, "char, bitfields(8), char"); check(OFFSETOF(S6, MODE, f3), 2, 2, 2, "offset of 2nd char");#else check(SIZEOF(LoaderExport, MODE), 10, 10, "kernel struct"); check(OFFSETOF(LoaderExport, MODE, offset), 4, 4, "offset of offset"); check(OFFSETOF(LoaderExport, MODE, sectionNumber), 8, 8, "offset of sectionNumber"); check(SIZEOF(S1, MODE), 6, 6, "bitfields & char"); check(SIZEOF(S2, MODE), 6, 6, "int & char"); check(SIZEOF(S3, MODE), 8, 8, "char, bitfields(32), char"); check(OFFSETOF(S3, MODE, f3), 6, 6, "offset of 2nd char"); check(SIZEOF(S4, MODE), 8, 8, "char, bitfields(32), char"); check(OFFSETOF(S4, MODE, f3), 6, 6, "offset of 2nd char"); check(SIZEOF(S5, MODE), 6, 6, "char, bitfields(16), char"); check(OFFSETOF(S5, MODE, f3), 4, 4, "offset of 2nd char"); check(SIZEOF(S6, MODE), 4, 4, "char, bitfields(8), char"); check(OFFSETOF(S6, MODE, f3), 2, 2, "offset of 2nd char");#endif#endif /* n __LP64__ */#undef MODE#define MODE pack2#if USE_GCC2_VALUES check(SIZEOF(LoaderExport, MODE), 10, 10, 10, "kernel struct"); check(OFFSETOF(LoaderExport, MODE, offset), 4, 4, 4, "offset of offset"); check(OFFSETOF(LoaderExport, MODE, sectionNumber), 8, 8, 8, "offset of sectionNumber"); /* GCC2 used to have this as '8', but it should really be 6. */ check(SIZEOF(S1, MODE), 6, 6, 6, "bitfields & char"); check(SIZEOF(S2, MODE), 6, 6, 6, "int & char"); check(SIZEOF(S3, MODE), 6, 6, 6, "char, bitfields(32), char"); check(OFFSETOF(S3, MODE, f3), 5, 5, 5, "offset of 2nd char"); check(SIZEOF(S4, MODE), 6, 6, 6, "char, bitfields(32), char"); check(OFFSETOF(S4, MODE, f3), 5, 5, 5, "offset of 2nd char"); check(SIZEOF(S5, MODE), 4, 4, 4, "char, bitfields(16), char"); check(OFFSETOF(S5, MODE, f3), 3, 3, 3, "offset of 2nd char"); check(SIZEOF(S6, MODE), 4, 4, 4, "char, bitfields(8), char"); check(OFFSETOF(S6, MODE, f3), 2, 2, 2, "offset of 2nd char");#else check(SIZEOF(LoaderExport, MODE), 10, 10, "kernel struct"); check(OFFSETOF(LoaderExport, MODE, offset), 4, 4, "offset of offset"); check(OFFSETOF(LoaderExport, MODE, sectionNumber), 8, 8, "offset of sectionNumber"); check(SIZEOF(S1, MODE), 6, 6, "bitfields & char"); check(SIZEOF(S2, MODE), 6, 6, "int & char"); check(SIZEOF(S3, MODE), 8, 8, "char, bitfields(32), char"); check(OFFSETOF(S3, MODE, f3), 6, 6, "offset of 2nd char"); check(SIZEOF(S4, MODE), 8, 8, "char, bitfields(32), char"); check(OFFSETOF(S4, MODE, f3), 6, 6, "offset of 2nd char"); check(SIZEOF(S5, MODE), 6, 6, "char, bitfields(16), char"); check(OFFSETOF(S5, MODE, f3), 4, 4, "offset of 2nd char"); check(SIZEOF(S6, MODE), 4, 4, "char, bitfields(8), char"); check(OFFSETOF(S6, MODE, f3), 2, 2, "offset of 2nd char");#endif if (nbr_failures > 0) return 1; else return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?