summaryrefslogtreecommitdiff
path: root/bxgen.c
diff options
context:
space:
mode:
authorMitya Selivanov <automainint@guattari.tech>2024-07-13 19:35:19 +0200
committerMitya Selivanov <automainint@guattari.tech>2024-07-13 19:35:19 +0200
commit90dfcfd6913b24700b956e9b21661f58b0913e88 (patch)
treeb064244d5b61ef42c0218151b34d612723c81890 /bxgen.c
parent85c9255ab4f56a8c88a3b1910f1d792ea76def16 (diff)
downloadbxgen-90dfcfd6913b24700b956e9b21661f58b0913e88.zip
Cleanup
Diffstat (limited to 'bxgen.c')
-rwxr-xr-xbxgen.c94
1 files changed, 66 insertions, 28 deletions
diff --git a/bxgen.c b/bxgen.c
index d64f6b2..a5c590c 100755
--- a/bxgen.c
+++ b/bxgen.c
@@ -6,7 +6,7 @@
#/ Binary executable code generation and linking.
#/ Compiler backend.
#/
-#/ ================================================================
+#/ ----------------------------------------------------------------
#/
#/ Qualities
#/
@@ -44,7 +44,14 @@
#/ - JIT
#/ - COFF, PE, OMF, Mach-O
#/ - i386, RISC-V, ARM, WebAssembly
+#/ - Soft floating-point arithmeric
#/ - Built-in standard library
+#/ - Built-in battaries:
+#/ - File I/O
+#/ - Input devices
+#/ - Networking
+#/ - Graphics
+#/ - Audio
#/
#/ Bugs
#/
@@ -415,7 +422,11 @@ void l_static(i64 unit, c8 *static_library);
// ================================================================
//
-// Main features implementation
+// IMPLEMENTATION
+//
+// ================================================================
+//
+// * Basic utilities
//
// ================================================================
@@ -425,9 +436,6 @@ void l_static(i64 unit, c8 *static_library);
#error Implementation code should be compiled with a C compiler!
#endif
-// Utils
-//
-
#ifndef NULL
#define NULL ((void *) 0)
#endif
@@ -489,6 +497,12 @@ c8 *bx_find_char(c8 *s, c8 *s_end, c8 c) {
return *s == c ? s : NULL;
}
+// ================================================================
+//
+// * Semantic graph
+//
+// ================================================================
+
// IR building procs
//
@@ -797,10 +811,15 @@ void unit_set_entry_point(Pool *pool, i64 unit, i64 entry_point_proc) {
pool->entities[unit].unit.entry_point_index = p->index_in_unit;
}
-// Serialization
+// ================================================================
//
+// * Serialization
+//
+// ================================================================
u16 read_u16(i32 endianness, void const *v) {
+ BX_ASSERT(v != NULL);
+
u8 const *u = (u8 const *) v;
if (endianness == LE)
@@ -816,6 +835,8 @@ u16 read_u16(i32 endianness, void const *v) {
}
u32 read_u32(i32 endianness, void const *v) {
+ BX_ASSERT(v != NULL);
+
u8 const *u = (u8 const *) v;
if (endianness == LE)
@@ -836,6 +857,8 @@ u32 read_u32(i32 endianness, void const *v) {
}
u64 read_u64(i32 endianness, void const *v) {
+ BX_ASSERT(v != NULL);
+
u8 const *u = (u8 const *) v;
if (endianness == LE)
@@ -863,6 +886,8 @@ u64 read_u64(i32 endianness, void const *v) {
}
void write_u16(i32 endianness, u16 x, void *v) {
+ BX_ASSERT(v != NULL);
+
u8 *u = (u8 *) v;
if (endianness == LE) {
@@ -879,6 +904,8 @@ void write_u16(i32 endianness, u16 x, void *v) {
}
void write_u32(i32 endianness, u32 x, void *v) {
+ BX_ASSERT(v != NULL);
+
u8 *u = (u8 *) v;
if (endianness == LE) {
@@ -899,6 +926,8 @@ void write_u32(i32 endianness, u32 x, void *v) {
}
void write_u64(i32 endianness, u64 x, void *v) {
+ BX_ASSERT(v != NULL);
+
u8 *u = (u8 *) v;
if (endianness == LE) {
@@ -966,8 +995,11 @@ void write_f64(i32 endianness, f64 x, void *v) {
write_u64(endianness, *(u64 *) &x, v);
}
-// Code generation proc
+// ================================================================
//
+// * Code generation and linking
+//
+// ================================================================
#include <stdio.h> // TEMP
#include <stdlib.h> // TEMP
@@ -1053,7 +1085,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data
BX_ASSERT(pool->entities[unit].unit.entry_point_index != UNDEFINED);
BX_ASSERT(target == (FORMAT_ELF | ARCH_X86_64));
- // ================================================================
+ // ==============================================================
c8 ELF_MAGIC[4] = "\x7f" "ELF";
@@ -1081,7 +1113,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data
c8 STRTAB[] = ".strtab";
- // ================================================================
+ // ==============================================================
#define WRITE(x, n) io_write( io_out, n, x, io_user_data )
#define WRITE_V(...) io_write( io_out, sizeof((u8[]) {__VA_ARGS__}), (u8[]) {__VA_ARGS__}, io_user_data )
@@ -1161,7 +1193,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data
#undef WRITE
- // ================================================================
+ // ==============================================================
// Intermediate buffer
//
@@ -1248,7 +1280,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data
f_begin = f_data + fn_size;
} else {
- // ================================================================
+ // ========================================================
//
// Decode ELF object file
@@ -1296,14 +1328,14 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data
f_begin = f_data + fn_size;
- // ================================================================
+ // ========================================================
}
}
}
return;
- // ================================================================
+ // ==============================================================
// Read dependencies
//
@@ -1329,7 +1361,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data
i64 n = 0, current_offset = 0;
- // ================================================================
+ // ==========================================================
//
// Read AR library
@@ -1483,7 +1515,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data
printf(" <SYMBOLS NOT FOUND>\n");
}
- // ================================================================
+ // ======================================================
//
// Decode ELF object file
@@ -1737,7 +1769,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data
printf("\n");
switch (type) {
- // ================================================================
+ // ==================================================
//
// Symbols
@@ -1841,7 +1873,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data
byte_count = prev_byte_count;
} break;
- // ================================================================
+ // ==================================================
//
// Relocarions without addends
@@ -1878,7 +1910,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data
byte_count = prev_byte_count;
} break;
- // ================================================================
+ // ==================================================
//
// Relocarions with addends
//
@@ -1981,7 +2013,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data
byte_count = prev_byte_count;
} break;
- // ================================================================
+ // ==================================================
default:;
}
@@ -1994,7 +2026,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data
#undef READ
- // ================================================================
+ // ======================================================
}
}
@@ -2004,7 +2036,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data
"<FILE NOT FOUND>",
symbols[symbol_index]);
- // ================================================================
+ // ==========================================================
io_close(f, io_user_data);
}
@@ -2054,7 +2086,7 @@ void io_chmod_exe(i64 f, void *user_data) {
// ================================================================
//
-// Helpers implementation
+// * Helper procedures
//
// ================================================================
@@ -2077,7 +2109,10 @@ void bx_assert(b8 condition, c8 const *message, u32 line, c8 const *file) {
return;
fflush(stdout);
- fprintf(stderr, "\r\x1b[31mASSERTION:\x1b[37m `\x1b[33m%s\x1b[37m` is false in \x1b[36m%s:%d\x1b[37m\n", message, file, line);
+ fprintf(stderr,
+ "\r\x1b[31mASSERTION:\x1b[37m `\x1b[33m%s\x1b[37m`"
+ " is false in \x1b[36m%s:%d\x1b[37m\n",
+ message, file, line);
exit(-1);
}
@@ -2120,10 +2155,13 @@ void io_dispatch(i16 op, i64 *id, i64 *size, void *data, void *user_data) {
u16 *origin = (u16 *) data;
if (!(*origin == IO_SEEK_CURSOR && *size == 0)) {
- BX_ASSERT(*origin == IO_SEEK_CURSOR || *origin == IO_SEEK_BEGIN || *origin == IO_SEEK_END);
- i32 s = fseek(*f, *size, *origin == IO_SEEK_CURSOR ? SEEK_CUR :
- *origin == IO_SEEK_BEGIN ? SEEK_SET :
- SEEK_END);
+ BX_ASSERT(*origin == IO_SEEK_CURSOR ||
+ *origin == IO_SEEK_BEGIN ||
+ *origin == IO_SEEK_END);
+ i32 s = fseek(*f, *size,
+ *origin == IO_SEEK_CURSOR ? SEEK_CUR :
+ *origin == IO_SEEK_BEGIN ? SEEK_SET :
+ SEEK_END);
BX_ASSERT(s == 0);
}
} break;
@@ -2254,7 +2292,7 @@ void l_static(i64 unit, c8 *static_library) {
// ================================================================
//
-// Example
+// EXAMPLE
//
// ================================================================