Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (C) 2012 Trillian Mobile AB
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version 2
   * of the License, or (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/gpl-2.0.html>.
  */
 package org.robovm.compiler.llvm;
 
 import java.util.List;
 import java.util.Map;

Version:
$Id$
 
 public class Function {
     private final String name;
     private final Linkage linkage;
     private final FunctionAttribute[] attributes;
     private final ParameterAttribute[][] parameterAttributes;
     private final String section;
     private final FunctionType type;
     private final Map<LabelBasicBlockbasicBlockMap = new HashMap<LabelBasicBlock>();
     private final List<BasicBlockbasicBlockList = new ArrayList<BasicBlock>();
     private final Map<StringVariablevariablesMap = new HashMap<StringVariable>();
     
     private int counter = 0;
     private final String[] parameterNames;
 
     public Function(Linkage linkageFunctionAttribute[] attributesString sectionString nameFunctionType typeString ... parameterNames) {
         this. = linkage;
         this. = attributes;
         this. = section;
         this. = name;
         this. = type;
         if (parameterNames == null || parameterNames.length == 0 && type.getParameterTypes().length > 0) {
             parameterNames = new String[type.getParameterTypes().length];
             for (int i = 0; i < parameterNames.lengthi++) {
                 parameterNames[i] = "p" + i;
             }
         }
         this. = parameterNames;
         this. = new ParameterAttribute[type.getParameterTypes().length][];
     }
 
     public FunctionRef ref() {
         return new FunctionRef(this);
     }
     
     public String getName() {
         return ;
     }
 
     public FunctionType getType() {
         return ;
     }
     
     public VariableRef getParameterRef(int index) {
         return new VariableRef([index], .getParameterTypes()[index]);
     }
     
     public VariableRef[] getParameterRefs() {
         VariableRef[] result = new VariableRef[.];
         for (int i = 0; i < result.lengthi++) {
             result[i] = getParameterRef(i);
         }
         return result;
     }
     
     public String[] getParameterNames() {
         return .clone();
     }
     
     public void setParameterAttributes(int paramIndexParameterAttribute ... attributes) {
         [paramIndex] = attributes.clone();
     }
     
     String getLabel(BasicBlock bb) {
         return "label" + .indexOf(bb);
     }
     
     String getLabel(BasicBlockRef ref) {
         return getLabel(.get(ref.getLabel()));
     }
     
     public BasicBlock newBasicBlock(Label label) {
         BasicBlock block = .get(label);
        if (block != null) {
            throw new IllegalArgumentException("BasicBlock with label " + label + " already exists");
        }
        block = new BasicBlock(thislabel);
        .put(labelblock);
        .add(block);
        return block;
    }
    public BasicBlockRef newBasicBlockRef(Label label) {
        return new BasicBlockRef(thislabel);
    }
    
    public BasicBlock getCurrentBasicBlock() {
        if (.isEmpty()) {
            return newBasicBlock(new Label());
        }
        return .get(.size() - 1);
    }
    public Variable newVariable(Type type) {
        return newVariable("t" + (++), type);
    }
    
    public Variable newVariable(String nameType type) {
        if (.containsKey(name)) {
            throw new IllegalArgumentException("Variable with name '" + name + "' already exists");
        }
        Variable v = new Variable(nametype);
        .put(namev);
        return v;
    }
    
    public BasicBlock getDefinedIn(VariableRef ref) {
        Variable var = new Variable(ref);
        for (BasicBlock bb : ) {
            if (bb.getWritesTo().contains(var)) {
                return bb;
            }
        }
        throw new IllegalStateException("Variable " + var + " not defined");
    }
    
    public void add(Instruction instruction) {
        getCurrentBasicBlock().add(instruction);
    }
    
    @Override
    public String toString() {
        Type returnType = .getReturnType();
        Type[] parameterTypes = .getParameterTypes();
        StringBuilder sb = new StringBuilder();
        sb.append("define ");
        if ( != null) {
            sb.append();
            sb.append(' ');
        }
        sb.append(returnType.toString());
        sb.append(" @");
        sb.append();
        sb.append('(');
        for (int i = 0; i < parameterTypes.lengthi++) {
            if (.isVarargs() || i > 0) {
                sb.append(", ");
            }
            sb.append(parameterTypes[i].toString());
            if ([i] != null) {
                for (ParameterAttribute attrib : [i]) {
                    sb.append(' ');
                    sb.append(attrib);
                }
            }
            sb.append(" %");
            sb.append([i]);
        }
        if (.isVarargs()) {
            sb.append("...");
        }
        sb.append(")");
        if ( != null && . > 0) {
            for (FunctionAttribute attr : ) {
                sb.append(' ');
                sb.append(attr.toString());
            }
        }
        if ( != null) {
            sb.append(" section \"");
            sb.append();
            sb.append('"');
        }
        sb.append(" {\n");
        for (BasicBlock bb : ) {
            sb.append(bb.toString());
        }
        sb.append("}\n");
        return sb.toString();
    }
New to GrepCode? Check out our FAQ X