src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Assembler.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Assembler.java Tue Apr 23 14:09:54 2019 -0400
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm/src/org/graalvm/compiler/asm/Assembler.java Tue Apr 23 22:55:09 2019 +0200
@@ -54,6 +54,11 @@
private List<LabelHint> jumpDisplacementHints;
/**
+ * Labels with instructions to be patched when it is {@linkplain Label#bind bound}.
+ */
+ Label labelsWithPatches;
+
+ /**
* Backing code buffer.
*/
private final Buffer codeBuffer;
@@ -151,13 +156,26 @@
* @return the data in this buffer or a trimmed copy if {@code trimmedCopy} is {@code true}
*/
public byte[] close(boolean trimmedCopy) {
+ checkAndClearLabelsWithPatches();
return codeBuffer.close(trimmedCopy);
}
+ private void checkAndClearLabelsWithPatches() throws InternalError {
+ Label label = labelsWithPatches;
+ while (label != null) {
+ if (label.patchPositions != null) {
+ throw new InternalError("Label used by instructions at following offsets has not been bound: " + label.patchPositions);
+ }
+ Label next = label.nextWithPatches;
+ label.nextWithPatches = null;
+ label = next;
+ }
+ labelsWithPatches = null;
+ }
+
public void bind(Label l) {
assert !l.isBound() : "can bind label only once";
- l.bind(position());
- l.patchInstructions(this);
+ l.bind(position(), this);
}
public abstract void align(int modulus);