< prev index next >

src/share/vm/opto/runtime.cpp

Print this page
rev 10512 : value type calling convention


 598   fields = TypeTuple::fields(0);
 599   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
 600 
 601   return TypeFunc::make(domain, range);
 602 }
 603 
 604 //-----------------------------------------------------------------------------
 605 // Monitor Handling
 606 const TypeFunc *OptoRuntime::complete_monitor_enter_Type() {
 607   // create input type (domain)
 608   const Type **fields = TypeTuple::fields(2);
 609   fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL;  // Object to be Locked
 610   fields[TypeFunc::Parms+1] = TypeRawPtr::BOTTOM;   // Address of stack location for lock
 611   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
 612 
 613   // create result type (range)
 614   fields = TypeTuple::fields(0);
 615 
 616   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
 617 
 618   return TypeFunc::make(domain,range);
 619 }
 620 
 621 
 622 //-----------------------------------------------------------------------------
 623 const TypeFunc *OptoRuntime::complete_monitor_exit_Type() {
 624   // create input type (domain)
 625   const Type **fields = TypeTuple::fields(3);
 626   fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL;  // Object to be Locked
 627   fields[TypeFunc::Parms+1] = TypeRawPtr::BOTTOM;    // Address of stack location for lock - BasicLock
 628   fields[TypeFunc::Parms+2] = TypeRawPtr::BOTTOM;    // Thread pointer (Self)
 629   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+3, fields);
 630 
 631   // create result type (range)
 632   fields = TypeTuple::fields(0);
 633 
 634   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
 635 
 636   return TypeFunc::make(domain, range);
 637 }
 638 


