-
Notifications
You must be signed in to change notification settings - Fork 21
Open
Description
The autogenerated LLIL for e.g. allocframe() and dealloc_return() manipulate LLIL_SPLIT_REG(LR, FP), and those refs don't seem to be elided in HLIL.
Example code (test_allocframe() in bn_llil_test_app):
00000020 01c09da0 { allocframe(SP,#0x8):raw } {var_8} {arg_0} {var_10}
00000024 00e00078 { R0 = #0x100 }
00000028 1ec01e96 { LR:FP = dealloc_return(FP):raw } {var_8}
LLIL:
// allocframe
0 @ 00000020 temp29.d = SP {arg_0}
1 @ 00000020 temp100.d = temp29.d - 8
2 @ 00000020 [temp100.d {var_8}].q = LR:FP
3 @ 00000020 FP = temp100.d
4 @ 00000020 temp29.d = temp100.d - 8 {var_10}
5 @ 00000020 SP = temp29.d
// r0 = 0x100
6 @ 00000024 temp0.d = 0x100
7 @ 00000024 R0 = temp0.d
// deallocframe
8 @ 00000028 temp100.d = FP {var_8}
9 @ 00000028 temp101.q = [temp100.d {var_8}].q
10 @ 00000028 temp30.q = temp101.q
11 @ 00000028 SP = temp100.d + 8
12 @ 00000028 LR:FP = temp30.q
13 @ 00000028 <return> jump(LR)
Resulting HLIL:
00000028 int32_t FP
00000028 int32_t FP_1
00000028 int32_t LR
00000028 int32_t LR_1
00000028 LR_1:FP_1 = LR:FP
00000028 return 0x100
I'd expect output more like
00000028 return 0x100
Looking at a different x86 binary, it seems that RBP and all callee-saved registers are eliminated somewhere between LLIL and MLIL.
Metadata
Metadata
Assignees
Labels
No labels