@@ -24,8 +24,8 @@ namespace
24
24
bool runOnFunction (Function &Func) override
25
25
{
26
26
// Keep reference of value still left to find the ranges
27
- // 'from' is unknown, it depends on 'to' and 'toValue '
28
- // from = to + toValue
27
+ // 'from' is unknown, it depends on 'to', 'toValue', and 'toOps '
28
+ // from = to toOps('+' or '-') toValue
29
29
std::vector<Value *> from;
30
30
std::vector<Value *> to;
31
31
std::vector<int > toValue;
@@ -55,12 +55,13 @@ namespace
55
55
// 'toValue' -> Operand1 int value
56
56
if (auto *operInst = dyn_cast<BinaryOperator>(&I))
57
57
{
58
- Value *oper0 = operInst->getOperand (0 );
58
+ // Value *oper0 = operInst->getOperand(0);
59
59
Value *oper1 = operInst->getOperand (1 );
60
60
61
+ // Store opcode ('+' or '-') to find real value range
61
62
if (operInst->getOpcode () == Instruction::Add)
62
63
{
63
- errs () << " -Stored:" << operInst->getName () << " \n " ;
64
+ errs () << " -Stored(Add) :" << operInst->getName () << " \n " ;
64
65
65
66
// Store reference of variable still to find range
66
67
from.push_back (operInst);
@@ -76,6 +77,19 @@ namespace
76
77
}
77
78
else if (operInst->getOpcode () == Instruction::Sub)
78
79
{
80
+ errs () << " -Stored(Sub):" << operInst->getName () << " \n " ;
81
+
82
+ // Store reference of variable still to find range
83
+ from.push_back (operInst);
84
+ to.push_back (loadRef.at (0 ));
85
+ toOps.push_back (operInst->getOpcode ());
86
+ if (ConstantInt *CI = dyn_cast<ConstantInt>(oper1))
87
+ {
88
+ toValue.push_back (CI->getZExtValue ());
89
+ }
90
+
91
+ // Remove previous used load instruction value
92
+ loadRef.pop_back ();
79
93
}
80
94
}
81
95
@@ -126,27 +140,36 @@ namespace
126
140
127
141
// Print references
128
142
errs () << " \n REFERENCES:\n " ;
129
- for (auto i = 0 ; i < from.size (); ++i)
143
+ for (unsigned i = 0 ; i < from.size (); ++i)
130
144
{
131
145
errs () << to.at (i)->getName () << " +" << toValue.at (i) << " <-" << from.at (i)->getName () << " \n " ;
132
146
133
147
// Search variable reference inside already found ranges
134
- for (int v = 0 ; v < ranged.size (); ++v)
148
+ for (unsigned v = 0 ; v < ranged.size (); ++v)
135
149
{
136
150
// When range found, add a new found range
137
151
if (to.at (i) == ranged.at (v))
138
152
{
139
153
errs () << " -FOUND:" << ranged.at (v)->getName () << " \n " ;
140
- minRange.push_back (minRange.at (v) + toValue.at (i));
141
- maxRange.push_back (minRange.at (v) + toValue.at (i));
154
+ if (toOps.at (i) == Instruction::Add)
155
+ {
156
+ minRange.push_back (minRange.at (v) + toValue.at (i));
157
+ maxRange.push_back (minRange.at (v) + toValue.at (i));
158
+ }
159
+ else if (toOps.at (i) == Instruction::Sub)
160
+ {
161
+ minRange.push_back (minRange.at (v) - toValue.at (i));
162
+ maxRange.push_back (minRange.at (v) - toValue.at (i));
163
+ }
164
+
142
165
ranged.push_back (from.at (i));
143
166
}
144
167
}
145
168
}
146
169
147
170
// Print value range computed
148
- errs () << " \n VALUE RANGES: \n " ;
149
- for (auto i = 0 ; i < minRange.size (); ++i)
171
+ errs () << " \n VALUE RANGES\n " ;
172
+ for (unsigned i = 0 ; i < minRange.size (); ++i)
150
173
{
151
174
errs () << ranged.at (i)->getName () << " (" << minRange.at (i) << " , " << maxRange.at (i) << " )\n " ;
152
175
}
0 commit comments