changeset 22411:78c691145967

Support putting multiple constants next to each other in DataSection.
author Roland Schatz <roland.schatz@oracle.com>
date Mon, 10 Aug 2015 13:36:47 +0200
parents 7dd034e68f2e
children e6e0113295ca
files jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/CodeCacheProvider.java jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/DataSection.java jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotCodeCacheProvider.java
diffstat 3 files changed, 29 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/CodeCacheProvider.java	Fri Aug 07 14:46:04 2015 +0200
+++ b/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/CodeCacheProvider.java	Mon Aug 10 13:36:47 2015 +0200
@@ -87,9 +87,11 @@
     boolean needsDataPatch(JavaConstant constant);
 
     /**
-     * Create a {@link Data} item for a {@link Constant}, that can be used in a {@link DataPatch}.
+     * Create a {@link Data} item for one or more {@link Constant Constants}, that can be used in a
+     * {@link DataPatch}. If more than one {@link Constant} is given, then they are tightly packed
+     * into a single {@link Data} item.
      */
-    Data createDataItem(Constant constant);
+    Data createDataItem(Constant... constants);
 
     /**
      * Gets a description of the target architecture.
--- a/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/DataSection.java	Fri Aug 07 14:46:04 2015 +0200
+++ b/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/DataSection.java	Mon Aug 10 13:36:47 2015 +0200
@@ -252,7 +252,7 @@
         return dataItems.iterator();
     }
 
-    private static int lcm(int x, int y) {
+    public static int lcm(int x, int y) {
         if (x == 0) {
             return y;
         } else if (y == 0) {
--- a/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotCodeCacheProvider.java	Fri Aug 07 14:46:04 2015 +0200
+++ b/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotCodeCacheProvider.java	Mon Aug 10 13:36:47 2015 +0200
@@ -166,7 +166,7 @@
         return constant instanceof HotSpotMetaspaceConstant;
     }
 
-    public Data createDataItem(Constant constant) {
+    private Data createSingleDataItem(Constant constant) {
         int size;
         DataBuilder builder;
         if (constant instanceof VMConstant) {
@@ -213,6 +213,29 @@
         return new Data(size, size, builder);
     }
 
+    public Data createDataItem(Constant... constants) {
+        assert constants.length > 0;
+        if (constants.length == 1) {
+            return createSingleDataItem(constants[0]);
+        } else {
+            DataBuilder[] builders = new DataBuilder[constants.length];
+            int size = 0;
+            int alignment = 1;
+            for (int i = 0; i < constants.length; i++) {
+                Data data = createSingleDataItem(constants[i]);
+                size += data.getSize();
+                builders[i] = data.getBuilder();
+                alignment = DataSection.lcm(alignment, data.getAlignment());
+            }
+            DataBuilder ret = (buffer, patches) -> {
+                for (DataBuilder b : builders) {
+                    b.emit(buffer, patches);
+                }
+            };
+            return new Data(alignment, size, ret);
+        }
+    }
+
     @Override
     public TargetDescription getTarget() {
         return target;