Mercurial > hg > graal-jvmci-8
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 { |