commit a1233648a601a398356c9a3c3d9f63ed1a7a7e73
parent ecbed962c021579f1bdf8f010da7c9de7dae84f4
Author: Henry Wilson <henry@henryandlizzy.uk>
Date: Thu, 8 Jan 2026 19:04:40 +0000
Move runtime support functions to cxa.cpp
Diffstat:
3 files changed, 32 insertions(+), 23 deletions(-)
diff --git a/Tupfile b/Tupfile
@@ -1,15 +1,23 @@
CXXFLAGS = -std=c++23 -Werror -g -fno-exceptions -fno-rtti -fno-asynchronous-unwind-tables -fno-builtin -fno-pic -fno-pie -fno-stack-protector -fdiagnostics-color=always
LDFLAGS = --gc-sections
-: |> ./errno.sh > %o |> errno.hpp {pre-compile}
+: |> ./errno.sh > %o |> errno.hpp
-: foreach *.cpp | {pre-compile} |> ^j^ clang++ --target=aarch64 $(CXXFLAGS) -c -o %o %f |> obj/%B.aarch64.o {objs-aarch64}
-: foreach *.cpp | {pre-compile} |> ^j^ clang++ --target=x86_64 $(CXXFLAGS) -c -o %o %f |> obj/%B.x86_64.o {objs-x86_64}
+!cpp.aarch64 = | errno.hpp |> ^j^ clang++ --target=aarch64 $(CXXFLAGS) -c -o %o %f |>
+!cpp.x86_64 = | errno.hpp |> ^j^ clang++ --target=x86_64 $(CXXFLAGS) -c -o %o %f |>
-: foreach *.S |> clang --target=%B -c -o %o %f |> obj/%B.o
+: foreach *.cpp ^cxa.cpp |> !cpp.aarch64 |> obj/%B.aarch64.o {objs-aarch64}
+: foreach *.cpp ^cxa.cpp |> !cpp.x86_64 |> obj/%B.x86_64.o {objs-x86_64}
+: cxa.cpp |> !cpp.aarch64 |> obj/%B.aarch64.o
+: cxa.cpp |> !cpp.x86_64 |> obj/%B.x86_64.o
-: foreach {objs-aarch64} | aarch64.ld obj/aarch64.o |> ld.lld -m aarch64elf $(LDFLAGS) -o %o --script aarch64.ld obj/aarch64.o %f |> bin/%B {bin-aarch64}
-: foreach {objs-x86_64} | x86_64.ld obj/x86_64.o |> ld.lld -m elf_x86_64 $(LDFLAGS) -o %o --script x86_64.ld obj/x86_64.o %f |> bin/%B {bin-x86_64}
+: foreach *.S |> clang --target=%B -c -o %o %f |> obj/%B.o
+
+!ld.aarch64 = | obj/cxa.aarch64.o obj/aarch64.o aarch64.ld |> ld.lld -m aarch64elf $(LDFLAGS) -o %o --script aarch64.ld %f obj/cxa.aarch64.o obj/aarch64.o |>
+!ld.x86_64 = | obj/cxa.x86_64.o obj/x86_64.o x86_64.ld |> ld.lld -m elf_x86_64 $(LDFLAGS) -o %o --script x86_64.ld %f obj/cxa.x86_64.o obj/x86_64.o |>
+
+: foreach {objs-aarch64} |> !ld.aarch64 |> bin/%B {bin-aarch64}
+: foreach {objs-x86_64} |> !ld.x86_64 |> bin/%B {bin-x86_64}
run ./gen.sh
diff --git a/cxa.cpp b/cxa.cpp
@@ -0,0 +1,18 @@
+#include "linux.hpp"
+
+extern "C"
+{
+
+void memset(char* p, size_t n, char c) noexcept
+{
+ char* const end = p + n;
+ while (p != end)
+ *p++ = c;
+}
+
+void __cxa_pure_virtual() noexcept
+{
+ __builtin_trap();
+}
+
+}
diff --git a/linux.hpp b/linux.hpp
@@ -223,20 +223,3 @@ extern syscall_result<void> bind(file socket, addr_ref addr);
extern syscall_result<void> listen(file socket, int backlog);
extern syscall_result<file> accept(file socket, void* addr_buf, socklen_t* addr_len);
extern syscall_result<file> dup(file oldfd, file newfd, int flags = 0);
-
-extern "C"
-{
-
-void memset(char* p, size_t n, char c)
-{
- char* const end = p + n;
- while (p != end)
- *p++ = c;
-}
-
-void __cxa_pure_virtual()
-{
- __builtin_trap();
-}
-
-}