From 078037ab9b410fa13a86eabdfc30918fc83cdcf3 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 11 Mar 2022 00:04:42 -0700 Subject: stage2: passing threadlocal tests for x86_64-linux * use the real start code for LLVM backend with x86_64-linux - there is still a check for zig_backend after initializing the TLS area to skip some stuff. * introduce new AIR instructions and implement them for the LLVM backend. They are the same as `call` except with a modifier. - call_always_tail - call_never_tail - call_never_inline * LLVM backend calls hasRuntimeBitsIgnoringComptime in more places to avoid unnecessarily depending on comptimeOnly being resolved for some types. * LLVM backend: remove duplicate code for setting linkage and value name. The canonical place for this is in `updateDeclExports`. * LLVM backend: do some assembly template massaging to make `%%` rendered as `%`. More hacks will be needed to make inline assembly catch up with stage1. --- lib/std/start.zig | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'lib/std') diff --git a/lib/std/start.zig b/lib/std/start.zig index 6e28ca61a3..3502645172 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -22,7 +22,16 @@ comptime { // The self-hosted compiler is not fully capable of handling all of this start.zig file. // Until then, we have simplified logic here for self-hosted. TODO remove this once // self-hosted is capable enough to handle all of the real start.zig logic. - if (builtin.zig_backend != .stage1) { + if (builtin.zig_backend == .stage2_wasm or + builtin.zig_backend == .stage2_c or + builtin.zig_backend == .stage2_x86_64 or + builtin.zig_backend == .stage2_x86 or + builtin.zig_backend == .stage2_aarch64 or + builtin.zig_backend == .stage2_arm or + builtin.zig_backend == .stage2_riscv64 or + (builtin.zig_backend == .stage2_llvm and native_os != .linux) or + (builtin.zig_backend == .stage2_llvm and native_arch != .x86_64)) + { if (builtin.output_mode == .Exe) { if ((builtin.link_libc or builtin.object_format == .c) and @hasDecl(root, "main")) { if (@typeInfo(@TypeOf(root.main)).Fn.calling_convention != .C) { @@ -399,6 +408,11 @@ fn posixCallMainAndExit() noreturn { // Initialize the TLS area. std.os.linux.tls.initStaticTLS(phdrs); + if (builtin.zig_backend == .stage2_llvm) { + root.main(); + exit2(0); + } + // The way Linux executables represent stack size is via the PT_GNU_STACK // program header. However the kernel does not recognize it; it always gives 8 MiB. // Here we look for the stack size in our program headers and use setrlimit -- cgit v1.2.3