Skip to content

Commit 8e970c8

Browse files
committed
aaaaaa
1 parent 21360b7 commit 8e970c8

File tree

10 files changed

+768
-611
lines changed

10 files changed

+768
-611
lines changed

rust/src/high_level_il.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ mod function;
44
mod instruction;
55
mod lift;
66
pub mod operation;
7+
pub mod token_emitter;
78

89
pub use self::block::*;
910
pub use self::function::*;

rust/src/high_level_il/function.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,17 @@ pub struct HighLevelILFunction {
1515
}
1616

1717
impl HighLevelILFunction {
18+
pub(crate) unsafe fn from_raw(handle: *mut BNHighLevelILFunction, full_ast: bool) -> Self {
19+
debug_assert!(!handle.is_null());
20+
Self { handle, full_ast }
21+
}
22+
1823
pub(crate) unsafe fn ref_from_raw(
1924
handle: *mut BNHighLevelILFunction,
2025
full_ast: bool,
2126
) -> Ref<Self> {
2227
debug_assert!(!handle.is_null());
23-
Self { handle, full_ast }.to_owned()
28+
Ref::new(Self { handle, full_ast })
2429
}
2530

2631
pub fn instruction_from_index(
Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
use crate::disassembly::{
2+
DisassemblySettings, DisassemblyTextLine, InstructionTextToken, InstructionTextTokenType,
3+
};
4+
use crate::high_level_il::HighLevelILFunction;
5+
use crate::language_representation::{OperatorPrecedence, SymbolDisplayResult, SymbolDisplayType};
6+
use crate::rc::{Array, Ref, RefCountable};
7+
use crate::variable::Variable;
8+
use binaryninjacore_sys::{
9+
BNAddHighLevelILArrayIndexToken, BNAddHighLevelILConstantTextToken,
10+
BNAddHighLevelILFloatSizeToken, BNAddHighLevelILIntegerTextToken,
11+
BNAddHighLevelILPointerTextToken, BNAddHighLevelILSizeToken, BNAddHighLevelILVarTextToken,
12+
BNFreeHighLevelILTokenEmitter, BNHighLevelILTokenEmitter,
13+
BNHighLevelILTokenEmitterGetCurrentTokens, BNHighLevelILTokenEmitterGetLines,
14+
BNNewHighLevelILTokenEmitterReference, BNVariable,
15+
};
16+
use std::ptr;
17+
18+
/// High level token emitter
19+
#[derive(PartialEq, Eq, Hash)]
20+
pub struct HighLevelILTokenEmitter {
21+
handle: ptr::NonNull<BNHighLevelILTokenEmitter>,
22+
}
23+
24+
unsafe impl Send for HighLevelILTokenEmitter {}
25+
unsafe impl Sync for HighLevelILTokenEmitter {}
26+
27+
unsafe impl RefCountable for HighLevelILTokenEmitter {
28+
unsafe fn inc_ref(handle: &Self) -> Ref<Self> {
29+
let handle = BNNewHighLevelILTokenEmitterReference(handle.handle.as_ptr());
30+
let handle = ptr::NonNull::new(handle).unwrap();
31+
Ref::new(HighLevelILTokenEmitter { handle })
32+
}
33+
34+
unsafe fn dec_ref(handle: &Self) {
35+
BNFreeHighLevelILTokenEmitter(handle.handle.as_ptr())
36+
}
37+
}
38+
39+
impl ToOwned for HighLevelILTokenEmitter {
40+
type Owned = Ref<Self>;
41+
42+
fn to_owned(&self) -> Self::Owned {
43+
unsafe { RefCountable::inc_ref(self) }
44+
}
45+
}
46+
47+
impl HighLevelILTokenEmitter {
48+
pub(crate) unsafe fn from_raw(handle: ptr::NonNull<BNHighLevelILTokenEmitter>) -> Self {
49+
Self { handle }
50+
}
51+
52+
pub(crate) fn as_raw(&self) -> *mut BNHighLevelILTokenEmitter {
53+
self.handle.as_ptr()
54+
}
55+
}
56+
57+
crate::impl_simple_functions! {
58+
HighLevelILTokenEmitter,
59+
prepend_collapse_blank_indicator -> BNHighLevelILTokenPrependCollapseBlankIndicator(),
60+
prepend_collapse_indicator -> BNHighLevelILTokenPrependCollapseIndicator(
61+
context: InstructionTextTokenContext: BNInstructionTextTokenContext = context,
62+
hash: u64,
63+
),
64+
has_collapsable_regions -> BNHighLevelILTokenEmitterHasCollapsableRegions() -> bool,
65+
set_has_collapsable_regions -> BNHighLevelILTokenEmitterSetHasCollapsableRegions(
66+
state: bool,
67+
),
68+
append -> BNHighLevelILTokenEmitterAppend (
69+
token: InstructionTextToken: *mut BNInstructionTextToken = &mut InstructionTextToken::into_raw(token),
70+
),
71+
init_line -> BNHighLevelILTokenEmitterInitLine(),
72+
new_line -> BNHighLevelILTokenEmitterNewLine(),
73+
increase_indent -> BNHighLevelILTokenEmitterIncreaseIndent(),
74+
decrease_indent -> BNHighLevelILTokenEmitterDecreaseIndent(),
75+
scope_separator -> BNHighLevelILTokenEmitterScopeSeparator(),
76+
begin_scope -> BNHighLevelILTokenEmitterBeginScope(
77+
type_: ScopeType,
78+
),
79+
end_scope -> BNHighLevelILTokenEmitterEndScope(
80+
type_: ScopeType,
81+
),
82+
scope_continuation -> BNHighLevelILTokenEmitterScopeContinuation(
83+
force_same_line: bool,
84+
),
85+
finalize_scope -> BNHighLevelILTokenEmitterFinalizeScope(),
86+
no_indent_for_this_line -> BNHighLevelILTokenEmitterNoIndentForThisLine(),
87+
begin_force_zero_confidence -> BNHighLevelILTokenEmitterBeginForceZeroConfidence(),
88+
end_force_zero_confidence -> BNHighLevelILTokenEmitterEndForceZeroConfidence(),
89+
set_current_expr -> BNHighLevelILTokenEmitterSetCurrentExpr(
90+
expr: TokenEmitterExpr,
91+
) -> TokenEmitterExpr,
92+
restore_current_expr -> BNHighLevelILTokenEmitterRestoreCurrentExpr(
93+
expr: TokenEmitterExpr,
94+
),
95+
finalize -> BNHighLevelILTokenEmitterFinalize(),
96+
append_open_paren -> BNHighLevelILTokenEmitterAppendOpenParen(),
97+
append_close_paren -> BNHighLevelILTokenEmitterAppendCloseParen(),
98+
append_open_bracket -> BNHighLevelILTokenEmitterAppendOpenBracket(),
99+
append_close_bracket -> BNHighLevelILTokenEmitterAppendCloseBracket(),
100+
append_open_brace -> BNHighLevelILTokenEmitterAppendOpenBrace(),
101+
append_close_brace -> BNHighLevelILTokenEmitterAppendCloseBrace(),
102+
append_semicolon -> BNHighLevelILTokenEmitterAppendSemicolon(),
103+
set_brace_requirement -> BNHighLevelILTokenEmitterSetBraceRequirement(
104+
required: BraceRequirement,
105+
),
106+
set_braces_around_switch_cases -> BNHighLevelILTokenEmitterSetBracesAroundSwitchCases(
107+
braces: bool,
108+
),
109+
set_default_braces_on_same_line -> BNHighLevelILTokenEmitterSetDefaultBracesOnSameLine(
110+
same_line: bool,
111+
),
112+
set_simple_scope_allowed -> BNHighLevelILTokenEmitterSetSimpleScopeAllowed(
113+
allowed: bool,
114+
),
115+
brace_requirement -> BNHighLevelILTokenEmitterGetBraceRequirement() -> BraceRequirement,
116+
has_braces_around_switch_cases -> BNHighLevelILTokenEmitterHasBracesAroundSwitchCases() -> bool,
117+
default_braces_on_same_line -> BNHighLevelILTokenEmitterGetDefaultBracesOnSameLine() -> bool,
118+
is_simple_scope_allowed -> BNHighLevelILTokenEmitterIsSimpleScopeAllowed() -> bool,
119+
}
120+
121+
impl HighLevelILTokenEmitter {
122+
pub fn current_tokens(&self) -> Array<InstructionTextToken> {
123+
let mut count = 0;
124+
let array = unsafe { BNHighLevelILTokenEmitterGetCurrentTokens(self.as_raw(), &mut count) };
125+
unsafe { Array::new(array, count, ()) }
126+
}
127+
pub fn lines(&self) -> Array<DisassemblyTextLine> {
128+
let mut count = 0;
129+
let array = unsafe { BNHighLevelILTokenEmitterGetLines(self.as_raw(), &mut count) };
130+
unsafe { Array::new(array, count, ()) }
131+
}
132+
133+
pub fn append_size_token(&self, size: usize, type_: InstructionTextTokenType) {
134+
unsafe { BNAddHighLevelILSizeToken(size, type_, self.as_raw()) }
135+
}
136+
137+
pub fn append_float_size_token(&self, size: usize, type_: InstructionTextTokenType) {
138+
unsafe { BNAddHighLevelILFloatSizeToken(size, type_, self.as_raw()) }
139+
}
140+
141+
pub fn append_var_text_token(
142+
&self,
143+
func: &HighLevelILFunction,
144+
var: Variable,
145+
expr_index: usize,
146+
size: usize,
147+
) {
148+
unsafe {
149+
BNAddHighLevelILVarTextToken(
150+
func.handle,
151+
&BNVariable::from(var),
152+
self.as_raw(),
153+
expr_index,
154+
size,
155+
)
156+
}
157+
}
158+
159+
pub fn append_integer_text_token(
160+
&self,
161+
func: &HighLevelILFunction,
162+
expr_index: usize,
163+
val: i64,
164+
size: usize,
165+
) {
166+
unsafe {
167+
BNAddHighLevelILIntegerTextToken(func.handle, expr_index, val, size, self.as_raw())
168+
}
169+
}
170+
171+
pub fn append_array_index_token(
172+
&self,
173+
func: &HighLevelILFunction,
174+
expr_index: usize,
175+
val: i64,
176+
size: usize,
177+
address: u64,
178+
) {
179+
unsafe {
180+
BNAddHighLevelILArrayIndexToken(
181+
func.handle,
182+
expr_index,
183+
val,
184+
size,
185+
self.as_raw(),
186+
address,
187+
)
188+
}
189+
}
190+
191+
pub fn append_pointer_text_token(
192+
&self,
193+
func: &HighLevelILFunction,
194+
expr_index: usize,
195+
val: i64,
196+
settings: &DisassemblySettings,
197+
symbol_display: SymbolDisplayType,
198+
precedence: OperatorPrecedence,
199+
allow_short_string: bool,
200+
) -> SymbolDisplayResult {
201+
unsafe {
202+
BNAddHighLevelILPointerTextToken(
203+
func.handle,
204+
expr_index,
205+
val,
206+
self.as_raw(),
207+
settings.handle,
208+
symbol_display,
209+
precedence,
210+
allow_short_string,
211+
)
212+
}
213+
}
214+
215+
pub fn append_constant_text_token(
216+
&self,
217+
func: &HighLevelILFunction,
218+
expr_index: usize,
219+
val: i64,
220+
size: usize,
221+
settings: &DisassemblySettings,
222+
precedence: OperatorPrecedence,
223+
) {
224+
unsafe {
225+
BNAddHighLevelILConstantTextToken(
226+
func.handle,
227+
expr_index,
228+
val,
229+
size,
230+
self.as_raw(),
231+
settings.handle,
232+
precedence,
233+
)
234+
}
235+
}
236+
}

0 commit comments

Comments
 (0)