diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Compilation.zig | 11 | ||||
| -rw-r--r-- | src/clang_options_data.zig | 63 | ||||
| -rw-r--r-- | src/codegen/llvm.zig | 2 | ||||
| -rw-r--r-- | src/codegen/llvm/bindings.zig | 2 | ||||
| -rw-r--r-- | src/link.zig | 2 | ||||
| -rw-r--r-- | src/main.zig | 16 | ||||
| -rw-r--r-- | src/target.zig | 2 | ||||
| -rw-r--r-- | src/zig_llvm.cpp | 6 | ||||
| -rw-r--r-- | src/zig_llvm.h | 2 |
9 files changed, 93 insertions, 13 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig index fab1c0bace..00b691f780 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -620,6 +620,7 @@ pub const InitOptions = struct { test_name_prefix: ?[]const u8 = null, test_runner_path: ?[]const u8 = null, subsystem: ?std.Target.SubSystem = null, + dwarf_format: ?std.dwarf.Format = null, /// WASI-only. Type of WASI execution model ("command" or "reactor"). wasi_exec_model: ?std.builtin.WasiExecModel = null, /// (Zig compiler development) Enable dumping linker's state as JSON. @@ -1111,6 +1112,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation { cache.hash.add(link_libunwind); cache.hash.add(options.output_mode); cache.hash.add(options.machine_code_model); + cache.hash.addOptional(options.dwarf_format); cache_helpers.addOptionalEmitLoc(&cache.hash, options.emit_bin); cache_helpers.addOptionalEmitLoc(&cache.hash, options.emit_implib); cache.hash.addBytes(options.root_name); @@ -1517,6 +1519,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation { .disable_lld_caching = options.disable_lld_caching or cache_mode == .whole, .subsystem = options.subsystem, .is_test = options.is_test, + .dwarf_format = options.dwarf_format, .wasi_exec_model = wasi_exec_model, .hash_style = options.hash_style, .enable_link_snapshots = options.enable_link_snapshots, @@ -4489,7 +4492,13 @@ pub fn addCCArgs( // generation, it only changes the type of information generated. try argv.appendSlice(&.{ "-g", "-gcodeview" }); }, - .elf, .macho => try argv.append("-gdwarf-4"), + .elf, .macho => { + try argv.append("-gdwarf-4"); + if (comp.bin_file.options.dwarf_format) |f| switch (f) { + .@"32" => try argv.append("-gdwarf32"), + .@"64" => try argv.append("-gdwarf64"), + }; + }, else => try argv.append("-g"), } } diff --git a/src/clang_options_data.zig b/src/clang_options_data.zig index fc23d86964..c342cf7777 100644 --- a/src/clang_options_data.zig +++ b/src/clang_options_data.zig @@ -3870,13 +3870,62 @@ flagpd1("gcodeview-command-line"), flagpd1("gcodeview-ghash"), flagpd1("gcolumn-info"), flagpd1("gdbx"), -flagpd1("gdwarf"), -flagpd1("gdwarf32"), -flagpd1("gdwarf64"), -flagpd1("gdwarf-2"), -flagpd1("gdwarf-3"), -flagpd1("gdwarf-4"), -flagpd1("gdwarf-5"), +.{ + .name = "gdwarf", + .syntax = .flag, + .zig_equivalent = .debug, + .pd1 = true, + .pd2 = false, + .psl = false, +}, +.{ + .name = "gdwarf32", + .syntax = .flag, + .zig_equivalent = .gdwarf32, + .pd1 = true, + .pd2 = false, + .psl = false, +}, +.{ + .name = "gdwarf64", + .syntax = .flag, + .zig_equivalent = .gdwarf64, + .pd1 = true, + .pd2 = false, + .psl = false, +}, +.{ + .name = "gdwarf-2", + .syntax = .flag, + .zig_equivalent = .debug, + .pd1 = true, + .pd2 = false, + .psl = false, +}, +.{ + .name = "gdwarf-3", + .syntax = .flag, + .zig_equivalent = .debug, + .pd1 = true, + .pd2 = false, + .psl = false, +}, +.{ + .name = "gdwarf-4", + .syntax = .flag, + .zig_equivalent = .debug, + .pd1 = true, + .pd2 = false, + .psl = false, +}, +.{ + .name = "gdwarf-5", + .syntax = .flag, + .zig_equivalent = .debug, + .pd1 = true, + .pd2 = false, + .psl = false, +}, flagpd1("gdwarf-aranges"), flagpd1("gembed-source"), sepd1("gen-cdb-fragment-path"), diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index fc3f14b7c6..897a582952 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -433,7 +433,7 @@ pub const Object = struct { if (!options.strip) { switch (options.target.ofmt) { .coff => llvm_module.addModuleCodeViewFlag(), - else => llvm_module.addModuleDebugInfoFlag(), + else => llvm_module.addModuleDebugInfoFlag(options.dwarf_format == std.dwarf.Format.@"64"), } const di_builder = llvm_module.createDIBuilder(true); opt_di_builder = di_builder; diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index 63cac80db8..55f0ba8963 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -409,7 +409,7 @@ pub const Module = opaque { extern fn LLVMSetTarget(M: *Module, Triple: [*:0]const u8) void; pub const addModuleDebugInfoFlag = ZigLLVMAddModuleDebugInfoFlag; - extern fn ZigLLVMAddModuleDebugInfoFlag(module: *Module) void; + extern fn ZigLLVMAddModuleDebugInfoFlag(module: *Module, dwarf64: bool) void; pub const addModuleCodeViewFlag = ZigLLVMAddModuleCodeViewFlag; extern fn ZigLLVMAddModuleCodeViewFlag(module: *Module) void; diff --git a/src/link.zig b/src/link.zig index c8999cee47..672a53999f 100644 --- a/src/link.zig +++ b/src/link.zig @@ -200,6 +200,8 @@ pub const Options = struct { compatibility_version: ?std.builtin.Version, libc_installation: ?*const LibCInstallation, + dwarf_format: ?std.dwarf.Format, + /// WASI-only. Type of WASI execution model ("command" or "reactor"). wasi_exec_model: std.builtin.WasiExecModel = undefined, diff --git a/src/main.zig b/src/main.zig index 2bc4961cba..6a83791ca3 100644 --- a/src/main.zig +++ b/src/main.zig @@ -844,6 +844,7 @@ fn buildOutputType( var reference_trace: ?u32 = null; var error_tracing: ?bool = null; var pdb_out_path: ?[]const u8 = null; + var dwarf_format: ?std.dwarf.Format = null; // e.g. -m3dnow or -mno-outline-atomics. They correspond to std.Target llvm cpu feature names. // This array is populated by zig cc frontend and then has to be converted to zig-style @@ -1355,6 +1356,10 @@ fn buildOutputType( strip = true; } else if (mem.eql(u8, arg, "-fno-strip")) { strip = false; + } else if (mem.eql(u8, arg, "-gdwarf32")) { + dwarf_format = .@"32"; + } else if (mem.eql(u8, arg, "-gdwarf64")) { + dwarf_format = .@"64"; } else if (mem.eql(u8, arg, "-fformatted-panics")) { formatted_panics = true; } else if (mem.eql(u8, arg, "-fno-formatted-panics")) { @@ -1762,6 +1767,14 @@ fn buildOutputType( try clang_argv.appendSlice(it.other_args); } }, + .gdwarf32 => { + strip = false; + dwarf_format = .@"32"; + }, + .gdwarf64 => { + strip = false; + dwarf_format = .@"64"; + }, .sanitize => { if (mem.eql(u8, it.only_arg, "undefined")) { want_sanitize_c = true; @@ -3145,6 +3158,7 @@ fn buildOutputType( .test_runner_path = test_runner_path, .disable_lld_caching = !output_to_cache, .subsystem = subsystem, + .dwarf_format = dwarf_format, .wasi_exec_model = wasi_exec_model, .debug_compile_errors = debug_compile_errors, .enable_link_snapshots = enable_link_snapshots, @@ -5102,6 +5116,8 @@ pub const ClangArgIterator = struct { asm_only, optimize, debug, + gdwarf32, + gdwarf64, sanitize, linker_script, dry_run, diff --git a/src/target.zig b/src/target.zig index da69293c35..76186db269 100644 --- a/src/target.zig +++ b/src/target.zig @@ -204,7 +204,7 @@ pub fn requiresPIC(target: std.Target, linking_libc: bool) bool { /// This is not whether the target supports Position Independent Code, but whether the -fPIC /// C compiler argument is valid to Clang. pub fn supports_fpic(target: std.Target) bool { - return target.os.tag != .windows; + return target.os.tag != .windows and target.os.tag != .uefi; } pub fn isSingleThreaded(target: std.Target) bool { diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index a884420422..af53bd1d27 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -1163,9 +1163,13 @@ void ZigLLVMGetNativeTarget(ZigLLVM_ArchType *arch_type, free(native_triple); } -void ZigLLVMAddModuleDebugInfoFlag(LLVMModuleRef module) { +void ZigLLVMAddModuleDebugInfoFlag(LLVMModuleRef module, bool produce_dwarf64) { unwrap(module)->addModuleFlag(Module::Warning, "Debug Info Version", DEBUG_METADATA_VERSION); unwrap(module)->addModuleFlag(Module::Warning, "Dwarf Version", 4); + + if (produce_dwarf64) { + unwrap(module)->addModuleFlag(Module::Warning, "DWARF64", 1); + } } void ZigLLVMAddModuleCodeViewFlag(LLVMModuleRef module) { diff --git a/src/zig_llvm.h b/src/zig_llvm.h index e466be9e8c..8f24d045a2 100644 --- a/src/zig_llvm.h +++ b/src/zig_llvm.h @@ -238,7 +238,7 @@ ZIG_EXTERN_C unsigned ZigLLVMTag_DW_union_type(void); ZIG_EXTERN_C struct ZigLLVMDIBuilder *ZigLLVMCreateDIBuilder(LLVMModuleRef module, bool allow_unresolved); ZIG_EXTERN_C void ZigLLVMDisposeDIBuilder(struct ZigLLVMDIBuilder *dbuilder); -ZIG_EXTERN_C void ZigLLVMAddModuleDebugInfoFlag(LLVMModuleRef module); +ZIG_EXTERN_C void ZigLLVMAddModuleDebugInfoFlag(LLVMModuleRef module, bool produce_dwarf64); ZIG_EXTERN_C void ZigLLVMAddModuleCodeViewFlag(LLVMModuleRef module); ZIG_EXTERN_C void ZigLLVMSetModulePICLevel(LLVMModuleRef module); ZIG_EXTERN_C void ZigLLVMSetModulePIELevel(LLVMModuleRef module); |
