1 cananian 1.1.2.1  // Code.java, created Fri Jan 22 17:00:41 1999 by cananian
 2 cananian 1.1.2.1  // Copyright (C) 1999 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.IR.LowQuad;
 5 cananian 1.1.2.1  
 6 cananian 1.1.2.12 import harpoon.Analysis.Maps.Derivation;
 7 cananian 1.1.2.12 import harpoon.Analysis.Maps.Derivation.DList;
 8 cananian 1.1.2.2  import harpoon.Analysis.Maps.TypeMap;
 9 duncan   1.1.2.8  import harpoon.ClassFile.HClass;
10 cananian 1.1.2.15 import harpoon.ClassFile.HCodeAndMaps;
11 cananian 1.1.2.7  import harpoon.ClassFile.HCodeElement;
12 cananian 1.1.2.1  import harpoon.ClassFile.HMethod;
13 cananian 1.1.2.1  import harpoon.IR.Quads.Quad;
14 cananian 1.1.2.1  import harpoon.Temp.Temp;
15 cananian 1.1.2.1  import harpoon.Temp.TempFactory;
16 cananian 1.1.2.1  
17 cananian 1.1.2.1  import java.util.Hashtable;
18 cananian 1.1.2.15 import java.util.Iterator;
19 cananian 1.1.2.1  /**
20 cananian 1.1.2.10  * <code>LowQuad.Code</code> is an abstract superclass of codeviews
21 cananian 1.1.2.10  * using the components in <code>IR.LowQuad</code>.  It implements
22 cananian 1.1.2.10  * shared methods for the various codeviews using <code>LowQuad</code>s.
23 cananian 1.1.2.1   * 
24 cananian 1.1.2.1   * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
25 cananian 1.3       * @version $Id: Code.java,v 1.3 2003/03/10 22:19:13 cananian Exp $
26 cananian 1.1.2.1   */
27 duncan   1.1.2.5  public abstract class Code extends harpoon.IR.Quads.Code 
28 cananian 1.1.2.1  {
29 cananian 1.1.2.1      /** Make the quad factory. */
30 cananian 1.1.2.1      protected harpoon.IR.Quads.QuadFactory newQF(final HMethod parent) {
31 cananian 1.1.2.1          final String scope = parent.getDeclaringClass().getName() + "." +
32 cananian 1.1.2.1              parent.getName() + parent.getDescriptor() + "/" + getName();
33 cananian 1.1.2.13         abstract class SerializableLowQuadFactory extends LowQuadFactory
34 cananian 1.1.2.13             implements java.io.Serializable { /* only declare inheritance */ }
35 cananian 1.1.2.13         return new SerializableLowQuadFactory() {
36 cananian 1.1.2.1              private final TempFactory tf = Temp.tempFactory(scope);
37 cananian 1.1.2.1              private int id=0;
38 cananian 1.1.2.1              public TempFactory tempFactory() { return tf; }
39 cananian 1.1.2.1              public harpoon.IR.Quads.Code getParent() { return Code.this; }
40 cananian 1.1.2.1              public synchronized int getUniqueID() { return id++; }
41 cananian 1.1.2.1          };
42 cananian 1.1.2.1      }
43 duncan   1.1.2.5  
44 duncan   1.1.2.4      protected Code(HMethod parent, Quad quads) {
45 cananian 1.1.2.1          super(parent, quads);
46 cananian 1.1.2.1      }
47 cananian 1.1.2.1  
48 cananian 1.1.2.14     // Provide access to derivation information.
49 cananian 1.3          private Derivation<Quad> m_derivation = null;
50 cananian 1.1.2.14     /** Return a <code>Derivation</code> object for this
51 cananian 1.1.2.14      *  <code>LowQuad.Code</code>. */
52 cananian 1.3          public Derivation<Quad> getDerivation() { return m_derivation; }
53 cananian 1.1.2.14     /** Allow subclasses to initialize the <code>Derivation</code> for
54 cananian 1.1.2.14      *  this <code>LowQuad.Code</code>. */
55 cananian 1.3          protected void setDerivation(Derivation<Quad> deriv){ m_derivation=deriv; }
56 cananian 1.1.2.15 
57 cananian 1.1.2.15     // clone derivation information, too.
58 cananian 1.3          protected HCodeAndMaps<Quad> cloneHelper(harpoon.IR.Quads.Code _this,
59 cananian 1.3                                                   harpoon.IR.Quads.Code qc) {
60 cananian 1.1.2.15         final HCodeAndMaps hcam = super.cloneHelper(_this, qc);
61 cananian 1.1.2.15         if (_this.getDerivation()!=null)
62 cananian 1.1.2.15             ((Code)qc).setDerivation(cloneDerivation(hcam));
63 cananian 1.1.2.15         return hcam;
64 cananian 1.1.2.15     }
65 cananian 1.3          private static Derivation<Quad> cloneDerivation(HCodeAndMaps<Quad> hcam) {
66 cananian 1.1.2.15         Code ocode = (Code) hcam.ancestorHCode();
67 cananian 1.3              Derivation<Quad> oderiv = ocode.getDerivation();
68 cananian 1.3              DerivationMap<Quad> nderiv = new DerivationMap<Quad>();
69 cananian 1.3              for (Iterator<Quad> it=ocode.getElementsI(); it.hasNext(); ) {
70 cananian 1.3                  Quad ohce = it.next();
71 cananian 1.3                  Quad nhce = hcam.elementMap().get(ohce);
72 cananian 1.3                  nderiv.transfer(nhce, ohce, ohce.def(),
73 cananian 1.1.2.15                             hcam.tempMap(), oderiv);
74 cananian 1.1.2.15         }
75 cananian 1.1.2.15         return nderiv;
76 cananian 1.1.2.15     }
77 cananian 1.2      }