Package org.trifort.rootbeer.generate.opencl

Source Code of org.trifort.rootbeer.generate.opencl.NameMangling

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

package org.trifort.rootbeer.generate.opencl;

import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.trifort.rootbeer.configuration.RootbeerPaths;

import soot.SootMethod;
import soot.Type;

public class NameMangling {

  private static NameMangling m_instance = null;
  private Map<String, Integer> m_mangleMap;
  private int m_lastInt;
 
  public static NameMangling v(){
    if(m_instance == null)
      m_instance = new NameMangling();
    return m_instance;
  }
 
  private NameMangling(){
    m_mangleMap = new HashMap<String, Integer>();
    m_lastInt = 0;
    addBuiltIns();
  }
 
  private void addBuiltIns(){
    addBuiltIn("void");                         //0
    addBuiltIn("boolean");                      //1
    addBuiltIn("byte");                         //2
    addBuiltIn("char");                         //3
    addBuiltIn("short");                        //4
    addBuiltIn("int");                          //5
    addBuiltIn("long");                         //6
    addBuiltIn("float");                        //7
    addBuiltIn("double");                       //8
    addBuiltIn("java.lang.String");             //9
    addBuiltIn("java.lang.StringBuilder");      //10
    addBuiltIn("boolean[]");                    //11
    addBuiltIn("byte[]");                       //12
    addBuiltIn("char[]");                       //13
    addBuiltIn("short[]");                      //14
    addBuiltIn("int[]");                        //15
    addBuiltIn("long[]");                       //16
    addBuiltIn("float[]");                      //17
    addBuiltIn("double[]");                     //18
  }
 
  private void addBuiltIn(String type){
    m_mangleMap.put(type, m_lastInt);
    ++m_lastInt;
  }
 
  public String mangleArgs(SootMethod method){
    String ret = "";

    Type return_type = method.getReturnType();
    ret += mangle(return_type);
   
    List parameter_types = method.getParameterTypes();
    for(int i = 0; i < parameter_types.size(); ++i){
      Type type = (Type) parameter_types.get(i);
      ret += mangle(type);
    }
    return ret;
  }

  public String mangle(Type type){
    String name_without_arrays = type.toString();
    name_without_arrays = name_without_arrays.replace("\\[", "a");

    int number;
    if(m_mangleMap.containsKey(name_without_arrays)){
      number = m_mangleMap.get(name_without_arrays);
    } else {
      number = m_lastInt;
      m_lastInt++;
      m_mangleMap.put(name_without_arrays, number);
    }

    int dims = arrayDimensions(type);
    String ret = "";
    for(int i = 0; i < dims; ++i)
      ret += "a";
    ret += Integer.toString(number);
    return ret+"_";
  }

  private int arrayDimensions(Type type){
    int ret = 0;
    String str = type.toString();
    for(int i = 0; i < str.length(); ++i){
      char c = str.charAt(i);
      if(c == '[')
        ret++;
    }
    return ret;
  }
 
  public void writeTypesToFile(){
    try {
      PrintWriter writer = new PrintWriter(RootbeerPaths.v().getRootbeerHome()+"mangling");
      for(String name : m_mangleMap.keySet()){
        int number = m_mangleMap.get(name);
        writer.println(number+" "+name);
      }
      writer.flush();
      writer.close();
    } catch(Exception ex){
      ex.printStackTrace();
    }
  }
}
TOP

Related Classes of org.trifort.rootbeer.generate.opencl.NameMangling

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.