1 cananian 1.1.2.3 // RealtimeRuntime.java, created Wed Jan 31 16:35:49 2001 by wbeebee 2 wbeebee 1.1.2.1 // Copyright (C) 2001 Wes Beebee <wbeebee@mit.edu> 3 wbeebee 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 wbeebee 1.1.2.1 package harpoon.Analysis.Realtime; 5 wbeebee 1.1.2.1 6 wbeebee 1.1.2.1 import harpoon.Analysis.ClassHierarchy; 7 wbeebee 1.1.2.1 import harpoon.Analysis.CallGraph; 8 wbeebee 1.1.2.1 9 wbeebee 1.1.2.1 import harpoon.Backend.Generic.Runtime.ObjectBuilder.Info; 10 wbeebee 1.1.2.1 import harpoon.Backend.Generic.Runtime.ObjectBuilder.ObjectInfo; 11 wbeebee 1.1.2.1 import harpoon.Backend.Maps.DefaultNameMap; 12 wbeebee 1.1.2.1 import harpoon.Backend.Maps.NameMap; 13 wbeebee 1.1.2.1 import harpoon.Backend.PreciseC.Frame; 14 wbeebee 1.1.2.1 import harpoon.Backend.Runtime1.AllocationStrategy; 15 wbeebee 1.1.2.1 import harpoon.Backend.Runtime1.Data; 16 wbeebee 1.1.2.1 import harpoon.Backend.Runtime1.ObjectBuilder; 17 wbeebee 1.1.2.1 import harpoon.Backend.Runtime1.ObjectBuilder.RootOracle; 18 wbeebee 1.1.2.1 19 wbeebee 1.1.2.1 import harpoon.ClassFile.HClass; 20 cananian 1.2.2.1 import harpoon.ClassFile.HData; 21 wbeebee 1.1.2.1 import harpoon.ClassFile.HDataElement; 22 wbeebee 1.1.2.1 import harpoon.ClassFile.HField; 23 wbeebee 1.1.2.1 import harpoon.ClassFile.HMethod; 24 wbeebee 1.1.2.1 import harpoon.ClassFile.Linker; 25 wbeebee 1.1.2.1 26 wbeebee 1.1.2.1 import harpoon.IR.Tree.Stm; 27 wbeebee 1.1.2.1 import harpoon.IR.Tree.TreeFactory; 28 wbeebee 1.1.2.1 import harpoon.IR.Tree.SEGMENT; 29 wbeebee 1.1.2.1 30 wbeebee 1.1.2.1 import harpoon.Temp.Label; 31 wbeebee 1.1.2.1 32 wbeebee 1.1.2.1 import java.util.ArrayList; 33 wbeebee 1.1.2.1 import java.util.List; 34 wbeebee 1.1.2.1 35 wbeebee 1.1.2.1 /** 36 wbeebee 1.1.2.1 * <code>RealtimeRuntime</code> is a trivial extension of 37 wbeebee 1.1.2.2 * <code>harpoon.Backend.Runtime2.Runtime</code> that allows constants 38 wbeebee 1.1.2.5 * to be tagged with an ImmortalMemory and emits extra const char* data 39 wbeebee 1.1.2.5 * for debugging purposes when Realtime.DEBUG_REF is turned on. 40 wbeebee 1.1.2.1 * 41 cananian 1.1.2.3 * @author Wes Beebee <wbeebee@mit.edu> 42 salcianu 1.6 * @version $Id: RealtimeRuntime.java,v 1.6 2002/10/04 19:50:31 salcianu Exp $ 43 wbeebee 1.1.2.1 */ 44 wbeebee 1.1.2.1 45 cananian 1.2.2.1 public class RealtimeRuntime extends harpoon.Backend.Runtime1.Runtime { 46 wbeebee 1.1.2.1 47 wbeebee 1.1.2.1 /** Create a RealtimeRuntime. */ 48 wbeebee 1.1.2.1 49 wbeebee 1.1.2.1 public RealtimeRuntime(Frame frame, AllocationStrategy as, 50 cananian 1.1.2.9 final HMethod main, final boolean prependUnderscore) 51 cananian 1.1.2.9 { 52 cananian 1.1.2.9 super(frame, as, main, prependUnderscore, 53 wbeebee 1.1.2.1 new RootOracle() { 54 wbeebee 1.1.2.1 public Object get(final HField hf, Info addlinfo) { 55 wbeebee 1.1.2.1 final HClass memoryArea = main 56 wbeebee 1.1.2.1 .getDeclaringClass().getLinker() 57 wbeebee 1.1.2.1 .forName("javax.realtime.ImmortalMemory"); 58 wbeebee 1.1.2.1 final HClass hfClass = hf.getDeclaringClass(); 59 wbeebee 1.1.2.1 final NameMap nm = 60 wbeebee 1.1.2.1 new DefaultNameMap(prependUnderscore); 61 wbeebee 1.1.2.1 if (hfClass.getName().equals("java.lang.Object") && 62 wbeebee 1.1.2.1 hf.getName().equals("memoryArea")) { 63 wbeebee 1.1.2.1 return new ObjectInfo() { 64 wbeebee 1.1.2.1 public HClass type() { 65 wbeebee 1.1.2.1 return memoryArea; 66 wbeebee 1.1.2.1 } 67 wbeebee 1.1.2.1 public Label label() { 68 wbeebee 1.1.2.1 return nm.label(hfClass, 69 wbeebee 1.1.2.1 "constantMemoryArea"); 70 wbeebee 1.1.2.1 } 71 wbeebee 1.1.2.1 public Object get(HField hff) { 72 wbeebee 1.1.2.1 return NOT_A_VALUE; // doesn't traverse 73 wbeebee 1.1.2.1 } 74 wbeebee 1.1.2.1 }; 75 wbeebee 1.1.2.1 } else { 76 wbeebee 1.1.2.1 return NOT_A_VALUE; 77 wbeebee 1.1.2.1 } 78 wbeebee 1.1.2.1 } 79 wbeebee 1.1.2.1 }); 80 wbeebee 1.1.2.1 } 81 wbeebee 1.1.2.1 82 wbeebee 1.1.2.1 /** Tag all classes with <code>javax.realtime.ImmortalMemory</code> 83 wbeebee 1.1.2.1 * <code>java.lang.Object.memoryArea</code> that has a field 84 wbeebee 1.1.2.1 * <code>javax.realtime.ImmortalMemory.constant = true;</code> 85 wbeebee 1.1.2.5 * 86 wbeebee 1.1.2.5 * Also emit data to deal with const char*'s that can be created 87 wbeebee 1.1.2.5 * when <code>Realtime.DEBUG_REF</code>. 88 wbeebee 1.1.2.1 */ 89 wbeebee 1.1.2.1 90 cananian 1.2.2.1 public List<HData> classData(final HClass hc) { 91 wbeebee 1.1.2.1 class DataConstMemoryArea extends Data { 92 wbeebee 1.1.2.1 DataConstMemoryArea() { 93 wbeebee 1.1.2.1 super("memArea-data", hc, RealtimeRuntime.this.frame); 94 wbeebee 1.1.2.1 95 wbeebee 1.1.2.1 ObjectInfo constMemAreaObject = new ObjectInfo() { 96 wbeebee 1.1.2.1 public HClass type() { return memoryArea; } 97 wbeebee 1.1.2.1 public Label label() { return label; } 98 wbeebee 1.1.2.1 public Object get(HField hf) { 99 wbeebee 1.1.2.1 if (hf.getName().equals("constant")) { 100 wbeebee 1.1.2.1 return new Boolean(true); 101 wbeebee 1.1.2.1 } else if (hf.getType() == HClass.Boolean) { 102 wbeebee 1.1.2.1 return new Boolean(false); 103 wbeebee 1.1.2.1 } else if (hf.getType() == HClass.Byte) { 104 wbeebee 1.1.2.1 return new Byte((byte)0); 105 wbeebee 1.1.2.1 } else if (hf.getType() == HClass.Short) { 106 wbeebee 1.1.2.1 return new Short((short)0); 107 wbeebee 1.1.2.1 } else if (hf.getType() == HClass.Int) { 108 wbeebee 1.1.2.1 return new Integer(0); 109 wbeebee 1.1.2.1 } else if (hf.getType() == HClass.Long) { 110 wbeebee 1.1.2.1 return new Long(0); 111 wbeebee 1.1.2.1 } else if (hf.getType() == HClass.Float) { 112 wbeebee 1.1.2.1 return new Float(0.0); 113 wbeebee 1.1.2.1 } else if (hf.getType() == HClass.Double) { 114 wbeebee 1.1.2.1 return new Double(0.0); 115 wbeebee 1.1.2.1 } else if (hf.getType() == HClass.Char) { 116 wbeebee 1.1.2.1 return new Character(' '); 117 wbeebee 1.1.2.1 } else { 118 wbeebee 1.1.2.1 return null; 119 wbeebee 1.1.2.1 } 120 wbeebee 1.1.2.1 } 121 wbeebee 1.1.2.1 122 wbeebee 1.1.2.11 final HClass memoryArea = 123 wbeebee 1.1.2.11 RealtimeRuntime.this.frame.getLinker() 124 wbeebee 1.1.2.1 .forName("javax.realtime.ImmortalMemory"); 125 wbeebee 1.1.2.1 final Label label = 126 cananian 1.1.2.9 getNameMap().label(hc, "constantMemoryArea"); 127 wbeebee 1.1.2.1 }; 128 wbeebee 1.1.2.1 129 wbeebee 1.1.2.1 List stmlist = new ArrayList(); 130 wbeebee 1.1.2.1 stmlist.add(new SEGMENT(tf, null, SEGMENT.STATIC_OBJECTS)); 131 wbeebee 1.1.2.1 stmlist.add(ob.buildObject(tf, constMemAreaObject, true)); 132 wbeebee 1.1.2.1 this.root = (HDataElement) Stm.toStm(stmlist); 133 wbeebee 1.1.2.1 } 134 wbeebee 1.1.2.1 } 135 wbeebee 1.1.2.1 136 wbeebee 1.1.2.6 class DataConstCharPointer extends Data { 137 wbeebee 1.1.2.6 DataConstCharPointer() { 138 wbeebee 1.1.2.5 super("constChar-data", hc, RealtimeRuntime.this.frame); 139 wbeebee 1.1.2.5 140 wbeebee 1.1.2.5 this.root = (HDataElement) 141 wbeebee 1.1.2.5 RealtimeAllocationStrategy.emitStrings(tf, null); 142 wbeebee 1.1.2.5 } 143 wbeebee 1.1.2.5 } 144 wbeebee 1.1.2.5 145 cananian 1.2.2.1 List<HData> r = super.classData(hc); 146 cananian 1.2.2.1 ArrayList<HData> datalst = new ArrayList<HData>(r.size() + (Realtime.DEBUG_REF?2:1)); 147 wbeebee 1.1.2.6 datalst.addAll(r); 148 wbeebee 1.1.2.6 datalst.add(new DataConstMemoryArea()); 149 wbeebee 1.1.2.5 if (Realtime.DEBUG_REF) { 150 wbeebee 1.1.2.6 datalst.add(new DataConstCharPointer()); 151 wbeebee 1.1.2.6 } 152 wbeebee 1.1.2.6 return datalst; 153 wbeebee 1.1.2.6 } 154 wbeebee 1.1.2.6 155 wbeebee 1.1.2.6 /** Initialize the tree builder with masking turned on if needed. */ 156 wbeebee 1.1.2.6 157 cananian 1.2.2.1 protected harpoon.Backend.Runtime1.TreeBuilder initTreeBuilder() { 158 wbeebee 1.1.2.6 if (System.getProperty("harpoon.runtime", "1").equals("2")) { 159 wbeebee 1.1.2.10 return new harpoon.Backend.Runtime2 160 cananian 1.1.2.9 .TreeBuilder(this, frame.getLinker(), as, 161 cananian 1.1.2.9 frame.pointersAreLong(), 162 wbeebee 1.1.2.12 (Realtime.NOHEAP_CHECKS||Realtime.NOHEAP_MASK)?4:0) { }; 163 wbeebee 1.1.2.6 } else { 164 wbeebee 1.1.2.10 return new harpoon.Backend.Runtime1 165 cananian 1.1.2.9 .TreeBuilder(this, frame.getLinker(), as, 166 cananian 1.1.2.9 frame.pointersAreLong(), 167 wbeebee 1.1.2.12 (Realtime.NOHEAP_CHECKS||Realtime.NOHEAP_MASK)?4:0) { }; 168 wbeebee 1.1.2.6 169 wbeebee 1.4 } 170 wbeebee 1.4 } 171 wbeebee 1.4 172 wbeebee 1.4 public String resourcePath(String basename) { 173 salcianu 1.6 if (basename.equals("init-safe.properties") && 174 wbeebee 1.4 Realtime.RTJ_PERF) { 175 wbeebee 1.4 return "harpoon/Analysis/Realtime/"+basename; 176 wbeebee 1.4 } else { 177 wbeebee 1.5 return super.resourcePath(basename); 178 wbeebee 1.1.2.5 } 179 wbeebee 1.1.2.1 } 180 cananian 1.2 }