28 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.REEXECUTABLE;
29 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.RegisterEffect.DESTROYS_REGISTERS;
30 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.SAFEPOINT;
31 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.clearPendingException;
32 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.registerAsWord;
33 import static jdk.internal.vm.compiler.word.LocationIdentity.any;
34
35 import org.graalvm.compiler.api.replacements.Fold;
36 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
37 import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
38 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
39 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
40 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
41 import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProviderImpl;
42 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
43 import org.graalvm.compiler.hotspot.nodes.StubForeignCallNode;
44 import org.graalvm.compiler.hotspot.word.KlassPointer;
45 import org.graalvm.compiler.options.OptionValues;
46 import org.graalvm.compiler.replacements.nodes.CStringConstant;
47 import org.graalvm.compiler.word.Word;
48
49 import jdk.vm.ci.code.Register;
50
51 /**
52 * Base class for stubs that create a runtime exception.
53 */
54 public class CreateExceptionStub extends SnippetStub {
55
56 protected CreateExceptionStub(String snippetMethodName, OptionValues options, HotSpotProviders providers, HotSpotForeignCallLinkage linkage) {
57 super(snippetMethodName, options, providers, linkage);
58 }
59
60 @Fold
61 static String getInternalClassName(Class<?> cls) {
62 return cls.getName().replace('.', '/');
63 }
64
65 private static Word classAsCString(Class<?> cls) {
66 return CStringConstant.cstring(getInternalClassName(cls));
67 }
68
69 protected static Object createException(Register threadRegister, Class<? extends Throwable> exception) {
70 Word message = null;
71 return createException(threadRegister, exception, message);
72 }
73
74 protected static Object createException(Register threadRegister, Class<? extends Throwable> exception, Word message) {
75 Word thread = registerAsWord(threadRegister);
76 throwAndPostJvmtiException(THROW_AND_POST_JVMTI_EXCEPTION, thread, classAsCString(exception), message);
77 return clearPendingException(thread);
78 }
79
80 protected static Object createException(Register threadRegister, Class<? extends Throwable> exception, KlassPointer klass) {
81 Word thread = registerAsWord(threadRegister);
82 throwKlassExternalNameException(THROW_KLASS_EXTERNAL_NAME_EXCEPTION, thread, classAsCString(exception), klass);
83 return clearPendingException(thread);
84 }
85
86 protected static Object createException(Register threadRegister, Class<? extends Throwable> exception, KlassPointer objKlass, KlassPointer targetKlass) {
87 Word thread = registerAsWord(threadRegister);
88 throwClassCastException(THROW_CLASS_CAST_EXCEPTION, thread, classAsCString(exception), objKlass, targetKlass);
89 return clearPendingException(thread);
90 }
|
28 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.REEXECUTABLE;
29 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.RegisterEffect.DESTROYS_REGISTERS;
30 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.SAFEPOINT;
31 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.clearPendingException;
32 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.registerAsWord;
33 import static jdk.internal.vm.compiler.word.LocationIdentity.any;
34
35 import org.graalvm.compiler.api.replacements.Fold;
36 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
37 import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
38 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
39 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
40 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
41 import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProviderImpl;
42 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
43 import org.graalvm.compiler.hotspot.nodes.StubForeignCallNode;
44 import org.graalvm.compiler.hotspot.word.KlassPointer;
45 import org.graalvm.compiler.options.OptionValues;
46 import org.graalvm.compiler.replacements.nodes.CStringConstant;
47 import org.graalvm.compiler.word.Word;
48 import jdk.internal.vm.compiler.word.WordFactory;
49
50 import jdk.vm.ci.code.Register;
51
52 /**
53 * Base class for stubs that create a runtime exception.
54 */
55 public class CreateExceptionStub extends SnippetStub {
56
57 protected CreateExceptionStub(String snippetMethodName, OptionValues options, HotSpotProviders providers, HotSpotForeignCallLinkage linkage) {
58 super(snippetMethodName, options, providers, linkage);
59 }
60
61 @Fold
62 static String getInternalClassName(Class<?> cls) {
63 return cls.getName().replace('.', '/');
64 }
65
66 private static Word classAsCString(Class<?> cls) {
67 return CStringConstant.cstring(getInternalClassName(cls));
68 }
69
70 protected static Object createException(Register threadRegister, Class<? extends Throwable> exception) {
71 Word message = WordFactory.zero();
72 return createException(threadRegister, exception, message);
73 }
74
75 protected static Object createException(Register threadRegister, Class<? extends Throwable> exception, Word message) {
76 Word thread = registerAsWord(threadRegister);
77 throwAndPostJvmtiException(THROW_AND_POST_JVMTI_EXCEPTION, thread, classAsCString(exception), message);
78 return clearPendingException(thread);
79 }
80
81 protected static Object createException(Register threadRegister, Class<? extends Throwable> exception, KlassPointer klass) {
82 Word thread = registerAsWord(threadRegister);
83 throwKlassExternalNameException(THROW_KLASS_EXTERNAL_NAME_EXCEPTION, thread, classAsCString(exception), klass);
84 return clearPendingException(thread);
85 }
86
87 protected static Object createException(Register threadRegister, Class<? extends Throwable> exception, KlassPointer objKlass, KlassPointer targetKlass) {
88 Word thread = registerAsWord(threadRegister);
89 throwClassCastException(THROW_CLASS_CAST_EXCEPTION, thread, classAsCString(exception), objKlass, targetKlass);
90 return clearPendingException(thread);
91 }
|