Skip to content

Commit 374b605

Browse files
committed
Inline-away LookedUpAddresses.
1 parent ab41f70 commit 374b605

File tree

3 files changed

+26
-67
lines changed

3 files changed

+26
-67
lines changed

samply-api/src/symbolicate/looked_up_addresses.rs

Lines changed: 12 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -19,65 +19,25 @@ pub struct AddressResult {
1919
pub inline_frames: Option<Vec<FrameDebugInfo>>,
2020
}
2121

22-
pub type AddressResults = BTreeMap<u32, Option<AddressResult>>;
23-
24-
pub struct LookedUpAddresses {
25-
pub address_results: AddressResults,
26-
pub symbol_count: u32,
27-
}
28-
29-
impl LookedUpAddresses {
30-
pub fn for_addresses(addresses: &[u32]) -> Self {
31-
LookedUpAddresses {
32-
address_results: addresses.iter().map(|&addr| (addr, None)).collect(),
33-
symbol_count: 0,
34-
}
35-
}
36-
37-
pub fn add_address_symbol(
38-
&mut self,
39-
address: u32,
40-
symbol_address: u32,
41-
symbol_name: String,
42-
function_size: Option<u32>,
43-
) {
44-
*self.address_results.get_mut(&address).unwrap() = Some(AddressResult {
22+
impl AddressResult {
23+
pub fn new(symbol_address: u32, symbol_name: String, function_size: Option<u32>) -> Self {
24+
Self {
4525
symbol_address,
4626
symbol_name,
4727
function_size,
4828
inline_frames: None,
49-
});
29+
}
5030
}
5131

52-
pub fn add_address_debug_info(&mut self, address: u32, frames: Vec<FrameDebugInfo>) {
32+
pub fn set_debug_info(&mut self, frames: Vec<FrameDebugInfo>) {
5333
let outer_function_name = frames.last().and_then(|f| f.function.as_deref());
54-
let entry = self.address_results.get_mut(&address).unwrap();
55-
56-
match entry {
57-
Some(address_result) => {
58-
// Overwrite the symbol name with the function name from the debug info.
59-
if let Some(name) = outer_function_name {
60-
address_result.symbol_name = name.to_string();
61-
}
62-
// Add the inline frame info.``
63-
address_result.inline_frames = Some(frames);
64-
}
65-
None => {
66-
// add_address_symbol has not been called for this address.
67-
// This happens when we only have debug info but no symbol for this address.
68-
// This is a rare case.
69-
*entry = Some(AddressResult {
70-
symbol_address: address, // TODO: Would be nice to get the actual function start address from addr2line
71-
symbol_name: outer_function_name
72-
.map_or_else(|| format!("0x{address:x}"), str::to_string),
73-
function_size: None,
74-
inline_frames: Some(frames),
75-
});
76-
}
34+
// Overwrite the symbol name with the function name from the debug info.
35+
if let Some(name) = outer_function_name {
36+
self.symbol_name = name.to_string();
7737
}
78-
}
79-
80-
pub fn set_total_symbol_count(&mut self, total_symbol_count: u32) {
81-
self.symbol_count = total_symbol_count;
38+
// Add the inline frame info.
39+
self.inline_frames = Some(frames);
8240
}
8341
}
42+
43+
pub type AddressResults = BTreeMap<u32, Option<AddressResult>>;

samply-api/src/symbolicate/mod.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,14 @@ use samply_symbols::{
77
};
88

99
use crate::error::Error;
10-
use crate::symbolicate::looked_up_addresses::PathResolver;
10+
use crate::symbolicate::looked_up_addresses::{AddressResult, AddressResults, PathResolver};
1111
use crate::symbolicate::response_json::{PerLibResult, Response};
1212
use crate::to_debug_id;
1313

1414
pub mod looked_up_addresses;
1515
pub mod request_json;
1616
pub mod response_json;
1717

18-
use looked_up_addresses::LookedUpAddresses;
1918
use request_json::Lib;
2019

2120
impl<H: FileAndPathHelper> PathResolver for SymbolMap<H> {
@@ -95,21 +94,21 @@ impl<'a, H: FileAndPathHelper + 'static> SymbolicateApi<'a, H> {
9594
};
9695
let symbol_map = self.symbol_manager.load_symbol_map(&info).await?;
9796
symbol_map.set_access_pattern_hint(AccessPatternHint::SequentialLookup);
98-
let mut symbolication_result = LookedUpAddresses::for_addresses(&addresses);
9997

100-
symbolication_result.set_total_symbol_count(symbol_map.symbol_count() as u32);
98+
let mut address_results: AddressResults =
99+
addresses.iter().map(|&addr| (addr, None)).collect();
101100

102101
for &address in &addresses {
103102
if let Some(address_info) = symbol_map.lookup_sync(LookupAddress::Relative(address)) {
104-
symbolication_result.add_address_symbol(
105-
address,
103+
let address_result = address_results.get_mut(&address).unwrap();
104+
*address_result = Some(AddressResult::new(
106105
address_info.symbol.address,
107106
address_info.symbol.name,
108107
address_info.symbol.size,
109-
);
108+
));
110109
match address_info.frames {
111110
Some(FramesLookupResult::Available(frames)) => {
112-
symbolication_result.add_address_debug_info(address, frames)
111+
address_result.as_mut().unwrap().set_debug_info(frames)
113112
}
114113
Some(FramesLookupResult::External(ext_address)) => {
115114
external_addresses.push((address, ext_address));
@@ -127,12 +126,13 @@ impl<'a, H: FileAndPathHelper + 'static> SymbolicateApi<'a, H> {
127126

128127
for (address, ext_address) in external_addresses {
129128
if let Some(frames) = symbol_map.lookup_external(&ext_address).await {
130-
symbolication_result.add_address_debug_info(address, frames);
129+
let address_result = address_results.get_mut(&address).unwrap();
130+
address_result.as_mut().unwrap().set_debug_info(frames);
131131
}
132132
}
133133

134134
let outcome = PerLibResult {
135-
address_results: symbolication_result,
135+
address_results,
136136
symbol_map: Arc::new(symbol_map),
137137
};
138138

samply-api/src/symbolicate/response_json.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@ use std::sync::Arc;
55
use samply_symbols::{FileAndPathHelper, FrameDebugInfo, SymbolMap};
66
use serde::ser::{SerializeMap, SerializeSeq};
77

8-
use super::looked_up_addresses::LookedUpAddresses;
98
use super::request_json::{Job, Lib, RequestFrame, RequestStack};
109
use crate::api_file_path::to_api_file_path;
1110
use crate::symbolicate::looked_up_addresses::{AddressResults, PathResolver};
1211
use crate::symbolicate::request_json::Request;
1312

1413
pub struct PerLibResult<H: FileAndPathHelper> {
15-
pub address_results: LookedUpAddresses,
14+
pub address_results: AddressResults,
1615
pub symbol_map: Arc<SymbolMap<H>>,
1716
}
1817

@@ -59,7 +58,7 @@ impl<H: FileAndPathHelper> serde::Serialize for Response<H> {
5958
}
6059

6160
pub struct PerLibResultRef<'a> {
62-
pub address_results: std::result::Result<&'a LookedUpAddresses, &'a samply_symbols::Error>,
61+
pub address_results: std::result::Result<&'a AddressResults, &'a samply_symbols::Error>,
6362
pub path_resolver: &'a dyn PathResolver,
6463
}
6564

@@ -106,9 +105,9 @@ impl<'a> serde::Serialize for Result<'a> {
106105
if let Some(per_lib_result) = self.per_lib_results.get(lib) {
107106
let module_key = format!("{}/{}", lib.debug_name, lib.breakpad_id);
108107
match per_lib_result.address_results {
109-
Ok(symbols) => {
108+
Ok(address_results) => {
110109
let module_results = PerModuleResultsRef {
111-
address_results: &symbols.address_results,
110+
address_results,
112111
path_resolver: per_lib_result.path_resolver,
113112
};
114113
symbols_by_module_index.insert(module_index as u32, module_results);

0 commit comments

Comments
 (0)