Mercurial > hg > truffle
annotate src/share/vm/code/vmreg.hpp @ 1721:413ad0331a0c
6977924: Changes for 6975078 produce build error with certain gcc versions
Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error.
Reviewed-by: jcoomes, ysr, phh
author | johnc |
---|---|
date | Wed, 18 Aug 2010 10:59:06 -0700 |
parents | c18cbe5936b8 |
children | f95d63e2154a |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
196
diff
changeset
|
2 * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
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 | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
196
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
196
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
196
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 //------------------------------VMReg------------------------------------------ | |
26 // The VM uses 'unwarped' stack slots; the compiler uses 'warped' stack slots. | |
27 // Register numbers below VMRegImpl::stack0 are the same for both. Register | |
28 // numbers above stack0 are either warped (in the compiler) or unwarped | |
29 // (in the VM). Unwarped numbers represent stack indices, offsets from | |
30 // the current stack pointer. Warped numbers are required during compilation | |
31 // when we do not yet know how big the frame will be. | |
32 | |
33 class VMRegImpl; | |
34 typedef VMRegImpl* VMReg; | |
35 | |
36 class VMRegImpl { | |
37 // friend class OopMap; | |
38 friend class VMStructs; | |
39 friend class OptoReg; | |
40 // friend class Location; | |
41 private: | |
42 enum { | |
43 BAD = -1 | |
44 }; | |
45 | |
46 | |
47 | |
48 static VMReg stack0; | |
49 // Names for registers | |
50 static const char *regName[]; | |
51 static const int register_count; | |
52 | |
53 | |
54 public: | |
55 | |
56 static VMReg as_VMReg(int val, bool bad_ok = false) { assert(val > BAD || bad_ok, "invalid"); return (VMReg) (intptr_t) val; } | |
57 | |
58 const char* name() { | |
59 if (is_reg()) { | |
60 return regName[value()]; | |
61 } else if (!is_valid()) { | |
62 return "BAD"; | |
63 } else { | |
64 // shouldn't really be called with stack | |
65 return "STACKED REG"; | |
66 } | |
67 } | |
68 static VMReg Bad() { return (VMReg) (intptr_t) BAD; } | |
25
c5cbd367e4d1
6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents:
0
diff
changeset
|
69 bool is_valid() const { return ((intptr_t) this) != BAD; } |
c5cbd367e4d1
6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents:
0
diff
changeset
|
70 bool is_stack() const { return (intptr_t) this >= (intptr_t) stack0; } |
c5cbd367e4d1
6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents:
0
diff
changeset
|
71 bool is_reg() const { return is_valid() && !is_stack(); } |
0 | 72 |
73 // A concrete register is a value that returns true for is_reg() and is | |
74 // also a register you could use in the assembler. On machines with | |
75 // 64bit registers only one half of the VMReg (and OptoReg) is considered | |
76 // concrete. | |
77 bool is_concrete(); | |
78 | |
79 // VMRegs are 4 bytes wide on all platforms | |
80 static const int stack_slot_size; | |
81 static const int slots_per_word; | |
82 | |
83 | |
84 // This really ought to check that the register is "real" in the sense that | |
85 // we don't try and get the VMReg number of a physical register that doesn't | |
86 // have an expressible part. That would be pd specific code | |
87 VMReg next() { | |
88 assert((is_reg() && value() < stack0->value() - 1) || is_stack(), "must be"); | |
89 return (VMReg)(intptr_t)(value() + 1); | |
90 } | |
91 VMReg prev() { | |
92 assert((is_stack() && value() > stack0->value()) || (is_reg() && value() != 0), "must be"); | |
93 return (VMReg)(intptr_t)(value() - 1); | |
94 } | |
95 | |
96 | |
97 intptr_t value() const {return (intptr_t) this; } | |
98 | |
100
c7c777385a15
6667042: PrintAssembly option does not work without special plugin
jrose
parents:
25
diff
changeset
|
99 void print_on(outputStream* st) const; |
25
c5cbd367e4d1
6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents:
0
diff
changeset
|
100 void print() const { print_on(tty); } |
0 | 101 |
102 // bias a stack slot. | |
103 // Typically used to adjust a virtual frame slots by amounts that are offset by | |
104 // amounts that are part of the native abi. The VMReg must be a stack slot | |
105 // and the result must be also. | |
106 | |
107 VMReg bias(int offset) { | |
108 assert(is_stack(), "must be"); | |
109 // VMReg res = VMRegImpl::as_VMReg(value() + offset); | |
110 VMReg res = stack2reg(reg2stack() + offset); | |
111 assert(res->is_stack(), "must be"); | |
112 return res; | |
113 } | |
114 | |
115 // Convert register numbers to stack slots and vice versa | |
116 static VMReg stack2reg( int idx ) { | |
117 return (VMReg) (intptr_t) (stack0->value() + idx); | |
118 } | |
119 | |
120 uintptr_t reg2stack() { | |
121 assert( is_stack(), "Not a stack-based register" ); | |
122 return value() - stack0->value(); | |
123 } | |
124 | |
125 static void set_regName(); | |
126 | |
127 #include "incls/_vmreg_pd.hpp.incl" | |
128 | |
129 }; | |
130 | |
131 //---------------------------VMRegPair------------------------------------------- | |
132 // Pairs of 32-bit registers for arguments. | |
133 // SharedRuntime::java_calling_convention will overwrite the structs with | |
134 // the calling convention's registers. VMRegImpl::Bad is returned for any | |
135 // unused 32-bit register. This happens for the unused high half of Int | |
136 // arguments, or for 32-bit pointers or for longs in the 32-bit sparc build | |
137 // (which are passed to natives in low 32-bits of e.g. O0/O1 and the high | |
138 // 32-bits of O0/O1 are set to VMRegImpl::Bad). Longs in one register & doubles | |
139 // always return a high and a low register, as do 64-bit pointers. | |
140 // | |
141 class VMRegPair { | |
142 private: | |
143 VMReg _second; | |
144 VMReg _first; | |
145 public: | |
146 void set_bad ( ) { _second=VMRegImpl::Bad(); _first=VMRegImpl::Bad(); } | |
147 void set1 ( VMReg v ) { _second=VMRegImpl::Bad(); _first=v; } | |
148 void set2 ( VMReg v ) { _second=v->next(); _first=v; } | |
149 void set_pair( VMReg second, VMReg first ) { _second= second; _first= first; } | |
150 void set_ptr ( VMReg ptr ) { | |
151 #ifdef _LP64 | |
152 _second = ptr->next(); | |
153 #else | |
154 _second = VMRegImpl::Bad(); | |
155 #endif | |
156 _first = ptr; | |
157 } | |
158 // Return true if single register, even if the pair is really just adjacent stack slots | |
100
c7c777385a15
6667042: PrintAssembly option does not work without special plugin
jrose
parents:
25
diff
changeset
|
159 bool is_single_reg() const { |
0 | 160 return (_first->is_valid()) && (_first->value() + 1 == _second->value()); |
161 } | |
162 | |
163 // Return true if single stack based "register" where the slot alignment matches input alignment | |
100
c7c777385a15
6667042: PrintAssembly option does not work without special plugin
jrose
parents:
25
diff
changeset
|
164 bool is_adjacent_on_stack(int alignment) const { |
0 | 165 return (_first->is_stack() && (_first->value() + 1 == _second->value()) && ((_first->value() & (alignment-1)) == 0)); |
166 } | |
167 | |
168 // Return true if single stack based "register" where the slot alignment matches input alignment | |
100
c7c777385a15
6667042: PrintAssembly option does not work without special plugin
jrose
parents:
25
diff
changeset
|
169 bool is_adjacent_aligned_on_stack(int alignment) const { |
0 | 170 return (_first->is_stack() && (_first->value() + 1 == _second->value()) && ((_first->value() & (alignment-1)) == 0)); |
171 } | |
172 | |
173 // Return true if single register but adjacent stack slots do not count | |
100
c7c777385a15
6667042: PrintAssembly option does not work without special plugin
jrose
parents:
25
diff
changeset
|
174 bool is_single_phys_reg() const { |
0 | 175 return (_first->is_reg() && (_first->value() + 1 == _second->value())); |
176 } | |
177 | |
178 VMReg second() const { return _second; } | |
179 VMReg first() const { return _first; } | |
180 VMRegPair(VMReg s, VMReg f) { _second = s; _first = f; } | |
181 VMRegPair(VMReg f) { _second = VMRegImpl::Bad(); _first = f; } | |
182 VMRegPair() { _second = VMRegImpl::Bad(); _first = VMRegImpl::Bad(); } | |
183 }; |