\section{Introduction}
\label{sec:intro}

DataFlowAPI aggregates a collection of dataflow analysis algorithms that are
useful in Dyninst development into a single library. These algorithms can also
be foundations for users to build customized analyses. Currently, these algorithms include:

\begin{itemize}[leftmargin=0pt,label=$\circ$]

{\item {\scshape Slicing}
takes a program location as input and can either slice
backward to determine which instructions affect the results of the given program location, or
slice forward to determine which instructions are affected by the results of the
given program location. One key feature of our slicing implementation is that
users can control where and when to stop slicing through a set of call back
functions.
}

{\item {\scshape Stack Analysis}
determines whether or not a register or memory location points to the stack.  If it does point to the stack, Stack Analysis may be able to determine the exact stack location that is pointed to.
}

{\item {\scshape Symbolic Expansion and Evaluation}
convert instructions to
several symbolic expressions. Each symbolic expression represents the overall effects of
these instructions on a register or a memory location.
}

{\item {\scshape Register Liveness}
determines whether a register is live or not at a program
location. A register is live at a program location if it will be used later in the program before its
content is overwritten. 
}
\end{itemize}
