mirror of
https://github.com/ziglang/zig.git
synced 2024-11-27 23:52:31 +00:00
macho: fix sorting symbols by seniority
This commit is contained in:
parent
02db9933a4
commit
983e373409
@ -242,6 +242,17 @@ const SymbolAtIndex = struct {
|
||||
return mem.sliceTo(@ptrCast([*:0]const u8, ctx.in_strtab.?.ptr + off), 0);
|
||||
}
|
||||
|
||||
fn getSymbolSeniority(self: SymbolAtIndex, ctx: Context) u2 {
|
||||
const sym = self.getSymbol(ctx);
|
||||
if (!sym.ext()) {
|
||||
const sym_name = self.getSymbolName(ctx);
|
||||
if (mem.startsWith(u8, sym_name, "l") or mem.startsWith(u8, sym_name, "L")) return 0;
|
||||
return 1;
|
||||
}
|
||||
if (sym.weakDef() or sym.pext()) return 2;
|
||||
return 3;
|
||||
}
|
||||
|
||||
/// Performs lexicographic-like check.
|
||||
/// * lhs and rhs defined
|
||||
/// * if lhs == rhs
|
||||
@ -256,23 +267,15 @@ const SymbolAtIndex = struct {
|
||||
if (lhs.sect() and rhs.sect()) {
|
||||
if (lhs.n_value == rhs.n_value) {
|
||||
if (lhs.n_sect == rhs.n_sect) {
|
||||
if (lhs.ext() and rhs.ext()) {
|
||||
if ((lhs.pext() or lhs.weakDef()) and (rhs.pext() or rhs.weakDef())) {
|
||||
return false;
|
||||
} else return rhs.pext() or rhs.weakDef();
|
||||
} else {
|
||||
const lhs_name = lhs_index.getSymbolName(ctx);
|
||||
const lhs_temp = mem.startsWith(u8, lhs_name, "l") or mem.startsWith(u8, lhs_name, "L");
|
||||
const rhs_name = rhs_index.getSymbolName(ctx);
|
||||
const rhs_temp = mem.startsWith(u8, rhs_name, "l") or mem.startsWith(u8, rhs_name, "L");
|
||||
if (lhs_temp and rhs_temp) {
|
||||
return false;
|
||||
} else return rhs_temp;
|
||||
}
|
||||
const lhs_senior = lhs_index.getSymbolSeniority(ctx);
|
||||
const rhs_senior = rhs_index.getSymbolSeniority(ctx);
|
||||
if (lhs_senior == rhs_senior) {
|
||||
return lessThanByNStrx(ctx, lhs_index, rhs_index);
|
||||
} else return lhs_senior < rhs_senior;
|
||||
} else return lhs.n_sect < rhs.n_sect;
|
||||
} else return lhs.n_value < rhs.n_value;
|
||||
} else if (lhs.undf() and rhs.undf()) {
|
||||
return false;
|
||||
return lessThanByNStrx(ctx, lhs_index, rhs_index);
|
||||
} else return rhs.undf();
|
||||
}
|
||||
|
||||
@ -786,6 +789,7 @@ fn parseUnwindInfo(self: *Object, zld: *Zld, object_id: u32) !void {
|
||||
mem.asBytes(&record),
|
||||
@intCast(i32, offset),
|
||||
);
|
||||
log.debug("unwind record {d} tracks {s}", .{ record_id, zld.getSymbolName(target) });
|
||||
if (target.getFile() != object_id) {
|
||||
self.unwind_relocs_lookup[record_id].dead = true;
|
||||
} else {
|
||||
|
@ -31,6 +31,8 @@ pub fn build(b: *Builder) void {
|
||||
|
||||
check.checkInSymtab();
|
||||
check.checkNext("(undefined) weak external _a (from liba)");
|
||||
|
||||
check.checkInSymtab();
|
||||
check.checkNext("(undefined) weak external _asStr (from liba)");
|
||||
|
||||
const run_cmd = check.runAndCompare();
|
||||
|
Loading…
Reference in New Issue
Block a user