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