< prev index next >

src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/DataSection.java

Print this page

        

*** 20,38 **** * or visit www.oracle.com if you need additional information or have any * questions. */ package jdk.vm.ci.code; ! import static jdk.vm.ci.meta.MetaUtil.*; ! import java.nio.*; ! import java.util.*; ! import java.util.function.*; ! ! import jdk.vm.ci.code.CompilationResult.*; ! import jdk.vm.ci.code.DataSection.*; ! import jdk.vm.ci.meta.*; public final class DataSection implements Iterable<Data> { @FunctionalInterface public interface DataBuilder { --- 20,41 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ package jdk.vm.ci.code; ! import static jdk.vm.ci.meta.MetaUtil.identityHashCodeString; ! import java.nio.ByteBuffer; ! import java.util.ArrayList; ! import java.util.Iterator; ! import java.util.Objects; ! import java.util.function.Consumer; ! ! import jdk.vm.ci.code.CompilationResult.DataPatch; ! import jdk.vm.ci.code.CompilationResult.DataSectionReference; ! import jdk.vm.ci.code.DataSection.Data; ! import jdk.vm.ci.meta.SerializableConstant; public final class DataSection implements Iterable<Data> { @FunctionalInterface public interface DataBuilder {
*** 174,189 **** --- 177,208 ---- * @param data the {@link Data} item to be inserted * @return a unique {@link DataSectionReference} identifying the {@link Data} item */ public DataSectionReference insertData(Data data) { assert !finalLayout; + synchronized (data) { if (data.ref == null) { data.ref = new DataSectionReference(); dataItems.add(data); } return data.ref; } + } + + /** + * Transfers all {@link Data} from the provided other {@link DataSection} to this + * {@link DataSection}, and empties the other section. + */ + public void addAll(DataSection other) { + assert !finalLayout && !other.finalLayout; + + for (Data data : other.dataItems) { + assert data.ref != null; + dataItems.add(data); + } + other.dataItems.clear(); + } /** * Compute the layout of the data section. This can be called only once, and after it has been * called, the data section can no longer be modified. */
*** 193,210 **** // simple heuristic: put items with larger alignment requirement first dataItems.sort((a, b) -> a.alignment - b.alignment); int position = 0; for (Data d : dataItems) { ! sectionAlignment = lcm(sectionAlignment, d.alignment); position = align(position, d.alignment); d.ref.setOffset(position); position += d.size; } sectionSize = position; } public boolean isFinalized() { return finalLayout; --- 212,231 ---- // simple heuristic: put items with larger alignment requirement first dataItems.sort((a, b) -> a.alignment - b.alignment); int position = 0; + int alignment = 1; for (Data d : dataItems) { ! alignment = lcm(alignment, d.alignment); position = align(position, d.alignment); d.ref.setOffset(position); position += d.size; } + sectionAlignment = alignment; sectionSize = position; } public boolean isFinalized() { return finalLayout;
< prev index next >