aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile40
-rw-r--r--misctools/headers-cleaner.js102
-rw-r--r--misctools/headers-cleaner.zig58
3 files changed, 125 insertions, 75 deletions
diff --git a/Makefile b/Makefile
index e4ae25005..8458d68fe 100644
--- a/Makefile
+++ b/Makefile
@@ -31,6 +31,7 @@ endif
AR=
+BUN_OR_NODE = $(shell which bun || which node)
CXX_VERSION=c++2a
TRIPLET = $(OS_NAME)-$(ARCH_NAME)
@@ -156,25 +157,28 @@ ENABLE_MIMALLOC ?= 1
_MIMALLOC_FILE = libmimalloc.o
_MIMALLOC_INPUT_PATH = CMakeFiles/mimalloc-obj.dir/src/static.c.o
_MIMALLOC_DEBUG_FILE = libmimalloc-debug.a
+_MIMALLOC_OBJECT_FILE = 1
+_MIMALLOC_LINK = $(BUN_DEPS_OUT_DIR)/$(MIMALLOC_FILE)
DEFAULT_LINKER_FLAGS =
JSC_BUILD_STEPS :=
ifeq ($(OS_NAME),linux)
JSC_BUILD_STEPS += jsc-build-linux
+ _MIMALLOC_LINK = $(BUN_DEPS_OUT_DIR)/$(MIMALLOC_FILE)
DEFAULT_LINKER_FLAGS= -pthread -ldl
endif
ifeq ($(OS_NAME),darwin)
+ _MIMALLOC_OBJECT_FILE = 0
JSC_BUILD_STEPS += jsc-build-mac jsc-copy-headers
_MIMALLOC_FILE = libmimalloc.a
_MIMALLOC_INPUT_PATH = libmimalloc.a
+ _MIMALLOC_LINK = -lmimalloc
endif
MIMALLOC_FILE=
MIMALLOC_INPUT_PATH=
-MIMALLOC_FILE_PATH=
ifeq ($(ENABLE_MIMALLOC), 1)
MIMALLOC_FILE=$(_MIMALLOC_FILE)
-MIMALLOC_FILE_PATH=$(BUN_DEPS_OUT_DIR)/$(MIMALLOC_FILE)
MIMALLOC_INPUT_PATH=$(_MIMALLOC_INPUT_PATH)
endif
@@ -325,7 +329,7 @@ ifeq ($(OS_NAME), darwin)
SHARED_LIB_EXTENSION = .dylib
endif
-ARCHIVE_FILES_WITHOUT_LIBCRYPTO = $(MIMALLOC_FILE_PATH) \
+ARCHIVE_FILES_WITHOUT_LIBCRYPTO = \
$(BUN_DEPS_OUT_DIR)/picohttpparser.o \
-L$(BUN_DEPS_OUT_DIR) \
-llolhtml \
@@ -333,7 +337,8 @@ ARCHIVE_FILES_WITHOUT_LIBCRYPTO = $(MIMALLOC_FILE_PATH) \
-larchive \
-lssl \
-lbase64 \
- -ltcc
+ -ltcc \
+ $(_MIMALLOC_LINK)
ARCHIVE_FILES = $(ARCHIVE_FILES_WITHOUT_LIBCRYPTO) -lcrypto
@@ -377,6 +382,7 @@ BUN_LLD_FLAGS_WITHOUT_JSC = $(ARCHIVE_FILES) \
BUN_LLD_FLAGS = $(BUN_LLD_FLAGS_WITHOUT_JSC) $(JSC_FILES) $(BINDINGS_OBJ)
+BUN_LLD_FLAGS_FAST = $(BUN_LLD_FLAGS_WITHOUT_JSC) $(JSC_FILES_DEBUG) $(BINDINGS_OBJ)
BUN_LLD_FLAGS_DEBUG = $(BUN_LLD_FLAGS_WITHOUT_JSC) $(JSC_FILES_DEBUG) $(BINDINGS_OBJ)
@@ -715,18 +721,7 @@ jsc-bindings-headers:
$(CXX) $(PLATFORM_LINKER_FLAGS) $(JSC_FILES_DEBUG) ${ICU_FLAGS} $(BUN_LLD_FLAGS_WITHOUT_JSC) -g $(DEBUG_BIN)/headers.o -W -o /tmp/build-jsc-headers -lc;
/tmp/build-jsc-headers
$(ZIG) translate-c src/bun.js/bindings/headers.h > src/bun.js/bindings/headers.zig
- $(ZIG) run misctools/headers-cleaner.zig -lc
- $(SED) -i '/pub const __darwin/d' src/bun.js/bindings/headers.zig || echo "";
- $(SED) -i '/pub const __builtin/d' src/bun.js/bindings/headers.zig || echo "";
- $(SED) -i '/pub const int/d' src/bun.js/bindings/headers.zig || echo "";
- $(SED) -i '/pub const uint/d' src/bun.js/bindings/headers.zig || echo "";
- $(SED) -i '/pub const intmax/d' src/bun.js/bindings/headers.zig || echo "";
- $(SED) -i '/pub const uintmax/d' src/bun.js/bindings/headers.zig || echo "";
- $(SED) -i '/pub const max_align_t/{N;N;N;d;}' src/bun.js/bindings/headers.zig
- $(SED) -i '/pub const ZigErrorCode/d' src/bun.js/bindings/headers.zig
- $(SED) -i '/pub const JSClassRef/d' src/bun.js/bindings/headers.zig
- cat src/bun.js/bindings/headers.zig > /tmp/headers.zig
- cat src/bun.js/bindings/headers-replacements.zig /tmp/headers.zig > src/bun.js/bindings/headers.zig
+ $(BUN_OR_NODE) misctools/headers-cleaner.js
$(ZIG) fmt src/bun.js/bindings/headers.zig
@@ -1186,6 +1181,16 @@ bun-link-lld-release:
rm -rf $(BUN_RELEASE_BIN).dSYM
cp $(BUN_RELEASE_BIN) $(BUN_RELEASE_BIN)-profile
+bun-link-lld-release-no-lto:
+ $(CXX) $(BUN_LLD_FLAGS_FAST) $(SYMBOLS) \
+ $(BUN_RELEASE_BIN).o \
+ -o $(BUN_RELEASE_BIN) \
+ -W \
+ $(OPTIMIZATION_LEVEL) $(RELEASE_FLAGS)
+ rm -rf $(BUN_RELEASE_BIN).dSYM
+ cp $(BUN_RELEASE_BIN) $(BUN_RELEASE_BIN)-profile
+
+
ifeq ($(OS_NAME),darwin)
bun-link-lld-release-dsym:
$(DSYMUTIL) -o $(BUN_RELEASE_BIN).dSYM $(BUN_RELEASE_BIN)
@@ -1205,6 +1210,7 @@ endif
bun-relink: bun-relink-copy bun-link-lld-release bun-link-lld-release-dsym
+bun-relink-fast: bun-relink-copy bun-link-lld-release-no-lto
wasm-return1:
zig build-lib -OReleaseSmall test/bun.js/wasm-return-1-test.zig -femit-bin=test/bun.js/wasm-return-1-test.wasm -target wasm32-freestanding
@@ -1218,7 +1224,7 @@ generate-sink:
EMIT_LLVM_FOR_RELEASE=-emit-llvm -flto="full"
EMIT_LLVM_FOR_DEBUG=
-EMIT_LLVM=$(EMIT_LLVM_FOR_RELEASE)
+EMIT_LLVM=$(EMIT_LLVM_FOR_DEBUG)
# We do this outside of build.zig for performance reasons
# The C compilation stuff with build.zig is really slow and we don't need to run this as often as the rest
diff --git a/misctools/headers-cleaner.js b/misctools/headers-cleaner.js
new file mode 100644
index 000000000..10824d916
--- /dev/null
+++ b/misctools/headers-cleaner.js
@@ -0,0 +1,102 @@
+// this file is intended to be runnable both from node and bun
+var { readFileSync, writeFileSync } = require("fs");
+var { join } = require("path");
+
+const destination = join(__dirname, "../src/bun.js/bindings/headers.zig");
+const replacements = join(
+ __dirname,
+ "../src/bun.js/bindings/headers-replacements.zig"
+);
+
+console.log("Writing to", destination);
+var output = "// GENERATED CODE - DO NOT MODIFY BY HAND\n\n";
+var input = readFileSync(destination, "utf8");
+
+const first_extern = input.indexOf("extern fn");
+const first_extern_line = input.indexOf("\n", first_extern - 128);
+const last_extern_fn = input.lastIndexOf("extern");
+const last_extern_fn_line = input.indexOf("\n", last_extern_fn);
+const keep = (
+ input.substring(0, first_extern_line) + input.substring(last_extern_fn_line)
+)
+ .split("\n")
+ .filter(
+ (a) =>
+ /const (JSC|WTF|Web)_/gi.test(a) &&
+ !a.includes("JSValue") &&
+ !a.includes("CatchScope")
+ )
+ .join("\n")
+ .trim();
+
+input = keep + input.slice(first_extern_line, last_extern_fn_line);
+input = input.replaceAll("*WebCore__", "*bindings.");
+input = input.replaceAll("*JSC__", "*bindings.");
+input = input.replaceAll("[*c] JSC__", "[*c]bindings.");
+input = input.replaceAll("[*c] const JSC__", "[*c]const bindings.");
+input = input.replaceAll(
+ "[*c]Inspector__ScriptArguments",
+ "[*c]bindings.ScriptArguments"
+);
+
+input = input
+ .replaceAll("VirtualMachine", "bindings.VirtualMachine")
+ .replaceAll("bindings.bindings.VirtualMachine", "bindings.VirtualMachine");
+
+const hardcode = {
+ "[*c][*c]JSC__Exception": "*?*JSC__Exception ",
+ "[*c]?*anyopaque": "[*c]*anyopaque",
+ "[*c]JSC__JSGlobalObject": "?*JSC__JSGlobalObject",
+};
+
+for (let key in hardcode) {
+ const value = hardcode[key];
+ input = input.replaceAll(key, value);
+}
+
+const remove = [
+ "pub const __darwin",
+ "pub const _",
+ "pub const __builtin",
+ "pub const int",
+ "pub const INT",
+ "pub const uint",
+ "pub const UINT",
+ "pub const WCHAR",
+ "pub const wchar",
+ "pub const intmax",
+ "pub const INTMAX",
+ "pub const uintmax",
+ "pub const UINTMAX",
+ "pub const max_align_t",
+ "pub const ZigErrorCode",
+ "pub const JSClassRef",
+ "pub const __",
+];
+var lines = input.split("\n");
+for (let prefix of remove) {
+ for (let i = 0; i < lines.length; i++) {
+ const line = lines[i];
+ if (line.startsWith(prefix)) {
+ lines[i] = "";
+ }
+ }
+}
+for (let i = 0; i < lines.length; i++) {
+ const line = lines[i];
+ if (line.includes("struct_")) {
+ lines[i] = "";
+ continue;
+ }
+}
+input = lines.filter((a) => a.length > 0).join("\n");
+
+writeFileSync(
+ destination,
+ output +
+ "\n" +
+ readFileSync(replacements, "utf8").trim() +
+ "\n" +
+ input.trim() +
+ "\n"
+);
diff --git a/misctools/headers-cleaner.zig b/misctools/headers-cleaner.zig
deleted file mode 100644
index 4715a2c97..000000000
--- a/misctools/headers-cleaner.zig
+++ /dev/null
@@ -1,58 +0,0 @@
-const std = @import("std");
-
-pub fn main() anyerror!void {
- const headers_zig_file_src: std.builtin.SourceLocation = @src();
- var paths = [_][]const u8{ std.mem.span(headers_zig_file_src.file), "../../src/bun.js/bindings/headers.zig" };
- const headers_zig_file = try std.fs.path.resolve(std.heap.c_allocator, &paths);
- std.debug.print("Writing to {s}", .{headers_zig_file});
- var headers_zig: std.fs.File = try std.fs.openFileAbsolute(headers_zig_file, .{ .mode = .read_write });
- var contents = try headers_zig.readToEndAlloc(std.heap.page_allocator, headers_zig.getEndPos() catch unreachable);
- const last_extern_i = std.mem.lastIndexOf(u8, contents, "pub extern fn") orelse @panic("Expected contents");
- const last_newline = std.mem.indexOf(u8, contents[last_extern_i..], "\n") orelse @panic("Expected newline");
- const to_splice = "// GENERATED CODE - DO NOT MODIFY BY HAND\n\n";
- var new_contents = try std.heap.page_allocator.alloc(u8, contents.len + to_splice.len);
- std.mem.copy(u8, new_contents, to_splice);
- std.mem.copy(u8, new_contents[to_splice.len..], contents);
- var i: usize = to_splice.len;
- var remainder = new_contents[i..];
- while (remainder.len > 0) {
- i = (std.mem.indexOf(u8, remainder, "\npub const struct_b") orelse break);
- var begin = remainder[i..];
-
- const end_struct = (std.mem.indexOf(u8, begin, "\n};\n") orelse break) + "\n};\n".len;
-
- std.mem.set(u8, begin[1 .. end_struct + 3], ' ');
- remainder = begin[end_struct..];
- }
- i = to_splice.len;
- remainder = new_contents[i..];
- while (remainder.len > 0) {
- i = (std.mem.indexOf(u8, remainder, "\npub const struct_") orelse break);
- var begin = remainder[i..];
- var end_struct = (std.mem.indexOf(u8, begin, "opaque {};") orelse break);
- end_struct += (std.mem.indexOf(u8, begin[end_struct..], "\n") orelse break);
- i = 0;
-
- std.mem.set(u8, begin[1..end_struct], ' ');
- remainder = begin[end_struct..];
- }
-
- const HARDCODE = [_][]const u8{
- "[*c][*c]JSC__Exception",
- "*?*JSC__Exception ",
- "[*c]?*anyopaque",
- "[*c]*anyopaque",
- };
- i = 0;
- while (i < HARDCODE.len) : (i += 2) {
- _ = std.mem.replace(u8, new_contents, HARDCODE[i], HARDCODE[i + 1], new_contents);
- }
-
- const js_value_start = std.mem.indexOf(u8, new_contents, "pub const JSC__JSValue") orelse unreachable;
- const js_value_end = std.mem.indexOf(u8, new_contents[js_value_start..], "\n") orelse unreachable;
- std.mem.set(u8, new_contents[js_value_start..][0..js_value_end], ' ');
-
- try headers_zig.seekTo(0);
- try headers_zig.writeAll(new_contents);
- try headers_zig.setEndPos(last_newline + last_extern_i + to_splice.len);
-}