Skip to content

Commit

Permalink
Fix: TrashedRegisterFinder wasn't working correctly.
Browse files Browse the repository at this point in the history
Sometimes, registers that really were being preserved across a function call were not. This fix looks at variables in the exit block of the procedure and marks them as preserved if the reaching definition for the variables is a `def` instruction from the entry block.
  • Loading branch information
uxmal committed Feb 13, 2024
1 parent c5c1221 commit 15e5066
Show file tree
Hide file tree
Showing 79 changed files with 442,320 additions and 445,293 deletions.
7 changes: 4 additions & 3 deletions src/Core/Types/TypeStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,15 +141,16 @@ public void BuildEquivalenceClassDataTypes(TypeFactory factory)
DataType dt = tv.OriginalDataType;
EquivalenceClass c = tv.Class;
DataType dtOld = c.DataType;
var dtNew = dt;
if (dtOld != null)
{
dt = u.Unify(dt, dtOld)!;
dtNew = u.Unify(dt, dtOld)!;
}
else if (dt != null)
{
dt = dt.Clone(); // why clone???
dtNew = dt.Clone(); // why clone???
}
c.DataType = dt!;
c.DataType = dtNew;
}
}

Expand Down
11 changes: 8 additions & 3 deletions src/Decompiler/Analysis/TrashedRegisterFinder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -556,12 +556,17 @@ public bool VisitUseInstruction(UseInstruction use)
}
else if (idV.Storage == id.Storage)
{
if (sid.OriginalIdentifier == idV &&
sid.OriginalIdentifier != id)
var sidV = ssas[block!.Procedure].Identifiers[idV];
if (block!.Procedure.Name == "__IOERROR" &&
( id.Name.Contains("si") ||
id.Name.Contains("bp")))
_ = this; //$DEBUG

if (sidV.DefStatement?.Instruction is DefInstruction)
{
ctx.ProcFlow.Preserved.Add(stg);
return true;
}
return true;
}
}
ctx.ProcFlow.Trashed.Add(stg);
Expand Down
5 changes: 3 additions & 2 deletions src/Decompiler/Typing/ExpressionTypeDescender.cs
Original file line number Diff line number Diff line change
Expand Up @@ -543,9 +543,10 @@ public DataType MeetDataType(TypeVariable tvExp, DataType dt)
seg.IsSegment = true;
var ptr = factory.CreatePointer(seg, dt.BitSize);
dt = ptr;
}
}
tvExp.DataType = unifier.Unify(tvExp.DataType, dt)!;
tvExp.OriginalDataType = unifier.Unify(tvExp.OriginalDataType, dt)!;
var u = unifier.Unify(tvExp.OriginalDataType, dt)!;
tvExp.OriginalDataType = u;
return tvExp.DataType;
}

