-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Port repr128-dwarf run-make test to rmake
- Loading branch information
Showing
8 changed files
with
83 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
//@ ignore-windows | ||
// This test should be replaced with one in tests/debuginfo once GDB or LLDB support 128-bit enums. | ||
|
||
extern crate run_make_support; | ||
|
||
use gimli::{AttributeValue, Dwarf, EndianRcSlice, Reader, RunTimeEndian}; | ||
use object::{Object, ObjectSection}; | ||
use run_make_support::{gimli, object, rustc, tmp_dir}; | ||
use std::borrow::Cow; | ||
use std::collections::HashMap; | ||
use std::rc::Rc; | ||
|
||
fn main() { | ||
let output = tmp_dir().join("repr128"); | ||
rustc().input("main.rs").arg("-o").arg(&output).arg("-Cdebuginfo=2").run(); | ||
// Mach-O uses packed debug info | ||
let dsym_location = output | ||
.with_extension("dSYM") | ||
.join("Contents") | ||
.join("Resources") | ||
.join("DWARF") | ||
.join("repr128"); | ||
let output = | ||
std::fs::read(if dsym_location.try_exists().unwrap() { dsym_location } else { output }) | ||
.unwrap(); | ||
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 iter = dwarf.units(); | ||
let mut still_to_find = HashMap::from([ | ||
("U128A", 0_u128), | ||
("U128B", 1_u128), | ||
("U128C", u64::MAX as u128 + 1), | ||
("U128D", u128::MAX), | ||
("I128A", 0_i128 as u128), | ||
("I128B", (-1_i128) as u128), | ||
("I128C", i128::MIN as u128), | ||
("I128D", i128::MAX as u128), | ||
]); | ||
while let Some(header) = iter.next().unwrap() { | ||
let unit = dwarf.unit(header).unwrap(); | ||
let mut cursor = unit.entries(); | ||
while let Some((_, entry)) = cursor.next_dfs().unwrap() { | ||
if entry.tag() == gimli::constants::DW_TAG_enumerator { | ||
let name = dwarf | ||
.attr_string( | ||
&unit, | ||
entry.attr(gimli::constants::DW_AT_name).unwrap().unwrap().value(), | ||
) | ||
.unwrap(); | ||
let name = name.to_string().unwrap(); | ||
if let Some(expected) = still_to_find.remove(name.as_ref()) { | ||
match entry.attr(gimli::constants::DW_AT_const_value).unwrap().unwrap().value() | ||
{ | ||
AttributeValue::Block(value) => { | ||
assert_eq!( | ||
value.to_slice().unwrap(), | ||
expected.to_le_bytes().as_slice(), | ||
"{name}" | ||
); | ||
} | ||
value => panic!("{name}: unexpected DW_AT_const_value of {value:?}"), | ||
} | ||
} | ||
} | ||
} | ||
} | ||
if !still_to_find.is_empty() { | ||
panic!("Didn't find debug entries for {still_to_find:?}"); | ||
} | ||
} |