Package dk.brics.xact.analysis.flowgraph

Examples of dk.brics.xact.analysis.flowgraph.Variable


      });
   
    // insert edges from definitions to single global use
    for (Statement s : new LinkedHashSet<Statement>(graph.getNodes()))
      if (s instanceof Assignment) {
        Variable v = ((Assignment)s).getDest();
        if (v.isGlobal()) {
          Debug.println(6, true, "Redirecting join flow edge for " + v + " (assigned in " + s + ")");
          // remove the variable from the outflow of the statement
          for (Edge<Statement,VariableFilter> edge : graph.getOutEdges(s))
            edge.getData().removeVariable(v);
          // insert new edge to the single global use (which only exists if it is used somewhere)
View Full Code Here


        }
        @Override
        public void visitCallStm(CallStm s) {
          for (int i=0; i<s.getArguments().length; i++) {
            // merge argument and parameter if either one is used as an array
            Variable arg = s.getArgument(i);
            Variable param = s.getMethod().getParameter(i);
            if (var_alias.getData(arg).array || var_alias.getData(param).array) {
              var_alias.merge(arg, param);
              s.setArgumentMutable(i, true);
            }
          }
          // merge return var and result if ether one is used as an array
          if (var_alias.getData(s.getResult()).array || var_alias.getData(s.getMethod().getReturnVar()).array) {
            var_alias.merge(s.getResult(), s.getMethod().getReturnVar());
          }
        }
        @Override
        public void visitEscapeStm(EscapeStm s) {
          Component c = var_alias.getData(s.getVar());
          if (c.array) {
            cfg.addStatement(new UnknownStm(s.getVar(), s.getOrigin()));
            replace(s, cfg.finish());
          } else {
            cfg.setOrigin(s.getOrigin());
            replace(s, cfg.finish());
          }
        }
      });
    }
    // replace each variable by its component representative IF the representative is an array
    for (Statement s : graph.getNodes()) {

      // replace variables in nodes
      s.visitBy(new StatementVisitor() {

        private Variable getrep(Variable var) {
          return var_alias.getRepresentativeKey(var);
        }

        private Variable replace(Variable var) {
          Variable rep = getrep(var);
          if (!var_alias.getData(rep).array) {
            return var;
          } else {
            Debug.println(6, true, "Aliasing: " + var);
            return rep;
View Full Code Here

          }
        } else if (graph.getOutEdges(vs).size() == 1) {
          Statement succ = graph.getOutEdges(vs).iterator().next().getTo();
          if (graph.getInEdges(succ).size()==1) { // TODO: copy propagation could be improved by not requiring "no other predecessors"
            // variable assignment with unique successor node that has no other predecessors - bypass this assignment
            final Variable vsrc = vs.getSource();
            succ.visitBy(new StatementVisitor() {

              public void visitAnalyzeStm(AnalyzeStm s) {
                s.setBase(vsrc);
              }
View Full Code Here

  }
 
  public boolean merge(Map<Variable,Set<Assignment>> source, VariableFilter filter, Map<Variable,Set<Assignment>> dest) {   
    boolean changed = false;
    for (Map.Entry<Variable,Set<Assignment>> e : source.entrySet()) {
      Variable var = e.getKey();
      if (filter.containsVariable(var))
        changed |= setput(dest, var, e.getValue());
    }
    return changed;
  }
View Full Code Here

 
  public boolean transfer(Map<Variable,Set<Assignment>> in, Statement s, Map<Variable,Set<Assignment>> out) {
    VariableFilter filter = new VariableFilter();
    boolean changed = false;
    if (s instanceof Assignment) {
      Variable var = ((Assignment)s).getDest();
      changed |= setput(out, var, (Assignment)s);
      filter.removeVariable(var);
    }
    changed |= merge(in, filter, out);
    return changed;
View Full Code Here

    // create methods and parse field annotations
    for (SootClass c : Scene.v().getApplicationClasses()) {
      for (SootMethod m : c.getMethods()) {
        Origin origin = new Origin(c.getName() + "." + m.getName(), 0, 0);
        Statement methodentry, methodexit;
        Variable returnVar;
        Variable[] parameters = new Variable[m.getParameterCount()];
        if (m.isConcrete()) {
          // entry
          methodentry = new NopStm(origin, "method entry");
          graph.addNode(methodentry);
          // exit
          methodexit = new NopStm(origin, "method exit");
          graph.addNode(methodexit);
          // parameters
          for (int i=0; i<m.getParameterCount(); i++) {
            parameters[i] = new Variable(context.getNextVarID(), false);
          }
          // return var
          returnVar = new Variable(context.getNextVarID(), false);
          // externally callable
          if (config.isExternallyCallable(m)) {
            graph.addEntry(methodentry);
          }
        } else {
View Full Code Here

   */
  public TranslatorContext(FlowGraph g, ErrorHandler errors) {
    this.graph = g;
    this.errors = errors;
    hierarchy = new Hierarchy();
    nothing = new Variable(getNextVarID(), true);
    this.namespaces = g.getNamespaces();
  }
View Full Code Here

  public Hierarchy getHierarchy() {
    return hierarchy;
  }
 
  public Variable getLocal(String name) {
    Variable v = var_map.get(name);
    if (v == null) {
      v = new Variable(getNextVarID(), false);
      var_map.put(name, v);
    }
    return v;
  }
View Full Code Here

      var_map.put(name, v);
    }
    return v;
  }
  public Variable getField(SootField field) {
    Variable v = field_map.get(field.getSignature());
    if (v == null) {
      v = new Variable(getNextVarID(), true);
      field_map.put(field.getSignature(), v);
    }
    return v;
  }
View Full Code Here

   * being invoked. It is only used for generating error messages.
   */
  private String invokedMethodName;

  private Variable makevar() {
    return new Variable(context.getNextVarID(), false);
  }
View Full Code Here

TOP

Related Classes of dk.brics.xact.analysis.flowgraph.Variable

Copyright © 2018 www.massapicom. 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.