Expand Down
4 changes: 2 additions & 2 deletions src/tests/Analysis/CrwIpLiveness.exp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ void fn0C00_0000(Register selector ds)
// ds: (ptr16 (segment 0106))
// LiveOut:
// Trashed: SCZO ax bx di si Top
// Preserved: sp
// Preserved: ds sp
// fn0C00_0000
// Return size: 0
// Mem0:Mem
Expand Down Expand Up @@ -53,7 +53,7 @@ Register word16 fn0C00_0026(Sequence segptr32 ds_si)
// Sequence ds:si: segptr32
// LiveOut: ax
// Trashed: SCZO ax Top
// Preserved: di sp
// Preserved: di ds si sp
// fn0C00_0026
// Return size: 0
// Mem0:Mem
Expand Down
4 changes: 2 additions & 2 deletions src/tests/Analysis/CrwParameters.exp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ void fn0C00_0000(Register selector ds)
// ds: (ptr16 (segment 0402))
// LiveOut:
// Trashed: SCZO ax si Top
// Preserved: sp
// Preserved: ds sp
// fn0C00_0000
// Return size: 0
// Mem0:Mem
Expand Down Expand Up @@ -164,7 +164,7 @@ Register word16 fn0C00_0036(Sequence segptr32 ds_si, Register out ptr16 siOut)
// Sequence ds:si: segptr32
// LiveOut: ax si
// Trashed: ax si Top
// Preserved: sp
// Preserved: ds sp
// fn0C00_0036
// Return size: 0
// Mem0:Mem
Expand Down
2 changes: 1 addition & 1 deletion src/tests/Analysis/CrwProcIsolation.exp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ void fn0C00_0000(Sequence segptr32 ds_di)
// Sequence ds:di: segptr32
// LiveOut:
// Trashed: SCZO ax Top
// Preserved: di sp
// Preserved: di ds sp
// fn0C00_0000
// Return size: 0
// Mem0:Mem
Expand Down
2 changes: 1 addition & 1 deletion src/tests/Analysis/CrwSliceReturn.exp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ void fn0C00_0000(Register selector ds)
// ds: (ptr16 (segment 0303))
// LiveOut:
// Trashed: ax si Top
// Preserved: sp
// Preserved: ds sp
// fn0C00_0000
// Return size: 0
// Mem0:Mem
Expand Down
6 changes: 3 additions & 3 deletions src/tests/Analysis/CrwVoidFunctions.exp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ void fn0C00_0000(Sequence segptr32 ds_di)
// Sequence ds:di: segptr32
// LiveOut:
// Trashed: SCZO ax bx si Top
// Preserved: sp
// Preserved: di ds sp
// fn0C00_0000
// Return size: 0
// Mem0:Mem
Expand Down Expand Up @@ -43,7 +43,7 @@ void fn0C00_0010(Sequence segptr32 ds_di, Register word16 si)
// si: (memptr (ptr16 (segment)) (struct 0004))
// LiveOut:
// Trashed: ax Top
// Preserved: sp
// Preserved: di ds sp
// fn0C00_0010
// Return size: 0
// Mem0:Mem
Expand Down Expand Up @@ -78,7 +78,7 @@ void fn0C00_0017(Sequence segptr32 ds_di, Stack word16 wArg02)
// Stack +0002: (memptr (ptr16 (segment)) (struct 0004))
// LiveOut:
// Trashed: SCZO ax bx Top
// Preserved: bp sp
// Preserved: bp di ds sp
// fn0C00_0017
// Return size: 0
// Mem0:Mem
Expand Down
2 changes: 1 addition & 1 deletion src/tests/Analysis/DfaFpuStackReturn.exp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// MayUse: ds:[0..15]
// LiveOut:
// Trashed: bx FPU -1 Top
// Preserved: sp
// Preserved: ds sp
// fn0C00_0000
// Return size: 0
void fn0C00_0000(selector ds)
Expand Down
4 changes: 2 additions & 2 deletions src/tests/Analysis/DfaReadFile.exp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// stackDelta: 2; fpuStackDelta: 0; fpuMaxParam: -1
// MayUse:
// LiveOut:
// Trashed: SCZO bx cx ds dx Top
// Trashed: SCZO ax bx cx ds dx Top
// Preserved: sp
// fn0C00_0000
// Return size: 0
Expand Down Expand Up @@ -42,7 +42,7 @@ fn0C00_001F_exit:
// MayUse: bx:[0..15] cx:[0..15] Sequence ds:dx:[0..31]
// LiveOut: ax
// Trashed: C ax Top
// Preserved: sp
// Preserved: ds dx sp
// fn0C00_0023
// Return size: 0
word16 fn0C00_0023(word32 ds_dx, word16 cx, word16 bx)
Expand Down
2 changes: 1 addition & 1 deletion src/tests/Analysis/DfaReg00010.exp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ fn0C00_0000_exit:
// MayUse: bp:[0..15] ds:[0..15] si:[0..15]
// LiveOut:
// Trashed: SCZO ax bp bx cx dx si Top
// Preserved: sp
// Preserved: ds sp
// fn0C00_0004
// Return size: 0
void fn0C00_0004(word16 bp, word16 si, selector ds)
Expand Down
4 changes: 2 additions & 2 deletions src/tests/Analysis/DfaRemoveSpaces.exp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ fn0C00_0000_entry:
// succ: l0C00_0000
l0C00_0000:
fn0C00_0015(SEQ(cs, 0x46<16>))
Mem31[ds:0x63<16>:word16] = fn0C00_002F(SEQ(cs, 0x46<16>))
Mem32[ds:0x63<16>:word16] = fn0C00_002F(SEQ(cs, 0x46<16>))
return
// succ: fn0C00_0000_exit
fn0C00_0000_exit:
Expand All @@ -20,7 +20,7 @@ fn0C00_0000_exit:
// stackDelta: 2; fpuStackDelta: 0; fpuMaxParam: -1
// MayUse: Stack +0002:[0..31]
// LiveOut:
// Trashed: SCZO di es si Top
// Trashed: SCZO al di es si Top
// Preserved: bp ds sp
// fn0C00_0015
// Return size: 0
Expand Down
2 changes: 1 addition & 1 deletion src/tests/Analysis/RlCalleeSave.exp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
LiveOut:
BitsUsed: ds:[0..15]
Trashed: ax si Top
Preserved: sp
Preserved: ds sp
// fn0C00_0000
define fn0C00_0000
fn0C00_0000_entry:
Expand Down
4 changes: 2 additions & 2 deletions src/tests/Analysis/RlDeepNest.exp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
LiveOut:
BitsUsed: ds:[0..15]
Trashed: ax si Top
Preserved: sp
Preserved: ds sp
// fn0C00_0000
define fn0C00_0000
fn0C00_0000_entry:
Expand All @@ -19,7 +19,7 @@ fn0C00_0000_exit:
LiveOut: ax:[0..15]
BitsUsed: Sequence ds:si:[0..31]
Trashed: ax Top
Preserved: si sp
Preserved: ds si sp
// fn0C00_000B
define fn0C00_000B
fn0C00_000B_entry:
Expand Down
4 changes: 2 additions & 2 deletions src/tests/Analysis/RlIpLiveness.exp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
LiveOut:
BitsUsed: ds:[0..15]
Trashed: SCZO ax bx di si Top
Preserved: sp
Preserved: ds sp
// fn0C00_0000
define fn0C00_0000
fn0C00_0000_entry:
Expand Down Expand Up @@ -36,7 +36,7 @@ fn0C00_0000_exit:
LiveOut: ax:[0..15]
BitsUsed: Sequence ds:si:[0..31]
Trashed: SCZO ax Top
Preserved: di sp
Preserved: di ds si sp
// fn0C00_0026
define fn0C00_0026
fn0C00_0026_entry:
Expand Down
2 changes: 1 addition & 1 deletion src/tests/Analysis/RlProcIsolation.exp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
LiveOut:
BitsUsed: Sequence ds:di:[0..31]
Trashed: SCZO ax Top
Preserved: di sp
Preserved: di ds sp
// fn0C00_0000
define fn0C00_0000
fn0C00_0000_entry:
Expand Down
2 changes: 1 addition & 1 deletion src/tests/Analysis/RlReg00010.exp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ fn0C00_0000_exit:
LiveOut:
BitsUsed: bp:[0..15] ds:[0..15] si:[0..15]
Trashed: SCZO ax bp bx cx dx si Top
Preserved: sp
Preserved: ds sp
// fn0C00_0004
define fn0C00_0004
fn0C00_0004_entry:
Expand Down
4 changes: 2 additions & 2 deletions src/tests/Analysis/RlSequence.exp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
LiveOut:
BitsUsed: ds:[0..15] es:[0..15]
Trashed: SCZO ax di si Top
Preserved: sp
Preserved: ds sp
// fn0C00_0000
define fn0C00_0000
fn0C00_0000_entry:
Expand All @@ -20,7 +20,7 @@ fn0C00_0000_exit:
LiveOut: ax:[0..15]
BitsUsed: es:[0..15] Sequence ds:si:[0..31]
Trashed: SCZO ax di Top
Preserved: si sp
Preserved: ds si sp
// fn0C00_000B
define fn0C00_000B
fn0C00_000B_entry:
Expand Down
2 changes: 1 addition & 1 deletion src/tests/Analysis/RlSliceReturn.exp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
LiveOut:
BitsUsed: ds:[0..15]
Trashed: ax si Top
Preserved: sp
Preserved: ds sp
// fn0C00_0000
define fn0C00_0000
fn0C00_0000_entry:
Expand Down
1 change: 0 additions & 1 deletion subjects/Elf/ARM/angr-685/RTOSDemo.reko/RTOSDemo.globals.c

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 15e5066

Please sign in to comment.