\section{Abstractions}
\label{sec:abstractions}

DataflowAPI starts from the control flow graphs generated by ParseAPI and the instructions generated by InstructionAPI.
From these, it provides dataflow facts in a variety of forms. The key abstractions used by DataflowAPI are:

\begin{itemize}[leftmargin=0pt,label=$\circ$]
{\item {\scshape Abstract Location}
represents a register or memory location in the program.
DataflowAPI provides three types of abstract locations: register, stack, and
heap. A register abstract location represents a register, and the same register at two
different program locations is treated as the same abstract location. 
A stack abstract location consists of the stack frame to which it belongs and
the offset within the stack frame. 
A heap abstract location consists of the virtual address of the heap variable.
}

{\item {\scshape Abstract Region}
represents a set of abstract locations of the same type. 
If an abstract region contains only a single abstract location, the
abstract location is precisely represented. 
If an abstract region contains more than one abstract location, the region
contains the type of the locations. In the cases where it represents memory
(either heap or stack), an abstract region also contains 
the memory address calculation that gives rise to this region. 
}

{\item {\scshape Abstract Syntax Tree (AST)}
represents a symbolic expression of an instruction's semantics.
Specifically, an AST specifies how the value of an abstract location is modified by the
instruction.
}

{\item {\scshape Assignment}
represents a single data dependency of abstract regions in an instruction. For example, \texttt{xchg eax, ebx} creates two assignments: one from pre-instruction \texttt{eax} to post-instruction \texttt{ebx}, and one from pre-instruction \texttt{ebx} to post-instruction \texttt{eax}.
}

{\item {\scshape Stack Height}
represents the difference between a value in an abstract location and the stack pointer at a function's call site.
}
\end{itemize}


