From 44e2dbe117fe79b99a970990878a061bdd26ff55 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 24 Dec 2023 20:11:58 -0700 Subject: [PATCH] fix logic for default entry point when linking libc, the entry point is within libc. when producing C code, the entry point is decided when compiling the C code and does not need to be known up front. fixes a false positive "error: unknown target entry point" when using -ofmt=c. --- src/Compilation/Config.zig | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/Compilation/Config.zig b/src/Compilation/Config.zig index 4abc27029d..811d37a2db 100644 --- a/src/Compilation/Config.zig +++ b/src/Compilation/Config.zig @@ -161,20 +161,6 @@ pub fn resolve(options: Options) ResolveError!Config { break :b options.shared_memory orelse false; }; - const entry: ?[]const u8 = switch (options.entry) { - .disabled => null, - .default => b: { - if (options.output_mode != .Exe) break :b null; - break :b target_util.defaultEntrySymbolName(target, wasi_exec_model) orelse - return error.UnknownTargetEntryPoint; - }, - .enabled => target_util.defaultEntrySymbolName(target, wasi_exec_model) orelse - return error.UnknownTargetEntryPoint, - .named => |name| name, - }; - if (entry != null and options.output_mode != .Exe) - return error.NonExecutableEntryPoint; - // *If* the LLVM backend were to be selected, should Zig use the LLVM // library to build the LLVM module? const use_lib_llvm = b: { @@ -348,6 +334,29 @@ pub fn resolve(options: Options) ResolveError!Config { break :b false; }; + const entry: ?[]const u8 = switch (options.entry) { + .disabled => null, + .default => b: { + if (options.output_mode != .Exe) break :b null; + + // When linking libc, the entry point is inside libc and not in the + // zig compilation unit. + if (link_libc) break :b null; + + // When producing C source code, the decision of entry point is made + // when compiling the C code, not when producing the C code. + if (target.ofmt == .c) break :b null; + + break :b target_util.defaultEntrySymbolName(target, wasi_exec_model) orelse + return error.UnknownTargetEntryPoint; + }, + .enabled => target_util.defaultEntrySymbolName(target, wasi_exec_model) orelse + return error.UnknownTargetEntryPoint, + .named => |name| name, + }; + if (entry != null and options.output_mode != .Exe) + return error.NonExecutableEntryPoint; + const any_unwind_tables = options.any_unwind_tables or link_libunwind or target_util.needUnwindTables(target);