aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Compilation.zig11
-rw-r--r--src/clang_options_data.zig63
-rw-r--r--src/codegen/llvm.zig2
-rw-r--r--src/codegen/llvm/bindings.zig2
-rw-r--r--src/link.zig2
-rw-r--r--src/main.zig16
-rw-r--r--src/target.zig2
-rw-r--r--src/zig_llvm.cpp6
-rw-r--r--src/zig_llvm.h2
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);