< prev index next >
src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/DataSection.java
Print this page
@@ -20,19 +20,22 @@
* 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 static jdk.vm.ci.meta.MetaUtil.identityHashCodeString;
-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.*;
+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,16 +177,32 @@
* @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,18 +212,20 @@
// 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) {
- sectionAlignment = lcm(sectionAlignment, d.alignment);
+ 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 >