< 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 >