aboutsummaryrefslogtreecommitdiff
path: root/src/link/Dwarf.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-03-11 16:11:09 -0400
committerGitHub <noreply@github.com>2025-03-11 16:11:09 -0400
commit982c500be5285500a236ca01c2f66e8555647a52 (patch)
tree070417adb81d973df463dd7f4adb40d175af453f /src/link/Dwarf.zig
parentf66067546775a04ca0cda1c74cb9002d02dc49d5 (diff)
parentcff90e3ae0b14da5163ea0c3283557f402001c67 (diff)
downloadzig-982c500be5285500a236ca01c2f66e8555647a52.tar.gz
zig-982c500be5285500a236ca01c2f66e8555647a52.zip
Merge pull request #23188 from jacobly0/fix-23143
x86_64: fix crashes with symbols
Diffstat (limited to 'src/link/Dwarf.zig')
-rw-r--r--src/link/Dwarf.zig59
1 files changed, 33 insertions, 26 deletions
diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig
index 1b3dcfe8b5..a657667f15 100644
--- a/src/link/Dwarf.zig
+++ b/src/link/Dwarf.zig
@@ -2008,9 +2008,9 @@ pub const WipNav = struct {
.decl_const_runtime_bits,
.decl_const_comptime_state,
.decl_const_runtime_bits_comptime_state,
- .decl_empty_func,
+ .decl_nullary_func,
.decl_func,
- .decl_empty_func_generic,
+ .decl_nullary_func_generic,
.decl_func_generic,
=> false,
.generic_decl_var,
@@ -2626,8 +2626,8 @@ pub fn finishWipNavFunc(
abbrev_code_buf,
try dwarf.refAbbrevCode(switch (abbrev_code) {
else => unreachable,
- .decl_func => .decl_empty_func,
- .decl_instance_func => .decl_instance_empty_func,
+ .decl_func => .decl_nullary_func,
+ .decl_instance_func => .decl_instance_nullary_func,
}),
);
}
@@ -3012,29 +3012,34 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo
if (nav_gop.found_existing) switch (try dwarf.debug_info.declAbbrevCode(wip_nav.unit, nav_gop.value_ptr.*)) {
.null => {},
else => unreachable,
- .decl_empty_func, .decl_func, .decl_instance_empty_func, .decl_instance_func => return,
- .decl_empty_func_generic,
+ .decl_nullary_func, .decl_func, .decl_instance_nullary_func, .decl_instance_func => return,
+ .decl_nullary_func_generic,
.decl_func_generic,
- .decl_instance_empty_func_generic,
+ .decl_instance_nullary_func_generic,
.decl_instance_func_generic,
=> dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(nav_gop.value_ptr.*).clear(),
} else nav_gop.value_ptr.* = try dwarf.addCommonEntry(wip_nav.unit);
wip_nav.entry = nav_gop.value_ptr.*;
const func_type = ip.indexToKey(func.ty).func_type;
+ const is_nullary = !func_type.is_var_args and for (0..func_type.param_types.len) |param_index| {
+ if (!func_type.paramIsComptime(std.math.cast(u5, param_index) orelse break false)) break false;
+ } else true;
const diw = wip_nav.debug_info.writer(dwarf.gpa);
- try wip_nav.declCommon(if (func_type.param_types.len > 0 or func_type.is_var_args) .{
- .decl = .decl_func_generic,
+ try wip_nav.declCommon(if (is_nullary) .{
+ .decl = .decl_nullary_func_generic,
.generic_decl = .generic_decl_func,
- .decl_instance = .decl_instance_func_generic,
+ .decl_instance = .decl_instance_nullary_func_generic,
} else .{
- .decl = .decl_empty_func_generic,
+ .decl = .decl_func_generic,
.generic_decl = .generic_decl_func,
- .decl_instance = .decl_instance_empty_func_generic,
+ .decl_instance = .decl_instance_func_generic,
}, &nav, inst_info.file, &decl);
try wip_nav.refType(.fromInterned(func_type.return_type));
- if (func_type.param_types.len > 0 or func_type.is_var_args) {
+ if (!is_nullary) {
for (0..func_type.param_types.len) |param_index| {
+ if (std.math.cast(u5, param_index)) |small_param_index|
+ if (func_type.paramIsComptime(small_param_index)) continue;
try wip_nav.abbrevCode(.func_type_param);
try wip_nav.refType(.fromInterned(func_type.param_types.get(ip)[param_index]));
}
@@ -3568,12 +3573,14 @@ fn updateLazyType(
};
try diw.writeByte(@intFromEnum(cc));
try wip_nav.refType(.fromInterned(func_type.return_type));
- for (0..func_type.param_types.len) |param_index| {
- try wip_nav.abbrevCode(.func_type_param);
- try wip_nav.refType(.fromInterned(func_type.param_types.get(ip)[param_index]));
+ if (!is_nullary) {
+ for (0..func_type.param_types.len) |param_index| {
+ try wip_nav.abbrevCode(.func_type_param);
+ try wip_nav.refType(.fromInterned(func_type.param_types.get(ip)[param_index]));
+ }
+ if (func_type.is_var_args) try wip_nav.abbrevCode(.is_var_args);
+ try uleb128(diw, @intFromEnum(AbbrevCode.null));
}
- if (func_type.is_var_args) try wip_nav.abbrevCode(.is_var_args);
- if (!is_nullary) try uleb128(diw, @intFromEnum(AbbrevCode.null));
},
.error_set_type => |error_set_type| {
try wip_nav.abbrevCode(if (error_set_type.names.len == 0) .generated_empty_enum_type else .generated_enum_type);
@@ -4787,9 +4794,9 @@ const AbbrevCode = enum {
decl_const_runtime_bits,
decl_const_comptime_state,
decl_const_runtime_bits_comptime_state,
- decl_empty_func,
+ decl_nullary_func,
decl_func,
- decl_empty_func_generic,
+ decl_nullary_func_generic,
decl_func_generic,
generic_decl_var,
generic_decl_const,
@@ -4806,9 +4813,9 @@ const AbbrevCode = enum {
decl_instance_const_runtime_bits,
decl_instance_const_comptime_state,
decl_instance_const_runtime_bits_comptime_state,
- decl_instance_empty_func,
+ decl_instance_nullary_func,
decl_instance_func,
- decl_instance_empty_func_generic,
+ decl_instance_nullary_func_generic,
decl_instance_func_generic,
// the rest are unrestricted other than empty variants must not be longer
// than the non-empty variant, and so should appear first
@@ -5019,7 +5026,7 @@ const AbbrevCode = enum {
.{ .ZIG_comptime_value, .ref_addr },
},
},
- .decl_empty_func = .{
+ .decl_nullary_func = .{
.tag = .subprogram,
.attrs = decl_abbrev_common_attrs ++ .{
.{ .linkage_name, .strp },
@@ -5044,7 +5051,7 @@ const AbbrevCode = enum {
.{ .noreturn, .flag },
},
},
- .decl_empty_func_generic = .{
+ .decl_nullary_func_generic = .{
.tag = .subprogram,
.attrs = decl_abbrev_common_attrs ++ .{
.{ .type, .ref_addr },
@@ -5167,7 +5174,7 @@ const AbbrevCode = enum {
.{ .ZIG_comptime_value, .ref_addr },
},
},
- .decl_instance_empty_func = .{
+ .decl_instance_nullary_func = .{
.tag = .subprogram,
.attrs = decl_instance_abbrev_common_attrs ++ .{
.{ .linkage_name, .strp },
@@ -5192,7 +5199,7 @@ const AbbrevCode = enum {
.{ .noreturn, .flag },
},
},
- .decl_instance_empty_func_generic = .{
+ .decl_instance_nullary_func_generic = .{
.tag = .subprogram,
.attrs = decl_instance_abbrev_common_attrs ++ .{
.{ .type, .ref_addr },