# HG changeset patch # User Roland Schatz # Date 1439206607 -7200 # Node ID 78c691145967a5c08022982c9c575c539b764c85 # Parent 7dd034e68f2e8906955fc05429d42da80482b6b6 Support putting multiple constants next to each other in DataSection. diff -r 7dd034e68f2e -r 78c691145967 jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/CodeCacheProvider.java --- 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. diff -r 7dd034e68f2e -r 78c691145967 jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/DataSection.java --- 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) { diff -r 7dd034e68f2e -r 78c691145967 jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotCodeCacheProvider.java --- 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;