Prefer references to _savegpr_14 over __savegpr

Same for `__restore_gpr`, `__save_fpr` and `__restore_fpr`.
A common issue that can be solved with a little bit
of special-casing.
This commit is contained in:
Luke Street 2024-04-30 18:04:50 -06:00
parent dc7e307c44
commit c1c4373e53

View File

@ -583,15 +583,24 @@ pub fn best_match_for_reloc(
} }
symbols.sort_by_key(|&(_, symbol)| { symbols.sort_by_key(|&(_, symbol)| {
let mut rank = match symbol.kind { let mut rank = match symbol.kind {
ObjSymbolKind::Function | ObjSymbolKind::Object => match reloc_kind { ObjSymbolKind::Function | ObjSymbolKind::Object => {
ObjRelocKind::PpcAddr16Hi // HACK: These are generally not referenced directly, so reduce their rank
| ObjRelocKind::PpcAddr16Ha if matches!(
| ObjRelocKind::PpcAddr16Lo => 1, symbol.name.as_str(),
ObjRelocKind::Absolute "__save_gpr" | "__restore_gpr" | "__save_fpr" | "__restore_fpr"
| ObjRelocKind::PpcRel24 ) {
| ObjRelocKind::PpcRel14 return 0;
| ObjRelocKind::PpcEmbSda21 => 2, }
}, match reloc_kind {
ObjRelocKind::PpcAddr16Hi
| ObjRelocKind::PpcAddr16Ha
| ObjRelocKind::PpcAddr16Lo => 1,
ObjRelocKind::Absolute
| ObjRelocKind::PpcRel24
| ObjRelocKind::PpcRel14
| ObjRelocKind::PpcEmbSda21 => 2,
}
}
// Label // Label
ObjSymbolKind::Unknown => match reloc_kind { ObjSymbolKind::Unknown => match reloc_kind {
ObjRelocKind::PpcAddr16Hi ObjRelocKind::PpcAddr16Hi