From b4b14d376d8a275084ec3cf1f36f7c0d5125539e Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Wed, 17 May 2023 20:05:53 +0200 Subject: [PATCH] yeah --- elven-forest/size-analyze.py | 17 +++++++++++++++++ elven-forest/src/size.rs | 29 +++++++++++++++++++---------- 2 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 elven-forest/size-analyze.py diff --git a/elven-forest/size-analyze.py b/elven-forest/size-analyze.py new file mode 100644 index 0000000..d8c56db --- /dev/null +++ b/elven-forest/size-analyze.py @@ -0,0 +1,17 @@ +import pandas as pd +import sys +import plotly.express as px + +df = pd.read_csv(sys.argv[1]) +#df = df[df['1'] == "rustc_middle[8d82ae2353292c40]"] + +print(df) + +fig = px.treemap(df, path=[px.Constant("functions"), '1', '2', '3', '4'], values='size', + hover_data=['size']) +fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) +print("finished") + + +fig.write_image("output.svg") +print("written") \ No newline at end of file diff --git a/elven-forest/src/size.rs b/elven-forest/src/size.rs index acfe78b..205dca6 100644 --- a/elven-forest/src/size.rs +++ b/elven-forest/src/size.rs @@ -35,7 +35,7 @@ pub fn analyze_text_bloat(elf: ElfReader<'_>, csv: bool) -> Result<()> { symbol_sizes.sort_by_key(|&(_, size)| size); symbol_sizes.reverse(); - let depth = 3; + let depth = 4; if csv { println!( @@ -54,8 +54,8 @@ pub fn analyze_text_bloat(elf: ElfReader<'_>, csv: bool) -> Result<()> { if csv { println!("{size},{components}"); } else { + println!("{size} {components}"); } - println!("{size} {components}"); } Ok(()) @@ -69,8 +69,10 @@ fn symbol_components(sym: &str, depth: usize, csv: bool) -> Result { } let mut components = if demangled.starts_with('<') { - let qpath = parse_qpath(&demangled).context("invalid qpath")?; - qpath_components(qpath)? + parse_qpath(&demangled) + .context("invalid qpath") + .and_then(|qpath| qpath_components(qpath)) + .unwrap_or_else(|_| demangled.split("::").collect::>()) } else { // normal path demangled.split("::").collect::>() @@ -79,7 +81,7 @@ fn symbol_components(sym: &str, depth: usize, csv: bool) -> Result { if components.len() >= depth { components.truncate(depth); } else { - components.extend(std::iter::repeat("").take(depth - components.len())); + components.extend(std::iter::repeat("_").take(depth - components.len())); } let components = components @@ -106,10 +108,17 @@ struct QPath<'a> { fn qpath_components(qpath: QPath<'_>) -> Result> { if qpath.qself.starts_with('<') { - let sub_qpath = parse_qpath(qpath.qself)?; - let mut sub_components = qpath_components(sub_qpath)?; - sub_components.extend(qpath.pathy_bit.split("::")); - Ok(sub_components) + if let Ok(sub_qpath) = parse_qpath(qpath.qself) { + let mut sub_components = qpath_components(sub_qpath)?; + sub_components.extend(qpath.pathy_bit.split("::")); + Ok(sub_components) + } else { + Ok(qpath + .qself + .split("::") + .chain(qpath.pathy_bit.split("::")) + .collect()) + } } else { Ok(qpath .qself @@ -202,7 +211,7 @@ mod tests { fn path_debug_helper() { // <::fmt::DebugHelper as core::fmt::Debug>::fmt::h4f87ac80fb33df05 let sym = "_ZN106_$LT$$LT$std..path..Iter$u20$as$u20$core..fmt..Debug$GT$..fmt..DebugHelper$u20$as$u20$core..fmt..Debug$GT$3fmt17h4f87ac80fb33df05E"; - let components = symbol_components(sym, 6).unwrap(); + let components = symbol_components(sym, 6, true).unwrap(); assert_eq!(components, "std,path,Iter,fmt,DebugHelper,fmt") }