/* * 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(); } } }