From b1cb0750b4fb44e7928eb6c5984dd9ed964a87e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=BCller?= Date: Tue, 24 Sep 2024 15:41:38 -0700 Subject: [PATCH] Factor out DwarfResolver::function_to_sym_info() helper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Factor out the internal DwarfResolver::function_to_sym_info() helper as a means to share the logic for converting a Function object into a SymInfo. Signed-off-by: Daniel Müller --- src/dwarf/resolver.rs | 70 +++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/src/dwarf/resolver.rs b/src/dwarf/resolver.rs index 0a868f5d..75bb5e8d 100644 --- a/src/dwarf/resolver.rs +++ b/src/dwarf/resolver.rs @@ -206,6 +206,46 @@ impl DwarfResolver { .collect::>(); Self::from_parser(Rc::new(parser), debug_dirs.as_slice()) } + + /// Try converting a `Function` into a `SymInfo`. + /// + /// # Notes + /// This method only returns `None` if `function` does not have the `name` + /// attribute set. + fn function_to_sym_info<'slf>( + &'slf self, + function: &'slf Function, + offset_in_file: bool, + ) -> Result>> { + let name = if let Some(name) = function.name { + name.to_string().unwrap() + } else { + return Ok(None) + }; + let addr = function + .range + .as_ref() + .map(|range| range.begin as Addr) + .unwrap_or(0); + let size = function + .range + .as_ref() + .and_then(|range| range.end.checked_sub(range.begin)) + .map(|size| usize::try_from(size).unwrap_or(usize::MAX)) + .unwrap_or(0); + let info = SymInfo { + name: Cow::Borrowed(name), + addr, + size, + sym_type: SymType::Function, + file_offset: offset_in_file + .then(|| self.parser.find_file_offset(addr)) + .transpose()? + .flatten(), + obj_file_name: self.parser.path().map(Cow::Borrowed), + }; + Ok(Some(info)) + } } impl Symbolize for DwarfResolver { @@ -268,31 +308,11 @@ impl Inspect for DwarfResolver { match result { Ok(function) => { // SANITY: We found the function by name, so it must have the - // name attribute set. - let name = function.name.unwrap().to_string().unwrap(); - let addr = function - .range - .as_ref() - .map(|range| range.begin as Addr) - .unwrap_or(0); - let size = function - .range - .as_ref() - .and_then(|range| range.end.checked_sub(range.begin)) - .map(|size| usize::try_from(size).unwrap_or(usize::MAX)) - .unwrap_or(0); - let info = SymInfo { - name: Cow::Borrowed(name), - addr, - size, - sym_type: SymType::Function, - file_offset: opts - .offset_in_file - .then(|| self.parser.find_file_offset(addr)) - .transpose()? - .flatten(), - obj_file_name: self.parser.path().map(Cow::Borrowed), - }; + // name attribute set. `function_to_sym_info` + // only returns `None` if no name is present. + let info = self + .function_to_sym_info(function, opts.offset_in_file)? + .unwrap(); Ok(info) } Err(err) => Err(Error::from(err)),