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      }