| ... | ... | @@ -2094,8 +2094,8 @@ fn writeStubHelperCommon(self: *MachO) !void { |
| 2094 | 2094 | fn resolveSymbolsInObject( |
| 2095 | 2095 | self: *MachO, |
| 2096 | 2096 | object_id: u16, |
| 2097 | | tentatives: *std.ArrayList(u32), |
| 2098 | | unresolved: *std.ArrayList(u32), |
| 2097 | tentatives: *std.AutoArrayHashMap(u32, void), |
| 2098 | unresolved: *std.AutoArrayHashMap(u32, void), |
| 2099 | 2099 | ) !void { |
| 2100 | 2100 | const object = &self.objects.items[object_id]; |
| 2101 | 2101 | |
| ... | ... | @@ -2176,14 +2176,9 @@ fn resolveSymbolsInObject( |
| 2176 | 2176 | return error.MultipleSymbolDefinitions; |
| 2177 | 2177 | } |
| 2178 | 2178 | if (symbolIsWeakDef(sym) or symbolIsPext(sym)) continue; // Current symbol is weak, so skip it. |
| 2179 | |
| 2179 | 2180 | if (symbolIsTentative(global.*)) { |
| 2180 | | var i: usize = 0; |
| 2181 | | while (i < tentatives.items.len) : (i += 1) { |
| 2182 | | if (tentatives.items[i] == resolv.where_index) { |
| 2183 | | _ = tentatives.swapRemove(i); |
| 2184 | | break; |
| 2185 | | } |
| 2186 | | } |
| 2181 | _ = tentatives.fetchSwapRemove(resolv.where_index); |
| 2187 | 2182 | } |
| 2188 | 2183 | |
| 2189 | 2184 | // Otherwise, update the resolver and the global symbol. |
| ... | ... | @@ -2202,14 +2197,7 @@ fn resolveSymbolsInObject( |
| 2202 | 2197 | .n_desc = 0, |
| 2203 | 2198 | .n_value = 0, |
| 2204 | 2199 | }; |
| 2205 | | |
| 2206 | | var i: usize = 0; |
| 2207 | | while (i < unresolved.items.len) : (i += 1) { |
| 2208 | | if (unresolved.items[i] == resolv.where_index) { |
| 2209 | | _ = unresolved.swapRemove(i); |
| 2210 | | break; |
| 2211 | | } |
| 2212 | | } |
| 2200 | _ = unresolved.fetchSwapRemove(resolv.where_index); |
| 2213 | 2201 | }, |
| 2214 | 2202 | } |
| 2215 | 2203 | |
| ... | ... | @@ -2243,7 +2231,7 @@ fn resolveSymbolsInObject( |
| 2243 | 2231 | .where_index = global_sym_index, |
| 2244 | 2232 | .file = object_id, |
| 2245 | 2233 | }); |
| 2246 | | try tentatives.append(global_sym_index); |
| 2234 | _ = try tentatives.getOrPut(global_sym_index); |
| 2247 | 2235 | continue; |
| 2248 | 2236 | }; |
| 2249 | 2237 | |
| ... | ... | @@ -2267,7 +2255,7 @@ fn resolveSymbolsInObject( |
| 2267 | 2255 | .n_desc = sym.n_desc, |
| 2268 | 2256 | .n_value = sym.n_value, |
| 2269 | 2257 | }); |
| 2270 | | try tentatives.append(global_sym_index); |
| 2258 | _ = try tentatives.getOrPut(global_sym_index); |
| 2271 | 2259 | resolv.* = .{ |
| 2272 | 2260 | .where = .global, |
| 2273 | 2261 | .where_index = global_sym_index, |
| ... | ... | @@ -2280,13 +2268,7 @@ fn resolveSymbolsInObject( |
| 2280 | 2268 | .n_desc = 0, |
| 2281 | 2269 | .n_value = 0, |
| 2282 | 2270 | }; |
| 2283 | | var i: usize = 0; |
| 2284 | | while (i < unresolved.items.len) : (i += 1) { |
| 2285 | | if (unresolved.items[i] == resolv.where_index) { |
| 2286 | | _ = unresolved.swapRemove(i); |
| 2287 | | break; |
| 2288 | | } |
| 2289 | | } |
| 2271 | _ = unresolved.fetchSwapRemove(resolv.where_index); |
| 2290 | 2272 | }, |
| 2291 | 2273 | } |
| 2292 | 2274 | } else { |
| ... | ... | @@ -2306,16 +2288,16 @@ fn resolveSymbolsInObject( |
| 2306 | 2288 | .where_index = undef_sym_index, |
| 2307 | 2289 | .file = object_id, |
| 2308 | 2290 | }); |
| 2309 | | try unresolved.append(undef_sym_index); |
| 2291 | _ = try unresolved.getOrPut(undef_sym_index); |
| 2310 | 2292 | } |
| 2311 | 2293 | } |
| 2312 | 2294 | } |
| 2313 | 2295 | |
| 2314 | 2296 | fn resolveSymbols(self: *MachO) !void { |
| 2315 | | var tentatives = std.ArrayList(u32).init(self.base.allocator); |
| 2297 | var tentatives = std.AutoArrayHashMap(u32, void).init(self.base.allocator); |
| 2316 | 2298 | defer tentatives.deinit(); |
| 2317 | 2299 | |
| 2318 | | var unresolved = std.ArrayList(u32).init(self.base.allocator); |
| 2300 | var unresolved = std.AutoArrayHashMap(u32, void).init(self.base.allocator); |
| 2319 | 2301 | defer unresolved.deinit(); |
| 2320 | 2302 | |
| 2321 | 2303 | // First pass, resolve symbols in provided objects. |
| ... | ... | @@ -2325,8 +2307,8 @@ fn resolveSymbols(self: *MachO) !void { |
| 2325 | 2307 | |
| 2326 | 2308 | // Second pass, resolve symbols in static libraries. |
| 2327 | 2309 | var next_sym: usize = 0; |
| 2328 | | loop: while (next_sym < unresolved.items.len) { |
| 2329 | | const sym = self.undefs.items[unresolved.items[next_sym]]; |
| 2310 | loop: while (next_sym < unresolved.count()) { |
| 2311 | const sym = self.undefs.items[unresolved.keys()[next_sym]]; |
| 2330 | 2312 | const sym_name = self.getString(sym.n_strx); |
| 2331 | 2313 | |
| 2332 | 2314 | for (self.archives.items) |archive| { |
| ... | ... | @@ -2350,7 +2332,10 @@ fn resolveSymbols(self: *MachO) !void { |
| 2350 | 2332 | |
| 2351 | 2333 | // Convert any tentative definition into a regular symbol and allocate |
| 2352 | 2334 | // text blocks for each tentative defintion. |
| 2353 | | while (tentatives.popOrNull()) |index| { |
| 2335 | var tentatives_count: usize = 0; |
| 2336 | const ntentatives = tentatives.count(); |
| 2337 | while (tentatives_count < ntentatives) : (tentatives_count += 1) { |
| 2338 | const index = tentatives.pop().key; |
| 2354 | 2339 | const sym = &self.globals.items[index]; |
| 2355 | 2340 | const match: MatchingSection = blk: { |
| 2356 | 2341 | if (self.common_section_index == null) { |
| ... | ... | @@ -2430,12 +2415,12 @@ fn resolveSymbols(self: *MachO) !void { |
| 2430 | 2415 | .where = .undef, |
| 2431 | 2416 | .where_index = undef_sym_index, |
| 2432 | 2417 | }); |
| 2433 | | try unresolved.append(undef_sym_index); |
| 2418 | _ = try unresolved.getOrPut(undef_sym_index); |
| 2434 | 2419 | } |
| 2435 | 2420 | |
| 2436 | 2421 | next_sym = 0; |
| 2437 | | loop: while (next_sym < unresolved.items.len) { |
| 2438 | | const sym = self.undefs.items[unresolved.items[next_sym]]; |
| 2422 | loop: while (next_sym < unresolved.count()) { |
| 2423 | const sym = self.undefs.items[unresolved.keys()[next_sym]]; |
| 2439 | 2424 | const sym_name = self.getString(sym.n_strx); |
| 2440 | 2425 | |
| 2441 | 2426 | for (self.dylibs.items) |dylib, id| { |
| ... | ... | @@ -2452,7 +2437,7 @@ fn resolveSymbols(self: *MachO) !void { |
| 2452 | 2437 | undef.n_type |= macho.N_EXT; |
| 2453 | 2438 | undef.n_desc = @intCast(u16, ordinal + 1) * macho.N_SYMBOL_RESOLVER; |
| 2454 | 2439 | |
| 2455 | | _ = unresolved.swapRemove(next_sym); |
| 2440 | _ = unresolved.fetchSwapRemove(resolv.where_index); |
| 2456 | 2441 | |
| 2457 | 2442 | continue :loop; |
| 2458 | 2443 | } |
| ... | ... | @@ -2486,13 +2471,7 @@ fn resolveSymbols(self: *MachO) !void { |
| 2486 | 2471 | nlist.n_desc = macho.N_WEAK_DEF; |
| 2487 | 2472 | try self.globals.append(self.base.allocator, nlist); |
| 2488 | 2473 | |
| 2489 | | var i: usize = 0; |
| 2490 | | while (i < unresolved.items.len) : (i += 1) { |
| 2491 | | if (unresolved.items[i] == resolv.where_index) { |
| 2492 | | _ = unresolved.swapRemove(i); |
| 2493 | | break; |
| 2494 | | } |
| 2495 | | } |
| 2474 | _ = unresolved.fetchSwapRemove(resolv.where_index); |
| 2496 | 2475 | |
| 2497 | 2476 | undef.* = .{ |
| 2498 | 2477 | .n_strx = 0, |
| ... | ... | @@ -2526,7 +2505,7 @@ fn resolveSymbols(self: *MachO) !void { |
| 2526 | 2505 | } |
| 2527 | 2506 | } |
| 2528 | 2507 | |
| 2529 | | for (unresolved.items) |index| { |
| 2508 | for (unresolved.keys()) |index| { |
| 2530 | 2509 | const sym = self.undefs.items[index]; |
| 2531 | 2510 | const sym_name = self.getString(sym.n_strx); |
| 2532 | 2511 | const resolv = self.symbol_resolver.get(sym.n_strx) orelse unreachable; |
| ... | ... | @@ -2535,7 +2514,7 @@ fn resolveSymbols(self: *MachO) !void { |
| 2535 | 2514 | log.err(" first referenced in '{s}'", .{self.objects.items[resolv.file].name}); |
| 2536 | 2515 | } |
| 2537 | 2516 | |
| 2538 | | if (unresolved.items.len > 0) |
| 2517 | if (unresolved.count() > 0) |
| 2539 | 2518 | return error.UndefinedSymbolReference; |
| 2540 | 2519 | } |
| 2541 | 2520 | |