< 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,48 **** --- 39,49 ---- 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,67 **** --- 52,70 ---- 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,92 **** --- 86,105 ---- * * @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,584 **** try { if (beforeOp != null) { beforeOp.accept(op); } ! emitOp(this, 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) { try { ! int start = crb.asm.position(); ! op.emitCode(crb); if (op.getPosition() != null) { ! crb.recordSourceMapping(start, crb.asm.position(), op.getPosition()); } } catch (BailoutException e) { throw e; } catch (AssertionError t) { throw new GraalError(t); --- 572,614 ---- try { if (beforeOp != null) { beforeOp.accept(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 void emitOp(LIRInstruction op) { try { ! int start = asm.position(); ! op.emitCode(this); if (op.getPosition() != null) { ! 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 >