Set alignment for floats/doubles in analyzer

Resolves #60
This commit is contained in:
Luke Street 2025-01-27 17:46:56 -07:00
parent 589e59a620
commit 9a6348ec49

View File

@ -734,55 +734,65 @@ impl Tracker {
); );
} }
} }
let data_kind = self let (data_kind, inferred_alignment) = self
.data_types .data_types
.get(&target) .get(&target)
.map(|dt| match dt { .map(|dt| match dt {
DataKind::Unknown => ObjDataKind::Unknown, DataKind::Unknown => (ObjDataKind::Unknown, None),
DataKind::Word => ObjDataKind::Byte4, DataKind::Word => (ObjDataKind::Byte4, None),
DataKind::Half => ObjDataKind::Byte2, DataKind::Half => (ObjDataKind::Byte2, None),
DataKind::Byte => ObjDataKind::Byte, DataKind::Byte => (ObjDataKind::Byte, None),
DataKind::Float => ObjDataKind::Float, DataKind::Float => (ObjDataKind::Float, Some(4)),
DataKind::Double => ObjDataKind::Double, DataKind::Double => (ObjDataKind::Double, Some(8)),
}) })
.unwrap_or_default(); .unwrap_or_default();
let (target_symbol, addend) = if let Some(symbol) = let (target_symbol, addend) =
self.special_symbol(obj, target.address, reloc_kind) if let Some(symbol) = self.special_symbol(obj, target.address, reloc_kind) {
{ (symbol, 0)
(symbol, 0) } else if let Some((symbol_idx, symbol)) =
} else if let Some((symbol_idx, symbol)) = obj.symbols.for_relocation(target, reloc_kind)?
obj.symbols.for_relocation(target, reloc_kind)?
{
let symbol_address = symbol.address;
// TODO meh
if data_kind != ObjDataKind::Unknown
&& symbol.data_kind == ObjDataKind::Unknown
&& symbol_address as u32 == target.address
{ {
obj.symbols.replace(symbol_idx, ObjSymbol { data_kind, ..symbol.clone() })?; let symbol_address = symbol.address;
} if symbol_address as u32 == target.address
(symbol_idx, target.address as i64 - symbol_address as i64) && ((data_kind != ObjDataKind::Unknown
} else { && symbol.data_kind == ObjDataKind::Unknown)
// Create a new label || (symbol.align.is_none() && inferred_alignment.is_some()))
let name = if obj.module_id == 0 { {
format!("lbl_{:08X}", target.address) let mut new_symbol = symbol.clone();
if symbol.data_kind == ObjDataKind::Unknown {
new_symbol.data_kind = data_kind;
}
if symbol.align.is_none() {
if let Some(inferred_alignment) = inferred_alignment {
if symbol_address as u32 % inferred_alignment == 0 {
new_symbol.align = Some(inferred_alignment);
}
}
}
obj.symbols.replace(symbol_idx, new_symbol)?;
}
(symbol_idx, target.address as i64 - symbol_address as i64)
} else { } else {
format!( // Create a new label
"lbl_{}_{}_{:X}", let name = if obj.module_id == 0 {
obj.module_id, format!("lbl_{:08X}", target.address)
obj.sections[target.section].name.trim_start_matches('.'), } else {
target.address format!(
) "lbl_{}_{}_{:X}",
obj.module_id,
obj.sections[target.section].name.trim_start_matches('.'),
target.address
)
};
let symbol_idx = obj.symbols.add_direct(ObjSymbol {
name,
address: target.address as u64,
section: Some(target.section),
data_kind,
..Default::default()
})?;
(symbol_idx, 0)
}; };
let symbol_idx = obj.symbols.add_direct(ObjSymbol {
name,
address: target.address as u64,
section: Some(target.section),
data_kind,
..Default::default()
})?;
(symbol_idx, 0)
};
let reloc = ObjReloc { kind: reloc_kind, target_symbol, addend, module: None }; let reloc = ObjReloc { kind: reloc_kind, target_symbol, addend, module: None };
let section = &mut obj.sections[addr.section]; let section = &mut obj.sections[addr.section];
if replace { if replace {