Skip to content

Commit c93d2c5

Browse files
authored
Merge pull request #1163 from ptomin/create-declaration-for-local-definions
Add declarations for def instructions (except procedure parameters and global variables)
2 parents dd62c85 + 9ac7d6b commit c93d2c5

File tree

212 files changed

+510990
-506432
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

212 files changed

+510990
-506432
lines changed

Diff for: src/Decompiler/Analysis/DeclarationInserter.cs

+21-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
using Reko.Core.Lib;
2424
using System;
2525
using System.Collections.Generic;
26+
using System.Linq;
2627

2728
namespace Reko.Analysis
2829
{
@@ -47,7 +48,7 @@ public void InsertDeclaration(Web web)
4748
{
4849
if (sid.DefStatement != null)
4950
{
50-
if (sid.DefStatement.Instruction is DefInstruction)
51+
if (IsImplicitDeclaration(sid.DefStatement))
5152
return;
5253
blocks.Add(sid.DefStatement.Block);
5354
foreach (Statement u in sid.Uses)
@@ -87,5 +88,23 @@ public void InsertDeclaration(Web web)
8788
new Declaration(web.Identifier!, null));
8889
}
8990
}
90-
}
91+
92+
static private bool IsImplicitDeclaration(Statement stm)
93+
{
94+
if (stm.Instruction is not DefInstruction def)
95+
return false;
96+
// Do not add declarations for global variables
97+
if (def.Identifier.Storage is GlobalStorage)
98+
return true;
99+
// Do not add declarations for parameters of procedure
100+
var sig = stm.Block.Procedure.Signature;
101+
if (
102+
sig.ParametersValid &&
103+
sig.Parameters!.Any(p => p.Name == def.Identifier.Name))
104+
{
105+
return true;
106+
}
107+
return false;
108+
}
109+
}
91110
}

Diff for: src/tests/Analysis/DfaReg00015.exp

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
// Return size: 0
1010
void fn0C00_0000(word16 ax, word16 dx, word16 bx)
1111
fn0C00_0000_entry:
12+
selector ss
1213
// succ: l0C00_0000
1314
l0C00_0000:
1415
Mem8[ss:0x6B6<16>:word16] = bx

Diff for: src/tests/Analysis/DfaRegPairReturn.exp

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
// Return size: 0
99
void fn0C00_0000()
1010
fn0C00_0000_entry:
11+
selector cs
1112
// succ: l0C00_0000
1213
l0C00_0000:
1314
Mem12[cs:0x2C<16>:word16] = SLICE(fn0C00_001B(cs), word16, 0)

Diff for: src/tests/Analysis/DfaStackPointerMessing.exp

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ fn0C00_0000_exit:
2525
// Return size: 0
2626
word16 fn0C00_0008(word16 bx, selector ds)
2727
fn0C00_0008_entry:
28+
mp16 fp
29+
selector ss
2830
// succ: l0C00_0008
2931
l0C00_0008:
3032
Mem5[ds:0x300<16>:word16] = fp

Diff for: src/tests/Structure/StrReg00013.exp

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Return size: 0
33
void fn0C00_0000(selector ds)
44
fn0C00_0000_entry:
5+
selector ss
6+
selector cs
57
Mem10[0C00:0001:word16] = 0x800<16>
68
Mem11[0800:5422:word16] = ds
79
Mem17[0800:0066:word16] = Mem11[0800:5420:word16]
@@ -228,6 +230,8 @@ fn0C00_0000_exit:
228230

