Package org.trifort.rootbeer.entry

Source Code of org.trifort.rootbeer.entry.TestCaseEntryPointDetector

/*
* Copyright 2012 Phil Pratt-Szeliga and other contributors
* http://chirrup.org/
*
* See the file LICENSE for copying permission.
*/

package org.trifort.rootbeer.entry;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import soot.*;
import soot.rbclassload.HierarchySootClass;
import soot.rbclassload.HierarchySootMethod;
import soot.jimple.InvokeExpr;
import soot.jimple.Jimple;
import soot.jimple.ReturnStmt;
import soot.jimple.StringConstant;
import soot.rbclassload.ClassHierarchy;
import soot.rbclassload.HierarchyInstruction;
import soot.rbclassload.MethodSignatureUtil;
import soot.rbclassload.MethodTester;
import soot.rbclassload.Operand;
import soot.rbclassload.RootbeerClassLoader;

public class TestCaseEntryPointDetector implements MethodTester {

  private String m_testCase;
  private List<SootClass> m_kernels;
  private List<String> m_testCasePackages;
  private String m_provider;
  private boolean m_initialized;
  private String m_signature;
  private List<String> m_entryPoints;
 
  public TestCaseEntryPointDetector(String test_case){
    m_testCase = test_case;
    m_testCasePackages = new ArrayList<String>();
    m_testCasePackages.add("org.trifort.rootbeer.testcases.otherpackage.");
    m_testCasePackages.add("org.trifort.rootbeer.testcases.otherpackage2.");
    m_testCasePackages.add("org.trifort.rootbeer.testcases.rootbeertest.");
    m_testCasePackages.add("org.trifort.rootbeer.testcases.rootbeertest.apps.fastmatrixdebug.");
    m_testCasePackages.add("org.trifort.rootbeer.testcases.rootbeertest.arraysum.");
    m_testCasePackages.add("org.trifort.rootbeer.testcases.rootbeertest.baseconversion.");
    m_testCasePackages.add("org.trifort.rootbeer.testcases.rootbeertest.canonical.");
    m_testCasePackages.add("org.trifort.rootbeer.testcases.rootbeertest.canonical2.");
    m_testCasePackages.add("org.trifort.rootbeer.testcases.rootbeertest.exception.");
    m_testCasePackages.add("org.trifort.rootbeer.testcases.rootbeertest.gpurequired.");
    m_testCasePackages.add("org.trifort.rootbeer.testcases.rootbeertest.kerneltemplate.");
    m_testCasePackages.add("org.trifort.rootbeer.testcases.rootbeertest.ofcoarse.");
    m_testCasePackages.add("org.trifort.rootbeer.testcases.rootbeertest.remaptest.");
    m_testCasePackages.add("org.trifort.rootbeer.testcases.rootbeertest.serialization.");

    m_initialized = false;
    m_entryPoints = new ArrayList<String>();
  }
 
  private void init(){
    if(m_testCase.contains(".") == false){
      String new_test_case = findTestCaseClass(m_testCase);
      if(new_test_case == null){
        System.out.println("cannot find test case class: "+m_testCase);
        System.exit(0);
      }
      m_testCase = new_test_case;
    }
    m_provider = m_testCase;
   
    ClassHierarchy class_hierarchy = RootbeerClassLoader.v().getClassHierarchy();
    HierarchySootClass prov_class = class_hierarchy.getHierarchySootClass(m_provider);
    HierarchySootMethod create_method = prov_class.findMethodByName("create");
    HierarchySootClass kernel_class = searchMethod(create_method);
    HierarchySootMethod gpu_method = kernel_class.findMethodBySubSignature("void gpuMethod()");
    m_signature = gpu_method.getSignature();
    m_initialized = true;
  }

  public String getProvider() {
    return m_provider;
  }
   
  private HierarchySootClass searchMethod(HierarchySootMethod method) {
    ClassHierarchy class_hierarchy = RootbeerClassLoader.v().getClassHierarchy();
    List<HierarchyInstruction> instructions = method.getInstructions();
    for(HierarchyInstruction inst : instructions){
      String name = inst.getName();
      if(name.equals("new")){
        List<Operand> operands = inst.getOperands();
        for(Operand operand : operands){
          if(operand.getType().equals("class_ref") == false){
            continue;
          }
          String class_name = operand.getValue();
          HierarchySootClass hclass = class_hierarchy.getHierarchySootClass(class_name);
          List<String> ifaces = hclass.getInterfaces();
          for(String iface : ifaces){
            if(iface.equals("org.trifort.rootbeer.runtime.Kernel")){
              return hclass;
            }
          }
        }
      }
    }
    return null;
  }

  private String findTestCaseClass(String test_case) {
    for(String pkg : m_testCasePackages){
      String name = pkg + test_case;
      if(RootbeerClassLoader.v().getClassHierarchy().containsClass(name)){
        return name;
      }
    }
    return null;
  }

  public boolean test(HierarchySootMethod sm) {
    if(m_initialized == false){
      init();
    }
    if(sm.getSignature().equals(m_signature)){
      if(m_entryPoints.contains(sm.getSignature()) == false){
        return true;
      }
    }
    return false;
  }
}
TOP

Related Classes of org.trifort.rootbeer.entry.TestCaseEntryPointDetector

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.