1185   fields = TypeTuple::fields(1);
1186   // fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // locked oop
1187   fields[TypeFunc::Parms+0] = NULL; // void
1188   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
1189   return TypeFunc::make(domain, range);
1190 }
1191 
1192 //-------------- methodData update helpers
1193 
1194 const TypeFunc* OptoRuntime::profile_receiver_type_Type() {
1195   // create input type (domain)
1196   const Type **fields = TypeTuple::fields(2);
1197   fields[TypeFunc::Parms+0] = TypeAryPtr::NOTNULL;    // methodData pointer
1198   fields[TypeFunc::Parms+1] = TypeInstPtr::BOTTOM;    // receiver oop
1199   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
1200 
1201   // create result type
1202   fields = TypeTuple::fields(1);
1203   fields[TypeFunc::Parms+0] = NULL; // void
1204   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
1205   return TypeFunc::make(domain,range);
1206 }
1207 
1208 JRT_LEAF(void, OptoRuntime::profile_receiver_type_C(DataLayout* data, oopDesc* receiver))
1209   if (receiver == NULL) return;
1210   Klass* receiver_klass = receiver->klass();
1211 
1212   intptr_t* mdp = ((intptr_t*)(data)) + DataLayout::header_size_in_cells();
1213   int empty_row = -1;           // free row, if any is encountered
1214 
1215   // ReceiverTypeData* vc = new ReceiverTypeData(mdp);
1216   for (uint row = 0; row < ReceiverTypeData::row_limit(); row++) {
1217     // if (vc->receiver(row) == receiver_klass)
1218     int receiver_off = ReceiverTypeData::receiver_cell_index(row);
1219     intptr_t row_recv = *(mdp + receiver_off);
1220     if (row_recv == (intptr_t) receiver_klass) {
1221       // vc->set_receiver_count(row, vc->receiver_count(row) + DataLayout::counter_increment);
1222       int count_off = ReceiverTypeData::receiver_count_cell_index(row);
1223       *(mdp + count_off) += DataLayout::counter_increment;
1224       return;
1225     } else if (row_recv == 0) {


1496   frame stub_frame = thread->last_frame();
1497   assert(stub_frame.is_runtime_frame() || exception_blob()->contains(stub_frame.pc()), "sanity check");
1498   frame caller_frame = stub_frame.sender(&reg_map);
1499   return caller_frame.is_deoptimized_frame();
1500 }
1501 
1502 
1503 const TypeFunc *OptoRuntime::register_finalizer_Type() {
1504   // create input type (domain)
1505   const Type **fields = TypeTuple::fields(1);
1506   fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL;  // oop;          Receiver
1507   // // The JavaThread* is passed to each routine as the last argument
1508   // fields[TypeFunc::Parms+1] = TypeRawPtr::NOTNULL;  // JavaThread *; Executing thread
1509   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1,fields);
1510 
1511   // create result type (range)
1512   fields = TypeTuple::fields(0);
1513 
1514   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
1515 
1516   return TypeFunc::make(domain,range);
1517 }
1518 
1519 
1520 //-----------------------------------------------------------------------------
1521 // Dtrace support.  entry and exit probes have the same signature
1522 const TypeFunc *OptoRuntime::dtrace_method_entry_exit_Type() {
1523   // create input type (domain)
1524   const Type **fields = TypeTuple::fields(2);
1525   fields[TypeFunc::Parms+0] = TypeRawPtr::BOTTOM; // Thread-local storage
1526   fields[TypeFunc::Parms+1] = TypeMetadataPtr::BOTTOM;  // Method*;    Method we are entering
1527   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
1528 
1529   // create result type (range)
1530   fields = TypeTuple::fields(0);
1531 
1532   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
1533 
1534   return TypeFunc::make(domain,range);
1535 }
1536 
1537 const TypeFunc *OptoRuntime::dtrace_object_alloc_Type() {
1538   // create input type (domain)
1539   const Type **fields = TypeTuple::fields(2);
1540   fields[TypeFunc::Parms+0] = TypeRawPtr::BOTTOM; // Thread-local storage
1541   fields[TypeFunc::Parms+1] = TypeInstPtr::NOTNULL;  // oop;    newly allocated object
1542 
1543   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
1544 
1545   // create result type (range)
1546   fields = TypeTuple::fields(0);
1547 
1548   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
1549 
1550   return TypeFunc::make(domain,range);
1551 }
1552 
1553 
1554 JRT_ENTRY_NO_ASYNC(void, OptoRuntime::register_finalizer(oopDesc* obj, JavaThread* thread))
1555   assert(obj->is_oop(), "must be a valid oop");
1556   assert(obj->klass()->has_finalizer(), "shouldn't be here otherwise");
1557   InstanceKlass::register_finalizer(instanceOop(obj), CHECK);
1558 JRT_END
1559 
1560 //-----------------------------------------------------------------------------
1561 
1562 NamedCounter * volatile OptoRuntime::_named_counters = NULL;
1563 
1564 //
1565 // dump the collected NamedCounters.
1566 //
1567 void OptoRuntime::print_named_counters() {
1568   int total_lock_count = 0;
1569   int eliminated_lock_count = 0;
1570 




 598   fields = TypeTuple::fields(0);
 599   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
 600 
 601   return TypeFunc::make(domain, range);
 602 }
 603 
 604 //-----------------------------------------------------------------------------
 605 // Monitor Handling
 606 const TypeFunc *OptoRuntime::complete_monitor_enter_Type() {
 607   // create input type (domain)
 608   const Type **fields = TypeTuple::fields(2);
 609   fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL;  // Object to be Locked
 610   fields[TypeFunc::Parms+1] = TypeRawPtr::BOTTOM;   // Address of stack location for lock
 611   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
 612 
 613   // create result type (range)
 614   fields = TypeTuple::fields(0);
 615 
 616   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
 617 
 618   return TypeFunc::make(domain, range);
 619 }
 620 
 621 
 622 //-----------------------------------------------------------------------------
 623 const TypeFunc *OptoRuntime::complete_monitor_exit_Type() {
 624   // create input type (domain)
 625   const Type **fields = TypeTuple::fields(3);
 626   fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL;  // Object to be Locked
 627   fields[TypeFunc::Parms+1] = TypeRawPtr::BOTTOM;    // Address of stack location for lock - BasicLock
 628   fields[TypeFunc::Parms+2] = TypeRawPtr::BOTTOM;    // Thread pointer (Self)
 629   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+3, fields);
 630 
 631   // create result type (range)
 632   fields = TypeTuple::fields(0);
 633 
 634   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
 635 
 636   return TypeFunc::make(domain, range);
 637 }
 638 


