libdwarf: make catch type field singly referenced #192
|
@ -72,7 +72,7 @@ unsafe fn get_ttype_entry(
|
||||||
encoding: u8,
|
encoding: u8,
|
||||||
ttype_base: usize,
|
ttype_base: usize,
|
||||||
ttype: *const u8,
|
ttype: *const u8,
|
||||||
) -> Result<*const u8, ()> {
|
) -> Result<Option<*const u8>, ()> {
|
||||||
let i = (offset * size_of_encoded_value(encoding)) as isize;
|
let i = (offset * size_of_encoded_value(encoding)) as isize;
|
||||||
read_encoded_pointer_with_base(
|
read_encoded_pointer_with_base(
|
||||||
&mut DwarfReader::new(ttype.offset(-i)),
|
&mut DwarfReader::new(ttype.offset(-i)),
|
||||||
|
@ -83,7 +83,10 @@ unsafe fn get_ttype_entry(
|
||||||
encoding | DW_EH_PE_pcrel,
|
encoding | DW_EH_PE_pcrel,
|
||||||
ttype_base,
|
ttype_base,
|
||||||
)
|
)
|
||||||
.map(|v| v as *const u8)
|
.map(|v| match v {
|
||||||
|
ttype_base => None,
|
||||||
|
ttype_entry => Some(ttype_entry as *const u8),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn find_eh_action(
|
pub unsafe fn find_eh_action(
|
||||||
|
@ -163,12 +166,12 @@ pub unsafe fn find_eh_action(
|
||||||
ttype_base,
|
ttype_base,
|
||||||
ttype_table,
|
ttype_table,
|
||||||
)?;
|
)?;
|
||||||
let clause_ptr = *(catch_type as *const *const u32);
|
match catch_type {
|
||||||
if clause_ptr.is_null() {
|
Some(clause_ptr) if *(clause_ptr as *const u32) == id => {
|
||||||
return Ok(EHAction::Catch(lpad));
|
return Ok(EHAction::Catch(lpad))
|
||||||
}
|
}
|
||||||
if *clause_ptr == id {
|
None => return Ok(EHAction::Catch(lpad)),
|
||||||
return Ok(EHAction::Catch(lpad));
|
_ => {}
|
||||||
}
|
}
|
||||||
} else if ar_filter < 0 {
|
} else if ar_filter < 0 {
|
||||||
// FIXME: how to handle this?
|
// FIXME: how to handle this?
|
||||||
|
|
Loading…
Reference in New Issue