aboutsummaryrefslogtreecommitdiff
path: root/src/link/C
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-01-05 11:08:34 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-01-05 17:41:14 -0700
commit7b8cede61fc20c137aca4e02425536bfc9a5a400 (patch)
tree9533e4e3afb63e23ab5a42ecddb18b9998ec1237 /src/link/C
parent9360e5887ce0bf0ce204eb49f0d0b253348ef557 (diff)
downloadzig-7b8cede61fc20c137aca4e02425536bfc9a5a400.tar.gz
zig-7b8cede61fc20c137aca4e02425536bfc9a5a400.zip
stage2: rework the C backend
* std.ArrayList gains `moveToUnmanaged` and dead code `ArrayListUnmanaged.appendWrite` is deleted. * emit_h state is attached to Module rather than Compilation. * remove the implementation of emit-h because it did not properly integrate with incremental compilation. I will re-implement it in a follow-up commit. * Compilation: use the .codegen_failure tag rather than .dependency_failure tag for when `bin_file.updateDecl` fails. C backend: * Use a CValue tagged union instead of strings for C values. * Cleanly separate state into Object and DeclGen: - Object is present only when generating a .c file - DeclGen is present for both generating a .c and .h * Move some functions into their respective Object/DeclGen namespace. * Forward decls are managed by the incremental compilation frontend; C backend no longer renders function signatures based on callsites. For simplicity, all functions always get forward decls. * Constants are managed by the incremental compilation frontend. C backend no longer has a "constants" section. * Participate in incremental compilation. Each Decl gets an ArrayList for its generated C code and it is updated when the Decl is updated. During flush(), all these are joined together in the output file. * The new CValue tagged union is used to clean up using of assigning to locals without an additional pointer local. * Fix bug with bitcast of non-pointers making the memcpy destination immutable.
Diffstat (limited to 'src/link/C')
-rw-r--r--src/link/C/zig.h45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/link/C/zig.h b/src/link/C/zig.h
new file mode 100644
index 0000000000..49f97210eb
--- /dev/null
+++ b/src/link/C/zig.h
@@ -0,0 +1,45 @@
+#if __STDC_VERSION__ >= 199901L
+#include <stdbool.h>
+#else
+#define bool unsigned char
+#define true 1
+#define false 0
+#endif
+
+#if __STDC_VERSION__ >= 201112L
+#define zig_noreturn _Noreturn
+#elif __GNUC__
+#define zig_noreturn __attribute__ ((noreturn))
+#elif _MSC_VER
+#define zig_noreturn __declspec(noreturn)
+#else
+#define zig_noreturn
+#endif
+
+#if defined(__GNUC__)
+#define zig_unreachable() __builtin_unreachable()
+#else
+#define zig_unreachable()
+#endif
+
+#if defined(_MSC_VER)
+#define zig_breakpoint __debugbreak()
+#else
+#if defined(__MINGW32__) || defined(__MINGW64__)
+#define zig_breakpoint __debugbreak()
+#elif defined(__clang__)
+#define zig_breakpoint __builtin_debugtrap()
+#elif defined(__GNUC__)
+#define zig_breakpoint __builtin_trap()
+#elif defined(__i386__) || defined(__x86_64__)
+#define zig_breakpoint __asm__ volatile("int $0x03");
+#else
+#define zig_breakpoint raise(SIGTRAP)
+#endif
+#endif
+
+#include <stdint.h>
+#define int128_t __int128
+#define uint128_t unsigned __int128
+#include <string.h>
+