mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-28 16:05:31 +08:00
Merge remote-tracking branch 'origin/GP-180-dragonmacher-forward-scoped-flow-fix'
This commit is contained in:
@@ -180,9 +180,9 @@ public class ChkDominanceAlgorithm<V, E extends GEdge<V>> extends AbstractDomina
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doGetDominated(V a, HashSet<V> results) {
|
private void doGetDominated(V a, Set<V> results) {
|
||||||
|
add(a, results); // a node always dominates itself
|
||||||
List<V> dominated = dominatedMap.get(a);
|
List<V> dominated = dominatedMap.get(a);
|
||||||
results.add(a); // a node always dominates itself
|
|
||||||
dominated.forEach(b -> doGetDominated(b, results));
|
dominated.forEach(b -> doGetDominated(b, results));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,18 +198,20 @@ public class ChkDominanceAlgorithm<V, E extends GEdge<V>> extends AbstractDomina
|
|||||||
dominators.add(a);
|
dominators.add(a);
|
||||||
|
|
||||||
while (a != root) {
|
while (a != root) {
|
||||||
a = getImmediateDominator(a);
|
a = dominatorMap.get(a); // immediate dominator
|
||||||
dominators.add(a);
|
add(a, dominators);
|
||||||
}
|
}
|
||||||
return dominators;
|
return dominators;
|
||||||
}
|
}
|
||||||
|
|
||||||
private V getImmediateDominator(V v) {
|
private void add(V v, Collection<V> set) {
|
||||||
V dom = dominatorMap.get(v);
|
if (!isDummy(v)) {
|
||||||
if (mutableGraph.isDummy(dom)) {
|
set.add(v);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
return dom;
|
}
|
||||||
|
|
||||||
|
private boolean isDummy(V v) {
|
||||||
|
return v != null && mutableGraph.isDummy(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -230,15 +232,23 @@ public class ChkDominanceAlgorithm<V, E extends GEdge<V>> extends AbstractDomina
|
|||||||
}
|
}
|
||||||
|
|
||||||
V dominator = getImmediateDominator(v);
|
V dominator = getImmediateDominator(v);
|
||||||
if (!dominator.equals(v)) {
|
if (!Objects.equals(dominator, v)) {
|
||||||
dg.addEdge(new DefaultGEdge<>(dominator, v));
|
dg.addEdge(new DefaultGEdge<>(dominator, v));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return dg;
|
return dg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private V getImmediateDominator(V v) {
|
||||||
|
V dom = dominatorMap.get(v);
|
||||||
|
if (isDummy(dom)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return dom;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Releases cached values used by internal data structures.
|
* Releases cached values used by internal data structures
|
||||||
*/
|
*/
|
||||||
public void clear() {
|
public void clear() {
|
||||||
dominatedMap.clear();
|
dominatedMap.clear();
|
||||||
|
|||||||
Reference in New Issue
Block a user