Thu, 22 May 2014 15:52:41 -0400
8037816: Fix for 8036122 breaks build with Xcode5/clang
8043029: Change 8037816 breaks HS build with older GCC versions which don't support diagnostic pragmas
8043164: Format warning in traceStream.hpp
Summary: Backport of main fix + two corrections, enables clang compilation, turns on format attributes, corrects/mutes warnings
Reviewed-by: kvn, coleenp, iveresov, twisti
duke@435 | 1 | /* |
drchase@6680 | 2 | * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. |
duke@435 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
duke@435 | 4 | * |
duke@435 | 5 | * This code is free software; you can redistribute it and/or modify it |
duke@435 | 6 | * under the terms of the GNU General Public License version 2 only, as |
duke@435 | 7 | * published by the Free Software Foundation. |
duke@435 | 8 | * |
duke@435 | 9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
duke@435 | 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
duke@435 | 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
duke@435 | 12 | * version 2 for more details (a copy is included in the LICENSE file that |
duke@435 | 13 | * accompanied this code). |
duke@435 | 14 | * |
duke@435 | 15 | * You should have received a copy of the GNU General Public License version |
duke@435 | 16 | * 2 along with this work; if not, write to the Free Software Foundation, |
duke@435 | 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
duke@435 | 18 | * |
trims@1907 | 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
trims@1907 | 20 | * or visit www.oracle.com if you need additional information or have any |
trims@1907 | 21 | * questions. |
duke@435 | 22 | * |
duke@435 | 23 | */ |
duke@435 | 24 | |
stefank@2314 | 25 | #ifndef SHARE_VM_ASM_REGISTER_HPP |
stefank@2314 | 26 | #define SHARE_VM_ASM_REGISTER_HPP |
stefank@2314 | 27 | |
stefank@2314 | 28 | #include "utilities/top.hpp" |
stefank@2314 | 29 | |
duke@435 | 30 | // Use AbstractRegister as shortcut |
duke@435 | 31 | class AbstractRegisterImpl; |
duke@435 | 32 | typedef AbstractRegisterImpl* AbstractRegister; |
duke@435 | 33 | |
duke@435 | 34 | |
duke@435 | 35 | // The super class for platform specific registers. Instead of using value objects, |
duke@435 | 36 | // registers are implemented as pointers. Subclassing is used so all registers can |
duke@435 | 37 | // use the debugging suport below. No virtual functions are used for efficiency. |
duke@435 | 38 | // They are canonicalized; i.e., registers are equal if their pointers are equal, |
duke@435 | 39 | // and vice versa. A concrete implementation may just map the register onto 'this'. |
duke@435 | 40 | |
duke@435 | 41 | class AbstractRegisterImpl { |
duke@435 | 42 | protected: |
duke@435 | 43 | int value() const { return (int)(intx)this; } |
duke@435 | 44 | }; |
duke@435 | 45 | |
duke@435 | 46 | |
duke@435 | 47 | // |
duke@435 | 48 | // Macros for use in defining Register instances. We'd like to be |
duke@435 | 49 | // able to simply define const instances of the RegisterImpl* for each |
duke@435 | 50 | // of the registers needed on a system in a header file. However many |
duke@435 | 51 | // compilers don't handle this very well and end up producing a |
duke@435 | 52 | // private definition in every file which includes the header file. |
duke@435 | 53 | // Along with the static constructors necessary for initialization it |
duke@435 | 54 | // can consume a significant amount of space in the result library. |
duke@435 | 55 | // |
duke@435 | 56 | // The following macros allow us to declare the instance in a .hpp and |
duke@435 | 57 | // produce an enumeration value which has the same number. Then in a |
duke@435 | 58 | // .cpp the the register instance can be defined using the enumeration |
duke@435 | 59 | // value. This avoids the use of static constructors and multiple |
duke@435 | 60 | // definitions per .cpp. In addition #defines for the register can be |
duke@435 | 61 | // produced so that the constant registers can be inlined. These |
duke@435 | 62 | // macros should not be used inside other macros, because you may get |
duke@435 | 63 | // multiple evaluations of the macros which can give bad results. |
duke@435 | 64 | // |
duke@435 | 65 | // Here are some example uses and expansions. Note that the macro |
duke@435 | 66 | // invocation is terminated with a ;. |
duke@435 | 67 | // |
duke@435 | 68 | // CONSTANT_REGISTER_DECLARATION(Register, G0, 0); |
duke@435 | 69 | // |
duke@435 | 70 | // extern const Register G0 ; |
duke@435 | 71 | // enum { G0_RegisterEnumValue = 0 } ; |
duke@435 | 72 | // |
duke@435 | 73 | // REGISTER_DECLARATION(Register, Gmethod, G5); |
duke@435 | 74 | // |
duke@435 | 75 | // extern const Register Gmethod ; |
duke@435 | 76 | // enum { Gmethod_RegisterEnumValue = G5_RegisterEnumValue } ; |
duke@435 | 77 | // |
duke@435 | 78 | // REGISTER_DEFINITION(Register, G0); |
duke@435 | 79 | // |
duke@435 | 80 | // const Register G0 = ( ( Register ) G0_RegisterEnumValue ) ; |
duke@435 | 81 | // |
duke@435 | 82 | |
duke@435 | 83 | #define AS_REGISTER(type,name) ((type)name##_##type##EnumValue) |
duke@435 | 84 | |
duke@435 | 85 | #define CONSTANT_REGISTER_DECLARATION(type, name, value) \ |
duke@435 | 86 | extern const type name; \ |
duke@435 | 87 | enum { name##_##type##EnumValue = (value) } |
duke@435 | 88 | |
duke@435 | 89 | #define REGISTER_DECLARATION(type, name, value) \ |
duke@435 | 90 | extern const type name; \ |
duke@435 | 91 | enum { name##_##type##EnumValue = value##_##type##EnumValue } |
duke@435 | 92 | |
duke@435 | 93 | #define REGISTER_DEFINITION(type, name) \ |
duke@435 | 94 | const type name = ((type)name##_##type##EnumValue) |
duke@435 | 95 | |
twisti@4323 | 96 | #ifdef TARGET_ARCH_x86 |
twisti@4323 | 97 | # include "register_x86.hpp" |
twisti@4323 | 98 | #endif |
twisti@4323 | 99 | #ifdef TARGET_ARCH_sparc |
twisti@4323 | 100 | # include "register_sparc.hpp" |
twisti@4323 | 101 | #endif |
twisti@4323 | 102 | #ifdef TARGET_ARCH_zero |
twisti@4323 | 103 | # include "register_zero.hpp" |
twisti@4323 | 104 | #endif |
twisti@4323 | 105 | #ifdef TARGET_ARCH_arm |
twisti@4323 | 106 | # include "register_arm.hpp" |
twisti@4323 | 107 | #endif |
twisti@4323 | 108 | #ifdef TARGET_ARCH_ppc |
twisti@4323 | 109 | # include "register_ppc.hpp" |
twisti@4323 | 110 | #endif |
duke@435 | 111 | |
duke@435 | 112 | |
duke@435 | 113 | // Debugging support |
duke@435 | 114 | |
duke@435 | 115 | inline void assert_different_registers( |
duke@435 | 116 | AbstractRegister a, |
duke@435 | 117 | AbstractRegister b |
duke@435 | 118 | ) { |
duke@435 | 119 | assert( |
duke@435 | 120 | a != b, |
drchase@6680 | 121 | err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT "", |
drchase@6680 | 122 | p2i(a), p2i(b)) |
duke@435 | 123 | ); |
duke@435 | 124 | } |
duke@435 | 125 | |
duke@435 | 126 | |
duke@435 | 127 | inline void assert_different_registers( |
duke@435 | 128 | AbstractRegister a, |
duke@435 | 129 | AbstractRegister b, |
duke@435 | 130 | AbstractRegister c |
duke@435 | 131 | ) { |
duke@435 | 132 | assert( |
duke@435 | 133 | a != b && a != c |
duke@435 | 134 | && b != c, |
drchase@6680 | 135 | err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT |
drchase@6680 | 136 | ", c=" INTPTR_FORMAT "", |
drchase@6680 | 137 | p2i(a), p2i(b), p2i(c)) |
duke@435 | 138 | ); |
duke@435 | 139 | } |
duke@435 | 140 | |
duke@435 | 141 | |
duke@435 | 142 | inline void assert_different_registers( |
duke@435 | 143 | AbstractRegister a, |
duke@435 | 144 | AbstractRegister b, |
duke@435 | 145 | AbstractRegister c, |
duke@435 | 146 | AbstractRegister d |
duke@435 | 147 | ) { |
duke@435 | 148 | assert( |
duke@435 | 149 | a != b && a != c && a != d |
duke@435 | 150 | && b != c && b != d |
duke@435 | 151 | && c != d, |
drchase@6680 | 152 | err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT |
drchase@6680 | 153 | ", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT "", |
drchase@6680 | 154 | p2i(a), p2i(b), p2i(c), p2i(d)) |
duke@435 | 155 | ); |
duke@435 | 156 | } |
duke@435 | 157 | |
duke@435 | 158 | |
duke@435 | 159 | inline void assert_different_registers( |
duke@435 | 160 | AbstractRegister a, |
duke@435 | 161 | AbstractRegister b, |
duke@435 | 162 | AbstractRegister c, |
duke@435 | 163 | AbstractRegister d, |
duke@435 | 164 | AbstractRegister e |
duke@435 | 165 | ) { |
duke@435 | 166 | assert( |
duke@435 | 167 | a != b && a != c && a != d && a != e |
duke@435 | 168 | && b != c && b != d && b != e |
duke@435 | 169 | && c != d && c != e |
duke@435 | 170 | && d != e, |
drchase@6680 | 171 | err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT |
drchase@6680 | 172 | ", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT "", |
drchase@6680 | 173 | p2i(a), p2i(b), p2i(c), p2i(d), p2i(e)) |
duke@435 | 174 | ); |
duke@435 | 175 | } |
duke@435 | 176 | |
duke@435 | 177 | |
duke@435 | 178 | inline void assert_different_registers( |
duke@435 | 179 | AbstractRegister a, |
duke@435 | 180 | AbstractRegister b, |
duke@435 | 181 | AbstractRegister c, |
duke@435 | 182 | AbstractRegister d, |
duke@435 | 183 | AbstractRegister e, |
duke@435 | 184 | AbstractRegister f |
duke@435 | 185 | ) { |
duke@435 | 186 | assert( |
duke@435 | 187 | a != b && a != c && a != d && a != e && a != f |
duke@435 | 188 | && b != c && b != d && b != e && b != f |
duke@435 | 189 | && c != d && c != e && c != f |
duke@435 | 190 | && d != e && d != f |
duke@435 | 191 | && e != f, |
drchase@6680 | 192 | err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT |
drchase@6680 | 193 | ", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT |
drchase@6680 | 194 | ", f=" INTPTR_FORMAT "", |
drchase@6680 | 195 | p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f)) |
duke@435 | 196 | ); |
duke@435 | 197 | } |
duke@435 | 198 | |
duke@435 | 199 | |
duke@435 | 200 | inline void assert_different_registers( |
duke@435 | 201 | AbstractRegister a, |
duke@435 | 202 | AbstractRegister b, |
duke@435 | 203 | AbstractRegister c, |
duke@435 | 204 | AbstractRegister d, |
duke@435 | 205 | AbstractRegister e, |
duke@435 | 206 | AbstractRegister f, |
duke@435 | 207 | AbstractRegister g |
duke@435 | 208 | ) { |
duke@435 | 209 | assert( |
duke@435 | 210 | a != b && a != c && a != d && a != e && a != f && a != g |
duke@435 | 211 | && b != c && b != d && b != e && b != f && b != g |
duke@435 | 212 | && c != d && c != e && c != f && c != g |
duke@435 | 213 | && d != e && d != f && d != g |
duke@435 | 214 | && e != f && e != g |
duke@435 | 215 | && f != g, |
drchase@6680 | 216 | err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT |
drchase@6680 | 217 | ", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT |
drchase@6680 | 218 | ", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT "", |
drchase@6680 | 219 | p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g)) |
duke@435 | 220 | ); |
duke@435 | 221 | } |
duke@435 | 222 | |
duke@435 | 223 | |
duke@435 | 224 | inline void assert_different_registers( |
duke@435 | 225 | AbstractRegister a, |
duke@435 | 226 | AbstractRegister b, |
duke@435 | 227 | AbstractRegister c, |
duke@435 | 228 | AbstractRegister d, |
duke@435 | 229 | AbstractRegister e, |
duke@435 | 230 | AbstractRegister f, |
duke@435 | 231 | AbstractRegister g, |
duke@435 | 232 | AbstractRegister h |
duke@435 | 233 | ) { |
duke@435 | 234 | assert( |
duke@435 | 235 | a != b && a != c && a != d && a != e && a != f && a != g && a != h |
duke@435 | 236 | && b != c && b != d && b != e && b != f && b != g && b != h |
duke@435 | 237 | && c != d && c != e && c != f && c != g && c != h |
duke@435 | 238 | && d != e && d != f && d != g && d != h |
duke@435 | 239 | && e != f && e != g && e != h |
duke@435 | 240 | && f != g && f != h |
duke@435 | 241 | && g != h, |
drchase@6680 | 242 | err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT |
drchase@6680 | 243 | ", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT |
drchase@6680 | 244 | ", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT "", |
drchase@6680 | 245 | p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h)) |
twisti@3969 | 246 | ); |
twisti@3969 | 247 | } |
twisti@3969 | 248 | |
twisti@3969 | 249 | |
twisti@3969 | 250 | inline void assert_different_registers( |
twisti@3969 | 251 | AbstractRegister a, |
twisti@3969 | 252 | AbstractRegister b, |
twisti@3969 | 253 | AbstractRegister c, |
twisti@3969 | 254 | AbstractRegister d, |
twisti@3969 | 255 | AbstractRegister e, |
twisti@3969 | 256 | AbstractRegister f, |
twisti@3969 | 257 | AbstractRegister g, |
twisti@3969 | 258 | AbstractRegister h, |
twisti@3969 | 259 | AbstractRegister i |
twisti@3969 | 260 | ) { |
twisti@3969 | 261 | assert( |
twisti@3969 | 262 | a != b && a != c && a != d && a != e && a != f && a != g && a != h && a != i |
twisti@3969 | 263 | && b != c && b != d && b != e && b != f && b != g && b != h && b != i |
twisti@3969 | 264 | && c != d && c != e && c != f && c != g && c != h && c != i |
twisti@3969 | 265 | && d != e && d != f && d != g && d != h && d != i |
twisti@3969 | 266 | && e != f && e != g && e != h && e != i |
twisti@3969 | 267 | && f != g && f != h && f != i |
twisti@3969 | 268 | && g != h && g != i |
twisti@3969 | 269 | && h != i, |
drchase@6680 | 270 | err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT |
drchase@6680 | 271 | ", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT |
drchase@6680 | 272 | ", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT |
drchase@6680 | 273 | ", i=" INTPTR_FORMAT "", |
drchase@6680 | 274 | p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h), p2i(i)) |
duke@435 | 275 | ); |
duke@435 | 276 | } |
stefank@2314 | 277 | |
stefank@2314 | 278 | #endif // SHARE_VM_ASM_REGISTER_HPP |