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(®_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(®_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
|