about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorrajdakin <rajdakin@gmail.com>2024-09-20 17:06:25 +0200
committerGitHub <noreply@github.com>2024-09-20 17:06:25 +0200
commite18846fac57c6b75fe9d918034159415e73c20cd (patch)
tree68513d9973e59ec2a606ab0acd0a8b980ac105f9
parent4aeb8ea1b037f8db84837f723253133277d0995b (diff)
downloadbox64-e18846fac57c6b75fe9d918034159415e73c20cd.tar.gz
box64-e18846fac57c6b75fe9d918034159415e73c20cd.zip
[WRAPPERHELPER] Fixed some bugs, added partial multiarch support (#1847)
-rw-r--r--wrapperhelper/include-override/aarch64/bits/pthreadtypes-arch.h47
-rw-r--r--wrapperhelper/include-override/aarch64/stdc-predef.h672
-rw-r--r--wrapperhelper/include-override/common/stdc-predef.h4
-rw-r--r--wrapperhelper/include-override/x86_64/bits/pthreadtypes-arch.h55
-rw-r--r--wrapperhelper/include-override/x86_64/stdc-predef.h18
-rw-r--r--wrapperhelper/src/generator.c83
-rw-r--r--wrapperhelper/src/generator.h6
-rw-r--r--wrapperhelper/src/lang.c1
-rw-r--r--wrapperhelper/src/machine.c94
-rw-r--r--wrapperhelper/src/machine.h9
-rw-r--r--wrapperhelper/src/parse.c65
11 files changed, 640 insertions, 414 deletions
diff --git a/wrapperhelper/include-override/aarch64/bits/pthreadtypes-arch.h b/wrapperhelper/include-override/aarch64/bits/pthreadtypes-arch.h
new file mode 100644
index 00000000..5fe9577f
--- /dev/null
+++ b/wrapperhelper/include-override/aarch64/bits/pthreadtypes-arch.h
@@ -0,0 +1,47 @@
+/* Copyright (C) 2002-2024 Free Software Foundation, Inc.
+
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _BITS_PTHREADTYPES_ARCH_H
+#define _BITS_PTHREADTYPES_ARCH_H	1
+
+#include <bits/endian.h>
+
+#ifdef __ILP32__
+# define __SIZEOF_PTHREAD_ATTR_T        32
+# define __SIZEOF_PTHREAD_MUTEX_T       32
+# define __SIZEOF_PTHREAD_MUTEXATTR_T    4
+# define __SIZEOF_PTHREAD_CONDATTR_T     4
+# define __SIZEOF_PTHREAD_RWLOCK_T      48
+# define __SIZEOF_PTHREAD_BARRIER_T     20
+# define __SIZEOF_PTHREAD_BARRIERATTR_T  4
+#else
+# define __SIZEOF_PTHREAD_ATTR_T        64
+# define __SIZEOF_PTHREAD_MUTEX_T       48
+# define __SIZEOF_PTHREAD_MUTEXATTR_T    8
+# define __SIZEOF_PTHREAD_CONDATTR_T     8
+# define __SIZEOF_PTHREAD_RWLOCK_T      56
+# define __SIZEOF_PTHREAD_BARRIER_T     32
+# define __SIZEOF_PTHREAD_BARRIERATTR_T  8
+#endif
+#define __SIZEOF_PTHREAD_COND_T         48
+#define __SIZEOF_PTHREAD_RWLOCKATTR_T	8
+
+#define __LOCK_ALIGNMENT
+#define __ONCE_ALIGNMENT
+
+#endif	/* bits/pthreadtypes.h */
diff --git a/wrapperhelper/include-override/aarch64/stdc-predef.h b/wrapperhelper/include-override/aarch64/stdc-predef.h
index bc1f5de3..b2609a3c 100644
--- a/wrapperhelper/include-override/aarch64/stdc-predef.h
+++ b/wrapperhelper/include-override/aarch64/stdc-predef.h
@@ -1,4 +1,65 @@
-#define __aarch64__ 1
+// C standard
+#define __STDC__         1
+#define __STDC_HOSTED__  1
+#define __STDC_UTF_16__  1
+#define __STDC_UTF_32__  1
+#define __STDC_VERSION__ 201710L
+// Generic aarch64 infos
+#define __ELF__                 1
+#define __NO_INLINE__           1
+#define __ORDER_BIG_ENDIAN__    4321
+#define __ORDER_LITTLE_ENDIAN__ 1234
+#define __ORDER_PDP_ENDIAN__    3412
+#define __PIC__                 2
+#define __pic__                 2
+#define __PIE__                 2
+#define __pie__                 2
+#define __USER_LABEL_PREFIX__
+#define __gnu_linux__           1
+#define __linux__               1
+#define __linux                 1
+#define linux                   1
+#define __unix__                1
+#define __unix                  1
+#define unix                    1
+// GCC
+//#define __GCC_ASM_FLAG_OUTPUTS__ 1
+//#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
+//#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
+//#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
+//#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
+//#define __GCC_ATOMIC_INT_LOCK_FREE 2
+//#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
+//#define __GCC_ATOMIC_LONG_LOCK_FREE 2
+//#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
+//#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
+//#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
+//#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
+//#define __GCC_CONSTRUCTIVE_SIZE 64
+//#define __GCC_DESTRUCTIVE_SIZE 256
+//#define __GCC_HAVE_DWARF2_CFI_ASM 1
+//#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
+//#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
+//#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
+//#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
+//#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 1
+//#define __GCC_IEC_559 2
+//#define __GCC_IEC_559_COMPLEX 2
+//#define __GNUC__ 14
+//#define __GNUC_EXECUTION_CHARSET_NAME "UTF-8"
+//#define __GNUC_MINOR__ 2
+//#define __GNUC_PATCHLEVEL__ 0
+//#define __GNUC_STDC_INLINE__ 1
+//#define __GNUC_WIDE_EXECUTION_CHARSET_NAME "UTF-32LE"
+//#define __GXX_ABI_VERSION 1019
+//#define __PRAGMA_REDEFINE_EXTNAME 1
+//#define __VERSION__ "14.2.0"
+// Specific aarch64 architecture
+#define __FINITE_MATH_ONLY__          0
+#define __HAVE_SPECULATION_SAFE_VALUE 1
+#define __LP64__                      1
+#define _LP64                         1
+#define __REGISTER_PREFIX__
 #define __AARCH64_CMODEL_SMALL__ 1
 #define __AARCH64EL__ 1
 #define __ARM_64BIT_STATE 1
@@ -16,406 +77,349 @@
 #define __ARM_FP 14
 #define __ARM_FP16_ARGS 1
 #define __ARM_FP16_FORMAT_IEEE 1
-#define __arm_in(...) [[__extension__ arm::in(__VA_ARGS__)]]
-#define __arm_inout(...) [[__extension__ arm::inout(__VA_ARGS__)]]
-#define __arm_locally_streaming [[__extension__ arm::locally_streaming]]
 #define __ARM_NEON 1
 #define __ARM_NEON_SVE_BRIDGE 1
-#define __arm_new(...) [[__extension__ arm::new(__VA_ARGS__)]]
-#define __arm_out(...) [[__extension__ arm::out(__VA_ARGS__)]]
 #define __ARM_PCS_AAPCS64 1
-#define __arm_preserves(...) [[__extension__ arm::preserves(__VA_ARGS__)]]
 #define __ARM_SIZEOF_MINIMAL_ENUM 4
 #define __ARM_SIZEOF_WCHAR_T 4
 #define __ARM_STATE_ZA 1
 #define __ARM_STATE_ZT0 1
+#define __arm_in(...) [[__extension__ arm::in(__VA_ARGS__)]]
+#define __arm_inout(...) [[__extension__ arm::inout(__VA_ARGS__)]]
+#define __arm_locally_streaming [[__extension__ arm::locally_streaming]]
+#define __arm_new(...) [[__extension__ arm::new(__VA_ARGS__)]]
+#define __arm_out(...) [[__extension__ arm::out(__VA_ARGS__)]]
+#define __arm_preserves(...) [[__extension__ arm::preserves(__VA_ARGS__)]]
 #define __arm_streaming_compatible [[__extension__ arm::streaming_compatible]]
 #define __arm_streaming [[__extension__ arm::streaming]]
-#define __ATOMIC_ACQ_REL 4
-#define __ATOMIC_ACQUIRE 2
-#define __ATOMIC_CONSUME 1
-#define __ATOMIC_RELAXED 0
-#define __ATOMIC_RELEASE 3
-#define __ATOMIC_SEQ_CST 5
-#define __BFLT16_DECIMAL_DIG__ 4
-#define __BFLT16_DENORM_MIN__ 9.18354961579912115600575419704879436e-41BF16
-#define __BFLT16_DIG__ 2
-#define __BFLT16_EPSILON__ 7.81250000000000000000000000000000000e-3BF16
-#define __BFLT16_HAS_DENORM__ 1
-#define __BFLT16_HAS_INFINITY__ 1
-#define __BFLT16_HAS_QUIET_NAN__ 1
-#define __BFLT16_IS_IEC_60559__ 0
-#define __BFLT16_MANT_DIG__ 8
-#define __BFLT16_MAX_10_EXP__ 38
-#define __BFLT16_MAX__ 3.38953138925153547590470800371487867e+38BF16
-#define __BFLT16_MAX_EXP__ 128
-#define __BFLT16_MIN_10_EXP__ (-37)
-#define __BFLT16_MIN__ 1.17549435082228750796873653722224568e-38BF16
-#define __BFLT16_MIN_EXP__ (-125)
-#define __BFLT16_NORM_MAX__ 3.38953138925153547590470800371487867e+38BF16
-#define __BIGGEST_ALIGNMENT__ 16
-#define __BITINT_MAXWIDTH__ 65535
-#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
-#define __CHAR16_TYPE__ short unsigned int
-#define __CHAR32_TYPE__ unsigned int
-#define __CHAR_BIT__ 8
+#define __aarch64__ 1
+// Atomic
+#define __ATOMIC_RELAXED     0
+#define __ATOMIC_CONSUME     1
+#define __ATOMIC_ACQUIRE     2
+#define __ATOMIC_RELEASE     3
+#define __ATOMIC_ACQ_REL     4
+#define __ATOMIC_SEQ_CST     5
+// Metainfo on types
+#define __BIGGEST_ALIGNMENT__  16
+#define __BYTE_ORDER__         __ORDER_LITTLE_ENDIAN__
+#define __CHAR_BIT__           8
 #define __CHAR_UNSIGNED__ 1
-#define __DBL_DECIMAL_DIG__ 17
-#define __DBL_DENORM_MIN__ ((double)4.94065645841246544176568792868221372e-324L)
-#define __DBL_DIG__ 15
-#define __DBL_EPSILON__ ((double)2.22044604925031308084726333618164062e-16L)
-#define __DBL_HAS_DENORM__ 1
-#define __DBL_HAS_INFINITY__ 1
-#define __DBL_HAS_QUIET_NAN__ 1
-#define __DBL_IS_IEC_60559__ 1
-#define __DBL_MANT_DIG__ 53
-#define __DBL_MAX_10_EXP__ 308
-#define __DBL_MAX__ ((double)1.79769313486231570814527423731704357e+308L)
-#define __DBL_MAX_EXP__ 1024
-#define __DBL_MIN_10_EXP__ (-307)
-#define __DBL_MIN__ ((double)2.22507385850720138309023271733240406e-308L)
-#define __DBL_MIN_EXP__ (-1021)
-#define __DBL_NORM_MAX__ ((double)1.79769313486231570814527423731704357e+308L)
-#define __DEC128_EPSILON__ 1E-33DL
-#define __DEC128_MANT_DIG__ 34
-#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
-#define __DEC128_MAX_EXP__ 6145
-#define __DEC128_MIN__ 1E-6143DL
-#define __DEC128_MIN_EXP__ (-6142)
-#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL
-#define __DEC32_EPSILON__ 1E-6DF
-#define __DEC32_MANT_DIG__ 7
-#define __DEC32_MAX__ 9.999999E96DF
-#define __DEC32_MAX_EXP__ 97
-#define __DEC32_MIN__ 1E-95DF
-#define __DEC32_MIN_EXP__ (-94)
-#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF
-#define __DEC64_EPSILON__ 1E-15DD
-#define __DEC64_MANT_DIG__ 16
-#define __DEC64_MAX__ 9.999999999999999E384DD
-#define __DEC64_MAX_EXP__ 385
-#define __DEC64_MIN__ 1E-383DD
-#define __DEC64_MIN_EXP__ (-382)
-#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD
-#define __DEC_EVAL_METHOD__ 2
-#define __DECIMAL_BID_FORMAT__ 1
-#define __DECIMAL_DIG__ 36
-#define __ELF__ 1
-#define __FINITE_MATH_ONLY__ 0
-#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__
-#define __FLT128_DECIMAL_DIG__ 36
-#define __FLT128_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966F128
-#define __FLT128_DIG__ 33
-#define __FLT128_EPSILON__ 1.92592994438723585305597794258492732e-34F128
-#define __FLT128_HAS_DENORM__ 1
-#define __FLT128_HAS_INFINITY__ 1
-#define __FLT128_HAS_QUIET_NAN__ 1
-#define __FLT128_IS_IEC_60559__ 1
-#define __FLT128_MANT_DIG__ 113
-#define __FLT128_MAX_10_EXP__ 4932
-#define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128
-#define __FLT128_MAX_EXP__ 16384
-#define __FLT128_MIN_10_EXP__ (-4931)
-#define __FLT128_MIN__ 3.36210314311209350626267781732175260e-4932F128
-#define __FLT128_MIN_EXP__ (-16381)
-#define __FLT128_NORM_MAX__ 1.18973149535723176508575932662800702e+4932F128
-#define __FLT16_DECIMAL_DIG__ 5
-#define __FLT16_DENORM_MIN__ 5.96046447753906250000000000000000000e-8F16
-#define __FLT16_DIG__ 3
-#define __FLT16_EPSILON__ 9.76562500000000000000000000000000000e-4F16
-#define __FLT16_HAS_DENORM__ 1
-#define __FLT16_HAS_INFINITY__ 1
-#define __FLT16_HAS_QUIET_NAN__ 1
-#define __FLT16_IS_IEC_60559__ 1
-#define __FLT16_MANT_DIG__ 11
-#define __FLT16_MAX_10_EXP__ 4
-#define __FLT16_MAX__ 6.55040000000000000000000000000000000e+4F16
-#define __FLT16_MAX_EXP__ 16
-#define __FLT16_MIN_10_EXP__ (-4)
-#define __FLT16_MIN__ 6.10351562500000000000000000000000000e-5F16
-#define __FLT16_MIN_EXP__ (-13)
-#define __FLT16_NORM_MAX__ 6.55040000000000000000000000000000000e+4F16
-#define __FLT32_DECIMAL_DIG__ 9
-#define __FLT32_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F32
-#define __FLT32_DIG__ 6
-#define __FLT32_EPSILON__ 1.19209289550781250000000000000000000e-7F32
-#define __FLT32_HAS_DENORM__ 1
-#define __FLT32_HAS_INFINITY__ 1
-#define __FLT32_HAS_QUIET_NAN__ 1
-#define __FLT32_IS_IEC_60559__ 1
-#define __FLT32_MANT_DIG__ 24
-#define __FLT32_MAX_10_EXP__ 38
-#define __FLT32_MAX__ 3.40282346638528859811704183484516925e+38F32
-#define __FLT32_MAX_EXP__ 128
-#define __FLT32_MIN_10_EXP__ (-37)
-#define __FLT32_MIN__ 1.17549435082228750796873653722224568e-38F32
-#define __FLT32_MIN_EXP__ (-125)
-#define __FLT32_NORM_MAX__ 3.40282346638528859811704183484516925e+38F32
-#define __FLT32X_DECIMAL_DIG__ 17
-#define __FLT32X_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F32x
-#define __FLT32X_DIG__ 15
-#define __FLT32X_EPSILON__ 2.22044604925031308084726333618164062e-16F32x
-#define __FLT32X_HAS_DENORM__ 1
-#define __FLT32X_HAS_INFINITY__ 1
-#define __FLT32X_HAS_QUIET_NAN__ 1
-#define __FLT32X_IS_IEC_60559__ 1
-#define __FLT32X_MANT_DIG__ 53
-#define __FLT32X_MAX_10_EXP__ 308
-#define __FLT32X_MAX__ 1.79769313486231570814527423731704357e+308F32x
-#define __FLT32X_MAX_EXP__ 1024
-#define __FLT32X_MIN_10_EXP__ (-307)
-#define __FLT32X_MIN__ 2.22507385850720138309023271733240406e-308F32x
-#define __FLT32X_MIN_EXP__ (-1021)
-#define __FLT32X_NORM_MAX__ 1.79769313486231570814527423731704357e+308F32x
-#define __FLT64_DECIMAL_DIG__ 17
-#define __FLT64_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F64
-#define __FLT64_DIG__ 15
-#define __FLT64_EPSILON__ 2.22044604925031308084726333618164062e-16F64
-#define __FLT64_HAS_DENORM__ 1
-#define __FLT64_HAS_INFINITY__ 1
-#define __FLT64_HAS_QUIET_NAN__ 1
-#define __FLT64_IS_IEC_60559__ 1
-#define __FLT64_MANT_DIG__ 53
-#define __FLT64_MAX_10_EXP__ 308
-#define __FLT64_MAX__ 1.79769313486231570814527423731704357e+308F64
-#define __FLT64_MAX_EXP__ 1024
-#define __FLT64_MIN_10_EXP__ (-307)
-#define __FLT64_MIN__ 2.22507385850720138309023271733240406e-308F64
-#define __FLT64_MIN_EXP__ (-1021)
-#define __FLT64_NORM_MAX__ 1.79769313486231570814527423731704357e+308F64
-#define __FLT64X_DECIMAL_DIG__ 36
-#define __FLT64X_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966F64x
-#define __FLT64X_DIG__ 33
-#define __FLT64X_EPSILON__ 1.92592994438723585305597794258492732e-34F64x
-#define __FLT64X_HAS_DENORM__ 1
-#define __FLT64X_HAS_INFINITY__ 1
-#define __FLT64X_HAS_QUIET_NAN__ 1
-#define __FLT64X_IS_IEC_60559__ 1
-#define __FLT64X_MANT_DIG__ 113
-#define __FLT64X_MAX_10_EXP__ 4932
-#define __FLT64X_MAX__ 1.18973149535723176508575932662800702e+4932F64x
-#define __FLT64X_MAX_EXP__ 16384
-#define __FLT64X_MIN_10_EXP__ (-4931)
-#define __FLT64X_MIN__ 3.36210314311209350626267781732175260e-4932F64x
-#define __FLT64X_MIN_EXP__ (-16381)
-#define __FLT64X_NORM_MAX__ 1.18973149535723176508575932662800702e+4932F64x
-#define __FLT_DECIMAL_DIG__ 9
-#define __FLT_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F
-#define __FLT_DIG__ 6
-#define __FLT_EPSILON__ 1.19209289550781250000000000000000000e-7F
-#define __FLT_EVAL_METHOD__ 0
-#define __FLT_EVAL_METHOD_C99__ 0
-#define __FLT_EVAL_METHOD_TS_18661_3__ 0
-#define __FLT_HAS_DENORM__ 1
-#define __FLT_HAS_INFINITY__ 1
-#define __FLT_HAS_QUIET_NAN__ 1
-#define __FLT_IS_IEC_60559__ 1
-#define __FLT_MANT_DIG__ 24
-#define __FLT_MAX_10_EXP__ 38
-#define __FLT_MAX__ 3.40282346638528859811704183484516925e+38F
-#define __FLT_MAX_EXP__ 128
-#define __FLT_MIN_10_EXP__ (-37)
-#define __FLT_MIN__ 1.17549435082228750796873653722224568e-38F
-#define __FLT_MIN_EXP__ (-125)
-#define __FLT_NORM_MAX__ 3.40282346638528859811704183484516925e+38F
-#define __FLT_RADIX__ 2
-#define __FP_FAST_FMA 1
-#define __FP_FAST_FMAF 1
-#define __FP_FAST_FMAF32 1
-#define __FP_FAST_FMAF32x 1
-#define __FP_FAST_FMAF64 1
-#define __GCC_ASM_FLAG_OUTPUTS__ 1
-#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
-#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
-#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
-#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
-#define __GCC_ATOMIC_INT_LOCK_FREE 2
-#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
-#define __GCC_ATOMIC_LONG_LOCK_FREE 2
-#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
-#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
-#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
-#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
-#define __GCC_CONSTRUCTIVE_SIZE 64
-#define __GCC_DESTRUCTIVE_SIZE 256
-#define __GCC_HAVE_DWARF2_CFI_ASM 1
-#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
-#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 1
-#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
-#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
-#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
-#define __GCC_IEC_559 2
-#define __GCC_IEC_559_COMPLEX 2
-#define __GNUC__ 14
-#define __GNUC_EXECUTION_CHARSET_NAME "UTF-8"
-#define __GNUC_MINOR__ 2
-#define __GNUC_PATCHLEVEL__ 0
-#define __GNUC_STDC_INLINE__ 1
-#define __GNUC_WIDE_EXECUTION_CHARSET_NAME "UTF-32LE"
-#define __gnu_linux__ 1
-#define __GXX_ABI_VERSION 1019
-#define __HAVE_SPECULATION_SAFE_VALUE 1
+#define __FLOAT_WORD_ORDER__   __ORDER_LITTLE_ENDIAN__
+#define __SIZEOF_SHORT__       2
+#define __SIZEOF_WCHAR_T__     4
+#define __SIZEOF_INT__         4
+#define __SIZEOF_WINT_T__      4
+#define __SIZEOF_LONG__        8
+#define __SIZEOF_LONG_LONG__   8
+#define __SIZEOF_POINTER__     8
+#define __SIZEOF_PTRDIFF_T__   8
+#define __SIZEOF_SIZE_T__      8
+#define __SIZEOF_INT128__      16
+#define __SIZEOF_FLOAT__       4
+#define __SIZEOF_DOUBLE__      8
+#define __SIZEOF_LONG_DOUBLE__ 16
+// Integers
+//#define __BITINT_MAXWIDTH__ 65535
+//#define __CHAR16_TYPE__ short unsigned int
+//#define __CHAR32_TYPE__ unsigned int
+#define __INT8_C(c) c
+#define __INT8_MAX__ 0x7f
+//#define __INT8_TYPE__ signed char
 #define __INT16_C(c) c
 #define __INT16_MAX__ 0x7fff
-#define __INT16_TYPE__ short int
+//#define __INT16_TYPE__ short int
 #define __INT32_C(c) c
 #define __INT32_MAX__ 0x7fffffff
-#define __INT32_TYPE__ int
+//#define __INT32_TYPE__ int
 #define __INT64_C(c) c ## L
 #define __INT64_MAX__ 0x7fffffffffffffffL
-#define __INT64_TYPE__ long int
-#define __INT8_C(c) c
-#define __INT8_MAX__ 0x7f
-#define __INT8_TYPE__ signed char
+//#define __INT64_TYPE__ long int
+#define __INT_FAST8_MAX__ 0x7f
+//#define __INT_FAST8_TYPE__ signed char
+#define __INT_FAST8_WIDTH__ 8
 #define __INT_FAST16_MAX__ 0x7fffffffffffffffL
-#define __INT_FAST16_TYPE__ long int
+//#define __INT_FAST16_TYPE__ long int
 #define __INT_FAST16_WIDTH__ 64
 #define __INT_FAST32_MAX__ 0x7fffffffffffffffL
-#define __INT_FAST32_TYPE__ long int
+//#define __INT_FAST32_TYPE__ long int
 #define __INT_FAST32_WIDTH__ 64
 #define __INT_FAST64_MAX__ 0x7fffffffffffffffL
-#define __INT_FAST64_TYPE__ long int
+//#define __INT_FAST64_TYPE__ long int
 #define __INT_FAST64_WIDTH__ 64
-#define __INT_FAST8_MAX__ 0x7f
-#define __INT_FAST8_TYPE__ signed char
-#define __INT_FAST8_WIDTH__ 8
+#define __INT_LEAST8_MAX__ 0x7f
+//#define __INT_LEAST8_TYPE__ signed char
+#define __INT_LEAST8_WIDTH__ 8
 #define __INT_LEAST16_MAX__ 0x7fff
-#define __INT_LEAST16_TYPE__ short int
+//#define __INT_LEAST16_TYPE__ short int
 #define __INT_LEAST16_WIDTH__ 16
 #define __INT_LEAST32_MAX__ 0x7fffffff
-#define __INT_LEAST32_TYPE__ int
+//#define __INT_LEAST32_TYPE__ int
 #define __INT_LEAST32_WIDTH__ 32
 #define __INT_LEAST64_MAX__ 0x7fffffffffffffffL
-#define __INT_LEAST64_TYPE__ long int
+//#define __INT_LEAST64_TYPE__ long int
 #define __INT_LEAST64_WIDTH__ 64
-#define __INT_LEAST8_MAX__ 0x7f
-#define __INT_LEAST8_TYPE__ signed char
-#define __INT_LEAST8_WIDTH__ 8
 #define __INT_MAX__ 0x7fffffff
+#define __INT_WIDTH__ 32
 #define __INTMAX_C(c) c ## L
 #define __INTMAX_MAX__ 0x7fffffffffffffffL
-#define __INTMAX_TYPE__ long int
+//#define __INTMAX_TYPE__ long int
 #define __INTMAX_WIDTH__ 64
 #define __INTPTR_MAX__ 0x7fffffffffffffffL
-#define __INTPTR_TYPE__ long int
+//#define __INTPTR_TYPE__ long int
 #define __INTPTR_WIDTH__ 64
-#define __INT_WIDTH__ 32
-#define __LDBL_DECIMAL_DIG__ 36
-#define __LDBL_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966L
-#define __LDBL_DIG__ 33
-#define __LDBL_EPSILON__ 1.92592994438723585305597794258492732e-34L
-#define __LDBL_HAS_DENORM__ 1
-#define __LDBL_HAS_INFINITY__ 1
-#define __LDBL_HAS_QUIET_NAN__ 1
-#define __LDBL_IS_IEC_60559__ 1
-#define __LDBL_MANT_DIG__ 113
-#define __LDBL_MAX_10_EXP__ 4932
-#define __LDBL_MAX__ 1.18973149535723176508575932662800702e+4932L
-#define __LDBL_MAX_EXP__ 16384
-#define __LDBL_MIN_10_EXP__ (-4931)
-#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L
-#define __LDBL_MIN_EXP__ (-16381)
-#define __LDBL_NORM_MAX__ 1.18973149535723176508575932662800702e+4932L
-#define __linux 1
-#define __linux__ 1
-#define linux 1
 #define __LONG_LONG_MAX__ 0x7fffffffffffffffLL
 #define __LONG_LONG_WIDTH__ 64
 #define __LONG_MAX__ 0x7fffffffffffffffL
 #define __LONG_WIDTH__ 64
-#define __LP64__ 1
-#define _LP64 1
-#define __NO_INLINE__ 1
-#define __ORDER_BIG_ENDIAN__ 4321
-#define __ORDER_LITTLE_ENDIAN__ 1234
-#define __ORDER_PDP_ENDIAN__ 3412
-#define __pic__ 2
-#define __PIC__ 2
-#define __pie__ 2
-#define __PIE__ 2
-#define __PRAGMA_REDEFINE_EXTNAME 1
 #define __PTRDIFF_MAX__ 0x7fffffffffffffffL
-#define __PTRDIFF_TYPE__ long int
+//#define __PTRDIFF_TYPE__ long int
 #define __PTRDIFF_WIDTH__ 64
-#define __REGISTER_PREFIX__ 
 #define __SCHAR_MAX__ 0x7f
 #define __SCHAR_WIDTH__ 8
 #define __SHRT_MAX__ 0x7fff
 #define __SHRT_WIDTH__ 16
 #define __SIG_ATOMIC_MAX__ 0x7fffffff
 #define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1)
-#define __SIG_ATOMIC_TYPE__ int
+//#define __SIG_ATOMIC_TYPE__ int
 #define __SIG_ATOMIC_WIDTH__ 32
 #define __SIZE_MAX__ 0xffffffffffffffffUL
-#define __SIZEOF_DOUBLE__ 8
-#define __SIZEOF_FLOAT__ 4
-#define __SIZEOF_INT128__ 16
-#define __SIZEOF_INT__ 4
-#define __SIZEOF_LONG__ 8
-#define __SIZEOF_LONG_DOUBLE__ 16
-#define __SIZEOF_LONG_LONG__ 8
-#define __SIZEOF_POINTER__ 8
-#define __SIZEOF_PTRDIFF_T__ 8
-#define __SIZEOF_SHORT__ 2
-#define __SIZEOF_SIZE_T__ 8
-#define __SIZEOF_WCHAR_T__ 4
-#define __SIZEOF_WINT_T__ 4
-#define __SIZE_TYPE__ long unsigned int
+//#define __SIZE_TYPE__ long unsigned int
 #define __SIZE_WIDTH__ 64
-#define __STDC__ 1
-#define __STDC_HOSTED__ 1
-#define __STDC_IEC_559__ 1
-#define __STDC_IEC_559_COMPLEX__ 1
-#define __STDC_IEC_60559_BFP__ 201404L
-#define __STDC_IEC_60559_COMPLEX__ 201404L
-#define __STDC_ISO_10646__ 201706L
-#define _STDC_PREDEF_H 1
-#define __STDC_UTF_16__ 1
-#define __STDC_UTF_32__ 1
-#define __STDC_VERSION__ 201710L
+#define __UINT8_C(c) c
+#define __UINT8_MAX__ 0xff
+//#define __UINT8_TYPE__ unsigned char
 #define __UINT16_C(c) c
 #define __UINT16_MAX__ 0xffff
-#define __UINT16_TYPE__ short unsigned int
+//#define __UINT16_TYPE__ short unsigned int
 #define __UINT32_C(c) c ## U
 #define __UINT32_MAX__ 0xffffffffU
-#define __UINT32_TYPE__ unsigned int
+//#define __UINT32_TYPE__ unsigned int
 #define __UINT64_C(c) c ## UL
 #define __UINT64_MAX__ 0xffffffffffffffffUL
-#define __UINT64_TYPE__ long unsigned int
-#define __UINT8_C(c) c
-#define __UINT8_MAX__ 0xff
-#define __UINT8_TYPE__ unsigned char
+//#define __UINT64_TYPE__ long unsigned int
+#define __UINT_FAST8_MAX__ 0xff
+//#define __UINT_FAST8_TYPE__ unsigned char
 #define __UINT_FAST16_MAX__ 0xffffffffffffffffUL
-#define __UINT_FAST16_TYPE__ long unsigned int
+//#define __UINT_FAST16_TYPE__ long unsigned int
 #define __UINT_FAST32_MAX__ 0xffffffffffffffffUL
-#define __UINT_FAST32_TYPE__ long unsigned int
+//#define __UINT_FAST32_TYPE__ long unsigned int
 #define __UINT_FAST64_MAX__ 0xffffffffffffffffUL
-#define __UINT_FAST64_TYPE__ long unsigned int
-#define __UINT_FAST8_MAX__ 0xff
-#define __UINT_FAST8_TYPE__ unsigned char
+//#define __UINT_FAST64_TYPE__ long unsigned int
+#define __UINT_LEAST8_MAX__ 0xff
+//#define __UINT_LEAST8_TYPE__ unsigned char
 #define __UINT_LEAST16_MAX__ 0xffff
-#define __UINT_LEAST16_TYPE__ short unsigned int
+//#define __UINT_LEAST16_TYPE__ short unsigned int
 #define __UINT_LEAST32_MAX__ 0xffffffffU
-#define __UINT_LEAST32_TYPE__ unsigned int
+//#define __UINT_LEAST32_TYPE__ unsigned int
 #define __UINT_LEAST64_MAX__ 0xffffffffffffffffUL
-#define __UINT_LEAST64_TYPE__ long unsigned int
-#define __UINT_LEAST8_MAX__ 0xff
-#define __UINT_LEAST8_TYPE__ unsigned char
+//#define __UINT_LEAST64_TYPE__ long unsigned int
 #define __UINTMAX_C(c) c ## UL
 #define __UINTMAX_MAX__ 0xffffffffffffffffUL
-#define __UINTMAX_TYPE__ long unsigned int
+//#define __UINTMAX_TYPE__ long unsigned int
 #define __UINTPTR_MAX__ 0xffffffffffffffffUL
-#define __UINTPTR_TYPE__ long unsigned int
-#define __unix 1
-#define __unix__ 1
-#define unix 1
-#define __USER_LABEL_PREFIX__ 
-#define __VERSION__ "14.2.0"
+//#define __UINTPTR_TYPE__ long unsigned int
 #define __WCHAR_MAX__ 0xffffffffU
 #define __WCHAR_MIN__ 0U
-#define __WCHAR_TYPE__ unsigned int
+//#define __WCHAR_TYPE__ unsigned int
 #define __WCHAR_WIDTH__ 32
 #define __WINT_MAX__ 0xffffffffU
 #define __WINT_MIN__ 0U
-#define __WINT_TYPE__ unsigned int
+//#define __WINT_TYPE__ unsigned int
 #define __WINT_WIDTH__ 32
+// Floats
+//#define __BFLT16_DECIMAL_DIG__ 4
+//#define __BFLT16_DENORM_MIN__ 9.18354961579912115600575419704879436e-41BF16
+//#define __BFLT16_DIG__ 2
+//#define __BFLT16_EPSILON__ 7.81250000000000000000000000000000000e-3BF16
+//#define __BFLT16_HAS_DENORM__ 1
+//#define __BFLT16_HAS_INFINITY__ 1
+//#define __BFLT16_HAS_QUIET_NAN__ 1
+//#define __BFLT16_IS_IEC_60559__ 0
+//#define __BFLT16_MANT_DIG__ 8
+//#define __BFLT16_MAX_10_EXP__ 38
+//#define __BFLT16_MAX__ 3.38953138925153547590470800371487867e+38BF16
+//#define __BFLT16_MAX_EXP__ 128
+//#define __BFLT16_MIN_10_EXP__ (-37)
+//#define __BFLT16_MIN__ 1.17549435082228750796873653722224568e-38BF16
+//#define __BFLT16_MIN_EXP__ (-125)
+//#define __BFLT16_NORM_MAX__ 3.38953138925153547590470800371487867e+38BF16
+#define __DBL_DECIMAL_DIG__ 17
+#define __DBL_DENORM_MIN__ ((double)4.94065645841246544176568792868221372e-324L)
+#define __DBL_DIG__ 15
+#define __DBL_EPSILON__ ((double)2.22044604925031308084726333618164062e-16L)
+#define __DBL_HAS_DENORM__ 1
+#define __DBL_HAS_INFINITY__ 1
+#define __DBL_HAS_QUIET_NAN__ 1
+#define __DBL_IS_IEC_60559__ 1
+#define __DBL_MANT_DIG__ 53
+#define __DBL_MAX_10_EXP__ 308
+#define __DBL_MAX__ ((double)1.79769313486231570814527423731704357e+308L)
+#define __DBL_MAX_EXP__ 1024
+#define __DBL_MIN_10_EXP__ (-307)
+#define __DBL_MIN__ ((double)2.22507385850720138309023271733240406e-308L)
+#define __DBL_MIN_EXP__ (-1021)
+#define __DBL_NORM_MAX__ ((double)1.79769313486231570814527423731704357e+308L)
+//#define __DEC32_EPSILON__ 1E-6DF
+//#define __DEC32_MANT_DIG__ 7
+//#define __DEC32_MAX__ 9.999999E96DF
+//#define __DEC32_MAX_EXP__ 97
+//#define __DEC32_MIN__ 1E-95DF
+//#define __DEC32_MIN_EXP__ (-94)
+//#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF
+//#define __DEC64_EPSILON__ 1E-15DD
+//#define __DEC64_MANT_DIG__ 16
+//#define __DEC64_MAX__ 9.999999999999999E384DD
+//#define __DEC64_MAX_EXP__ 385
+//#define __DEC64_MIN__ 1E-383DD
+//#define __DEC64_MIN_EXP__ (-382)
+//#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD
+//#define __DEC128_EPSILON__ 1E-33DL
+//#define __DEC128_MANT_DIG__ 34
+//#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
+//#define __DEC128_MAX_EXP__ 6145
+//#define __DEC128_MIN__ 1E-6143DL
+//#define __DEC128_MIN_EXP__ (-6142)
+//#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL
+//#define __DEC_EVAL_METHOD__ 2
+//#define __DECIMAL_BID_FORMAT__ 1
+//#define __DECIMAL_DIG__ 36
+//#define __FLT16_DECIMAL_DIG__ 5
+//#define __FLT16_DENORM_MIN__ 5.96046447753906250000000000000000000e-8F16
+//#define __FLT16_DIG__ 3
+//#define __FLT16_EPSILON__ 9.76562500000000000000000000000000000e-4F16
+//#define __FLT16_HAS_DENORM__ 1
+//#define __FLT16_HAS_INFINITY__ 1
+//#define __FLT16_HAS_QUIET_NAN__ 1
+//#define __FLT16_IS_IEC_60559__ 1
+//#define __FLT16_MANT_DIG__ 11
+//#define __FLT16_MAX_10_EXP__ 4
+//#define __FLT16_MAX__ 6.55040000000000000000000000000000000e+4F16
+//#define __FLT16_MAX_EXP__ 16
+//#define __FLT16_MIN_10_EXP__ (-4)
+//#define __FLT16_MIN__ 6.10351562500000000000000000000000000e-5F16
+//#define __FLT16_MIN_EXP__ (-13)
+//#define __FLT16_NORM_MAX__ 6.55040000000000000000000000000000000e+4F16
+//#define __FLT32_DECIMAL_DIG__ 9
+//#define __FLT32_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F32
+//#define __FLT32_DIG__ 6
+//#define __FLT32_EPSILON__ 1.19209289550781250000000000000000000e-7F32
+//#define __FLT32_HAS_DENORM__ 1
+//#define __FLT32_HAS_INFINITY__ 1
+//#define __FLT32_HAS_QUIET_NAN__ 1
+//#define __FLT32_IS_IEC_60559__ 1
+//#define __FLT32_MANT_DIG__ 24
+//#define __FLT32_MAX_10_EXP__ 38
+//#define __FLT32_MAX__ 3.40282346638528859811704183484516925e+38F32
+//#define __FLT32_MAX_EXP__ 128
+//#define __FLT32_MIN_10_EXP__ (-37)
+//#define __FLT32_MIN__ 1.17549435082228750796873653722224568e-38F32
+//#define __FLT32_MIN_EXP__ (-125)
+//#define __FLT32_NORM_MAX__ 3.40282346638528859811704183484516925e+38F32
+//#define __FLT32X_DECIMAL_DIG__ 17
+//#define __FLT32X_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F32x
+//#define __FLT32X_DIG__ 15
+//#define __FLT32X_EPSILON__ 2.22044604925031308084726333618164062e-16F32x
+//#define __FLT32X_HAS_DENORM__ 1
+//#define __FLT32X_HAS_INFINITY__ 1
+//#define __FLT32X_HAS_QUIET_NAN__ 1
+//#define __FLT32X_IS_IEC_60559__ 1
+//#define __FLT32X_MANT_DIG__ 53
+//#define __FLT32X_MAX_10_EXP__ 308
+//#define __FLT32X_MAX__ 1.79769313486231570814527423731704357e+308F32x
+//#define __FLT32X_MAX_EXP__ 1024
+//#define __FLT32X_MIN_10_EXP__ (-307)
+//#define __FLT32X_MIN__ 2.22507385850720138309023271733240406e-308F32x
+//#define __FLT32X_MIN_EXP__ (-1021)
+//#define __FLT32X_NORM_MAX__ 1.79769313486231570814527423731704357e+308F32x
+//#define __FLT64_DECIMAL_DIG__ 17
+//#define __FLT64_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F64
+//#define __FLT64_DIG__ 15
+//#define __FLT64_EPSILON__ 2.22044604925031308084726333618164062e-16F64
+//#define __FLT64_HAS_DENORM__ 1
+//#define __FLT64_HAS_INFINITY__ 1
+//#define __FLT64_HAS_QUIET_NAN__ 1
+//#define __FLT64_IS_IEC_60559__ 1
+//#define __FLT64_MANT_DIG__ 53
+//#define __FLT64_MAX_10_EXP__ 308
+//#define __FLT64_MAX__ 1.79769313486231570814527423731704357e+308F64
+//#define __FLT64_MAX_EXP__ 1024
+//#define __FLT64_MIN_10_EXP__ (-307)
+//#define __FLT64_MIN__ 2.22507385850720138309023271733240406e-308F64
+//#define __FLT64_MIN_EXP__ (-1021)
+//#define __FLT64_NORM_MAX__ 1.79769313486231570814527423731704357e+308F64
+//#define __FLT64X_DECIMAL_DIG__ 36
+//#define __FLT64X_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966F64x
+//#define __FLT64X_DIG__ 33
+//#define __FLT64X_EPSILON__ 1.92592994438723585305597794258492732e-34F64x
+//#define __FLT64X_HAS_DENORM__ 1
+//#define __FLT64X_HAS_INFINITY__ 1
+//#define __FLT64X_HAS_QUIET_NAN__ 1
+//#define __FLT64X_IS_IEC_60559__ 1
+//#define __FLT64X_MANT_DIG__ 113
+//#define __FLT64X_MAX_10_EXP__ 4932
+//#define __FLT64X_MAX__ 1.18973149535723176508575932662800702e+4932F64x
+//#define __FLT64X_MAX_EXP__ 16384
+//#define __FLT64X_MIN_10_EXP__ (-4931)
+//#define __FLT64X_MIN__ 3.36210314311209350626267781732175260e-4932F64x
+//#define __FLT64X_MIN_EXP__ (-16381)
+//#define __FLT64X_NORM_MAX__ 1.18973149535723176508575932662800702e+4932F64x
+//#define __FLT128_DECIMAL_DIG__ 36
+//#define __FLT128_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966F128
+//#define __FLT128_DIG__ 33
+//#define __FLT128_EPSILON__ 1.92592994438723585305597794258492732e-34F128
+//#define __FLT128_HAS_DENORM__ 1
+//#define __FLT128_HAS_INFINITY__ 1
+//#define __FLT128_HAS_QUIET_NAN__ 1
+//#define __FLT128_IS_IEC_60559__ 1
+//#define __FLT128_MANT_DIG__ 113
+//#define __FLT128_MAX_10_EXP__ 4932
+//#define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128
+//#define __FLT128_MAX_EXP__ 16384
+//#define __FLT128_MIN_10_EXP__ (-4931)
+//#define __FLT128_MIN__ 3.36210314311209350626267781732175260e-4932F128
+//#define __FLT128_MIN_EXP__ (-16381)
+//#define __FLT128_NORM_MAX__ 1.18973149535723176508575932662800702e+4932F128
+#define __FLT_DECIMAL_DIG__ 9
+#define __FLT_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F
+#define __FLT_DIG__ 6
+#define __FLT_EPSILON__ 1.19209289550781250000000000000000000e-7F
+#define __FLT_EVAL_METHOD__ 0
+#define __FLT_EVAL_METHOD_C99__ 0
+#define __FLT_EVAL_METHOD_TS_18661_3__ 0
+#define __FLT_HAS_DENORM__ 1
+#define __FLT_HAS_INFINITY__ 1
+#define __FLT_HAS_QUIET_NAN__ 1
+#define __FLT_IS_IEC_60559__ 1
+#define __FLT_MANT_DIG__ 24
+#define __FLT_MAX_10_EXP__ 38
+#define __FLT_MAX__ 3.40282346638528859811704183484516925e+38F
+#define __FLT_MAX_EXP__ 128
+#define __FLT_MIN_10_EXP__ (-37)
+#define __FLT_MIN__ 1.17549435082228750796873653722224568e-38F
+#define __FLT_MIN_EXP__ (-125)
+#define __FLT_NORM_MAX__ 3.40282346638528859811704183484516925e+38F
+#define __FLT_RADIX__ 2
+#define __FP_FAST_FMA 1
+#define __FP_FAST_FMAF 1
+#define __FP_FAST_FMAF32 1
+#define __FP_FAST_FMAF32x 1
+#define __FP_FAST_FMAF64 1
+#define __LDBL_DECIMAL_DIG__ 36
+#define __LDBL_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966L
+#define __LDBL_DIG__ 33
+#define __LDBL_EPSILON__ 1.92592994438723585305597794258492732e-34L
+#define __LDBL_HAS_DENORM__ 1
+#define __LDBL_HAS_INFINITY__ 1
+#define __LDBL_HAS_QUIET_NAN__ 1
+#define __LDBL_IS_IEC_60559__ 1
+#define __LDBL_MANT_DIG__ 113
+#define __LDBL_MAX_10_EXP__ 4932
+#define __LDBL_MAX__ 1.18973149535723176508575932662800702e+4932L
+#define __LDBL_MAX_EXP__ 16384
+#define __LDBL_MIN_10_EXP__ (-4931)
+#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L
+#define __LDBL_MIN_EXP__ (-16381)
+#define __LDBL_NORM_MAX__ 1.18973149535723176508575932662800702e+4932L
+
+#include_next "stdc-predef.h"
diff --git a/wrapperhelper/include-override/common/stdc-predef.h b/wrapperhelper/include-override/common/stdc-predef.h
new file mode 100644
index 00000000..ace6ec7d
--- /dev/null
+++ b/wrapperhelper/include-override/common/stdc-predef.h
@@ -0,0 +1,4 @@
+// Ignore all attributes
+#define __attribute__(_)
+
+#include_next "stdc-predef.h"
diff --git a/wrapperhelper/include-override/x86_64/bits/pthreadtypes-arch.h b/wrapperhelper/include-override/x86_64/bits/pthreadtypes-arch.h
new file mode 100644
index 00000000..b23ff3b0
--- /dev/null
+++ b/wrapperhelper/include-override/x86_64/bits/pthreadtypes-arch.h
@@ -0,0 +1,55 @@
+/* Copyright (C) 2002-2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _BITS_PTHREADTYPES_ARCH_H
+#define _BITS_PTHREADTYPES_ARCH_H	1
+
+#include <bits/wordsize.h>
+
+#ifdef __x86_64__
+# if __WORDSIZE == 64
+#  define __SIZEOF_PTHREAD_MUTEX_T 40
+#  define __SIZEOF_PTHREAD_ATTR_T 56
+#  define __SIZEOF_PTHREAD_RWLOCK_T 56
+#  define __SIZEOF_PTHREAD_BARRIER_T 32
+# else
+#  define __SIZEOF_PTHREAD_MUTEX_T 32
+#  define __SIZEOF_PTHREAD_ATTR_T 32
+#  define __SIZEOF_PTHREAD_RWLOCK_T 44
+#  define __SIZEOF_PTHREAD_BARRIER_T 20
+# endif
+#else
+# define __SIZEOF_PTHREAD_MUTEX_T 24
+# define __SIZEOF_PTHREAD_ATTR_T 36
+# define __SIZEOF_PTHREAD_RWLOCK_T 32
+# define __SIZEOF_PTHREAD_BARRIER_T 20
+#endif
+#define __SIZEOF_PTHREAD_MUTEXATTR_T 4
+#define __SIZEOF_PTHREAD_COND_T 48
+#define __SIZEOF_PTHREAD_CONDATTR_T 4
+#define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
+#define __SIZEOF_PTHREAD_BARRIERATTR_T 4
+
+#define __LOCK_ALIGNMENT
+#define __ONCE_ALIGNMENT
+
+#ifndef __x86_64__
+/* Extra attributes for the cleanup functions.  */
+# define __cleanup_fct_attribute __attribute__ ((__regparm__ (1)))
+#endif
+
+#endif	/* bits/pthreadtypes.h */
diff --git a/wrapperhelper/include-override/x86_64/stdc-predef.h b/wrapperhelper/include-override/x86_64/stdc-predef.h
index f88103d8..5ed6af02 100644
--- a/wrapperhelper/include-override/x86_64/stdc-predef.h
+++ b/wrapperhelper/include-override/x86_64/stdc-predef.h
@@ -14,7 +14,6 @@
 #define __pic__                 2
 #define __PIE__                 2
 #define __pie__                 2
-#define __SSP_STRONG__          3
 #define __USER_LABEL_PREFIX__
 #define __gnu_linux__           1
 #define __linux__               1
@@ -55,20 +54,21 @@
 //#define __PRAGMA_REDEFINE_EXTNAME 1
 //#define __VERSION__ "14.2.1 20240805"
 // Specific x86_64 architecture
-#define __FXSR__                      1
 #define __FINITE_MATH_ONLY__          0
 #define __HAVE_SPECULATION_SAFE_VALUE 1
 #define __LP64__                      1
 #define _LP64                         1
+#define __REGISTER_PREFIX__
+#define __FXSR__                      1
 #define __MMX__                       1
 #define __MMX_WITH_SSE__              1
-#define __REGISTER_PREFIX__
 #define __SEG_FS                      1
 #define __SEG_GS                      1
 #define __SSE__                       1
 #define __SSE_MATH__                  1
 #define __SSE2__                      1
 #define __SSE2_MATH__                 1
+#define __SSP_STRONG__          3
 #define __amd64__                     1
 #define __amd64                       1
 #define __code_model_small__          1
@@ -88,8 +88,8 @@
 // Metainfo on types
 #define __BIGGEST_ALIGNMENT__  16
 #define __BYTE_ORDER__         __ORDER_LITTLE_ENDIAN__
-#define __FLOAT_WORD_ORDER__   __ORDER_LITTLE_ENDIAN__
 #define __CHAR_BIT__           8
+#define __FLOAT_WORD_ORDER__   __ORDER_LITTLE_ENDIAN__
 #define __SIZEOF_SHORT__       2
 #define __SIZEOF_WCHAR_T__     4
 #define __SIZEOF_INT__         4
@@ -291,16 +291,16 @@
 //#define __FLT32_DIG__ 6
 //#define __FLT32_EPSILON__ 1.19209289550781250000000000000000000e-7F32
 //#define __FLT32_HAS_DENORM__ 1
-//#define __FLT32_HAS_QUIET_NAN__ 1
 //#define __FLT32_HAS_INFINITY__ 1
+//#define __FLT32_HAS_QUIET_NAN__ 1
 //#define __FLT32_IS_IEC_60559__ 1
+//#define __FLT32_MANT_DIG__ 24
 //#define __FLT32_MAX_10_EXP__ 38
 //#define __FLT32_MAX__ 3.40282346638528859811704183484516925e+38F32
 //#define __FLT32_MAX_EXP__ 128
 //#define __FLT32_MIN_10_EXP__ (-37)
 //#define __FLT32_MIN__ 1.17549435082228750796873653722224568e-38F32
 //#define __FLT32_MIN_EXP__ (-125)
-//#define __FLT32_MANT_DIG__ 24
 //#define __FLT32_NORM_MAX__ 3.40282346638528859811704183484516925e+38F32
 //#define __FLT32X_DECIMAL_DIG__ 17
 //#define __FLT32X_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F32x
@@ -359,8 +359,8 @@
 //#define __FLT128_HAS_QUIET_NAN__ 1
 //#define __FLT128_IS_IEC_60559__ 1
 //#define __FLT128_MANT_DIG__ 113
-//#define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128
 //#define __FLT128_MAX_10_EXP__ 4932
+//#define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128
 //#define __FLT128_MAX_EXP__ 16384
 //#define __FLT128_MIN_10_EXP__ (-4931)
 //#define __FLT128_MIN__ 3.36210314311209350626267781732175260e-4932F128
@@ -403,7 +403,3 @@
 #define __LDBL_NORM_MAX__ 1.18973149535723176502126385303097021e+4932L
 
 #include_next "stdc-predef.h"
-
-#define __attribute__(_)
-#define inline
-#define _Noreturn
diff --git a/wrapperhelper/src/generator.c b/wrapperhelper/src/generator.c
index 8839f484..cf4d1851 100644
--- a/wrapperhelper/src/generator.c
+++ b/wrapperhelper/src/generator.c
@@ -964,8 +964,12 @@ static int convert_type_post(string_t *dest, type_t *typ, string_t *obj_name) {
 	}
 }
 
