dxil_reader/disasm/
mod.rs1mod annotate;
16mod asm;
17mod header;
18mod layout;
19#[rustfmt::skip] mod ops;
21
22use crate::{Module, Result, error, psv, rdat};
23
24pub fn disassemble(container: &[u8]) -> Result<String> {
26 let parts = crate::parts(container)?;
27 let find = |kind: &[u8; 4]| parts.iter().find(|c| &c.kind == kind).map(|c| c.data);
28 let mut s = String::new();
29 if let Some(sfi0) = find(b"SFI0") {
30 header::feature_info(&mut s, sfi0)?;
31 }
32 for (kind, name, input) in [
33 (b"ISG1", "Input", true),
34 (b"OSG1", "Output", false),
35 (b"PSG1", "Patch Constant", false),
36 ] {
37 if let Some(part) = find(kind) {
38 header::part_signature(&mut s, name, part, input)?;
39 }
40 }
41 if let Some(ildn) = find(b"ILDN") {
42 header::debug_name(&mut s, ildn);
43 }
44 if let Some(hash) = find(b"HASH") {
45 header::hash(&mut s, hash)?;
46 }
47 let program = find(b"ILDB")
49 .or_else(|| find(b"DXIL"))
50 .ok_or_else(|| error(0, "the container has no DXIL part"))?;
51 let program = crate::program(program)?;
52 if let Some(part) = find(b"PSV0") {
53 let kind = u8::try_from(program.program_version >> 16 & 0xFF).unwrap_or(u8::MAX);
55 header::psv_runtime(&mut s, &psv::read(part)?, kind)?;
56 }
57 let module = read(program.bitcode)?;
58 let reflection = match find(b"STAT").map(crate::program) {
61 Some(Ok(part)) => Some(read(part.bitcode)?),
62 _ => None,
63 };
64 if module.named_metadata.iter().any(|(n, _)| n == "dx.version") {
65 let kind = crate::reflection::shader_model(&module)?
66 .map(|(k, _, _)| k)
67 .ok_or_else(|| error(module.at, "the module has no dx.shaderModel metadata"))?;
68 if kind != "lib" {
69 header::dxil_signatures(&mut s, &module, &kind)?;
70 }
71 header::reflection_sections(&mut s, reflection.as_ref().unwrap_or(&module))?;
72 let subobjects = match find(b"RDAT") {
73 Some(part) => rdat::subobjects(part)?,
74 None => Vec::new(),
75 };
76 if subobjects.is_empty() && module.named_metadata.iter().any(|(n, _)| n == "dx.subobjects") {
77 return Err(error(
78 module.at,
79 "subobjects in dx.subobjects metadata are not supported",
80 ));
81 }
82 header::subobjects(&mut s, &subobjects);
83 }
84 asm::write(&mut s, &module)?;
85 s.push('\n');
87 Ok(s)
88}
89
90pub fn module_text(m: &Module) -> Result<String> {
92 let mut s = String::new();
93 asm::write(&mut s, m)?;
94 Ok(s)
95}
96
97fn read(bitcode: &[u8]) -> Result<Module> {
98 Module::read(&crate::bitstream::read(bitcode, *b"BC\xc0\xde")?)
99}