fortrangoingonforty/afs-ld / 4919d68

Browse files

Cache reloc symbol lookups

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
4919d68901327a871a34a6e5423fb589476d1afe
Parents
9dbf0eb
Tree
35f8e1c

1 changed file

StatusFile+-
M src/reloc/arm64.rs 38 26
src/reloc/arm64.rsmodified
@@ -44,6 +44,7 @@ impl std::error::Error for RelocError {}
4444
 
4545
 struct ResolveView<'a> {
4646
     sym_table: &'a SymbolTable,
47
+    symbol_name_index: &'a HashMap<String, SymbolId>,
4748
     atom_table: &'a AtomTable,
4849
     atom_addrs: &'a HashMap<crate::resolve::AtomId, u64>,
4950
     atoms_by_input_section: &'a HashMap<(InputId, u8), Vec<crate::resolve::AtomId>>,
@@ -236,8 +237,10 @@ pub fn apply_layout(
236237
     let atoms_by_input_section = atoms.by_input_section();
237238
     let section_addrs = input_section_address_map(layout, atoms);
238239
     let synth_addrs = synthetic_address_maps(layout, plan.synthetic_plan);
240
+    let symbol_name_index = build_symbol_name_index(sym_table);
239241
     let resolve = ResolveView {
240242
         sym_table,
243
+        symbol_name_index: &symbol_name_index,
241244
         atom_table: atoms,
242245
         atom_addrs: &atom_addrs,
243246
         atoms_by_input_section: &atoms_by_input_section,
@@ -556,8 +559,10 @@ pub fn plan_thunks(
556559
     let atoms_by_input_section = atoms.by_input_section();
557560
     let section_addrs = input_section_address_map(layout, atoms);
558561
     let synth_addrs = synthetic_address_maps(layout, synthetic_plan);
562
+    let symbol_name_index = build_symbol_name_index(sym_table);
559563
     let resolve = ResolveView {
560564
         sym_table,
565
+        symbol_name_index: &symbol_name_index,
561566
         atom_table: atoms,
562567
         atom_addrs: &atom_addrs,
563568
         atoms_by_input_section: &atoms_by_input_section,
@@ -683,7 +688,7 @@ fn apply_one(
683688
     })? + local_offset as u64;
684689
     match reloc.kind {
685690
         RelocKind::Unsigned => {
686
-            if dylib_import_symbol_id(obj, reloc.referent, resolve.sym_table).is_some() {
691
+            if dylib_import_symbol_id(obj, reloc.referent, resolve).is_some() {
687692
                 if direct_import_bind_supported(reloc) {
688693
                     clear_direct_import_slot(bytes, atom, obj, local_offset, reloc)
689694
                 } else {
@@ -801,7 +806,7 @@ fn apply_one(
801806
         ),
802807
         RelocKind::TlvpLoadPageOff12 => {
803808
             let target = resolve_tlvp_pageoff_target(obj, atom, reloc, resolve)?;
804
-            if dylib_import_symbol_id(obj, reloc.referent, resolve.sym_table).is_some() {
809
+            if dylib_import_symbol_id(obj, reloc.referent, resolve).is_some() {
805810
                 patch_pageoff12(bytes, atom, obj, local_offset, reloc, target)
806811
             } else {
807812
                 patch_tlvp_pageoff12(bytes, atom, obj, local_offset, reloc, target)
@@ -826,7 +831,7 @@ fn resolve_branch_target_key(
826831
     reloc: Reloc,
827832
     resolve: &ResolveView<'_>,
828833
 ) -> Result<BranchTargetKey, RelocError> {
829
-    if let Some(symbol_id) = dylib_import_symbol_id(obj, reloc.referent, resolve.sym_table) {
834
+    if let Some(symbol_id) = dylib_import_symbol_id(obj, reloc.referent, resolve) {
830835
         return Ok(BranchTargetKey::Stub(symbol_id));
831836
     }
832837
     match reloc.referent {
@@ -847,11 +852,7 @@ fn resolve_branch_target_key(
847852
                 )
848853
             })?;
849854
             if let Ok(name) = obj.symbol_name(input_sym) {
850
-                if let Some((symbol_id, _)) = resolve
851
-                    .sym_table
852
-                    .iter()
853
-                    .find(|(_, symbol)| resolve.sym_table.interner.resolve(symbol.name()) == name)
854
-                {
855
+                if let Some(symbol_id) = resolve.symbol_name_index.get(name).copied() {
855856
                     return Ok(BranchTargetKey::Symbol(symbol_id));
856857
                 }
857858
             }
@@ -1085,7 +1086,7 @@ fn resolve_got_target(
10851086
     reloc: Reloc,
10861087
     resolve: &ResolveView<'_>,
10871088
 ) -> Result<u64, RelocError> {
1088
-    let Some(symbol_id) = symbol_referent_id(obj, reloc.referent, resolve.sym_table) else {
1089
+    let Some(symbol_id) = symbol_referent_id(obj, reloc.referent, resolve) else {
10891090
         return Err(reloc_error(
10901091
             atom,
10911092
             &obj.path,
@@ -1108,7 +1109,7 @@ fn resolve_got_target(
11081109
 }
11091110
 
11101111
 fn got_reloc_relaxes_locally(obj: &ObjectFile, reloc: Reloc, resolve: &ResolveView<'_>) -> bool {
1111
-    match symbol_referent_id(obj, reloc.referent, resolve.sym_table) {
1112
+    match symbol_referent_id(obj, reloc.referent, resolve) {
11121113
         Some(symbol_id) => match resolve.sym_table.get(symbol_id) {
11131114
             Symbol::DylibImport { .. } => false,
11141115
             Symbol::Defined { .. } => true,
@@ -1124,7 +1125,7 @@ fn resolve_tlvp_target(
11241125
     reloc: Reloc,
11251126
     resolve: &ResolveView<'_>,
11261127
 ) -> Result<u64, RelocError> {
1127
-    if dylib_import_symbol_id(obj, reloc.referent, resolve.sym_table).is_some() {
1128
+    if dylib_import_symbol_id(obj, reloc.referent, resolve).is_some() {
11281129
         return resolve_got_target(obj, atom, reloc, resolve);
11291130
     }
11301131
     resolve_referent(obj, atom, reloc.kind, reloc.referent, resolve)
@@ -1136,7 +1137,7 @@ fn resolve_tlvp_pageoff_target(
11361137
     reloc: Reloc,
11371138
     resolve: &ResolveView<'_>,
11381139
 ) -> Result<u64, RelocError> {
1139
-    if dylib_import_symbol_id(obj, reloc.referent, resolve.sym_table).is_some() {
1140
+    if dylib_import_symbol_id(obj, reloc.referent, resolve).is_some() {
11401141
         return resolve_got_target(obj, atom, reloc, resolve);
11411142
     }
11421143
     resolve_referent(obj, atom, reloc.kind, reloc.referent, resolve)
@@ -1189,12 +1190,15 @@ fn resolve_symbol_referent(
11891190
     })?;
11901191
 
11911192
     if let Ok(name) = obj.symbol_name(input_sym) {
1192
-        if let Some((_, symbol)) = resolve
1193
-            .sym_table
1194
-            .iter()
1195
-            .find(|(_, symbol)| resolve.sym_table.interner.resolve(symbol.name()) == name)
1196
-        {
1197
-            return resolve_global_symbol(obj, atom, kind, name, symbol, resolve);
1193
+        if let Some(symbol_id) = resolve.symbol_name_index.get(name).copied() {
1194
+            return resolve_global_symbol(
1195
+                obj,
1196
+                atom,
1197
+                kind,
1198
+                name,
1199
+                resolve.sym_table.get(symbol_id),
1200
+                resolve,
1201
+            );
11981202
         }
11991203
     }
12001204
 
@@ -1204,27 +1208,35 @@ fn resolve_symbol_referent(
12041208
 fn dylib_import_symbol_id(
12051209
     obj: &ObjectFile,
12061210
     referent: Referent,
1207
-    sym_table: &SymbolTable,
1211
+    resolve: &ResolveView<'_>,
12081212
 ) -> Option<SymbolId> {
1209
-    let symbol_id = symbol_referent_id(obj, referent, sym_table)?;
1210
-    matches!(sym_table.get(symbol_id), Symbol::DylibImport { .. }).then_some(symbol_id)
1213
+    let symbol_id = symbol_referent_id(obj, referent, resolve)?;
1214
+    matches!(resolve.sym_table.get(symbol_id), Symbol::DylibImport { .. }).then_some(symbol_id)
12111215
 }
12121216
 
12131217
 fn symbol_referent_id(
12141218
     obj: &ObjectFile,
12151219
     referent: Referent,
1216
-    sym_table: &SymbolTable,
1220
+    resolve: &ResolveView<'_>,
12171221
 ) -> Option<SymbolId> {
12181222
     let Referent::Symbol(sym_idx) = referent else {
12191223
         return None;
12201224
     };
12211225
     let input_sym = obj.symbols.get(sym_idx as usize)?;
12221226
     let name = obj.symbol_name(input_sym).ok()?;
1223
-    let (symbol_id, symbol) = sym_table
1227
+    resolve.symbol_name_index.get(name).copied()
1228
+}
1229
+
1230
+fn build_symbol_name_index(sym_table: &SymbolTable) -> HashMap<String, SymbolId> {
1231
+    sym_table
12241232
         .iter()
1225
-        .find(|(_, symbol)| sym_table.interner.resolve(symbol.name()) == name)?;
1226
-    let _ = symbol;
1227
-    Some(symbol_id)
1233
+        .map(|(symbol_id, symbol)| {
1234
+            (
1235
+                sym_table.interner.resolve(symbol.name()).to_string(),
1236
+                symbol_id,
1237
+            )
1238
+        })
1239
+        .collect()
12281240
 }
12291241
 
12301242
 fn resolve_global_symbol(