< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/asm/CompilationResultBuilder.java
Print this page
rev 56282 : [mq]: graal
@@ -39,10 +39,11 @@
import org.graalvm.compiler.asm.AbstractAddress;
import org.graalvm.compiler.asm.Assembler;
import org.graalvm.compiler.asm.Label;
import org.graalvm.compiler.code.CompilationResult;
import org.graalvm.compiler.code.CompilationResult.CodeAnnotation;
+import org.graalvm.compiler.code.CompilationResult.JumpTable;
import org.graalvm.compiler.code.DataSection.Data;
import org.graalvm.compiler.code.DataSection.RawData;
import org.graalvm.compiler.core.common.NumUtil;
import org.graalvm.compiler.core.common.cfg.AbstractBlockBase;
import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
@@ -51,17 +52,19 @@
import org.graalvm.compiler.debug.GraalError;
import org.graalvm.compiler.graph.NodeSourcePosition;
import org.graalvm.compiler.lir.LIR;
import org.graalvm.compiler.lir.LIRFrameState;
import org.graalvm.compiler.lir.LIRInstruction;
+import org.graalvm.compiler.lir.LIRInstructionVerifier;
import org.graalvm.compiler.lir.LabelRef;
import org.graalvm.compiler.lir.StandardOp.LabelHoldingOp;
import org.graalvm.compiler.lir.framemap.FrameMap;
import org.graalvm.compiler.options.Option;
import org.graalvm.compiler.options.OptionKey;
import org.graalvm.compiler.options.OptionType;
import org.graalvm.compiler.options.OptionValues;
+import org.graalvm.compiler.serviceprovider.GraalServices;
import jdk.vm.ci.code.BailoutException;
import jdk.vm.ci.code.CodeCacheProvider;
import jdk.vm.ci.code.DebugInfo;
import jdk.vm.ci.code.Register;
@@ -83,10 +86,20 @@
*
* @see CompilationResultBuilderFactory
*/
public class CompilationResultBuilder {
+ private static final List<LIRInstructionVerifier> LIR_INSTRUCTION_VERIFIERS = new ArrayList<>();
+
+ static {
+ for (LIRInstructionVerifier verifier : GraalServices.load(LIRInstructionVerifier.class)) {
+ if (verifier.isEnabled()) {
+ LIR_INSTRUCTION_VERIFIERS.add(verifier);
+ }
+ }
+ }
+
public static class Options {
@Option(help = "Include the LIR as comments with the final assembly.", type = OptionType.Debug) //
public static final OptionKey<Boolean> PrintLIRWithAssembly = new OptionKey<>(false);
}
@@ -559,26 +572,43 @@
try {
if (beforeOp != null) {
beforeOp.accept(op);
}
- emitOp(this, op);
+ emitOp(op);
if (afterOp != null) {
afterOp.accept(op);
}
} catch (GraalError e) {
throw e.addContext("lir instruction", block + "@" + op.id() + " " + op.getClass().getName() + " " + op + "\n" + Arrays.toString(lir.codeEmittingOrder()));
}
}
}
- private static void emitOp(CompilationResultBuilder crb, LIRInstruction op) {
+ private void emitOp(LIRInstruction op) {
try {
- int start = crb.asm.position();
- op.emitCode(crb);
+ int start = asm.position();
+ op.emitCode(this);
if (op.getPosition() != null) {
- crb.recordSourceMapping(start, crb.asm.position(), op.getPosition());
+ recordSourceMapping(start, asm.position(), op.getPosition());
+ }
+ if (LIR_INSTRUCTION_VERIFIERS.size() > 0 && start < asm.position()) {
+ int end = asm.position();
+ for (CodeAnnotation codeAnnotation : compilationResult.getCodeAnnotations()) {
+ if (codeAnnotation instanceof JumpTable) {
+ // Skip jump table. Here we assume the jump table is at the tail of the
+ // emitted code.
+ int jumpTableStart = codeAnnotation.position;
+ if (jumpTableStart >= start && jumpTableStart < end) {
+ end = jumpTableStart;
+ }
+ }
+ }
+ byte[] emittedCode = asm.copy(start, end);
+ for (LIRInstructionVerifier verifier : LIR_INSTRUCTION_VERIFIERS) {
+ verifier.verify(op, emittedCode);
+ }
}
} catch (BailoutException e) {
throw e;
} catch (AssertionError t) {
throw new GraalError(t);
< prev index next >