aboutsummaryrefslogtreecommitdiffstats
path: root/cil/src/machdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'cil/src/machdep.c')
-rw-r--r--cil/src/machdep.c220
1 files changed, 220 insertions, 0 deletions
diff --git a/cil/src/machdep.c b/cil/src/machdep.c
new file mode 100644
index 00000000..11348653
--- /dev/null
+++ b/cil/src/machdep.c
@@ -0,0 +1,220 @@
+/*
+ *
+ * Copyright (c) 2001-2002,
+ * George C. Necula <necula@cs.berkeley.edu>
+ * Scott McPeak <smcpeak@cs.berkeley.edu>
+ * Wes Weimer <weimer@cs.berkeley.edu>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. The names of the contributors may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "../config.h"
+
+#include <stdio.h>
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_WCHAR_H
+#include <wchar.h>
+#endif
+
+#ifdef _GNUCC
+#define LONGLONG long long
+#define CONST_STRING_LITERALS "true"
+#define VERSION __VERSION__
+#define VERSION_MAJOR __GNUC__
+#define VERSION_MINOR __GNUC_MINOR__
+#endif
+
+#ifdef _MSVC
+#define LONGLONG __int64
+#define CONST_STRING_LITERALS "false"
+#define VERSION "0"
+#define VERSION_MAJOR 0
+#define VERSION_MINOR 0
+#endif
+
+/* The type for the machine dependency structure is generated from the
+ Makefile */
+int main() {
+ fprintf(stderr, "Generating machine dependency information for CIL\n");
+
+ printf("(* Generated by code in %s *)\n", __FILE__);
+ printf("\t version_major = %d;\n", VERSION_MAJOR);
+ printf("\t version_minor = %d;\n", VERSION_MINOR);
+ printf("\t version = \"%s\";\n", VERSION);
+ // Size of certain types
+ printf("\t sizeof_short = %d;\n", sizeof(short));
+ printf("\t sizeof_int = %d;\n", sizeof(int));
+ printf("\t sizeof_long = %d;\n", sizeof(long));
+ printf("\t sizeof_longlong = %d;\n", sizeof(LONGLONG));
+ printf("\t sizeof_ptr = %d;\n", sizeof(int *));
+ printf("\t sizeof_enum = %d;\n", sizeof(enum e { ONE, TWO }));
+ printf("\t sizeof_float = %d;\n", sizeof(float));
+ printf("\t sizeof_double = %d;\n", sizeof(double));
+ printf("\t sizeof_longdouble = %d;\n", sizeof(long double));
+ printf("\t sizeof_sizeof = %d;\n", sizeof(sizeof(int)));
+ printf("\t sizeof_wchar = %d;\n", sizeof(wchar_t));
+ printf("\t sizeof_void = %d;\n", sizeof(void));
+ printf("\t sizeof_fun = %d;\n",
+#ifdef __GNUC__
+ sizeof(main)
+#else
+ 0
+#endif
+ );
+
+ // The alignment of a short
+ {
+ struct shortstruct {
+ char c;
+ short s;
+ };
+ printf("\t alignof_short = %d;\n",
+ (int)(&((struct shortstruct*)0)->s));
+ }
+
+ // The alignment of an int
+ {
+ struct intstruct {
+ char c;
+ int i;
+ };
+ printf("\t alignof_int = %d;\n",
+ (int)(&((struct intstruct*)0)->i));
+ }
+
+ // The alignment of a long
+ {
+ struct longstruct {
+ char c;
+ long l;
+ };
+ printf("\t alignof_long = %d;\n",
+ (int)(&((struct longstruct*)0)->l));
+ }
+
+ // The alignment of long long
+ {
+ struct longlong {
+ char c;
+ LONGLONG ll;
+ };
+ printf("\t alignof_longlong = %d;\n",
+ (int)(&((struct longlong*)0)->ll));
+ }
+
+ // The alignment of a ptr
+ {
+ struct ptrstruct {
+ char c;
+ int * p;
+ };
+ printf("\t alignof_ptr = %d;\n",
+ (int)(&((struct ptrstruct*)0)->p));
+ }
+
+ // The alignment of an enum
+ {
+ struct enumstruct {
+ char c;
+ enum e2 { THREE, FOUR, FIVE } e;
+ };
+ printf("\t alignof_enum = %d;\n",
+ (int)(&((struct enumstruct*)0)->e));
+ }
+
+ // The alignment of a float
+ {
+ struct floatstruct {
+ char c;
+ float f;
+ };
+ printf("\t alignof_float = %d;\n",
+ (int)(&((struct floatstruct*)0)->f));
+ }
+
+ // The alignment of double
+ {
+ struct s1 {
+ char c;
+ double d;
+ };
+ printf("\t alignof_double = %d;\n",
+ (int)(&((struct s1*)0)->d));
+ }
+
+ // The alignment of long double
+ {
+ struct s1 {
+ char c;
+ long double ld;
+ };
+ printf("\t alignof_longdouble = %d;\n",
+ (int)(&((struct s1*)0)->ld));
+ }
+
+ printf("\t alignof_str = %d;\n",
+#ifdef __GNUC__
+ __alignof("a string")
+#else
+ 0
+#endif
+ );
+
+ printf("\t alignof_fun = %d;\n",
+#ifdef __GNUC__
+ __alignof(main)
+#else
+ 0
+#endif
+ );
+
+ // Whether char is unsigned
+ printf("\t char_is_unsigned = %s;\n",
+ ((char)0xff) > 0 ? "true" : "false");
+
+
+ // Whether string literals contain constant characters
+ puts("\t const_string_literals = " CONST_STRING_LITERALS ";");
+
+
+ // endianity
+ {
+ int e = 0x11223344;
+ printf("\t little_endian = %s;\n",
+ (0x44 == *(char*)&e) ? "true" :
+ ((0x11 == *(char*)&e) ? "false" : (exit(1), "false")));
+ }
+
+ exit(0);
+}