commit 44e2dbe117fe79b99a970990878a061bdd26ff55 (tree)
parent 1edcea9ec80d9ca6fd9700ef605cfa9c3722817b
Author: Andrew Kelley <andrew@ziglang.org>
Date: Sun, 24 Dec 2023 20:11:58 -0700
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.
Diffstat:
1 file changed, 23 insertions(+), 14 deletions(-)
diff --git 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);