* Locate ProDG .bss sections (partial addressing of #62) * Support both correct and incorrect memset calls
This commit is contained in:
parent
c484952912
commit
c3c7c2b062
|
@ -597,19 +597,27 @@ pub fn locate_bss_memsets(obj: &mut ObjInfo) -> Result<Vec<(u32, u32)>> {
|
||||||
StepResult::Branch(branches) => {
|
StepResult::Branch(branches) => {
|
||||||
for branch in branches {
|
for branch in branches {
|
||||||
if branch.link {
|
if branch.link {
|
||||||
// ProDG bug? Registers are supposed to start at r3
|
// Some ProDG crt0.s versions use the wrong registers, some don't
|
||||||
if let (
|
if let (
|
||||||
GprValue::Constant(addr),
|
GprValue::Constant(addr),
|
||||||
GprValue::Constant(value),
|
GprValue::Constant(value),
|
||||||
GprValue::Constant(size),
|
GprValue::Constant(size),
|
||||||
) = (vm.gpr_value(4), vm.gpr_value(5), vm.gpr_value(6))
|
) = {
|
||||||
{
|
if vm.gpr_value(4) == GprValue::Constant(0) {
|
||||||
|
(vm.gpr_value(3), vm.gpr_value(4), vm.gpr_value(5))
|
||||||
|
} else {
|
||||||
|
(vm.gpr_value(4), vm.gpr_value(5), vm.gpr_value(6))
|
||||||
|
}
|
||||||
|
} {
|
||||||
if value == 0 && size > 0 {
|
if value == 0 && size > 0 {
|
||||||
bss_sections.push((addr, size));
|
bss_sections.push((addr, size));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if bss_sections.len() >= 2 {
|
||||||
|
return Ok(ExecCbResult::End(()));
|
||||||
|
}
|
||||||
Ok(ExecCbResult::Continue)
|
Ok(ExecCbResult::Continue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue