Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplification Pass DSA #336

Merged
merged 95 commits into from
Mar 12, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
1235080
implemented FieldDSA using new constraints
sadrabt Jan 20, 2025
3e7ce35
pull out some common functionality for DSA
sadrabt Jan 21, 2025
6bca97f
refactor DSAGraph
sadrabt Jan 22, 2025
a3d4acb
refactored common DSA components out of FieldDSA
sadrabt Jan 23, 2025
04a0dca
refactored DSA
sadrabt Jan 24, 2025
892bd40
generic function for creating DSANodes
sadrabt Jan 24, 2025
fcb1c75
share parents among the solver
sadrabt Jan 24, 2025
25da6c9
partially implemented SetDSA
sadrabt Jan 24, 2025
0b004f0
removed extra type bound
sadrabt Jan 24, 2025
47984e6
add contains to interval
sadrabt Jan 28, 2025
ac17a3b
implemented SetDSA merging
sadrabt Jan 28, 2025
b5f97c8
DSA improvements
sadrabt Jan 28, 2025
cc13431
dot graph for setDSA
sadrabt Jan 28, 2025
61616d8
refactor to create non-setbased DSA
sadrabt Jan 29, 2025
1d81b2f
make dsa dependant on flags
sadrabt Jan 29, 2025
512ea3d
remove collect implementation for setdsa
sadrabt Jan 30, 2025
2b0c215
ignore non address values in merges
sadrabt Jan 30, 2025
c860443
functionality to compute procedures that affect the DSG of main
sadrabt Jan 30, 2025
2cb5825
fix SadDSA issues
sadrabt Jan 31, 2025
3c554db
create SadDSA tests
sadrabt Jan 31, 2025
4fb384b
added flag support
sadrabt Jan 31, 2025
b6aa93a
initial stack analysis
sadrabt Feb 4, 2025
6246696
SadDSA cloning
sadrabt Feb 4, 2025
d5456aa
SadDSA cloning fix use updated clonedNodes
sadrabt Feb 4, 2025
e3c9406
refactored clone for nodes
sadrabt Feb 4, 2025
fe79cfd
bu phase
sadrabt Feb 4, 2025
7809441
scc fix
sadrabt Feb 4, 2025
fb23657
sadsa fix after simplification pass update
sadrabt Feb 5, 2025
8fdd326
cleanup collapseAndMerge
sadrabt Feb 5, 2025
bef81ea
fix cloning
sadrabt Feb 5, 2025
12b660d
estimate stack sizes for procs
sadrabt Feb 5, 2025
171fb3d
maintain collapses through cloning
sadrabt Feb 5, 2025
ad0a601
build nodes for all dsa variables from the sva
sadrabt Feb 6, 2025
dce665f
improved assertions
sadrabt Feb 11, 2025
11c81c6
ignore problem callees
sadrabt Feb 11, 2025
08c1731
added missed offset union find solver
sadrabt Feb 12, 2025
56df2e0
td
sadrabt Feb 13, 2025
7c1baa2
remove implicit finds
sadrabt Feb 14, 2025
568fad3
prevent new cycles by collapsing all pointees early if a collapsed no…
sadrabt Feb 18, 2025
233eb65
fix top down order
sadrabt Feb 18, 2025
4c78816
maintain offsets through merges
sadrabt Feb 19, 2025
6185b23
always return a cell with the provided interval in add
sadrabt Feb 20, 2025
4a34265
cleanup
sadrabt Feb 20, 2025
71d81f7
merge global nodes
sadrabt Feb 20, 2025
e83e0dc
fix naming
sadrabt Feb 20, 2025
060d8f7
reduce global threshold for function entries
sadrabt Feb 20, 2025
3e51261
implement call resolution
sadrabt Feb 21, 2025
906e8b3
refactor context transfer
sadrabt Feb 21, 2025
7facb31
removed unused procedures
sadrabt Feb 21, 2025
2a4ebfb
update dsa domain to include functions not directly called
sadrabt Feb 24, 2025
e042e41
clean up
sadrabt Feb 24, 2025
32086bf
refactor DSA
sadrabt Feb 24, 2025
bef09f7
rename to something IntervalDSA
sadrabt Feb 24, 2025
6d62eca
more renaming
sadrabt Feb 24, 2025
b737c0a
reformat
sadrabt Feb 24, 2025
775b3b1
fix
sadrabt Feb 24, 2025
643e04e
fix
sadrabt Feb 24, 2025
cb9effe
main mill script
sadrabt Feb 24, 2025
b71ff37
resolve issue with cntlm gtirb infinite merge
sadrabt Feb 25, 2025
74e1322
reformat
sadrabt Feb 25, 2025
39dbe6e
DSADomain includes reachable from all func entry procs instead of main
sadrabt Feb 27, 2025
202076c
more aggressive SVA widening
sadrabt Feb 28, 2025
bffa58b
remove redundant node building for cloned graphs
sadrabt Feb 28, 2025
0482546
global regions set flag to global
sadrabt Feb 28, 2025
0fc5dab
import ir.* instead of every OPCode
sadrabt Feb 28, 2025
c301631
fix logger naming mistake
sadrabt Feb 28, 2025
5eae5ba
fix interval size
sadrabt Feb 28, 2025
1f6c561
cloning reduces number of nodes by ignoring non-parent nodes in the u…
sadrabt Feb 28, 2025
ed321dd
use cloning to shrink graphs after each phase
sadrabt Feb 28, 2025
87facb0
add timer
sadrabt Mar 5, 2025
d673ba2
Allow interval to represent clobbered intervals
sadrabt Mar 5, 2025
e9b88bf
update dsa to work with new interval
sadrabt Mar 5, 2025
3f4a5b0
rename DSA BU/TD procs
sadrabt Mar 6, 2025
fb2fe99
remove outdated assertion
sadrabt Mar 6, 2025
2d65ad5
add function which determines if constant is a global
sadrabt Mar 6, 2025
6097739
remove print
sadrabt Mar 6, 2025
29d3a0d
local constraint check documentation
sadrabt Mar 6, 2025
ed2f69c
improved naming for pure functions
sadrabt Mar 9, 2025
70235ea
docs for isUptoDate invariant
sadrabt Mar 9, 2025
e862698
document get pointee
sadrabt Mar 9, 2025
d027f14
update tests
sadrabt Mar 9, 2025
ccc08ae
check Resolved Call
sadrabt Mar 10, 2025
fd811b8
clean up
sadrabt Mar 10, 2025
573ad6a
dsa call resolution tests
sadrabt Mar 10, 2025
0c1740a
fix
sadrabt Mar 10, 2025
91cba62
fix formatting
sadrabt Mar 10, 2025
d3c0485
change log level
sadrabt Mar 10, 2025
96f6817
find() during node builder
sadrabt Mar 11, 2025
830cca5
update collect
sadrabt Mar 11, 2025
82ec8f7
fix toDot
sadrabt Mar 11, 2025
c41cdbf
toDot ignore contents function of indexes
sadrabt Mar 12, 2025
6059556
use reference inequality for pointee operations
sadrabt Mar 12, 2025
459db59
add a global dereference test
sadrabt Mar 12, 2025
4e103c8
reformat
sadrabt Mar 12, 2025
e78f229
find in add before setting pointee
sadrabt Mar 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion mill
Original file line number Diff line number Diff line change
Expand Up @@ -238,4 +238,4 @@ unset MILL_REPO_URL

# We don't quote MILL_FIRST_ARG on purpose, so we can expand the empty value without quotes
# shellcheck disable=SC2086
exec "${MILL}" $MILL_FIRST_ARG -D "mill.main.cli=${MILL_MAIN_CLI}" "$@"
exec "${MILL}" $MILL_FIRST_ARG -D "mill.main.cli=${MILL_MAIN_CLI}" "$@"
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,11 @@ sealed trait CallConstraint[T <: Call, V <: Procedure | Variable](call: T) exten
def caller: Procedure = call.parent.parent
def target: V
val inParams: Map[LocalVar, Expr]
val outParmas: Map[LocalVar, LocalVar]
val outParams: Map[LocalVar, LocalVar]
def inConstraints: Set[AssignmentConstraint] =
inParams.map(pair => AssignmentConstraint(call, pair._1, pair._2)).toSet
def outConstraints: Set[AssignmentConstraint] =
outParmas.map(pair => AssignmentConstraint(call, pair._1, pair._2)).toSet
outParams.map(pair => AssignmentConstraint(call, pair._1, pair._2)).toSet
override def source: T = call
override def toString: String = eval()

Expand All @@ -94,15 +94,15 @@ case class DirectCallConstraint(call: DirectCall) extends CallConstraint[DirectC
override def target: Procedure = call.target

override val inParams: Map[LocalVar, Expr] = call.actualParams
override val outParmas: Map[LocalVar, LocalVar] = call.outParams.view.mapValues(_.asInstanceOf[LocalVar]).toMap
override val outParams: Map[LocalVar, LocalVar] = call.outParams.view.mapValues(_.asInstanceOf[LocalVar]).toMap
}