229231
void fn0C00_0000(selector ds)
230232
{
233+
selector ss;
234+
selector cs;
231235
Mem10[0C00:0001:word16] = 0x800<16>;
232236
Mem11[0800:5422:word16] = ds;
233237
Mem17[0800:0066:word16] = Mem11[0800:5420:word16];

Diff for: src/tests/Typing/DtbArrayAccess.exp

+24-22
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Return size: 0
33
void ArrayAccess()
44
ArrayAccess_entry:
5+
word32 r
6+
word32 i
57
// succ: l1
68
l1:
79
(r + 0x14<32>)[i * 0xA<32>] = 0<i32>
@@ -12,17 +14,17 @@ ArrayAccess_exit:
1214
// Equivalence classes ////////////
1315
Eq_1: (ptr32 (struct "Globals"))
1416
globals_t (in globals : (ptr32 (struct "Globals")))
15-
Eq_2: int32
16-
T_2 (in 0<i32> : int32)
17-
T_9 (in (r + 0x14<32>)[i * 0xA<32>] : int32)
18-
Eq_3: (ptr32 (struct (10 T_18 t0010) (14 T_16 t0014)))
19-
T_3 (in r : word32)
17+
Eq_2: (ptr32 (struct (10 T_18 t0010) (14 T_16 t0014)))
18+
T_2 (in r : word32)
19+
Eq_3: ui32
20+
T_3 (in i : word32)
2021
Eq_4: int32
21-
T_4 (in 0x14<32> : word32)
22-
Eq_5: (ptr32 T_16)
23-
T_5 (in r + 0x14<32> : word32)
24-
Eq_6: ui32
25-
T_6 (in i : word32)
22+
T_4 (in 0<i32> : int32)
23+
T_9 (in (r + 0x14<32>)[i * 0xA<32>] : int32)
24+
Eq_5: int32
25+
T_5 (in 0x14<32> : word32)
26+
Eq_6: (ptr32 T_16)
27+
T_6 (in r + 0x14<32> : word32)
2628
Eq_7: ui32
2729
T_7 (in 0xA<32> : word32)
2830
Eq_8: ui32
@@ -50,26 +52,26 @@ globals_t: (in globals : (ptr32 (struct "Globals")))
5052
Class: Eq_1
5153
DataType: (ptr32 (struct "Globals"))
5254
OrigDataType: (ptr32 (struct "Globals"))
53-
T_2: (in 0<i32> : int32)
55+
T_2: (in r : word32)
5456
Class: Eq_2
55-
DataType: int32
56-
OrigDataType: int32
57-
T_3: (in r : word32)
58-
Class: Eq_3
5957
DataType: (ptr32 (struct (10 T_18 t0010) (14 T_16 t0014)))
6058
OrigDataType: (ptr32 (struct (10 T_18 t0010) (14 T_16 t0014)))
61-
T_4: (in 0x14<32> : word32)
59+
T_3: (in i : word32)
60+
Class: Eq_3
61+
DataType: ui32
62+
OrigDataType: ui32
63+
T_4: (in 0<i32> : int32)
6264
Class: Eq_4
6365
DataType: int32
6466
OrigDataType: int32
65-
T_5: (in r + 0x14<32> : word32)
67+
T_5: (in 0x14<32> : word32)
6668
Class: Eq_5
69+
DataType: int32
70+
OrigDataType: int32
71+
T_6: (in r + 0x14<32> : word32)
72+
Class: Eq_6
6773
DataType: (ptr32 T_16)
6874
OrigDataType: (ptr32 T_16)
69-
T_6: (in i : word32)
70-
Class: Eq_6
71-
DataType: ui32
72-
OrigDataType: ui32
7375
T_7: (in 0xA<32> : word32)
7476
Class: Eq_7
7577
DataType: ui32
@@ -79,7 +81,7 @@ T_8: (in i * 0xA<32> : word32)
7981
DataType: ui32
8082
OrigDataType: ui32
8183
T_9: (in (r + 0x14<32>)[i * 0xA<32>] : int32)
82-
Class: Eq_2
84+
Class: Eq_4
8385
DataType: int32
8486
OrigDataType: int32
8587
T_10: (in 0x10<32> : word32)

Diff for: src/tests/Typing/DtbGlobalVariables.exp

+11-10
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Return size: 0
33
void GlobalVariablesMock()
44
GlobalVariablesMock_entry:
5+
word32 ptr
56
// succ: l1
67
l1:
78
Mem4[ptr + 0<32>:real32] = 0.75F
@@ -11,11 +12,11 @@ GlobalVariablesMock_exit:
1112
// Equivalence classes ////////////
1213
Eq_1: (ptr32 (struct "Globals"))
1314
globals_t (in globals : (ptr32 (struct "Globals")))
14-
Eq_2: real32
15-
T_2 (in 0.75F : real32)
15+
Eq_2: (ptr32 (struct (0 T_6 t0000)))
16+
T_2 (in ptr : word32)
17+
Eq_3: real32
18+
T_3 (in 0.75F : real32)
1619
T_6 (in Mem4[ptr + 0<32>:real32] : real32)
17-
Eq_3: (ptr32 (struct (0 T_6 t0000)))
18-
T_3 (in ptr : word32)
1920
Eq_4: word32
2021
T_4 (in 0<32> : word32)
2122
Eq_5: word32
@@ -30,14 +31,14 @@ globals_t: (in globals : (ptr32 (struct "Globals")))
3031
Class: Eq_1
3132
DataType: (ptr32 (struct "Globals"))
3233
OrigDataType: (ptr32 (struct "Globals"))
33-
T_2: (in 0.75F : real32)
34+
T_2: (in ptr : word32)
3435
Class: Eq_2
35-
DataType: real32
36-
OrigDataType: real32
37-
T_3: (in ptr : word32)
38-
Class: Eq_3
3936
DataType: (ptr32 (struct (0 T_6 t0000)))
4037
OrigDataType: (ptr32 (struct (0 T_6 t0000)))
38+
T_3: (in 0.75F : real32)
39+
Class: Eq_3
40+
DataType: real32
41+
OrigDataType: real32
4142
T_4: (in 0<32> : word32)
4243
Class: Eq_4
4344
DataType: word32
@@ -47,7 +48,7 @@ T_5: (in ptr + 0<32> : word32)
4748
DataType: word32
4849
OrigDataType: word32
4950
T_6: (in Mem4[ptr + 0<32>:real32] : real32)
50-
Class: Eq_2
51+
Class: Eq_3
5152
DataType: real32
5253
OrigDataType: real32
5354
T_7: (in 0.5F : real32)

Diff for: src/tests/Typing/DtbSegmentedDoubleReference.exp

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Return size: 0
33
void SegmentedDoubleReferenceMock()
44
SegmentedDoubleReferenceMock_entry:
5+
word16 ds
56
// succ: l1
67
l1:
78
Mem6[ds:0x100<16>:word16] = Mem0[ds:Mem0[ds:0x300<16>:word16] + 4<16>:word16]

Diff for: src/tests/Typing/DtbTreeFind.exp

+33-31
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Return size: 0
33
void TreeFindMock()
44
TreeFindMock_entry:
5+
word32 t
6+
word32 v
57
// succ: l0
68
l0:
79
// succ: l0_seek
@@ -30,21 +32,21 @@ TreeFindMock_exit:
3032
// Equivalence classes ////////////
3133
Eq_1: (ptr32 (struct "Globals"))
3234
globals_t (in globals : (ptr32 (struct "Globals")))
33-
Eq_2: (ptr32 (struct (0 T_8 t0000) (4 T_14 t0004) (8 T_17 t0008)))
35+
Eq_2: (ptr32 (struct (0 T_9 t0000) (4 T_14 t0004) (8 T_17 t0008)))
3436
T_2 (in t : word32)
35-
T_3 (in 0<32> : word32)
37+
T_4 (in 0<32> : word32)
3638
T_14 (in Mem0[t + 4<32>:word32] : word32)
3739
T_17 (in Mem0[t + 8<32>:word32] : word32)
38-
Eq_4: bool
39-
T_4 (in t == 0<32> : bool)
40-
Eq_5: int32
41-
T_5 (in vv_5 : word32)
42-
T_8 (in Mem0[t + 0<32>:word32] : word32)
43-
T_9 (in v : word32)
44-
Eq_6: word32
45-
T_6 (in 0<32> : word32)
40+
Eq_3: int32
41+
T_3 (in v : word32)
42+
T_6 (in vv_5 : word32)
43+
T_9 (in Mem0[t + 0<32>:word32] : word32)
44+
Eq_5: bool
45+
T_5 (in t == 0<32> : bool)
4646
Eq_7: word32
47-
T_7 (in t + 0<32> : word32)
47+
T_7 (in 0<32> : word32)
48+
Eq_8: word32
49+
T_8 (in t + 0<32> : word32)
4850
Eq_10: bool
4951
T_10 (in v == vv_5 : bool)
5052
Eq_11: bool
@@ -64,36 +66,36 @@ globals_t: (in globals : (ptr32 (struct "Globals")))
6466
OrigDataType: (ptr32 (struct "Globals"))
6567
T_2: (in t : word32)
6668
Class: Eq_2
67-
DataType: (ptr32 (struct (0 T_8 t0000) (4 T_14 t0004) (8 T_17 t0008)))
68-
OrigDataType: (ptr32 (struct (0 T_8 t0000) (4 T_14 t0004) (8 T_17 t0008)))
69-
T_3: (in 0<32> : word32)
69+
DataType: (ptr32 (struct (0 T_9 t0000) (4 T_14 t0004) (8 T_17 t0008)))
70+
OrigDataType: (ptr32 (struct (0 T_9 t0000) (4 T_14 t0004) (8 T_17 t0008)))
71+
T_3: (in v : word32)
72+
Class: Eq_3
73+
DataType: int32
74+
OrigDataType: int32
75+
T_4: (in 0<32> : word32)
7076
Class: Eq_2
71-
DataType: (ptr32 (struct (0 T_8 t0000) (4 T_14 t0004) (8 T_17 t0008)))
77+
DataType: (ptr32 (struct (0 T_9 t0000) (4 T_14 t0004) (8 T_17 t0008)))
7278
OrigDataType: word32
73-
T_4: (in t == 0<32> : bool)
74-
Class: Eq_4
79+
T_5: (in t == 0<32> : bool)
80+
Class: Eq_5
7581
DataType: bool
7682
OrigDataType: bool
77-
T_5: (in vv_5 : word32)
78-
Class: Eq_5
83+
T_6: (in vv_5 : word32)
84+
Class: Eq_3
7985
DataType: int32
8086
OrigDataType: int32
81-
T_6: (in 0<32> : word32)
82-
Class: Eq_6
87+
T_7: (in 0<32> : word32)
88+
Class: Eq_7
8389
DataType: word32
8490
OrigDataType: word32
85-
T_7: (in t + 0<32> : word32)
86-
Class: Eq_7
91+
T_8: (in t + 0<32> : word32)
92+
Class: Eq_8
8793
DataType: word32
8894
OrigDataType: word32
89-
T_8: (in Mem0[t + 0<32>:word32] : word32)
90-
Class: Eq_5
95+
T_9: (in Mem0[t + 0<32>:word32] : word32)
96+
Class: Eq_3
9197
DataType: int32
9298
OrigDataType: word32
93-
T_9: (in v : word32)
94-
Class: Eq_5
95-
DataType: int32
96-
OrigDataType: int32
9799
T_10: (in v == vv_5 : bool)
98100
Class: Eq_10
99101
DataType: bool
@@ -112,7 +114,7 @@ T_13: (in t + 4<32> : word32)
112114
OrigDataType: ptr32
113115
T_14: (in Mem0[t + 4<32>:word32] : word32)
114116
Class: Eq_2
115-
DataType: (ptr32 (struct (0 T_8 t0000) (4 T_14 t0004) (8 T_17 t0008)))
117+
DataType: (ptr32 (struct (0 T_9 t0000) (4 T_14 t0004) (8 T_17 t0008)))
116118
OrigDataType: word32
117119
T_15: (in 8<32> : word32)
118120
Class: Eq_15
@@ -124,5 +126,5 @@ T_16: (in t + 8<32> : word32)
124126
OrigDataType: ptr32
125127
T_17: (in Mem0[t + 8<32>:word32] : word32)
126128
Class: Eq_2
127-
DataType: (ptr32 (struct (0 T_8 t0000) (4 T_14 t0004) (8 T_17 t0008)))
129+
DataType: (ptr32 (struct (0 T_9 t0000) (4 T_14 t0004) (8 T_17 t0008)))
128130
OrigDataType: word32

0 commit comments

Comments
 (0)