mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-19 16:40:38 -09:00
GP-0: Certify
This commit is contained in:
@@ -1,13 +1,12 @@
|
||||
/* ###
|
||||
* IP: GHIDRA
|
||||
* REVIEWED: YES
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@@ -17,46 +16,48 @@
|
||||
package ghidra.pcodeCPort.slghpatexpress;
|
||||
|
||||
import generic.stl.VectorSTL;
|
||||
import ghidra.pcodeCPort.context.*;
|
||||
import ghidra.pcodeCPort.context.SleighError;
|
||||
import ghidra.sleigh.grammar.Location;
|
||||
|
||||
public class EqualEquation extends ValExpressEquation {
|
||||
|
||||
public EqualEquation(Location location, PatternValue l, PatternExpression r) {
|
||||
super(location, l, r);
|
||||
}
|
||||
public EqualEquation(Location location, PatternValue l, PatternExpression r) {
|
||||
super(location, l, r);
|
||||
}
|
||||
|
||||
static boolean isValueInRange(long value, long min, long max) {
|
||||
return Long.compareUnsigned(value, min) >= 0 && Long.compareUnsigned(value, max) <= 0;
|
||||
}
|
||||
static boolean isValueInRange(long value, long min, long max) {
|
||||
return Long.compareUnsigned(value, min) >= 0 && Long.compareUnsigned(value, max) <= 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void genPattern(VectorSTL<TokenPattern> ops) {
|
||||
long lhsmin = lhs.minValue();
|
||||
long lhsmax = lhs.maxValue();
|
||||
VectorSTL<PatternValue> semval = new VectorSTL<PatternValue>();
|
||||
VectorSTL<Long> min = new VectorSTL<Long>();
|
||||
VectorSTL<Long> max = new VectorSTL<Long>();
|
||||
VectorSTL<Long> cur = new VectorSTL<Long>();
|
||||
int count = 0;
|
||||
@Override
|
||||
public void genPattern(VectorSTL<TokenPattern> ops) {
|
||||
long lhsmin = lhs.minValue();
|
||||
long lhsmax = lhs.maxValue();
|
||||
VectorSTL<PatternValue> semval = new VectorSTL<PatternValue>();
|
||||
VectorSTL<Long> min = new VectorSTL<Long>();
|
||||
VectorSTL<Long> max = new VectorSTL<Long>();
|
||||
VectorSTL<Long> cur = new VectorSTL<Long>();
|
||||
int count = 0;
|
||||
|
||||
rhs.listValues(semval);
|
||||
rhs.getMinMax(min, max);
|
||||
cur = min.copy();
|
||||
rhs.listValues(semval);
|
||||
rhs.getMinMax(min, max);
|
||||
cur = min.copy();
|
||||
|
||||
do {
|
||||
long val = rhs.getSubValue(cur);
|
||||
if (isValueInRange(val, lhsmin, lhsmax)) {
|
||||
if (count == 0)
|
||||
setTokenPattern(ExpressUtils.buildPattern(lhs, val, semval, cur));
|
||||
else
|
||||
setTokenPattern(getTokenPattern().doOr(ExpressUtils.buildPattern(lhs, val, semval, cur)));
|
||||
count += 1;
|
||||
}
|
||||
} while (ExpressUtils.advance_combo(cur, min, max));
|
||||
if (count == 0) {
|
||||
throw new SleighError("Equal constraint is impossible to match", location);
|
||||
}
|
||||
}
|
||||
do {
|
||||
long val = rhs.getSubValue(cur);
|
||||
if (isValueInRange(val, lhsmin, lhsmax)) {
|
||||
if (count == 0)
|
||||
setTokenPattern(ExpressUtils.buildPattern(lhs, val, semval, cur));
|
||||
else
|
||||
setTokenPattern(
|
||||
getTokenPattern().doOr(ExpressUtils.buildPattern(lhs, val, semval, cur)));
|
||||
count += 1;
|
||||
}
|
||||
}
|
||||
while (ExpressUtils.advance_combo(cur, min, max));
|
||||
if (count == 0) {
|
||||
throw new SleighError("Equal constraint is impossible to match", location);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user