-int solve_request(request_t *req, type_t *typ, khash_t(conv_map) *conv_map) {
-	if (typ->typ == TYPE_FUNCTION) {
+int solve_request(request_t *req, type_t *emu_typ, type_t *target_typ, khash_t(conv_map) *conv_map) {
+	if (!type_t_equal(emu_typ, target_typ)) {
+		printf("Error: TODO: %s: emulated and target types are different\n", string_content(req->obj_name));
+		return 0;
+	}
+	if (emu_typ->typ == TYPE_FUNCTION) {
 		int needs_D = 0, needs_my = req->def.fun.typ && (req->def.rty == RQT_FUN_MY), needs_2 = 0;
 		int convert_post;
 		size_t idx_conv;
@@ -974,15 +978,15 @@ int solve_request(request_t *req, type_t *typ, khash_t(conv_map) *conv_map) {
 			printf("Error: failed to create function type string\n");
 			return 0;
 		}
-		if (!convert_type(req->val.fun.typ, typ->val.fun.ret, 1, &needs_D, &needs_my, conv_map, req->obj_name)) goto fun_fail;
+		if (!convert_type(req->val.fun.typ, emu_typ->val.fun.ret, 1, &needs_D, &needs_my, conv_map, req->obj_name)) goto fun_fail;
 		idx_conv = string_len(req->val.fun.typ);
 		if (!string_add_char(req->val.fun.typ, 'F')) {
 			printf("Error: failed to add convention char\n");
 			goto fun_fail;
 		}
-		convert_post = convert_type_post(req->val.fun.typ, typ->val.fun.ret, req->obj_name);
+		convert_post = convert_type_post(req->val.fun.typ, emu_typ->val.fun.ret, req->obj_name);
 		if (!convert_post) goto fun_fail;
-		if (typ->val.fun.nargs == (size_t)-1) {
+		if (emu_typ->val.fun.nargs == (size_t)-1) {
 			printf("Warning: assuming empty specification is void specification\n");
 			if (convert_post == 1) {
 				if (!string_add_char(req->val.fun.typ, 'v')) {
@@ -990,7 +994,7 @@ int solve_request(request_t *req, type_t *typ, khash_t(conv_map) *conv_map) {
 					goto fun_fail;
 				}
 			}
-		} else if (!typ->val.fun.nargs && !typ->val.fun.has_varargs) {
+		} else if (!emu_typ->val.fun.nargs && !emu_typ->val.fun.has_varargs) {
 			if (convert_post == 1) {
 				if (!string_add_char(req->val.fun.typ, 'v')) {
 					printf("Error: failed to add void specification char\n");
@@ -998,10 +1002,10 @@ int solve_request(request_t *req, type_t *typ, khash_t(conv_map) *conv_map) {
 				}
 			}
 		} else {
-			for (size_t i = 0; i < typ->val.fun.nargs; ++i) {
-				if (!convert_type(req->val.fun.typ, typ->val.fun.args[i], 0, &needs_D, &needs_my, conv_map, req->obj_name)) goto fun_fail;
+			for (size_t i = 0; i < emu_typ->val.fun.nargs; ++i) {
+				if (!convert_type(req->val.fun.typ, emu_typ->val.fun.args[i], 0, &needs_D, &needs_my, conv_map, req->obj_name)) goto fun_fail;
 			}
-			if (typ->val.fun.has_varargs) {
+			if (emu_typ->val.fun.has_varargs) {
 				if (req->def.fun.typ
 				      && (string_len(req->def.fun.typ) == string_len(req->val.fun.typ) + 1)
 				      && !strncmp(string_content(req->def.fun.typ), string_content(req->val.fun.typ), string_len(req->val.fun.typ))
@@ -1010,13 +1014,13 @@ int solve_request(request_t *req, type_t *typ, khash_t(conv_map) *conv_map) {
 					if (!string_add_char(req->val.fun.typ, string_content(req->def.fun.typ)[string_len(req->val.fun.typ)])) {
 						printf("Error: failed to add type char '%c' for %s\n",
 							string_content(req->def.fun.typ)[string_len(req->val.fun.typ)],
-							builtin2str[typ->val.builtin]);
+							builtin2str[emu_typ->val.builtin]);
 						goto fun_fail;
 					}
 				} else {
 					needs_my = 1;
 					if (!string_add_char(req->val.fun.typ, 'V')) {
-						printf("Error: failed to add type char 'V' for %s\n", builtin2str[typ->val.builtin]);
+						printf("Error: failed to add type char 'V' for %s\n", builtin2str[emu_typ->val.builtin]);
 						goto fun_fail;
 					}
 				}
@@ -1024,8 +1028,10 @@ int solve_request(request_t *req, type_t *typ, khash_t(conv_map) *conv_map) {
 		}
 		
 	// fun_succ:
-		// Add 'E' by default
-		if (needs_my) {
+		// Add 'E' by default, unless we have the same function as before
+		if (needs_my && (req->default_comment
+		                  || (req->def.rty != RQT_FUN_MY)
+		                  || strcmp(string_content(req->def.fun.typ), string_content(req->val.fun.typ)))) {
 			if (!string_add_char_at(req->val.fun.typ, 'E', idx_conv + 1)) {
 				printf("Error: failed to add emu char\n");
 				goto fun_fail;
@@ -1064,45 +1070,62 @@ int solve_request(request_t *req, type_t *typ, khash_t(conv_map) *conv_map) {
 		return 0;
 	} else {
 		int needs_D = 0, needs_my = req->def.dat.has_size && (req->def.rty == RQT_DATAM);
-		if (is_simple_type(typ, &needs_D, &needs_my, conv_map)) {
+		if (is_simple_type(emu_typ, &needs_D, &needs_my, conv_map)) {
 			// TODO: Hmm...
 			req->val.rty = needs_my ? RQT_DATAM : req->def.rty;
 			req->val.dat.has_size = 1;
-			req->val.dat.sz = typ->szinfo.size;
+			req->val.dat.sz = emu_typ->szinfo.size;
 			req->has_val = 1;
 			return 1;
 		} else {
 			printf("Error: TODO: solve_request for data %s with non-simple type ", string_content(req->obj_name));
-			type_print(typ);
+			type_print(emu_typ);
 			printf("\n");
 			return 0;
 		}
 	}
 }
-int solve_request_map(request_t *req, khash_t(decl_map) *decl_map, khash_t(conv_map) *conv_map) {
-	khiter_t it = kh_get(decl_map, decl_map, string_content(req->obj_name));
-	if (it == kh_end(decl_map)) {
-		if (string_content(req->obj_name)[0] != '_') {
-			printf("Error: %s was not declared\n", string_content(req->obj_name));
-		}
-		return 0;
+int solve_request_map(request_t *req, khash_t(decl_map) *emu_decl_map, khash_t(decl_map) *target_decl_map, khash_t(conv_map) *conv_map) {
+	int hasemu = 0, hastarget = 0;
+	khiter_t emuit, targetit;
+	emuit = kh_get(decl_map, emu_decl_map, string_content(req->obj_name));
+	if (emuit == kh_end(emu_decl_map)) {
+		goto failed;
+	}
+	if ((kh_val(emu_decl_map, emuit)->storage == STORAGE_STATIC) || (kh_val(emu_decl_map, emuit)->storage == STORAGE_TLS_STATIC)) {
+		goto failed;
+	}
+	targetit = kh_get(decl_map, target_decl_map, string_content(req->obj_name));
+	if (targetit == kh_end(target_decl_map)) {
+		goto failed;
 	}
-	if ((kh_val(decl_map, it)->storage == STORAGE_STATIC) || (kh_val(decl_map, it)->storage == STORAGE_TLS_STATIC)) {
-		if (string_content(req->obj_name)[0] != '_') {
-			printf("Error: %s was not declared\n", string_content(req->obj_name));
+	if ((kh_val(target_decl_map, targetit)->storage == STORAGE_STATIC) || (kh_val(target_decl_map, targetit)->storage == STORAGE_TLS_STATIC)) {
+		goto failed;
+	}
+	return solve_request(req, kh_val(emu_decl_map, emuit)->typ, kh_val(target_decl_map, targetit)->typ, conv_map);
+	
+failed:
+	if (string_content(req->obj_name)[0] != '_') {
+		if (!hasemu && !hastarget) {
+			printf("Error: %s was not declared in the emulated and target architectures\n", string_content(req->obj_name));
+		} else if (!hasemu) {
+			printf("Error: %s was not declared only in the emulated architecture\n", string_content(req->obj_name));
+		} else if (!hastarget) {
+			printf("Error: %s was not declared only in the target architecture\n", string_content(req->obj_name));
+		} else {
+			printf("Error: internal error: failed but found for %s\n", string_content(req->obj_name));
 		}
-		return 0;
 	}
-	return solve_request(req, kh_val(decl_map, it)->typ, conv_map);
+	return 0;
 }
-int solve_references(VECTOR(references) *refs, khash_t(decl_map) *decl_map, khash_t(conv_map) *conv_map) {
+int solve_references(VECTOR(references) *refs, khash_t(decl_map) *emu_decl_map, khash_t(decl_map) *target_decl_map, khash_t(conv_map) *conv_map) {
 	int ret = 1;
 	int cond_depth = 0, ok_depth = 0;
 	vector_for(references, ref, refs) {
 		switch (ref->typ) {
 		case REF_REQ:
 			if (ok_depth == cond_depth) {
-				if (!solve_request_map(&ref->req, decl_map, conv_map)) ret = 0;
+				if (!solve_request_map(&ref->req, emu_decl_map, target_decl_map, conv_map)) ret = 0;
 			} else {
 				ref->req.ignored = 1;
 			}
diff --git a/wrapperhelper/src/generator.h b/wrapperhelper/src/generator.h
index 59115eb0..4d8ef120 100644
--- a/wrapperhelper/src/generator.h
+++ b/wrapperhelper/src/generator.h
@@ -57,8 +57,8 @@ void references_print_check(const VECTOR(references) *refs);
 void output_from_references(FILE *f, const VECTOR(references) *reqs);
 
 VECTOR(references) *references_from_file(const char *filename, FILE *f); // Takes ownership of f
-int solve_request(request_t *req, type_t *typ, khash_t(conv_map) *conv_map);
-int solve_request_map(request_t *req, khash_t(decl_map) *decl_map, khash_t(conv_map) *conv_map);
-int solve_references(VECTOR(references) *reqs, khash_t(decl_map) *decl_map, khash_t(conv_map) *conv_map);
+int solve_request(request_t *req, type_t *emu_typ, type_t *target_typ, khash_t(conv_map) *conv_map);
+int solve_request_map(request_t *req, khash_t(decl_map) *emu_decl_map, khash_t(decl_map) *target_decl_map, khash_t(conv_map) *conv_map);
+int solve_references(VECTOR(references) *reqs, khash_t(decl_map) *emu_decl_map, khash_t(decl_map) *target_decl_map, khash_t(conv_map) *conv_map);
 
 #endif // GENERATOR_H
diff --git a/wrapperhelper/src/lang.c b/wrapperhelper/src/lang.c
index 8aaacc36..c3b5ca19 100644
--- a/wrapperhelper/src/lang.c
+++ b/wrapperhelper/src/lang.c
@@ -783,6 +783,7 @@ struct_t *struct_new(int is_struct, string_t *tag) {
 	ret->is_struct = is_struct;
 	ret->tag = tag;
 	ret->is_defined = 0;
+	ret->is_simple = 0;
 	ret->nrefs = 1;
 	return ret;
 }
diff --git a/wrapperhelper/src/machine.c b/wrapperhelper/src/machine.c
index 9b54df7a..b89a64ae 100644
--- a/wrapperhelper/src/machine.c
+++ b/wrapperhelper/src/machine.c
@@ -6,33 +6,34 @@
 
 machine_t machine_x86_64;
 // machine_t machine_x86;
-// machine_t machine_arm64;
+machine_t machine_aarch64;
 
 #define PASTE2(a, b) a ## b
 #define PASTE(a, b) PASTE2(a, b)
 #define STRINGIFY2(a) #a
 #define STRINGIFY(a) STRINGIFY2(a)
 #define MACHINE_STR STRINGIFY(CUR_MACHINE)
+#define MACHINE_VAL PASTE(machine_, CUR_MACHINE)
 
 #define PATHS_OFFSET_PRE 2 // There are two paths that are always included before any other
 #define ADD_PATH(path) \
-	if (!(PASTE(machine_, CUR_MACHINE).include_path[failure_id] = strdup(path))) { \
-		printf("Failed to add include path to " MACHINE_STR " platform\n");        \
-		goto PASTE(failed_, PASTE(CUR_MACHINE, _paths));                           \
-	}                                                                              \
+	if (!(MACHINE_VAL.include_path[failure_id] = strdup(path))) {           \
+		printf("Failed to add include path to " MACHINE_STR " platform\n"); \
+		goto PASTE(failed_, PASTE(CUR_MACHINE, _paths));                    \
+	}                                                                       \
 	++failure_id;
 #define INIT_PATHS \
-	PASTE(machine_, CUR_MACHINE).npaths = PATHS_OFFSET_PRE + npaths + paths_offset_post;                      \
-	if (!(PASTE(machine_, CUR_MACHINE).include_path =                                                         \
-	      malloc(PASTE(machine_, CUR_MACHINE).npaths * sizeof *PASTE(machine_, CUR_MACHINE).include_path))) { \
-		printf("Failed to add include path to " MACHINE_STR " platform\n");                                   \
-		goto PASTE(failed_, PASTE(CUR_MACHINE, _nopath));                                                     \
-	}                                                                                                         \
-	failure_id = 0;                                                                                           \
-	ADD_PATH("include-override/" MACHINE_STR)                                                                 \
-	ADD_PATH("include-override/common")                                                                       \
-	while (failure_id < PATHS_OFFSET_PRE + npaths) {                                                          \
-		ADD_PATH(extra_include_path[failure_id - PATHS_OFFSET_PRE])                                           \
+	MACHINE_VAL.npaths = PATHS_OFFSET_PRE + npaths + paths_offset_post;     \
+	if (!(MACHINE_VAL.include_path =                                        \
+	      malloc(MACHINE_VAL.npaths * sizeof *MACHINE_VAL.include_path))) { \
+		printf("Failed to add include path to " MACHINE_STR " platform\n"); \
+		goto PASTE(failed_, PASTE(CUR_MACHINE, _nopath));                   \
+	}                                                                       \
+	failure_id = 0;                                                         \
+	ADD_PATH("include-override/" MACHINE_STR)                               \
+	ADD_PATH("include-override/common")                                     \
+	while (failure_id < PATHS_OFFSET_PRE + npaths) {                        \
+		ADD_PATH(extra_include_path[failure_id - PATHS_OFFSET_PRE])         \
 	}
 
 int init_machines(size_t npaths, const char *const *extra_include_path) {
@@ -49,6 +50,23 @@ int init_machines(size_t npaths, const char *const *extra_include_path) {
 	machine_x86_64.size_long = 8;
 	machine_x86_64.align_valist = 8;
 	machine_x86_64.size_valist = 24;
+	machine_x86_64.unsigned_char = 1;
+	machine_x86_64.unnamed_bitfield_aligns = 0;
+	INIT_PATHS
+#define DO_PATH ADD_PATH
+#include "machine.gen"
+#undef DO_PATH
+#undef CUR_MACHINE
+#pragma GCC diagnostic pop
+	
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak"
+#define CUR_MACHINE aarch64
+	machine_aarch64.size_long = 8;
+	machine_aarch64.align_valist = 8;
+	machine_aarch64.size_valist = 32;
+	machine_aarch64.unsigned_char = 0;
+	machine_aarch64.unnamed_bitfield_aligns = 1;
 	INIT_PATHS
 #define DO_PATH ADD_PATH
 #include "machine.gen"
@@ -58,6 +76,13 @@ int init_machines(size_t npaths, const char *const *extra_include_path) {
 	
 	return 1;
 	
+failed_aarch64_paths:
+	while (failure_id--) {
+		free(machine_aarch64.include_path[failure_id]);
+	}
+	free(machine_aarch64.include_path);
+failed_aarch64_nopath:
+	failure_id = machine_x86_64.npaths;
 failed_x86_64_paths:
 	while (failure_id--) {
 		free(machine_x86_64.include_path[failure_id]);
@@ -71,10 +96,19 @@ static void machine_del(machine_t *m) {
 	for (size_t path_no = m->npaths; path_no--;) {
 		free(m->include_path[path_no]);
 	}
-	free(machine_x86_64.include_path);
+	free(m->include_path);
 }
 void del_machines(void) {
 	machine_del(&machine_x86_64);
+	machine_del(&machine_aarch64);
+}
+
+machine_t *convert_machine_name(const char *archname) {
+	if (!strcmp(archname, "x86_64"))
+		return &machine_x86_64;
+	if (!strcmp(archname, "aarch64"))
+		return &machine_aarch64;
+	return NULL;
 }
 
 int validate_type(machine_t *target, type_t *typ) {
@@ -238,17 +272,33 @@ int validate_type(machine_t *target, type_t *typ) {
 					printf("Error: bitfields can only have a specific subset of types\n");
 					return 0;
 				}
-				if ((mem->typ->val.builtin != BTT_BOOL) && (mem->typ->val.builtin != BTT_INT)
-				 && (mem->typ->val.builtin != BTT_SINT) && (mem->typ->val.builtin != BTT_UINT)) {
+				if ((mem->typ->val.builtin != BTT_BOOL) && (mem->typ->val.builtin != BTT_CHAR)
+				 && (mem->typ->val.builtin != BTT_SHORT) && (mem->typ->val.builtin != BTT_INT)
+				 && (mem->typ->val.builtin != BTT_LONG) && (mem->typ->val.builtin != BTT_LONGLONG)
+				 && (mem->typ->val.builtin != BTT_SCHAR) && (mem->typ->val.builtin != BTT_UCHAR)
+				 && (mem->typ->val.builtin != BTT_SSHORT) && (mem->typ->val.builtin != BTT_USHORT)
+				 && (mem->typ->val.builtin != BTT_SINT) && (mem->typ->val.builtin != BTT_UINT)
+				 && (mem->typ->val.builtin != BTT_SLONG) && (mem->typ->val.builtin != BTT_ULONG)
+				 && (mem->typ->val.builtin != BTT_S8) && (mem->typ->val.builtin != BTT_U8)
+				 && (mem->typ->val.builtin != BTT_S16) && (mem->typ->val.builtin != BTT_U16)
+				 && (mem->typ->val.builtin != BTT_S32) && (mem->typ->val.builtin != BTT_U32)
+				 && (mem->typ->val.builtin != BTT_S64) && (mem->typ->val.builtin != BTT_U64)) {
+					// C standard: allow _Bool, (s/u)int
+					// Implementation: also allow (u/s)char, (u/s)short, (u/s)long, (u/s)long long, [u]intx_t
 					printf("Error: bitfields can only have a specific subset of types\n");
 					return 0;
 				}
-				if (!mem->name && (mem->typ->szinfo.align > max_align)) {
-					printf("Error: TODO: unnamed bitfield member with greater alignment (width=%zu)\n", mem->bitfield_width);
+				if (mem->typ->szinfo.size < mem->bitfield_width / 8) {
+					printf("Error: bitfield member %c%s%c has width (%zu) greater than its container size (%zu * 8)\n",
+						mem->name ? '\'' : '<',
+						mem->name ? string_content(mem->name) : "unnamed",
+						mem->name ? '\'' : '>',
+						mem->bitfield_width,
+						mem->typ->szinfo.size);
 					return 0;
 				}
 				if (mem->bitfield_width) {
-					if (mem->name && (max_align < mem->typ->szinfo.align)) max_align = mem->typ->szinfo.align;
+					if ((target->unnamed_bitfield_aligns || mem->name) && (max_align < mem->typ->szinfo.align)) max_align = mem->typ->szinfo.align;
 					size_t cur_block = cur_sz / mem->typ->szinfo.align;
 					size_t end_block = (cur_sz + (cur_bit + mem->bitfield_width - 1) / 8) / mem->typ->szinfo.align;
 					if (cur_block == end_block) {
diff --git a/wrapperhelper/src/machine.h b/wrapperhelper/src/machine.h
index b5a5b0ea..566f1d43 100644
--- a/wrapperhelper/src/machine.h
+++ b/wrapperhelper/src/machine.h
@@ -17,15 +17,14 @@ typedef struct machine_s {
 	// Parsing
 	size_t size_long;
 	size_t align_valist, size_valist;
-	// TODO: also have info on unnamed bitfields, etc
+	_Bool unsigned_char;
+	// Structure parsing
+	_Bool unnamed_bitfield_aligns;
 } machine_t;
 
-extern machine_t machine_x86_64;
-// extern machine_t machine_x86;
-// extern machine_t machine_arm64;
-
 int init_machines(size_t npaths, const char *const *extra_include_path);
 void del_machines(void);
+machine_t *convert_machine_name(const char *archname);
 
 int validate_type(machine_t *target, struct type_s *typ);
 
diff --git a/wrapperhelper/src/parse.c b/wrapperhelper/src/parse.c
index 4b5b90b9..0254d8df 100644
--- a/wrapperhelper/src/parse.c
+++ b/wrapperhelper/src/parse.c
@@ -735,7 +735,7 @@ expr_new_token:
 	// expr2 ::= sizeof expr2
 	// which includes expr2 ::= sizeof ( expr16 )
 	// expr2 ::= sizeof ( type-name )
-	if ((has_level == -1) && (expr_level >= 2) && (tok->tokt == PTOK_KEYWORD) && (tok->tokv.kw = KW_SIZEOF)) {
+	if ((has_level == -1) && (expr_level >= 2) && (tok->tokt == PTOK_KEYWORD) && (tok->tokv.kw == KW_SIZEOF)) {
 		*tok = proc_next_token(prep);
 		if ((tok->tokt != PTOK_SYM) || (tok->tokv.sym != SYM_LPAREN)) {
 			struct expr_partial_op pop = {
@@ -765,8 +765,8 @@ expr_new_token:
 			if (!parse_type_name(target, struct_map, type_map, enum_map, builtins, const_map, type_set, prep, tok, SYM_RPAREN, &typ)) {
 				goto failed;
 			}
-			if (!typ->is_validated || typ->is_incomplete) {
-				printf("Error: cannot get the size of an incomplete type\n");
+			if (!typ->is_validated || typ->is_incomplete || (typ->typ == TYPE_FUNCTION)) {
+				printf("Error: cannot get the size of a function or incomplete type\n");
 				type_del(typ);
 				proc_token_del(tok);
 				goto failed;
@@ -817,6 +817,51 @@ expr_new_token:
 			goto pushed_expr;
 		}
 	}
+	// expr2 ::= _Alignof ( type-name )
+	if ((has_level == -1) && (expr_level >= 2) && (tok->tokt == PTOK_KEYWORD) && (tok->tokv.kw == KW_ALIGNOF)) {
+		*tok = proc_next_token(prep);
+		if ((tok->tokt != PTOK_SYM) || (tok->tokv.sym != SYM_LPAREN)) {
+			printf("Error: invalid _Alignof expression\n");
+			proc_token_del(tok);
+			goto failed;
+		}
+		// Empty destructor
+		*tok = proc_next_token(prep);
+		type_t *typ = type_new();
+		if (!typ) {
+			printf("Error: failed to create new type info structure\n");
+			proc_token_del(tok);
+			goto failed;
+		}
+		if (!parse_type_name(target, struct_map, type_map, enum_map, builtins, const_map, type_set, prep, tok, SYM_RPAREN, &typ)) {
+			goto failed;
+		}
+		if (!typ->is_validated || typ->is_incomplete || (typ->typ == TYPE_FUNCTION)) {
+			printf("Error: cannot get the alignment of a function or incomplete type\n");
+			type_del(typ);
+			proc_token_del(tok);
+			goto failed;
+		}
+		e = malloc(sizeof *e);
+		if (!e) {
+			printf("Error: failed to create new expression atom\n");
+			type_del(typ);
+			proc_token_del(tok);
+			goto failed;
+		}
+		e->typ = ETY_CONST;
+		e->val.cst.typ = NCT_UINT64;
+		e->val.cst.val.u64 = typ->szinfo.align;
+		has_level = 2;
+		type_del(typ);
+		if (!e->val.cst.val.u64) {
+			proc_token_del(tok);
+			goto failed;
+		}
+		// Empty destructor
+		*tok = proc_next_token(prep);
+		goto expr_new_token;
+	}
 	
 	// expr0 ::= ( expr16 )
 	// expr1 ::= expr1 ( )
@@ -1327,7 +1372,7 @@ static int eval_expression(expr_t *e, khash_t(const_map) *const_map, num_constan
 				return 1;
 			case BTT_VOID:
 			case BTT_BOOL:
-			case BTT_CHAR:
+			case BTT_CHAR: // May be signed or unsigned depending on the machine
 			case BTT_SCHAR:
 			case BTT_SHORT:
 			case BTT_SSHORT:
@@ -1960,6 +2005,7 @@ parse_cur_token_decl:
 			}
 			
 			typ->is_incomplete = 0;
+			typ->is_validated = 0;
 			typ->val.st->has_incomplete = 0; // Filled by the validate_type step
 			typ->val.st->nmembers = vector_size(st_members, members);
 			typ->val.st->members = vector_steal(st_members, members);
@@ -3178,14 +3224,14 @@ failed0:
 	return 0;
 }
 
-int finalize_file(file_t *file) {
+static int finalize_file(machine_t *target, file_t *file) {
 #define MARK_SIMPLE(sname) \
 	it = kh_get(struct_map, file->struct_map, #sname);                          \
 	if (it != kh_end(file->struct_map)) {                                       \
 		kh_val(file->struct_map, it)->is_simple = 1;                            \
 	} else {                                                                    \
 		it = kh_get(type_map, file->type_map, #sname);                          \
-		if (it != kh_end(file->struct_map)) {                                   \
+		if (it != kh_end(file->type_map)) {                                     \
 			type_t *typ2 = kh_val(file->type_map, it);                          \
 			if (typ2->typ != TYPE_STRUCT_UNION) {                               \
 				printf("Error: invalid typedef " #sname ": not a structure\n"); \
@@ -3195,6 +3241,7 @@ int finalize_file(file_t *file) {
 		}                                                                       \
 	}
 #define SET_WEAK(converted) \
+	validate_type(target, typ);                                              \
 	typ = type_try_merge(typ, file->type_set);                               \
 	it = kh_put(conv_map, file->relaxed_type_conversion, typ, &iret);        \
 	if (iret < 0) {                                                          \
@@ -3206,8 +3253,7 @@ int finalize_file(file_t *file) {
 		type_del(typ);                                                       \
 		return 0;                                                            \
 	}                                                                        \
-	kh_val(file->relaxed_type_conversion, it) = string_new_cstr(#converted); \
-	type_del(typ);
+	kh_val(file->relaxed_type_conversion, it) = string_new_cstr(#converted);
 #define SET_WEAK_PTR_TO(to_typ, converted) \
 	it = kh_get(type_map, file->type_map, #to_typ);         \
 	if (it != kh_end(file->type_map)) {                     \
@@ -3216,6 +3262,7 @@ int finalize_file(file_t *file) {
 			printf("Failed to create type " #to_typ "*\n"); \
 			return 0;                                       \
 		}                                                   \
+		++kh_val(file->type_map, it)->nrefs;                \
 		SET_WEAK(converted)                                 \
 	}
 	
@@ -3417,7 +3464,7 @@ file_t *parse_file(machine_t *target, const char *filename, FILE *file) {
 success:
 	preproc_del(prep);
 	type_del(typ);
-	if (!finalize_file(ret)) {
+	if (!finalize_file(target, ret)) {
 		printf("Error: failed to add builtin aliases\n");
 		file_del(ret);
 		return NULL;