Mercurial > hg > graal-jvmci-8
comparison src/share/vm/runtime/sharedRuntime.hpp @ 1187:cf0685d550f1
6911204: generated adapters with large signatures can fill up the code cache
Reviewed-by: kvn, jrose
author | never |
---|---|
date | Wed, 20 Jan 2010 22:10:33 -0800 |
parents | dd57230ba8fe |
children | 74c848d437ab |
comparison
equal
deleted
inserted
replaced
1179:3d6016e040d6 | 1187:cf0685d550f1 |
---|---|
1 /* | 1 /* |
2 * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. | 2 * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
21 * have any questions. | 21 * have any questions. |
22 * | 22 * |
23 */ | 23 */ |
24 | 24 |
25 class AdapterHandlerEntry; | 25 class AdapterHandlerEntry; |
26 class AdapterHandlerTable; | |
27 class AdapterFingerPrint; | |
26 class vframeStream; | 28 class vframeStream; |
27 | 29 |
28 // Runtime is the base class for various runtime interfaces | 30 // Runtime is the base class for various runtime interfaces |
29 // (InterpreterRuntime, CompilerRuntime, etc.). It provides | 31 // (InterpreterRuntime, CompilerRuntime, etc.). It provides |
30 // shared functionality such as exception forwarding (C++ to | 32 // shared functionality such as exception forwarding (C++ to |
335 | 337 |
336 static AdapterHandlerEntry* generate_i2c2i_adapters(MacroAssembler *_masm, | 338 static AdapterHandlerEntry* generate_i2c2i_adapters(MacroAssembler *_masm, |
337 int total_args_passed, | 339 int total_args_passed, |
338 int max_arg, | 340 int max_arg, |
339 const BasicType *sig_bt, | 341 const BasicType *sig_bt, |
340 const VMRegPair *regs); | 342 const VMRegPair *regs, |
343 AdapterFingerPrint* fingerprint); | |
341 | 344 |
342 // OSR support | 345 // OSR support |
343 | 346 |
344 // OSR_migration_begin will extract the jvm state from an interpreter | 347 // OSR_migration_begin will extract the jvm state from an interpreter |
345 // frame (locals, monitors) and store the data in a piece of C heap | 348 // frame (locals, monitors) and store the data in a piece of C heap |
526 // routine in their middles and end in a return (instead of ending in a jump). | 529 // routine in their middles and end in a return (instead of ending in a jump). |
527 // The native wrappers are stored in real nmethods instead of the BufferBlobs | 530 // The native wrappers are stored in real nmethods instead of the BufferBlobs |
528 // used by the adapters. The code generation happens here because it's very | 531 // used by the adapters. The code generation happens here because it's very |
529 // similar to what the adapters have to do. | 532 // similar to what the adapters have to do. |
530 | 533 |
531 class AdapterHandlerEntry : public CHeapObj { | 534 class AdapterHandlerEntry : public BasicHashtableEntry { |
535 friend class AdapterHandlerTable; | |
536 | |
532 private: | 537 private: |
538 AdapterFingerPrint* _fingerprint; | |
533 address _i2c_entry; | 539 address _i2c_entry; |
534 address _c2i_entry; | 540 address _c2i_entry; |
535 address _c2i_unverified_entry; | 541 address _c2i_unverified_entry; |
536 | 542 |
543 void init(AdapterFingerPrint* fingerprint, address i2c_entry, address c2i_entry, address c2i_unverified_entry) { | |
544 _fingerprint = fingerprint; | |
545 _i2c_entry = i2c_entry; | |
546 _c2i_entry = c2i_entry; | |
547 _c2i_unverified_entry = c2i_unverified_entry; | |
548 } | |
549 | |
550 // should never be used | |
551 AdapterHandlerEntry(); | |
552 | |
537 public: | 553 public: |
538 | |
539 // The name we give all buffer blobs | 554 // The name we give all buffer blobs |
540 static const char* name; | 555 static const char* name; |
541 | |
542 AdapterHandlerEntry(address i2c_entry, address c2i_entry, address c2i_unverified_entry): | |
543 _i2c_entry(i2c_entry), | |
544 _c2i_entry(c2i_entry), | |
545 _c2i_unverified_entry(c2i_unverified_entry) { | |
546 } | |
547 | 556 |
548 address get_i2c_entry() { return _i2c_entry; } | 557 address get_i2c_entry() { return _i2c_entry; } |
549 address get_c2i_entry() { return _c2i_entry; } | 558 address get_c2i_entry() { return _c2i_entry; } |
550 address get_c2i_unverified_entry() { return _c2i_unverified_entry; } | 559 address get_c2i_unverified_entry() { return _c2i_unverified_entry; } |
551 | 560 |
552 void relocate(address new_base); | 561 void relocate(address new_base); |
562 | |
563 AdapterFingerPrint* fingerprint() { return _fingerprint; } | |
564 | |
565 AdapterHandlerEntry* next() { | |
566 return (AdapterHandlerEntry*)BasicHashtableEntry::next(); | |
567 } | |
568 | |
553 #ifndef PRODUCT | 569 #ifndef PRODUCT |
554 void print(); | 570 void print(); |
555 #endif /* PRODUCT */ | 571 #endif /* PRODUCT */ |
556 }; | 572 }; |
557 | 573 |
558 class AdapterHandlerLibrary: public AllStatic { | 574 class AdapterHandlerLibrary: public AllStatic { |
559 private: | 575 private: |
560 static BufferBlob* _buffer; // the temporary code buffer in CodeCache | 576 static BufferBlob* _buffer; // the temporary code buffer in CodeCache |
561 static GrowableArray<uint64_t>* _fingerprints; // the fingerprint collection | 577 static AdapterHandlerTable* _adapters; |
562 static GrowableArray<AdapterHandlerEntry*> * _handlers; // the corresponding handlers | 578 static AdapterHandlerEntry* _abstract_method_handler; |
563 enum { | |
564 AbstractMethodHandler = 1 // special handler for abstract methods | |
565 }; | |
566 static BufferBlob* buffer_blob(); | 579 static BufferBlob* buffer_blob(); |
567 static void initialize(); | 580 static void initialize(); |
568 static int get_create_adapter_index(methodHandle method); | |
569 static address get_i2c_entry( int index ) { | |
570 return get_entry(index)->get_i2c_entry(); | |
571 } | |
572 static address get_c2i_entry( int index ) { | |
573 return get_entry(index)->get_c2i_entry(); | |
574 } | |
575 static address get_c2i_unverified_entry( int index ) { | |
576 return get_entry(index)->get_c2i_unverified_entry(); | |
577 } | |
578 | 581 |
579 public: | 582 public: |
580 static AdapterHandlerEntry* get_entry( int index ) { return _handlers->at(index); } | 583 |
584 static AdapterHandlerEntry* new_entry(AdapterFingerPrint* fingerprint, | |
585 address i2c_entry, address c2i_entry, address c2i_unverified_entry); | |
581 static nmethod* create_native_wrapper(methodHandle method); | 586 static nmethod* create_native_wrapper(methodHandle method); |
582 static AdapterHandlerEntry* get_adapter(methodHandle method) { | 587 static AdapterHandlerEntry* get_adapter(methodHandle method); |
583 return get_entry(get_create_adapter_index(method)); | 588 |
584 } | |
585 #ifdef HAVE_DTRACE_H | 589 #ifdef HAVE_DTRACE_H |
586 static nmethod* create_dtrace_nmethod (methodHandle method); | 590 static nmethod* create_dtrace_nmethod (methodHandle method); |
587 #endif // HAVE_DTRACE_H | 591 #endif // HAVE_DTRACE_H |
588 | 592 |
589 #ifndef PRODUCT | 593 #ifndef PRODUCT |
590 static void print_handler(CodeBlob* b); | 594 static void print_handler(CodeBlob* b); |
591 static bool contains(CodeBlob* b); | 595 static bool contains(CodeBlob* b); |
596 static void print_statistics(); | |
592 #endif /* PRODUCT */ | 597 #endif /* PRODUCT */ |
593 | 598 |
594 }; | 599 }; |