diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2023-12-24 20:11:58 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2024-01-01 17:51:21 -0700 |
| commit | 44e2dbe117fe79b99a970990878a061bdd26ff55 (patch) | |
| tree | 43431cc5b9026c75d907f62d911c1a9f9c39d57c /src/Compilation | |
| parent | 1edcea9ec80d9ca6fd9700ef605cfa9c3722817b (diff) | |
| download | zig-44e2dbe117fe79b99a970990878a061bdd26ff55.tar.gz zig-44e2dbe117fe79b99a970990878a061bdd26ff55.zip | |
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 (limited to 'src/Compilation')
| -rw-r--r-- | src/Compilation/Config.zig | 37 |
1 files 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); |
