\begin{algorithm} \caption{Call-Graph-Construction} \begin{algorithmic} \INPUT Signature of entry methods $m^{entry}$. \OUTPUT Call Graph CG, a set of call edges. \PROCEDURE{BuildCallGraph}{$m^{entry}$} \STATE $WL = [m^{entry}]$ \COMMENT{Work List, containing the methods to be processed} \STATE $CG = \{\}$ \COMMENT{Call Graph, a set of call edges} \STATE $RM = \{\}$ \COMMENT{A set of reachable methods} \WHILE{$WL$ \textbf{is} \NOT empty} \STATE remove $m$ from $WL$ \COMMENT{$m$ is a method} \IF{$m \notin RM$} \STATE add $m$ to $RM$ \FOR{\textbf{each} call site $cs$ \textbf{in} $m$} \STATE $T :=$ \CALL{Resolve}{$cs$} \COMMENT{Resolve target methods, probably via CHA} \FOR{\textbf{each} target method $m'$ \textbf{in} $T$} \STATE add $cs \to m'$ to $CG$ \STATE add $m'$ to $WL$ \ENDFOR \ENDFOR \ENDIF \ENDWHILE \RETURN $CG$ \ENDPROCEDURE \end{algorithmic} \end{algorithm}