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