\documentclass[11pt]{article} \usepackage{html} \title{Using the Jimple Parser} \author{Patrice Pominville\\ \htmladdnormallink{patrice@sable.mcgill.ca}{mailto:patrice@sable.mcgill.ca}} \date{March 24, 2000} \begin{document} \maketitle \section{Introduction} At the heart of the Soot bytecode optimization framework is the Jimple Internal Representation. This document describes Soot's ability to read in textual Jimple files. We have already seen Soot's ability to load Java {\tt .class} files. Soot can output the Jimple representation of classes in a textual format ({\tt .jimple} files) and reread this textual format back into Soot. The ability to parsing textual {\tt .jimple} files is quite handy. For example, a user could output classfiles as {\tt .jimple} files, tweak these by hand, and then use Soot to parse them and output tweaked bytecode. Soot thus provides a high-level facility for editing class files. Another potential application of the {\tt .jimple} files is to cache optimized classfiles for future analysis. Soot can, at a later time, read these files back in, and will not need to reoptimize the original classfile. This leads to faster compilation times. Finally, a user, or a software tool, can write a class in the Jimple textual format, use Soot to parse the Jimple, and thus create bytecode. \todo{trade off: precision and recall} The Jimple format is self-explanatory. The SableCC grammar for textual Jimple can be found in the source code distribution of Soot; it is called {\tt jimple.scc}. The following is an fragment of Jimple code: \begin{verbatim} { java.lang.String[] r0; long l0, $l1, $l2, $l3, $l4, $l5, $l6, $l7; int i0, $i1, $i2, i3; java.io.PrintStream $r1, $r2, $r3; r0 := @parameter0: java.lang.String[]; i0 = 0; $i1 = 33 % 33; $i2 = $i1 + 2; if $i2 != 43 goto label0; i3 = 9; goto label1; label0: i3 = 4; \end{verbatim} \section{Producing {\tt .jimple} Files} The default output format for Soot is classfiles. However, Soot can also produce output in other formats, i.e. textual Jimple. To output {\tt .jimple} files, invoke Soot using the {\tt -f jimple} command line option. For example, \begin{verbatim} java soot.Main -f jimple --app test \end{verbatim} will output test and dependent classes as {\tt .jimple} files. \section{Parsing {\tt .jimple} Files} Out of the box, Soot will first look for a classfile to find the definition of a given class; only if this fails will it look for a {\tt .jimple} definition. The command line option {\tt -}{\tt -src-prec jimple} (source precedence) instructs Soot to preferentially resolve the class from a {\tt .jimple} file, falling back on {\tt .class} files. When resolving, Soot will look for {\tt .jimple} files using the {\tt soot-classpath} in the same manner as it does to find {\tt .class} files. For example, to build on the previous example, the command \begin{verbatim} java soot.Main --src-prec jimple --app test \end{verbatim} will read the class {\tt test} from the file {\tt test.jimple}, and its related classes from the other {\tt .jimple} files produced in the previous step. For more details on the {\tt -f} and {\tt -}{\tt -src-prec} options the user can refer to the Soot \htmladdnormallink{command line documentation}{../usage}. \section*{History} \begin{itemize} \item March 24, 2000: Initial version. \item May 31, 2003: Updated for Soot 2.0. \end{itemize} \end{document}