comparison src/share/vm/c1x/c1x_CodeInstaller.cpp @ 1469:52bb06250d35

Converted CiDebugInfo.registerRefMap field from type long to CiBitMap.
author Doug Simon <doug.simon@oracle.com>
date Fri, 19 Nov 2010 21:16:36 +0100
parents e4cd5d2de7e1
children ef7761803480
comparison
equal deleted inserted replaced
1468:e4cd5d2de7e1 1469:52bb06250d35
44 } else { 44 } else {
45 return XMM_REGS[c1x_reg - NUM_CPU_REGS]->as_VMReg(); 45 return XMM_REGS[c1x_reg - NUM_CPU_REGS]->as_VMReg();
46 } 46 }
47 } 47 }
48 48
49 static bool is_bit_set(oop bit_map, int i) {
50 if (i < 64) {
51 jlong low = CiBitMap::low(bit_map);
52 return (low & (1 << i)) != 0;
53 } else {
54 const unsigned int MapWordBits = 64;
55 jint extra_idx = (i - MapWordBits) / MapWordBits;
56 arrayOop extra = (arrayOop) CiBitMap::extra(bit_map);
57 assert(extra_idx >= 0 && extra_idx < extra->length(), "unexpected index");
58 jlong word = ((jlong*) extra->base(T_LONG))[extra_idx];
59 return (word & (1 << (i % MapWordBits))) != 0;
60 }
61 }
62
49 // creates a hotspot oop map out of the byte arrays provided by CiDebugInfo 63 // creates a hotspot oop map out of the byte arrays provided by CiDebugInfo
50 static OopMap* create_oop_map(jint frame_size, jint parameter_count, oop debug_info) { 64 static OopMap* create_oop_map(jint frame_size, jint parameter_count, oop debug_info) {
51 OopMap* map = new OopMap(frame_size, parameter_count); 65 OopMap* map = new OopMap(frame_size, parameter_count);
52 jlong register_map = CiDebugInfo::registerRefMap(debug_info); 66 oop register_map = (oop) CiDebugInfo::registerRefMap(debug_info);
53 oop frame_map = (oop) CiDebugInfo::frameRefMap(debug_info); 67 oop frame_map = (oop) CiDebugInfo::frameRefMap(debug_info);
54 68
55 assert(sizeof(register_map) * 8 >= (unsigned) NUM_CPU_REGS, "unexpected register_map length"); 69 if (register_map != NULL) {
56 if (register_map != NO_REF_MAP) { 70 assert(CiBitMap::size(register_map) == (unsigned) NUM_CPU_REGS, "unexpected register_map length");
57 for (jint i = 0; i < NUM_CPU_REGS; i++) { 71 for (jint i = 0; i < NUM_CPU_REGS; i++) {
58 bool is_oop = (register_map & (1L << i)) != 0; 72 bool is_oop = is_bit_set(register_map, i);
59 VMReg reg = get_hotspot_reg(i); 73 VMReg reg = get_hotspot_reg(i);
60 if (is_oop) { 74 if (is_oop) {
61 assert(OOP_ALLOWED[i], "this register may never be an oop, register map misaligned?"); 75 assert(OOP_ALLOWED[i], "this register may never be an oop, register map misaligned?");
62 map->set_oop(reg); 76 map->set_oop(reg);
63 } else { 77 } else {
68 82
69 if (frame_size > 0) { 83 if (frame_size > 0) {
70 assert(CiBitMap::size(frame_map) == frame_size / HeapWordSize, "unexpected frame_map length"); 84 assert(CiBitMap::size(frame_map) == frame_size / HeapWordSize, "unexpected frame_map length");
71 85
72 for (jint i = 0; i < frame_size / HeapWordSize; i++) { 86 for (jint i = 0; i < frame_size / HeapWordSize; i++) {
73 bool is_oop; 87 bool is_oop = is_bit_set(frame_map, i);
74 if (i < 64) {
75 jlong low = CiBitMap::low(frame_map);
76 is_oop = (low & (1 << i)) != 0;
77 } else {
78 const unsigned int MapWordBits = 64;
79 jint extra_idx = (i - MapWordBits) / MapWordBits;
80 arrayOop extra = (arrayOop) CiBitMap::extra(frame_map);
81 assert(extra_idx >= 0 && extra_idx < extra->length(), "unexpected index");
82 jlong word = ((jlong*) extra->base(T_LONG))[extra_idx];
83 is_oop = (word & (1 << (i % MapWordBits))) != 0;
84 }
85 // hotspot stack slots are 4 bytes 88 // hotspot stack slots are 4 bytes
86 VMReg reg = VMRegImpl::stack2reg(i * 2); 89 VMReg reg = VMRegImpl::stack2reg(i * 2);
87 if (is_oop) { 90 if (is_oop) {
88 map->set_oop(reg); 91 map->set_oop(reg);
89 } else { 92 } else {