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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
use super::super::*;
use core::mem;
pub trait FormatterOptionsProvider {
fn operand_options(
&mut self, instruction: &Instruction, operand: u32, instruction_operand: Option<u32>, options: &mut FormatterOperandOptions,
number_options: &mut NumberFormattingOptions,
);
}
pub(super) struct FormatterOperandOptionsFlags;
impl FormatterOperandOptionsFlags {
#[cfg(any(feature = "intel", feature = "masm", feature = "nasm"))]
pub(super) const NONE: u32 = 0x0000_0000;
pub(super) const NO_BRANCH_SIZE: u32 = 0x0000_0001;
const RIP_RELATIVE_ADDRESSES: u32 = 0x0000_0002;
const MEMORY_SIZE_SHIFT: u32 = 30;
const MEMORY_SIZE_MASK: u32 = 3 << FormatterOperandOptionsFlags::MEMORY_SIZE_SHIFT;
}
#[derive(Debug, Default, Copy, Clone, Eq, PartialEq, Hash)]
pub struct FormatterOperandOptions {
flags: u32,
}
#[cfg_attr(feature = "cargo-clippy", allow(clippy::trivially_copy_pass_by_ref))]
impl FormatterOperandOptions {
#[cfg(any(feature = "intel", feature = "masm", feature = "nasm"))]
#[cfg_attr(has_must_use, must_use)]
#[inline]
pub(super) fn new(flags: u32) -> Self {
Self { flags }
}
#[cfg_attr(has_must_use, must_use)]
#[inline]
pub(super) fn with_memory_size_options(options: MemorySizeOptions) -> Self {
Self { flags: (options as u32) << FormatterOperandOptionsFlags::MEMORY_SIZE_SHIFT }
}
#[cfg_attr(has_must_use, must_use)]
#[inline]
pub fn branch_size(&self) -> bool {
(self.flags & FormatterOperandOptionsFlags::NO_BRANCH_SIZE) == 0
}
#[inline]
pub fn set_branch_size(&mut self, value: bool) {
if value {
self.flags &= !FormatterOperandOptionsFlags::NO_BRANCH_SIZE;
} else {
self.flags |= FormatterOperandOptionsFlags::NO_BRANCH_SIZE;
}
}
#[cfg_attr(has_must_use, must_use)]
#[inline]
pub fn rip_relative_addresses(&self) -> bool {
(self.flags & FormatterOperandOptionsFlags::RIP_RELATIVE_ADDRESSES) != 0
}
#[inline]
pub fn set_rip_relative_addresses(&mut self, value: bool) {
if value {
self.flags |= FormatterOperandOptionsFlags::RIP_RELATIVE_ADDRESSES;
} else {
self.flags &= !FormatterOperandOptionsFlags::RIP_RELATIVE_ADDRESSES;
}
}
#[cfg_attr(has_must_use, must_use)]
#[inline]
pub fn memory_size_options(&self) -> MemorySizeOptions {
unsafe { mem::transmute((self.flags >> FormatterOperandOptionsFlags::MEMORY_SIZE_SHIFT) as u8) }
}
#[inline]
pub fn set_memory_size_options(&mut self, value: MemorySizeOptions) {
self.flags =
(self.flags & !FormatterOperandOptionsFlags::MEMORY_SIZE_MASK) | ((value as u32) << FormatterOperandOptionsFlags::MEMORY_SIZE_SHIFT)
}
}