395 // Adapt a method's signature if it contains 32 bit integers that must |
395 // Adapt a method's signature if it contains 32 bit integers that must |
396 // be converted to longs. Needed if CCallingConventionRequiresIntsAsLongs |
396 // be converted to longs. Needed if CCallingConventionRequiresIntsAsLongs |
397 // is true. |
397 // is true. |
398 static void convert_ints_to_longints(int i2l_argcnt, int& in_args_count, |
398 static void convert_ints_to_longints(int i2l_argcnt, int& in_args_count, |
399 BasicType*& in_sig_bt, VMRegPair*& in_regs); |
399 BasicType*& in_sig_bt, VMRegPair*& in_regs); |
|
400 |
|
401 static size_t trampoline_size(); |
|
402 |
|
403 static void generate_trampoline(MacroAssembler *masm, address destination); |
400 |
404 |
401 // Generate I2C and C2I adapters. These adapters are simple argument marshalling |
405 // Generate I2C and C2I adapters. These adapters are simple argument marshalling |
402 // blobs. Unlike adapters in the tiger and earlier releases the code in these |
406 // blobs. Unlike adapters in the tiger and earlier releases the code in these |
403 // blobs does not create a new frame and are therefore virtually invisible |
407 // blobs does not create a new frame and are therefore virtually invisible |
404 // to the stack walking code. In general these blobs extend the callers stack |
408 // to the stack walking code. In general these blobs extend the callers stack |
678 |
682 |
679 //virtual void print_on(outputStream* st) const; DO NOT USE |
683 //virtual void print_on(outputStream* st) const; DO NOT USE |
680 void print_adapter_on(outputStream* st) const; |
684 void print_adapter_on(outputStream* st) const; |
681 }; |
685 }; |
682 |
686 |
|
687 class CDSAdapterHandlerEntry: public AdapterHandlerEntry { |
|
688 address _c2i_entry_trampoline; // allocated from shared spaces "MC" region |
|
689 AdapterHandlerEntry** _adapter_trampoline; // allocated from shared spaces "MD" region |
|
690 |
|
691 public: |
|
692 address get_c2i_entry_trampoline() const { return _c2i_entry_trampoline; } |
|
693 AdapterHandlerEntry** get_adapter_trampoline() const { return _adapter_trampoline; } |
|
694 void init() NOT_CDS_RETURN; |
|
695 }; |
|
696 |
|
697 |
683 class AdapterHandlerLibrary: public AllStatic { |
698 class AdapterHandlerLibrary: public AllStatic { |
684 private: |
699 private: |
685 static BufferBlob* _buffer; // the temporary code buffer in CodeCache |
700 static BufferBlob* _buffer; // the temporary code buffer in CodeCache |
686 static AdapterHandlerTable* _adapters; |
701 static AdapterHandlerTable* _adapters; |
687 static AdapterHandlerEntry* _abstract_method_handler; |
702 static AdapterHandlerEntry* _abstract_method_handler; |
688 static BufferBlob* buffer_blob(); |
703 static BufferBlob* buffer_blob(); |
689 static void initialize(); |
704 static void initialize(); |
|
705 static AdapterHandlerEntry* get_adapter0(const methodHandle& method); |
690 |
706 |
691 public: |
707 public: |
692 |
708 |
693 static AdapterHandlerEntry* new_entry(AdapterFingerPrint* fingerprint, |
709 static AdapterHandlerEntry* new_entry(AdapterFingerPrint* fingerprint, |
694 address i2c_entry, address c2i_entry, address c2i_unverified_entry); |
710 address i2c_entry, address c2i_entry, address c2i_unverified_entry); |