src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiledClass.java
Index Unified diffs Context diffs Sdiffs Frames Patch New Old Previous File Next File hotspot Sdiff src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc

src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiledClass.java

Print this page


   1 /*
   2  * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */


  24 package jdk.tools.jaotc;
  25 
  26 import java.util.ArrayList;
  27 import java.util.HashMap;
  28 import java.util.Map;
  29 
  30 import jdk.tools.jaotc.binformat.BinaryContainer;
  31 import jdk.tools.jaotc.binformat.ReadOnlyDataContainer;
  32 import jdk.tools.jaotc.binformat.Symbol.Binding;
  33 import jdk.tools.jaotc.binformat.Symbol.Kind;
  34 
  35 import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
  36 import jdk.vm.ci.meta.ResolvedJavaField;
  37 import jdk.vm.ci.meta.ResolvedJavaMethod;
  38 import jdk.vm.ci.meta.ResolvedJavaType;
  39 
  40 /**
  41  * Class encapsulating Graal-compiled output of a Java class. The compilation result of all methods
  42  * of a class {@code className} are maintained in an array list.
  43  */
  44 public class AOTCompiledClass {
  45 
  46     public static class AOTKlassData {
  47         int gotIndex; // Index (offset/8) to the got in the .metaspace.got section
  48         int classId;  // Unique ID
  49         // Offset to compiled methods data in the .methods.offsets section.
  50         int compiledMethodsOffset;
  51         // Offset to dependent methods data.
  52         int dependentMethodsOffset;
  53         long fingerprint;           // Class fingerprint
  54 
  55         private final String name;
  56         private boolean isArray;
  57 
  58         /**
  59          * List of dependent compiled methods which have a reference to this class.
  60          */
  61         private ArrayList<CompiledMethodInfo> dependentMethods;
  62 
  63         public AOTKlassData(BinaryContainer binaryContainer, String name, long fingerprint, int classId) {
  64             this.dependentMethods = new ArrayList<>();
  65             this.classId = classId;
  66             this.fingerprint = fingerprint;
  67             this.gotIndex = binaryContainer.addTwoSlotMetaspaceSymbol(name);
  68             this.compiledMethodsOffset = -1; // Not compiled classes do not have compiled methods.
  69             this.dependentMethodsOffset = -1;
  70             this.name = name;
  71             this.isArray = name.length() > 0 && name.charAt(0) == '[';
  72         }
  73 
  74         public long getFingerprint() {
  75             return fingerprint;
  76         }
  77 
  78         /**
  79          * Add a method to the list of dependent methods.
  80          */
  81         public synchronized boolean addDependentMethod(CompiledMethodInfo cm) {
  82             return dependentMethods.add(cm);
  83         }
  84 
  85         /**
  86          * Return the array list of dependent class methods.
  87          *
  88          * @return array list of dependent methods
  89          */
  90         public ArrayList<CompiledMethodInfo> getDependentMethods() {
  91             return dependentMethods;
  92         }
  93 
  94         /**
  95          * Returns if this class has dependent methods.
  96          *
  97          * @return true if dependent methods exist, false otherwise
  98          */
  99         public boolean hasDependentMethods() {
 100             return !dependentMethods.isEmpty();
 101         }
 102 
 103         public void setCompiledMethodsOffset(int offset) {
 104             compiledMethodsOffset = offset;
 105         }
 106 
 107         protected void putAOTKlassData(BinaryContainer binaryContainer, ReadOnlyDataContainer container) {
 108             int cntDepMethods = dependentMethods.size();
 109             // Create array of dependent methods IDs. First word is count.
 110             ReadOnlyDataContainer dependenciesContainer = binaryContainer.getKlassesDependenciesContainer();
 111             this.dependentMethodsOffset = binaryContainer.addMethodsCount(cntDepMethods, dependenciesContainer);
 112             for (CompiledMethodInfo methodInfo : dependentMethods) {
 113                 dependenciesContainer.appendInt(methodInfo.getCodeId());
 114             }
 115             verify();
 116 
 117             // @formatter:off
 118             /*
 119              * The offsets layout should match AOTKlassData structure in AOT JVM runtime
 120              */
 121             int offset = container.getByteStreamSize();
 122             container.createSymbol(offset, Kind.OBJECT, Binding.GLOBAL, 0, name);
 123                       // Add index (offset/8) to the got in the .metaspace.got section
 124             container.appendInt(gotIndex).
 125                       // Add unique ID
 126                       appendInt(classId).
 127                       // Add the offset to compiled methods data in the .metaspace.offsets section.
 128                       appendInt(compiledMethodsOffset).
 129                       // Add the offset to dependent methods data in the .metaspace.offsets section.
 130                       appendInt(dependentMethodsOffset).
 131                       // Add fingerprint.


 159      * List of all compiled class methods.
 160      */
 161     private ArrayList<CompiledMethodInfo> compiledMethods;
 162 
 163     /**
 164      * If this class represents Graal stub code.
 165      */
 166     private final boolean representsStubs;
 167 
 168     /**
 169      * Classes count used to generate unique global method id.
 170      */
 171     private static int classesCount = 0;
 172 
 173     /**
 174      * Construct an object with compiled methods. Intended to be used for code with no corresponding
 175      * Java method name in the user application.
 176      *
 177      * @param compiledMethods AOT compiled methods
 178      */
 179     public AOTCompiledClass(ArrayList<CompiledMethodInfo> compiledMethods) {
 180         this.resolvedJavaType = null;
 181         this.compiledMethods = compiledMethods;
 182         this.representsStubs = true;
 183     }
 184 
 185     /**
 186      * Construct an object with compiled versions of the named class.
 187      */
 188     public AOTCompiledClass(ResolvedJavaType resolvedJavaType) {
 189         this.resolvedJavaType = (HotSpotResolvedObjectType) resolvedJavaType;
 190         this.compiledMethods = new ArrayList<>();
 191         this.representsStubs = false;
 192     }
 193 
 194     /**
 195      * @return the ResolvedJavaType of this class
 196      */
 197     public ResolvedJavaType getResolvedJavaType() {
 198         return resolvedJavaType;
 199     }
 200 
 201     /**
 202      * Get the list of methods which should be compiled.
 203      */
 204     public ArrayList<ResolvedJavaMethod> getMethods() {
 205         ArrayList<ResolvedJavaMethod> m = methods;
 206         methods = null; // Free - it is not used after that.
 207         return m;
 208     }
 209 
 210     /**
 211      * Get the number of all AOT classes.
 212      */
 213     public static int getClassesCount() {
 214         return classesCount;
 215     }
 216 
 217     /**
 218      * Get the number of methods which should be compiled.
 219      *
 220      * @return number of methods which should be compiled
 221      */
 222     public int getMethodCount() {
 223         return methods.size();
 224     }
 225 
 226     /**
 227      * Add a method to the list of methods to be compiled.
 228      */
 229     public void addMethod(ResolvedJavaMethod method) {
 230         methods.add(method);
 231     }
 232 
 233     /**
 234      * Returns if this class has methods which should be compiled.
 235      *
 236      * @return true if this class contains methods which should be compiled, false otherwise
 237      */
 238     public boolean hasMethods() {
 239         return !methods.isEmpty();
 240     }
 241 
 242     /**
 243      * Add a method to the list of compiled methods. This method needs to be thread-safe.
 244      */
 245     public synchronized boolean addCompiledMethod(CompiledMethodInfo cm) {
 246         return compiledMethods.add(cm);
 247     }
 248 
 249     /**
 250      * Return the array list of compiled class methods.
 251      *
 252      * @return array list of compiled methods
 253      */
 254     public ArrayList<CompiledMethodInfo> getCompiledMethods() {
 255         return compiledMethods;
 256     }
 257 
 258     /**
 259      * Returns if this class has successfully compiled methods.
 260      *
 261      * @return true if methods were compiled, false otherwise
 262      */
 263     public boolean hasCompiledMethods() {
 264         return !compiledMethods.isEmpty();
 265     }
 266 
 267     /**
 268      * Add a klass data.
 269      */
 270     public synchronized static AOTKlassData addAOTKlassData(BinaryContainer binaryContainer, HotSpotResolvedObjectType type) {
 271         String name = type.getName();
 272         long fingerprint = type.getFingerprint();
 273         AOTKlassData data = klassData.get(name);
 274         if (data != null) {
 275             assert data.getFingerprint() == fingerprint : "incorrect fingerprint data for klass: " + name;
 276         } else {
 277             data = new AOTKlassData(binaryContainer, name, fingerprint, classesCount++);
 278             klassData.put(name, data);
 279         }
 280         return data;
 281     }
 282 
 283     public synchronized static AOTKlassData getAOTKlassData(String name) {
 284         return klassData.get(name);
 285     }
 286 
 287     public synchronized static AOTKlassData getAOTKlassData(HotSpotResolvedObjectType type) {
 288         return getAOTKlassData(type.getName());
 289     }
 290 
 291     public void addAOTKlassData(BinaryContainer binaryContainer) {
 292         for (CompiledMethodInfo methodInfo : compiledMethods) {
 293             // Record methods holder
 294             methodInfo.addDependentKlassData(binaryContainer, resolvedJavaType);
 295             // Record inlinee classes
 296             ResolvedJavaMethod[] inlinees = methodInfo.getCompilationResult().getMethods();
 297             if (inlinees != null) {
 298                 for (ResolvedJavaMethod m : inlinees) {
 299                     methodInfo.addDependentKlassData(binaryContainer, (HotSpotResolvedObjectType) m.getDeclaringClass());
 300                 }
 301             }
 302             // Record classes of fields that were accessed
 303             ResolvedJavaField[] fields = methodInfo.getCompilationResult().getFields();
 304             if (fields != null) {
 305                 for (ResolvedJavaField f : fields) {
 306                     methodInfo.addDependentKlassData(binaryContainer, (HotSpotResolvedObjectType) f.getDeclaringClass());
 307                 }
 308             }
 309         }
 310     }
 311 
 312     public synchronized static AOTKlassData addFingerprintKlassData(BinaryContainer binaryContainer, HotSpotResolvedObjectType type) {
 313         if (type.isArray()) {
 314             return addAOTKlassData(binaryContainer, type);
 315         }
 316         assert type.getFingerprint() != 0 : "no fingerprint for " + type.getName();
 317         AOTKlassData old = getAOTKlassData(type);
 318         if (old != null) {
 319             boolean assertsEnabled = false;

 320             assert assertsEnabled = true;
 321             if (assertsEnabled) {
 322                 HotSpotResolvedObjectType s = type.getSuperclass();
 323                 if (s != null) {
 324                     assert getAOTKlassData(s) != null : "fingerprint super " + s.getName() + " needed for " + type.getName();
 325                 }
 326                 for (HotSpotResolvedObjectType i : type.getInterfaces()) {
 327                     assert getAOTKlassData(i) != null : "fingerprint super " + i.getName() + " needed for " + type.getName();
 328                 }
 329             }
 330             return old;
 331         }
 332 
 333         // Fingerprinting requires super classes and super interfaces
 334         HotSpotResolvedObjectType s = type.getSuperclass();
 335         if (s != null) {
 336             addFingerprintKlassData(binaryContainer, s);
 337         }
 338         for (HotSpotResolvedObjectType i : type.getInterfaces()) {
 339             addFingerprintKlassData(binaryContainer, i);
 340         }
 341 
 342         return addAOTKlassData(binaryContainer, type);
 343     }
 344 
 345     /*
 346      * Put methods data to contained.
 347      */
 348     public void putMethodsData(BinaryContainer binaryContainer) {
 349         ReadOnlyDataContainer container = binaryContainer.getMethodsOffsetsContainer();
 350         int cntMethods = compiledMethods.size();
 351         int startMethods = binaryContainer.addMethodsCount(cntMethods, container);
 352         for (CompiledMethodInfo methodInfo : compiledMethods) {
 353             methodInfo.addMethodOffsets(binaryContainer, container);
 354         }
 355         String name = resolvedJavaType.getName();
 356         AOTKlassData data = klassData.get(name);
 357         assert data != null : "missing data for klass: " + name;
 358         assert data.getFingerprint() == resolvedJavaType.getFingerprint() : "incorrect fingerprint for klass: " + name;
 359         int cntDepMethods = data.dependentMethods.size();
 360         assert cntDepMethods > 0 : "no dependent methods for compiled klass: " + name;
 361         data.setCompiledMethodsOffset(startMethods);
 362     }
 363 
 364     public static void putAOTKlassData(BinaryContainer binaryContainer) {
 365         ReadOnlyDataContainer container = binaryContainer.getKlassesOffsetsContainer();
 366         for (AOTKlassData data : klassData.values()) {
 367             data.putAOTKlassData(binaryContainer, container);
 368         }
 369     }
 370 
 371     public boolean representsStubs() {
 372         return representsStubs;
 373     }
 374 
 375     public void clear() {
 376         for (CompiledMethodInfo c : compiledMethods) {
 377             c.clear();
 378         }
 379         this.compiledMethods = null;
 380         this.methods = null;
 381     }
 382 
 383 }
   1 /*
   2  * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */


  24 package jdk.tools.jaotc;
  25 
  26 import java.util.ArrayList;
  27 import java.util.HashMap;
  28 import java.util.Map;
  29 
  30 import jdk.tools.jaotc.binformat.BinaryContainer;
  31 import jdk.tools.jaotc.binformat.ReadOnlyDataContainer;
  32 import jdk.tools.jaotc.binformat.Symbol.Binding;
  33 import jdk.tools.jaotc.binformat.Symbol.Kind;
  34 
  35 import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
  36 import jdk.vm.ci.meta.ResolvedJavaField;
  37 import jdk.vm.ci.meta.ResolvedJavaMethod;
  38 import jdk.vm.ci.meta.ResolvedJavaType;
  39 
  40 /**
  41  * Class encapsulating Graal-compiled output of a Java class. The compilation result of all methods
  42  * of a class {@code className} are maintained in an array list.
  43  */
  44 final class AOTCompiledClass {
  45 
  46     static class AOTKlassData {
  47         private int gotIndex; // Index (offset/8) to the got in the .metaspace.got section
  48         private int classId;  // Unique ID
  49         // Offset to compiled methods data in the .methods.offsets section.
  50         private int compiledMethodsOffset;
  51         // Offset to dependent methods data.
  52         private int dependentMethodsOffset;
  53         private long fingerprint;           // Class fingerprint
  54 
  55         private final String name;
  56         private boolean isArray;
  57 
  58         /**
  59          * List of dependent compiled methods which have a reference to this class.
  60          */
  61         private ArrayList<CompiledMethodInfo> dependentMethods;
  62 
  63         AOTKlassData(BinaryContainer binaryContainer, String name, long fingerprint, int classId) {
  64             this.dependentMethods = new ArrayList<>();
  65             this.classId = classId;
  66             this.fingerprint = fingerprint;
  67             this.gotIndex = binaryContainer.addTwoSlotKlassSymbol(name);
  68             this.compiledMethodsOffset = -1; // Not compiled classes do not have compiled methods.
  69             this.dependentMethodsOffset = -1;
  70             this.name = name;
  71             this.isArray = name.length() > 0 && name.charAt(0) == '[';
  72         }
  73 
  74         long getFingerprint() {
  75             return fingerprint;
  76         }
  77 
  78         /**
  79          * Add a method to the list of dependent methods.
  80          */
  81         synchronized boolean addDependentMethod(CompiledMethodInfo cm) {
  82             return dependentMethods.add(cm);
  83         }
  84 
  85         /**
  86          * Return the array list of dependent class methods.
  87          *
  88          * @return array list of dependent methods
  89          */
  90         ArrayList<CompiledMethodInfo> getDependentMethods() {
  91             return dependentMethods;
  92         }
  93 
  94         /**
  95          * Returns if this class has dependent methods.
  96          *
  97          * @return true if dependent methods exist, false otherwise
  98          */
  99         boolean hasDependentMethods() {
 100             return !dependentMethods.isEmpty();
 101         }
 102 
 103         void setCompiledMethodsOffset(int offset) {
 104             compiledMethodsOffset = offset;
 105         }
 106 
 107         protected void putAOTKlassData(BinaryContainer binaryContainer, ReadOnlyDataContainer container) {
 108             int cntDepMethods = dependentMethods.size();
 109             // Create array of dependent methods IDs. First word is count.
 110             ReadOnlyDataContainer dependenciesContainer = binaryContainer.getKlassesDependenciesContainer();
 111             this.dependentMethodsOffset = BinaryContainer.addMethodsCount(cntDepMethods, dependenciesContainer);
 112             for (CompiledMethodInfo methodInfo : dependentMethods) {
 113                 dependenciesContainer.appendInt(methodInfo.getCodeId());
 114             }
 115             verify();
 116 
 117             // @formatter:off
 118             /*
 119              * The offsets layout should match AOTKlassData structure in AOT JVM runtime
 120              */
 121             int offset = container.getByteStreamSize();
 122             container.createSymbol(offset, Kind.OBJECT, Binding.GLOBAL, 0, name);
 123                       // Add index (offset/8) to the got in the .metaspace.got section
 124             container.appendInt(gotIndex).
 125                       // Add unique ID
 126                       appendInt(classId).
 127                       // Add the offset to compiled methods data in the .metaspace.offsets section.
 128                       appendInt(compiledMethodsOffset).
 129                       // Add the offset to dependent methods data in the .metaspace.offsets section.
 130                       appendInt(dependentMethodsOffset).
 131                       // Add fingerprint.


 159      * List of all compiled class methods.
 160      */
 161     private ArrayList<CompiledMethodInfo> compiledMethods;
 162 
 163     /**
 164      * If this class represents Graal stub code.
 165      */
 166     private final boolean representsStubs;
 167 
 168     /**
 169      * Classes count used to generate unique global method id.
 170      */
 171     private static int classesCount = 0;
 172 
 173     /**
 174      * Construct an object with compiled methods. Intended to be used for code with no corresponding
 175      * Java method name in the user application.
 176      *
 177      * @param compiledMethods AOT compiled methods
 178      */
 179     AOTCompiledClass(ArrayList<CompiledMethodInfo> compiledMethods) {
 180         this.resolvedJavaType = null;
 181         this.compiledMethods = compiledMethods;
 182         this.representsStubs = true;
 183     }
 184 
 185     /**
 186      * Construct an object with compiled versions of the named class.
 187      */
 188     AOTCompiledClass(ResolvedJavaType resolvedJavaType) {
 189         this.resolvedJavaType = (HotSpotResolvedObjectType) resolvedJavaType;
 190         this.compiledMethods = new ArrayList<>();
 191         this.representsStubs = false;
 192     }
 193 
 194     /**
 195      * @return the ResolvedJavaType of this class
 196      */
 197     ResolvedJavaType getResolvedJavaType() {
 198         return resolvedJavaType;
 199     }
 200 
 201     /**
 202      * Get the list of methods which should be compiled.
 203      */
 204     ArrayList<ResolvedJavaMethod> getMethods() {
 205         ArrayList<ResolvedJavaMethod> m = methods;
 206         methods = null; // Free - it is not used after that.
 207         return m;
 208     }
 209 
 210     /**
 211      * Get the number of all AOT classes.
 212      */
 213     static int getClassesCount() {
 214         return classesCount;
 215     }
 216 
 217     /**
 218      * Get the number of methods which should be compiled.
 219      *
 220      * @return number of methods which should be compiled
 221      */
 222     int getMethodCount() {
 223         return methods.size();
 224     }
 225 
 226     /**
 227      * Add a method to the list of methods to be compiled.
 228      */
 229     void addMethod(ResolvedJavaMethod method) {
 230         methods.add(method);
 231     }
 232 
 233     /**
 234      * Returns if this class has methods which should be compiled.
 235      *
 236      * @return true if this class contains methods which should be compiled, false otherwise
 237      */
 238     boolean hasMethods() {
 239         return !methods.isEmpty();
 240     }
 241 
 242     /**
 243      * Add a method to the list of compiled methods. This method needs to be thread-safe.
 244      */
 245     synchronized boolean addCompiledMethod(CompiledMethodInfo cm) {
 246         return compiledMethods.add(cm);
 247     }
 248 
 249     /**
 250      * Return the array list of compiled class methods.
 251      *
 252      * @return array list of compiled methods
 253      */
 254     ArrayList<CompiledMethodInfo> getCompiledMethods() {
 255         return compiledMethods;
 256     }
 257 
 258     /**
 259      * Returns if this class has successfully compiled methods.
 260      *
 261      * @return true if methods were compiled, false otherwise
 262      */
 263     boolean hasCompiledMethods() {
 264         return !compiledMethods.isEmpty();
 265     }
 266 
 267     /**
 268      * Add a klass data.
 269      */
 270     synchronized static AOTKlassData addAOTKlassData(BinaryContainer binaryContainer, HotSpotResolvedObjectType type) {
 271         String name = type.getName();
 272         long fingerprint = type.getFingerprint();
 273         AOTKlassData data = klassData.get(name);
 274         if (data != null) {
 275             assert data.getFingerprint() == fingerprint : "incorrect fingerprint data for klass: " + name;
 276         } else {
 277             data = new AOTKlassData(binaryContainer, name, fingerprint, classesCount++);
 278             klassData.put(name, data);
 279         }
 280         return data;
 281     }
 282 
 283     synchronized static AOTKlassData getAOTKlassData(String name) {
 284         return klassData.get(name);
 285     }
 286 
 287     synchronized static AOTKlassData getAOTKlassData(HotSpotResolvedObjectType type) {
 288         return getAOTKlassData(type.getName());
 289     }
 290 
 291     void addAOTKlassData(BinaryContainer binaryContainer) {
 292         for (CompiledMethodInfo methodInfo : compiledMethods) {
 293             // Record methods holder
 294             methodInfo.addDependentKlassData(binaryContainer, resolvedJavaType);
 295             // Record inlinee classes
 296             ResolvedJavaMethod[] inlinees = methodInfo.getCompilationResult().getMethods();
 297             if (inlinees != null) {
 298                 for (ResolvedJavaMethod m : inlinees) {
 299                     methodInfo.addDependentKlassData(binaryContainer, (HotSpotResolvedObjectType) m.getDeclaringClass());
 300                 }
 301             }
 302             // Record classes of fields that were accessed
 303             ResolvedJavaField[] fields = methodInfo.getCompilationResult().getFields();
 304             if (fields != null) {
 305                 for (ResolvedJavaField f : fields) {
 306                     methodInfo.addDependentKlassData(binaryContainer, (HotSpotResolvedObjectType) f.getDeclaringClass());
 307                 }
 308             }
 309         }
 310     }
 311 
 312     synchronized static AOTKlassData addFingerprintKlassData(BinaryContainer binaryContainer, HotSpotResolvedObjectType type) {
 313         if (type.isArray()) {
 314             return addAOTKlassData(binaryContainer, type);
 315         }
 316         assert type.getFingerprint() != 0 : "no fingerprint for " + type.getName();
 317         AOTKlassData old = getAOTKlassData(type);
 318         if (old != null) {
 319             boolean assertsEnabled = false;
 320             // Next assignment will be executed when asserts are enabled.
 321             assert assertsEnabled = true;
 322             if (assertsEnabled) {
 323                 HotSpotResolvedObjectType s = type.getSuperclass();
 324                 if (s != null) {
 325                     assert getAOTKlassData(s) != null : "fingerprint for super " + s.getName() + " needed for " + type.getName();
 326                 }
 327                 for (HotSpotResolvedObjectType i : type.getInterfaces()) {
 328                     assert getAOTKlassData(i) != null : "fingerprint for interface " + i.getName() + " needed for " + type.getName();
 329                 }
 330             }
 331             return old;
 332         }
 333 
 334         // Fingerprinting requires super classes and super interfaces
 335         HotSpotResolvedObjectType s = type.getSuperclass();
 336         if (s != null) {
 337             addFingerprintKlassData(binaryContainer, s);
 338         }
 339         for (HotSpotResolvedObjectType i : type.getInterfaces()) {
 340             addFingerprintKlassData(binaryContainer, i);
 341         }
 342 
 343         return addAOTKlassData(binaryContainer, type);
 344     }
 345 
 346     /*
 347      * Put methods data to contained.
 348      */
 349     void putMethodsData(BinaryContainer binaryContainer) {
 350         ReadOnlyDataContainer container = binaryContainer.getMethodsOffsetsContainer();
 351         int cntMethods = compiledMethods.size();
 352         int startMethods = BinaryContainer.addMethodsCount(cntMethods, container);
 353         for (CompiledMethodInfo methodInfo : compiledMethods) {
 354             methodInfo.addMethodOffsets(binaryContainer, container);
 355         }
 356         String name = resolvedJavaType.getName();
 357         AOTKlassData data = klassData.get(name);
 358         assert data != null : "missing data for klass: " + name;
 359         assert data.getFingerprint() == resolvedJavaType.getFingerprint() : "incorrect fingerprint for klass: " + name;
 360         int cntDepMethods = data.dependentMethods.size();
 361         assert cntDepMethods > 0 : "no dependent methods for compiled klass: " + name;
 362         data.setCompiledMethodsOffset(startMethods);
 363     }
 364 
 365     static void putAOTKlassData(BinaryContainer binaryContainer) {
 366         ReadOnlyDataContainer container = binaryContainer.getKlassesOffsetsContainer();
 367         for (AOTKlassData data : klassData.values()) {
 368             data.putAOTKlassData(binaryContainer, container);
 369         }
 370     }
 371 
 372     boolean representsStubs() {
 373         return representsStubs;
 374     }
 375 
 376     void clear() {
 377         for (CompiledMethodInfo c : compiledMethods) {
 378             c.clear();
 379         }
 380         this.compiledMethods = null;
 381         this.methods = null;
 382     }
 383 
 384 }
src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiledClass.java
Index Unified diffs Context diffs Sdiffs Frames Patch New Old Previous File Next File