618 // only for C2, but done for C1 as well) we need a callee-saved oop
619 // map and therefore have to make these stubs into RuntimeStubs
620 // rather than BufferBlobs. If the compiler needs all registers to
621 // be preserved between the fault point and the exception handler
622 // then it must assume responsibility for that in
623 // AbstractCompiler::continuation_for_implicit_null_exception or
624 // continuation_for_implicit_division_by_zero_exception. All other
625 // implicit exceptions (e.g., NullPointerException or
626 // AbstractMethodError on entry) are either at call sites or
627 // otherwise assume that stack unwinding will be initiated, so
628 // caller saved registers were assumed volatile in the compiler.
629 address generate_throw_exception(const char* name,
630 address runtime_entry,
631 Register arg1 = noreg,
632 Register arg2 = noreg);
633
634 // shared exception handler for FFM upcall stubs
635 address generate_upcall_stub_exception_handler();
636 address generate_upcall_stub_load_target();
637
638 // Specialized stub implementations for UseSecondarySupersTable.
639 void generate_lookup_secondary_supers_table_stub();
640
641 // Slow path implementation for UseSecondarySupersTable.
642 address generate_lookup_secondary_supers_table_slow_path_stub();
643
644 void create_control_words();
645
646 // Initialization
647 void generate_preuniverse_stubs();
648 void generate_initial_stubs();
649 void generate_continuation_stubs();
650 void generate_compiler_stubs();
651 void generate_final_stubs();
652
653 public:
654 StubGenerator(CodeBuffer* code, BlobId blob_id);
655 };
656
657 #endif // CPU_X86_STUBGENERATOR_X86_64_HPP
|
618 // only for C2, but done for C1 as well) we need a callee-saved oop
619 // map and therefore have to make these stubs into RuntimeStubs
620 // rather than BufferBlobs. If the compiler needs all registers to
621 // be preserved between the fault point and the exception handler
622 // then it must assume responsibility for that in
623 // AbstractCompiler::continuation_for_implicit_null_exception or
624 // continuation_for_implicit_division_by_zero_exception. All other
625 // implicit exceptions (e.g., NullPointerException or
626 // AbstractMethodError on entry) are either at call sites or
627 // otherwise assume that stack unwinding will be initiated, so
628 // caller saved registers were assumed volatile in the compiler.
629 address generate_throw_exception(const char* name,
630 address runtime_entry,
631 Register arg1 = noreg,
632 Register arg2 = noreg);
633
634 // shared exception handler for FFM upcall stubs
635 address generate_upcall_stub_exception_handler();
636 address generate_upcall_stub_load_target();
637
638 // interpreter or compiled code marshalling registers to/from inline type instance
639 address generate_return_value_stub(address destination, const char* name, bool has_res);
640
641 // Specialized stub implementations for UseSecondarySupersTable.
642 void generate_lookup_secondary_supers_table_stub();
643
644 // Slow path implementation for UseSecondarySupersTable.
645 address generate_lookup_secondary_supers_table_slow_path_stub();
646
647 void create_control_words();
648
649 // Initialization
650 void generate_preuniverse_stubs();
651 void generate_initial_stubs();
652 void generate_continuation_stubs();
653 void generate_compiler_stubs();
654 void generate_final_stubs();
655
656 public:
657 StubGenerator(CodeBuffer* code, BlobId blob_id);
658 };
659
660 #endif // CPU_X86_STUBGENERATOR_X86_64_HPP
|