Skip to content

Commit

Permalink
WIP: Add a test for -Zembed-source=yes (requires upstream gimli release)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mrmaxmeier committed Jun 28, 2024
1 parent b80455e commit b73040d
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 2 deletions.
12 changes: 11 additions & 1 deletion Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1612,6 +1612,16 @@ dependencies = [
"rustc-std-workspace-core",
]

[[package]]
name = "gimli"
version = "0.30.0"
source = "git+https://github.com/gimli-rs/gimli.git?rev=aca0c4275e073da77a0c6e506ba9f4fb3c3aa6ca#aca0c4275e073da77a0c6e506ba9f4fb3c3aa6ca"
dependencies = [
"fallible-iterator",
"indexmap",
"stable_deref_trait",
]

[[package]]
name = "glob"
version = "0.3.1"
Expand Down Expand Up @@ -3394,7 +3404,7 @@ dependencies = [
name = "run_make_support"
version = "0.2.0"
dependencies = [
"gimli 0.28.1",
"gimli 0.30.0",
"object 0.34.0",
"regex",
"similar",
Expand Down
4 changes: 3 additions & 1 deletion src/tools/run-make-support/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@ object = "0.34.0"
similar = "2.5.0"
wasmparser = "0.118.2"
regex = "1.8" # 1.8 to avoid memchr 2.6.0, as 2.5.0 is pinned in the workspace
gimli = "0.28.1"
# gimli = "0.28.1"
# FIXME: replace with crates.io release once available
gimli = { git = "https://github.com/gimli-rs/gimli.git", rev = "aca0c4275e073da77a0c6e506ba9f4fb3c3aa6ca" } # PR 728
2 changes: 2 additions & 0 deletions tests/run-make/embed-source-dwarf/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// hello
fn main() {}
64 changes: 64 additions & 0 deletions tests/run-make/embed-source-dwarf/rmake.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
//@ ignore-windows
//@ ignore-apple

// This test should be replaced with one in tests/debuginfo once we can easily
// tell via GDB or LLDB if debuginfo contains source code. Cheap tricks in LLDB
// like setting an invalid source map path don't appear to work, maybe this'll
// become easier once GDB supports DWARFv6?

use gimli::{AttributeValue, EndianRcSlice, Reader, RunTimeEndian};
use object::{Object, ObjectSection};
use run_make_support::{fs_wrapper, gimli, object, rustc};
use std::collections::HashMap;
use std::path::PathBuf;
use std::rc::Rc;

fn main() {
let output = PathBuf::from("embed-source-main");
rustc()
.input("main.rs")
.output(&output)
.arg("-g")
.arg("-Zembed-source=yes")
.arg("-Zdwarf-version=5")
.run();
let output = fs_wrapper::read(output);
let obj = object::File::parse(output.as_slice()).unwrap();
let endian = if obj.is_little_endian() { RunTimeEndian::Little } else { RunTimeEndian::Big };
let dwarf = gimli::Dwarf::load(|section| -> Result<_, ()> {
let data = obj.section_by_name(section.name()).map(|s| s.uncompressed_data().unwrap());
Ok(EndianRcSlice::new(Rc::from(data.unwrap_or_default().as_ref()), endian))
})
.unwrap();

let mut sources = HashMap::new();

let mut iter = dwarf.units();
while let Some(header) = iter.next().unwrap() {
let unit = dwarf.unit(header).unwrap();
let unit = unit.unit_ref(&dwarf);

if let Some(program) = &unit.line_program {
let header = program.header();
for file in header.file_names() {
if let Some(source) = file.source() {
let path = unit
.attr_string(file.path_name())
.unwrap()
.to_string_lossy()
.unwrap()
.to_string();
let source =
unit.attr_string(source).unwrap().to_string_lossy().unwrap().to_string();
if !source.is_empty() {
sources.insert(path, source);
}
}
}
}
}

dbg!(&sources);
assert_eq!(sources.len(), 1);
assert_eq!(sources.get("main.rs").unwrap(), "// hello\nfn main() {}\n");
}

0 comments on commit b73040d

Please sign in to comment.