1use super::{DebugId, IntExpr, PlaceNumcheck, SymId, XmlRegister};
4use crate::storage::Kind;
5use crate::{codec_enum, codec_struct};
6
7#[derive(Clone, Debug, PartialEq, Eq)]
8pub struct Place {
9 pub base: Base,
10 pub offset: u32,
11 pub len: u32,
13 pub kind: Kind,
14 pub scaling: u32,
16 pub moved: Vec<Odo>,
19 pub subscripts: Vec<Subscript>,
21 pub odo: Vec<Odo>,
24 pub refmod: Option<RefMod>,
25 pub name: SymId,
26 pub at: DebugId,
27 pub numcheck: PlaceNumcheck,
28 pub table: Option<TableRange>,
31}
32
33#[derive(Clone, Copy, Debug, PartialEq, Eq)]
36pub struct TableRange {
37 pub displacement: u32,
38 pub extent: u32,
39}
40
41#[derive(Clone, Copy, Debug, PartialEq, Eq)]
42pub enum Base {
43 Program,
44 Local,
45 Linkage(u16),
46 ReturnCode,
48 Eib,
49 SelfRef,
50 JniEnv,
51 Xml(XmlRegister),
55}
56
57#[derive(Clone, Debug, PartialEq, Eq)]
58pub struct Subscript {
59 pub stride: u32,
60 pub value: IntExpr,
61}
62
63#[derive(Clone, Debug, PartialEq, Eq)]
64pub struct Odo {
65 pub object: IntExpr,
66 pub max: u32,
67 pub element: u32,
68 pub check: bool,
69}
70
71#[derive(Clone, Debug, PartialEq, Eq)]
73pub struct RefMod {
74 pub start: IntExpr,
75 pub length: Option<IntExpr>,
76 pub check: bool,
77}
78
79codec_struct!(Place { base, offset, len, kind, scaling, moved, subscripts, odo, refmod, name, at, numcheck } default { table } check crate::module::codec::unchecked);
80codec_struct!(TableRange { displacement, extent });
81codec_enum!(Base {
82 Program = 0,
83 Local = 1,
84 Linkage(record) = 2,
85 ReturnCode = 3,
86 Eib = 4,
87 SelfRef = 5,
88 JniEnv = 6,
89 Xml(register) = 7,
90});
91codec_struct!(Subscript { stride, value });
92codec_struct!(Odo { object, max, element, check });
93codec_struct!(RefMod { start, length, check });