1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
use llvm_constants::{IrBlockId, ModuleCode, TARGET_TRIPLE};
use crate::block::attributes::{AttributeGroups, Attributes};
use crate::block::type_table::TypeTable;
use crate::block::{BlockId, BlockMapError, IrBlock};
use crate::map::{MapCtx, Mappable};
use crate::record::{Comdat, DataLayout};
use crate::unroll::UnrolledBlock;
#[non_exhaustive]
#[derive(Debug)]
pub struct Module {
version: u64,
pub triple: String,
pub datalayout: DataLayout,
pub asm: Vec<String>,
pub deplibs: Vec<String>,
pub type_table: TypeTable,
}
impl IrBlock for Module {
const BLOCK_ID: IrBlockId = IrBlockId::Module;
fn try_map_inner(block: &UnrolledBlock, ctx: &mut MapCtx) -> Result<Self, BlockMapError> {
let version = {
let version = block.one_record(ModuleCode::Version as u64)?;
version.get_field(0)?
};
ctx.version = Some(version);
let triple = if let Some(record) = block.maybe_one_record(ModuleCode::Triple as u64)? {
record.try_string(0)?
} else {
TARGET_TRIPLE.into()
};
let datalayout =
if let Some(record) = block.maybe_one_record(ModuleCode::DataLayout as u64)? {
DataLayout::try_map(record, ctx)?
} else {
DataLayout::default()
};
let asm = match block.maybe_one_record(ModuleCode::Asm as u64)? {
Some(rec) => rec
.try_string(0)?
.split('\n')
.map(String::from)
.collect::<Vec<_>>(),
None => Vec::new(),
};
let deplibs = block
.records(ModuleCode::DepLib as u64)
.map(|rec| rec.try_string(0))
.collect::<Result<Vec<_>, _>>()?;
let _section_table = block
.records(ModuleCode::SectionName as u64)
.map(|rec| rec.try_string(0))
.collect::<Result<Vec<_>, _>>()?;
let _gc_table = block
.records(ModuleCode::GcName as u64)
.map(|rec| rec.try_string(0))
.collect::<Result<Vec<_>, _>>()?;
let _comdats = block
.records(ModuleCode::Comdat as u64)
.map(|rec| Comdat::try_map(rec, ctx))
.collect::<Result<Vec<_>, _>>()?;
let type_table = TypeTable::try_map(block.one_block(BlockId::Ir(IrBlockId::Type))?, ctx)?;
ctx.attribute_groups = block
.maybe_one_block(BlockId::Ir(IrBlockId::ParamAttrGroup))?
.map(|b| AttributeGroups::try_map(b, ctx))
.transpose()?;
ctx.attributes = block
.maybe_one_block(BlockId::Ir(IrBlockId::ParamAttr))?
.map(|b| Attributes::try_map(b, ctx))
.transpose()?;
log::debug!("attributes: {:?}", ctx.attributes);
Ok(Self {
version,
triple,
datalayout,
asm,
deplibs,
type_table,
})
}
}