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

[WIP] Convert Jimple to ConSORT with basic blocks #34

Open
wants to merge 19 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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: 2 additions & 0 deletions src/regnant/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ build/
sootOutput/
tmp/
minepump

bin/
41 changes: 21 additions & 20 deletions src/regnant/regnant.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
#!/usr/bin/env python3

import sys
import argparse
import atexit
import os
import shutil
import subprocess
import sys
import tempfile
import atexit, shutil, os
import argparse
import time


def log_command(args, cmd):
if args.verbose:
import pipes
Expand Down Expand Up @@ -36,7 +39,7 @@ def main(this_dir, args):
parser.add_argument("--timing", action="store_true")
parser.add_argument("--src-dir")
parser.add_argument("--yaml")
parser.add_argument("jdk8")
parser.add_argument("jdk8_rtjar")
parser.add_argument("entry_point")
parser.add_argument("consort_args", nargs="*")
args = parser.parse_args(args)
Expand Down Expand Up @@ -84,16 +87,14 @@ def main(this_dir, args):

run_script = os.path.join(this_dir, "build/install/regnant/bin/regnant")

rt_path = os.path.join(args.jdk8, "jre/lib/rt.jar")

regnant_command = [
run_script,
"-f", "n", # no output
"-no-bodies-for-excluded", # don't load the JCL (for now)
"-w", # whole program mode
"-p", "cg.spark", "on", # run points to analysis
# "-p", "jb", "use-original-names:true", # try to make our names easier
"-soot-class-path", cls_dir + ":" + rt_path, # where to find the test file
"-soot-class-path", cls_dir + ":" + args.jdk8_rtjar, # where to find the test file
"-p", "wjtp.regnant", regnant_options,
cls # the class to run on
]
Expand All @@ -106,20 +107,20 @@ def main(this_dir, args):
el = run_silently(regnant_command)
print_done(args, el)

print("Generating control flags...", end=' ')
sys.stdout.flush()
# print("Generating control flags...", end=' ')
# sys.stdout.flush()
intr_loc = os.path.join(work_dir, "java.intr")

intr_command = [
os.path.join(this_dir, "../_build/default/genFlags.exe"),
os.path.join(this_dir, "../stdlib/lin.intr"),
flags,
intr_loc,
"generated.smt"
]
log_command(args, intr_command)
el = run_silently(intr_command)
print_done(args, el)
#
# intr_command = [
# os.path.join(this_dir, "../_build/default/genFlags.exe"),
# os.path.join(this_dir, "../stdlib/lin.intr"),
# flags,
# intr_loc,
# "generated.smt"
# ]
# log_command(args, intr_command)
# el = run_silently(intr_command)
# print_done(args, el)

print("Running ConSORT on translated program:")
yaml_flg = ["-yaml"] if args.yaml is not None else []
Expand Down
25 changes: 7 additions & 18 deletions src/regnant/src/main/java/edu/kyoto/fos/regnant/Regnant.java
Original file line number Diff line number Diff line change
@@ -1,26 +1,15 @@
package edu.kyoto.fos.regnant;

import edu.kyoto.fos.regnant.aliasing.FieldAliasing;
import edu.kyoto.fos.regnant.cfg.BasicBlockGraph;
import edu.kyoto.fos.regnant.cfg.BasicBlockMapper;
import edu.kyoto.fos.regnant.cfg.CFGReconstructor;
import edu.kyoto.fos.regnant.cfg.instrumentation.FlagInstrumentation;
import edu.kyoto.fos.regnant.simpl.RewriteChain;
import edu.kyoto.fos.regnant.storage.LetBindAllocator;
import edu.kyoto.fos.regnant.storage.oo.StorageLayout;
import edu.kyoto.fos.regnant.translation.FlagTranslation;
import edu.kyoto.fos.regnant.translation.ObjectModel;
import edu.kyoto.fos.regnant.translation.ObjectModel.Impl;
import edu.kyoto.fos.regnant.translation.Translate;
import soot.Body;
import soot.Local;
import soot.Main;
import soot.PackManager;
import soot.Scene;
import soot.SceneTransformer;
import soot.SootClass;
import soot.SootMethod;
import soot.Transform;
import soot.UnitPatchingChain;
import soot.ValueBox;
import soot.*;
import soot.options.Options;
import soot.util.queue.ChunkedQueue;
import soot.util.queue.QueueReader;
Expand Down Expand Up @@ -75,7 +64,7 @@ private void internalTransform(final String phaseName, Map<String, String> optio
pw.printf("{ %s() }\n", Translate.getMangledName(mainMethod));
} catch (IOException ignored) {
}
FlagTranslation.outputTo(options.get("flags"));
// FlagTranslation.outputTo(options.get("flags"));
}

private void removeArgVector(final SootMethod main) {
Expand Down Expand Up @@ -120,11 +109,11 @@ private List<Translate> work(final QueueReader<SootMethod> reader, final Chunked
System.out.println("Simplified: ");
System.out.println(simpl);
CFGReconstructor cfg = new CFGReconstructor(simpl);
BasicBlockMapper bbm = cfg.GetBasicBlockMapper();
BasicBlockGraph bbg = cfg.GetBasicBlockGraph();
System.out.println(cfg.dump());

FlagInstrumentation fi = new FlagInstrumentation(cfg);
LetBindAllocator bindAlloc = new LetBindAllocator(cfg.getStructure());
Translate t = new Translate(simpl, cfg.getReconstructedGraph(), fi, bindAlloc, worklist, l, as, oimpl);
Translate t = new Translate(simpl, worklist, l, as, oimpl, bbm, bbg);
toReturn.add(t);
}
return toReturn;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,25 @@
import soot.jimple.GotoStmt;
import soot.toolkits.graph.BriefUnitGraph;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Stream;

public class BasicBlockMapper {
private Map<Unit, BasicBlock> hdMap = new HashMap<>();
private Map<Unit, BasicBlock> tlMap = new HashMap<>();
private List<Unit> entryPoints;

public BasicBlockMapper(final Body b) {
HashSet<Unit> start = new HashSet<>();
BriefUnitGraph ug = new BriefUnitGraph(b);
entryPoints = ug.getHeads();

for(Unit u : b.getUnits()) {
if(ug.getPredsOf(u).size() > 1) {
start.add(u);
}
}
LinkedList<Unit> worklist = new LinkedList<>(ug.getHeads());
LinkedList<Unit> worklist = new LinkedList<>(entryPoints);
Set<Unit> visited = new HashSet<>();
List<List<Unit>> blocks = new ArrayList<>();
while(!worklist.isEmpty()) {
Expand Down Expand Up @@ -87,6 +83,11 @@ public BasicBlock getBlockByTail(final Unit unit) {
return tlMap.get(unit);
}

public BasicBlock getEntryPoint() {
assert entryPoints.size() == 1;
return getBlockByHead(entryPoints.get(0));
}

public Iterator<BasicBlock> iterator() {
return hdMap.values().iterator();
}
Expand Down
Loading