case class IndirectCallConstraint(call: IndirectCall) extends CallConstraint[IndirectCall, Variable](call) {

override def target: Variable = call.target

override val inParams: Map[LocalVar, Expr] = Map.empty
override val outParmas: Map[LocalVar, LocalVar] = Map.empty
override val outParams: Map[LocalVar, LocalVar] = Map.empty
}

def generateConstraints(proc: Procedure): Set[Constraint] = {
Expand Down
140 changes: 140 additions & 0 deletions src/main/scala/analysis/data_structure_analysis/DSA.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
package analysis.data_structure_analysis

import analysis.solvers.{DSAUnionFindSolver, OffsetUnionFindSolver, UnionFindSolver}
import ir.{Expr, Procedure, Program}
import specification.{ExternalFunction, SymbolTableEntry}
import util.{DSALogger, IRContext}
import java.io.File

import scala.collection.{SortedSet, mutable}

trait Counter(val init: Int = 0) {
private var counter = init
def increment(by: Int = 1): Int = {
counter += by
counter
}

def decrement(by: Int = 1): Int = {
counter -= by
counter
}

def get: Int = counter

def reset(): Unit = counter = init
}

enum DSAPhase {
case Pre, Local, BU, TD
}

enum Interval(val start: Option[Int], val end: Option[Int]) {
case Top extends Interval(None, None)
case Value(s: Int, e: Int) extends Interval(Some(s), Some(e))

override def toString: String =
this match
case Interval.Top => "Top"
case Interval.Value(start, end) => s"$start-${end - 1}"

def size: Option[Int] =
this match
case Interval.Top => None
case Interval.Value(start, end) => Some(end - 1 - start)

def move(func: Int => Int): Interval =
this match
case Interval.Top => Interval.Top
case Interval.Value(start, end) => Value(func(start), func(end))

def isEmpty: Boolean = this.size.contains(0)

def growTo(size: Int): Interval =
this match
case Interval.Top => Interval.Top
case Interval.Value(start, end) => Interval(start, math.max(end, start + size))

def contains(offset: Int): Boolean =
this match
case Interval.Top => true
case Interval.Value(start, end) => start <= offset && end > offset

def contains(interval: Interval): Boolean =
(this, interval) match
case (Interval.Top, _) => true
case (_, Interval.Top) => false // this is not top
case (Interval.Value(start1, end1), Interval.Value(start2, end2)) =>
start1 <= start2 && end1 >= end2

def isOverlapping(other: Interval): Boolean =
(this, other) match
case (Interval.Top, _) => true
case (_, Interval.Top) => true
case (Interval.Value(start1, end1), Interval.Value(start2, end2)) =>
!(start1 >= end2 || start2 >= end1)

def join(other: Interval): Interval = {
(this, other) match
case (Interval.Top, _) => Interval.Top
case (_, Interval.Top) => Interval.Top
case (Interval.Value(start1, end1), Interval.Value(start2, end2)) =>
Interval(math.min(start1, start2), math.max(end1, end2))
}
}

object Interval {
def apply(start: Int, end: Int) = Interval.Value(start, end)
def join(interval1: Interval, interval2: Interval): Interval = interval1.join(interval2)
implicit def orderingByTuple[T <: Interval]: Ordering[T] =
Ordering.by { case Interval.Value(start, end) =>
(start, end)
}
}

class DSFlag {
var collapsed = false
var function = false
var stack = false
var heap = false
var global = false
var unknown = false
var read = false
var modified = false
var incomplete = false
var foreign = false
var merged = false

def join(other: DSFlag): Unit =
collapsed = collapsed || other.collapsed
stack = other.stack || stack
heap = other.heap || heap
global = other.global || global
unknown = other.unknown || unknown
read = other.read || read
modified = other.modified || modified
incomplete = other.incomplete || incomplete
foreign = other.foreign && foreign
merged = true
function = function || other.function
}

def computeDSADomain(proc: Procedure, context: IRContext): Set[Procedure] = {
var domain: Set[Procedure] = Set(proc) ++ (context.program.procedures.filter(f =>
context.funcEntries.map(_.name).filter(!_.startsWith("_")).contains(f.procName)
))

val stack: mutable.Stack[Procedure] = mutable.Stack()
stack.pushAll(domain.flatMap(_.calls))

// calculate the procedures used in the program
while (stack.nonEmpty) {
val current = stack.pop()
domain += current
stack.pushAll(current.calls.diff(domain))
}

domain
}

trait DSACell
Loading