1185   fields = TypeTuple::fields(1);
1186   // fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // locked oop
1187   fields[TypeFunc::Parms+0] = NULL; // void
1188   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
1189   return TypeFunc::make(domain, range);
1190 }
1191 
1192 //-------------- methodData update helpers
1193 
1194 const TypeFunc* OptoRuntime::profile_receiver_type_Type() {
1195   // create input type (domain)
1196   const Type **fields = TypeTuple::fields(2);
1197   fields[TypeFunc::Parms+0] = TypeAryPtr::NOTNULL;    // methodData pointer
1198   fields[TypeFunc::Parms+1] = TypeInstPtr::BOTTOM;    // receiver oop
1199   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
1200 
1201   // create result type
1202   fields = TypeTuple::fields(1);
1203   fields[TypeFunc::Parms+0] = NULL; // void
1204   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
1205   return TypeFunc::make(domain, range);
1206 }
1207 
1208 JRT_LEAF(void, OptoRuntime::profile_receiver_type_C(DataLayout* data, oopDesc* receiver))
1209   if (receiver == NULL) return;
1210   Klass* receiver_klass = receiver->klass();
1211 
1212   intptr_t* mdp = ((intptr_t*)(data)) + DataLayout::header_size_in_cells();
1213   int empty_row = -1;           // free row, if any is encountered
1214 
1215   // ReceiverTypeData* vc = new ReceiverTypeData(mdp);
1216   for (uint row = 0; row < ReceiverTypeData::row_limit(); row++) {
1217     // if (vc->receiver(row) == receiver_klass)
1218     int receiver_off = ReceiverTypeData::receiver_cell_index(row);
1219     intptr_t row_recv = *(mdp + receiver_off);
1220     if (row_recv == (intptr_t) receiver_klass) {
1221       // vc->set_receiver_count(row, vc->receiver_count(row) + DataLayout::counter_increment);
1222       int count_off = ReceiverTypeData::receiver_count_cell_index(row);
1223       *(mdp + count_off) += DataLayout::counter_increment;
1224       return;
1225     } else if (row_recv == 0) {


1496   frame stub_frame = thread->last_frame();
1497   assert(stub_frame.is_runtime_frame() || exception_blob()->contains(stub_frame.pc()), "sanity check");
1498   frame caller_frame = stub_frame.sender(&reg_map);
1499   return caller_frame.is_deoptimized_frame();
1500 }
1501 
1502 
1503 const TypeFunc *OptoRuntime::register_finalizer_Type() {
1504   // create input type (domain)
1505   const Type **fields = TypeTuple::fields(1);
1506   fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL;  // oop;          Receiver
1507   // // The JavaThread* is passed to each routine as the last argument
1508   // fields[TypeFunc::Parms+1] = TypeRawPtr::NOTNULL;  // JavaThread *; Executing thread
1509   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1,fields);
1510 
1511   // create result type (range)
1512   fields = TypeTuple::fields(0);
1513 
1514   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
1515 
1516   return TypeFunc::make(domain, range);
1517 }
1518 
1519 
1520 //-----------------------------------------------------------------------------
1521 // Dtrace support.  entry and exit probes have the same signature
1522 const TypeFunc *OptoRuntime::dtrace_method_entry_exit_Type() {
1523   // create input type (domain)
1524   const Type **fields = TypeTuple::fields(2);
1525   fields[TypeFunc::Parms+0] = TypeRawPtr::BOTTOM; // Thread-local storage
1526   fields[TypeFunc::Parms+1] = TypeMetadataPtr::BOTTOM;  // Method*;    Method we are entering
1527   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
1528 
1529   // create result type (range)
1530   fields = TypeTuple::fields(0);
1531 
1532   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
1533 
1534   return TypeFunc::make(domain, range);
1535 }
1536 
1537 const TypeFunc *OptoRuntime::dtrace_object_alloc_Type() {
1538   // create input type (domain)
1539   const Type **fields = TypeTuple::fields(2);
1540   fields[TypeFunc::Parms+0] = TypeRawPtr::BOTTOM; // Thread-local storage
1541   fields[TypeFunc::Parms+1] = TypeInstPtr::NOTNULL;  // oop;    newly allocated object
1542 
1543   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2,fields);
1544 
1545   // create result type (range)
1546   fields = TypeTuple::fields(0);
1547 
1548   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
1549 
1550   return TypeFunc::make(domain, range);
1551 }
1552 
1553 
1554 JRT_ENTRY_NO_ASYNC(void, OptoRuntime::register_finalizer(oopDesc* obj, JavaThread* thread))
1555   assert(obj->is_oop(), "must be a valid oop");
1556   assert(obj->klass()->has_finalizer(), "shouldn't be here otherwise");
1557   InstanceKlass::register_finalizer(instanceOop(obj), CHECK);
1558 JRT_END
1559 
1560 //-----------------------------------------------------------------------------
1561 
1562 NamedCounter * volatile OptoRuntime::_named_counters = NULL;
1563 
1564 //
1565 // dump the collected NamedCounters.
1566 //
1567 void OptoRuntime::print_named_counters() {
1568   int total_lock_count = 0;
1569   int eliminated_lock_count = 0;
1570 


< prev index next >