533 // Continuation point for throwing of implicit exceptions that are
534 // not handled in the current activation. Fabricates an exception
535 // oop and initiates normal exception dispatching in this
536 // frame. Since we need to preserve callee-saved values (currently
537 // only for C2, but done for C1 as well) we need a callee-saved oop
538 // map and therefore have to make these stubs into RuntimeStubs
539 // rather than BufferBlobs. If the compiler needs all registers to
540 // be preserved between the fault point and the exception handler
541 // then it must assume responsibility for that in
542 // AbstractCompiler::continuation_for_implicit_null_exception or
543 // continuation_for_implicit_division_by_zero_exception. All other
544 // implicit exceptions (e.g., NullPointerException or
545 // AbstractMethodError on entry) are either at call sites or
546 // otherwise assume that stack unwinding will be initiated, so
547 // caller saved registers were assumed volatile in the compiler.
548 address generate_throw_exception(const char* name,
549 address runtime_entry,
550 Register arg1 = noreg,
551 Register arg2 = noreg);
552
553 void create_control_words();
554
555 // Initialization
556 void generate_initial_stubs();
557 void generate_continuation_stubs();
558 void generate_compiler_stubs();
559 void generate_final_stubs();
560
561 public:
562 StubGenerator(CodeBuffer* code, StubsKind kind);
563 };
564
565 #endif // CPU_X86_STUBGENERATOR_X86_64_HPP
|
533 // Continuation point for throwing of implicit exceptions that are
534 // not handled in the current activation. Fabricates an exception
535 // oop and initiates normal exception dispatching in this
536 // frame. Since we need to preserve callee-saved values (currently
537 // only for C2, but done for C1 as well) we need a callee-saved oop
538 // map and therefore have to make these stubs into RuntimeStubs
539 // rather than BufferBlobs. If the compiler needs all registers to
540 // be preserved between the fault point and the exception handler
541 // then it must assume responsibility for that in
542 // AbstractCompiler::continuation_for_implicit_null_exception or
543 // continuation_for_implicit_division_by_zero_exception. All other
544 // implicit exceptions (e.g., NullPointerException or
545 // AbstractMethodError on entry) are either at call sites or
546 // otherwise assume that stack unwinding will be initiated, so
547 // caller saved registers were assumed volatile in the compiler.
548 address generate_throw_exception(const char* name,
549 address runtime_entry,
550 Register arg1 = noreg,
551 Register arg2 = noreg);
552
553 // interpreter or compiled code marshalling registers to/from inline type instance
554 address generate_return_value_stub(address destination, const char* name, bool has_res);
555
556 void create_control_words();
557
558 // Initialization
559 void generate_initial_stubs();
560 void generate_continuation_stubs();
561 void generate_compiler_stubs();
562 void generate_final_stubs();
563
564 public:
565 StubGenerator(CodeBuffer* code, StubsKind kind);
566 };
567
568 #endif // CPU_X86_STUBGENERATOR_X86_64_HPP
|