563 // frame. Since we need to preserve callee-saved values (currently
564 // only for C2, but done for C1 as well) we need a callee-saved oop
565 // map and therefore have to make these stubs into RuntimeStubs
566 // rather than BufferBlobs. If the compiler needs all registers to
567 // be preserved between the fault point and the exception handler
568 // then it must assume responsibility for that in
569 // AbstractCompiler::continuation_for_implicit_null_exception or
570 // continuation_for_implicit_division_by_zero_exception. All other
571 // implicit exceptions (e.g., NullPointerException or
572 // AbstractMethodError on entry) are either at call sites or
573 // otherwise assume that stack unwinding will be initiated, so
574 // caller saved registers were assumed volatile in the compiler.
575 address generate_throw_exception(const char* name,
576 address runtime_entry,
577 Register arg1 = noreg,
578 Register arg2 = noreg);
579
580 // shared exception handler for FFM upcall stubs
581 address generate_upcall_stub_exception_handler();
582
583 void create_control_words();
584
585 // Initialization
586 void generate_initial_stubs();
587 void generate_continuation_stubs();
588 void generate_compiler_stubs();
589 void generate_final_stubs();
590
591 public:
592 StubGenerator(CodeBuffer* code, StubsKind kind);
593 };
594
595 #endif // CPU_X86_STUBGENERATOR_X86_64_HPP
|
563 // frame. Since we need to preserve callee-saved values (currently
564 // only for C2, but done for C1 as well) we need a callee-saved oop
565 // map and therefore have to make these stubs into RuntimeStubs
566 // rather than BufferBlobs. If the compiler needs all registers to
567 // be preserved between the fault point and the exception handler
568 // then it must assume responsibility for that in
569 // AbstractCompiler::continuation_for_implicit_null_exception or
570 // continuation_for_implicit_division_by_zero_exception. All other
571 // implicit exceptions (e.g., NullPointerException or
572 // AbstractMethodError on entry) are either at call sites or
573 // otherwise assume that stack unwinding will be initiated, so
574 // caller saved registers were assumed volatile in the compiler.
575 address generate_throw_exception(const char* name,
576 address runtime_entry,
577 Register arg1 = noreg,
578 Register arg2 = noreg);
579
580 // shared exception handler for FFM upcall stubs
581 address generate_upcall_stub_exception_handler();
582
583 // interpreter or compiled code marshalling registers to/from inline type instance
584 address generate_return_value_stub(address destination, const char* name, bool has_res);
585
586 void create_control_words();
587
588 // Initialization
589 void generate_initial_stubs();
590 void generate_continuation_stubs();
591 void generate_compiler_stubs();
592 void generate_final_stubs();
593
594 public:
595 StubGenerator(CodeBuffer* code, StubsKind kind);
596 };
597
598 #endif // CPU_X86_STUBGENERATOR_X86_64_HPP
|