1 cananian 1.1.2.1 // AllocationInformationMap.java, created Mon Apr  3 19:11:39 2000 by cananian
  2 cananian 1.1.2.1 // Copyright (C) 2000 C. Scott Ananian <cananian@alumni.princeton.edu>
  3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
  4 cananian 1.1.2.1 package harpoon.Analysis;
  5 cananian 1.1.2.1 
  6 cananian 1.1.2.1 import harpoon.Analysis.Maps.AllocationInformation;
  7 pnkfelix 1.1.2.8 import harpoon.Analysis.Maps.AllocationInformation.AllocationProperties;
  8 kkz      1.1.2.7 import harpoon.ClassFile.HClass;
  9 cananian 1.1.2.1 import harpoon.ClassFile.HCodeElement;
 10 salcianu 1.8     import harpoon.Temp.Label;
 11 cananian 1.1.2.1 import harpoon.Temp.Temp;
 12 cananian 1.1.2.1 import harpoon.Temp.TempMap;
 13 cananian 1.1.2.1 import harpoon.Util.Util;
 14 cananian 1.1.2.1 
 15 cananian 1.1.2.1 import java.util.HashMap;
 16 cananian 1.1.2.1 import java.util.Map;
 17 cananian 1.1.2.1 /**
 18 cananian 1.1.2.2  * An <code>AllocationInformationMap</code> makes it easy to create a
 19 cananian 1.1.2.2  * map-based <code>AllocationInformation</code> structure.  It also
 20 cananian 1.1.2.2  * contains methods to facilitate transferring allocation information
 21 cananian 1.1.2.2  * from a different <code>AllocationInformation</code> object.
 22 cananian 1.1.2.1  * 
 23 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
 24 cananian 1.9      * @version $Id: AllocationInformationMap.java,v 1.9 2003/03/11 17:49:48 cananian Exp $
 25 cananian 1.1.2.1  */
 26 cananian 1.9     public class AllocationInformationMap<HCE extends HCodeElement>
 27 cananian 1.9         implements AllocationInformation<HCE>, java.io.Serializable {
 28 cananian 1.9         private final Map<HCE,AllocationProperties> map =
 29 cananian 1.9             new HashMap<HCE,AllocationProperties>();
 30 cananian 1.1.2.1     
 31 cananian 1.1.2.1     /** Creates a <code>AllocationInformationMap</code>. */
 32 cananian 1.1.2.1     public AllocationInformationMap() { }
 33 cananian 1.1.2.1 
 34 cananian 1.1.2.1     /** Return the <code>AllocationProperties</code> for the given
 35 cananian 1.1.2.1      *  <code>allocationSite</code>. */
 36 cananian 1.9         public AllocationProperties query(HCE allocationSite) {
 37 cananian 1.9             return map.get(allocationSite);
 38 cananian 1.1.2.1     }
 39 cananian 1.1.2.1     /** Associate the given <code>allocationSite</code> with the specified
 40 cananian 1.1.2.1      *  <code>AllocationProperties</code>. */
 41 cananian 1.9         public void associate(HCE allocationSite, AllocationProperties ap)
 42 cananian 1.1.2.1     {
 43 cananian 1.1.2.1         map.put(allocationSite, ap);
 44 cananian 1.1.2.1     }
 45 cananian 1.1.2.1     /** Transfer allocation information from the oldallocsite to newallocsite
 46 cananian 1.1.2.1      *  using the specified <code>TempMap</code> and old 
 47 cananian 1.1.2.1      *  <code>AllocationInformation</code>. */
 48 cananian 1.9         public <HCE2 extends HCodeElement> void transfer
 49 cananian 1.9                              (HCE newallocsite, HCE2 oldallocsite,
 50 cananian 1.9                               TempMap tm, AllocationInformation<HCE2> ai) {
 51 cananian 1.1.2.1         AllocationProperties ap = ai.query(oldallocsite);
 52 cananian 1.1.2.1         associate(newallocsite, ap.allocationHeap()==null ? ap :
 53 cananian 1.1.2.4                   new AllocationPropertiesImpl(ap, tm));
 54 cananian 1.1.2.1     }
 55 cananian 1.1.2.4     /** A simple implementation of <code>AllocationProperties</code>. */
 56 cananian 1.1.2.5     public final static class AllocationPropertiesImpl
 57 cananian 1.1.2.5         implements AllocationProperties, java.io.Serializable {
 58 cananian 1.1.2.1         final boolean hasInteriorPointers;
 59 cananian 1.1.2.1         final boolean canBeStackAllocated;
 60 cananian 1.1.2.1         final boolean canBeThreadAllocated;
 61 cananian 1.1.2.6         final boolean makeHeap;
 62 salcianu 1.1.2.9         final boolean noSynchronization;
 63 cananian 1.1.2.1         final Temp allocationHeap;
 64 kkz      1.1.2.7         final HClass actualClass;
 65 kkz      1.5             final boolean setDynamicWBFlag;
 66 salcianu 1.8             final Label labelOfPtrToMemoryChunk;
 67 salcianu 1.7             final int uniqueID;
 68 salcianu 1.6             
 69 cananian 1.1.2.4         public AllocationPropertiesImpl(boolean hasInteriorPointers,
 70 cananian 1.1.2.4                                         boolean canBeStackAllocated,
 71 cananian 1.1.2.4                                         boolean canBeThreadAllocated,
 72 cananian 1.1.2.6                                         boolean makeHeap,
 73 salcianu 1.1.2.9                                         boolean noSynchronization,
 74 kkz      1.1.2.7                                         Temp allocationHeap,
 75 kkz      1.5                                             HClass actualClass,
 76 kkz      1.5                                             boolean setDynamicWBFlag) {
 77 salcianu 1.6                 this(hasInteriorPointers,
 78 salcianu 1.6                      canBeStackAllocated, canBeThreadAllocated, makeHeap,
 79 salcianu 1.6                      noSynchronization, allocationHeap,
 80 salcianu 1.7                      actualClass, setDynamicWBFlag, null, -1);
 81 salcianu 1.6             }
 82 salcianu 1.6     
 83 salcianu 1.6             public AllocationPropertiesImpl(boolean hasInteriorPointers,
 84 salcianu 1.6                                             boolean canBeStackAllocated,
 85 salcianu 1.6                                             boolean canBeThreadAllocated,
 86 salcianu 1.6                                             boolean makeHeap,
 87 salcianu 1.6                                             boolean noSynchronization,
 88 salcianu 1.6                                             Temp allocationHeap,
 89 salcianu 1.6                                             HClass actualClass,
 90 salcianu 1.6                                             boolean setDynamicWBFlag,
 91 salcianu 1.8                                             Label labelOfPtrToMemoryChunk,
 92 salcianu 1.7                                             int uniqueID) {
 93 cananian 1.3.2.1             assert !(allocationHeap!=null && !canBeThreadAllocated);
 94 cananian 1.3.2.1             assert !(allocationHeap!=null && makeHeap);
 95 salcianu 1.1.2.9             this.hasInteriorPointers  = hasInteriorPointers;
 96 salcianu 1.1.2.9             this.canBeStackAllocated  = canBeStackAllocated;
 97 salcianu 1.1.2.9             this.canBeThreadAllocated = canBeThreadAllocated;
 98 salcianu 1.1.2.9             this.makeHeap             = makeHeap;
 99 salcianu 1.1.2.9             this.noSynchronization    = noSynchronization;
100 salcianu 1.1.2.9             this.allocationHeap       = allocationHeap;
101 salcianu 1.1.2.9             this.actualClass          = actualClass;
102 kkz      1.5                 this.setDynamicWBFlag     = setDynamicWBFlag;
103 salcianu 1.8                 this.labelOfPtrToMemoryChunk = labelOfPtrToMemoryChunk;
104 salcianu 1.7                 this.uniqueID             = uniqueID;
105 cananian 1.1.2.3         }
106 kkz      1.1.2.7         public AllocationPropertiesImpl(AllocationProperties ap, 
107 kkz      1.1.2.7                                         TempMap tm) {
108 cananian 1.1.2.3             this(ap.hasInteriorPointers(),
109 cananian 1.1.2.3                  ap.canBeStackAllocated(),
110 cananian 1.1.2.3                  ap.canBeThreadAllocated(),
111 cananian 1.1.2.6                  ap.makeHeap(),
112 salcianu 1.1.2.9                  ap.noSync(),
113 cananian 1.1.2.3                  ap.allocationHeap() != null ?
114 kkz      1.1.2.7                  tm.tempMap(ap.allocationHeap()) : null,
115 kkz      1.5                      ap.actualClass(),
116 salcianu 1.6                      ap.setDynamicWBFlag(),
117 salcianu 1.8                      ap.getLabelOfPtrToMemoryChunk(),
118 salcianu 1.7                      ap.getUniqueID());
119 cananian 1.1.2.1         }
120 cananian 1.1.2.1         public boolean hasInteriorPointers() { return hasInteriorPointers; }
121 cananian 1.1.2.1         public boolean canBeStackAllocated() { return canBeStackAllocated; }
122 salcianu 1.1.2.9         public boolean canBeThreadAllocated(){ return canBeThreadAllocated; }
123 cananian 1.1.2.6         public boolean makeHeap()            { return makeHeap; }
124 salcianu 1.1.2.9         public boolean noSync()              { return noSynchronization; } 
125 cananian 1.1.2.5         public Temp allocationHeap()         { return allocationHeap; }
126 kkz      1.1.2.7         public HClass actualClass()          { return actualClass; }
127 kkz      1.5             public boolean setDynamicWBFlag()    { return setDynamicWBFlag; }
128 salcianu 1.8             public Label getLabelOfPtrToMemoryChunk() {
129 salcianu 1.8                 return labelOfPtrToMemoryChunk; }
130 salcianu 1.7             public int getUniqueID()             { return -1; }
131 cananian 1.1.2.1     }
132 cananian 1.2     }