Vladimir Marko | 7dac864 | 2019-11-06 17:09:30 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2019 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
Vladimir Marko | 654f01c | 2021-05-26 16:40:20 +0100 | [diff] [blame] | 17 | #include <sstream> |
| 18 | |
Vladimir Marko | 7dac864 | 2019-11-06 17:09:30 +0000 | [diff] [blame] | 19 | #include "jni.h" |
| 20 | |
Vladimir Marko | 654f01c | 2021-05-26 16:40:20 +0100 | [diff] [blame] | 21 | #include "arch/context.h" |
| 22 | #include "monitor.h" |
| 23 | #include "scoped_thread_state_change-inl.h" |
| 24 | #include "stack.h" |
| 25 | #include "thread-current-inl.h" |
| 26 | |
Vladimir Marko | 7dac864 | 2019-11-06 17:09:30 +0000 | [diff] [blame] | 27 | namespace art { |
| 28 | |
| 29 | static inline bool VerifyManyParameters( |
| 30 | jint i1, jlong l1, jfloat f1, jdouble d1, |
| 31 | jint i2, jlong l2, jfloat f2, jdouble d2, |
| 32 | jint i3, jlong l3, jfloat f3, jdouble d3, |
| 33 | jint i4, jlong l4, jfloat f4, jdouble d4, |
| 34 | jint i5, jlong l5, jfloat f5, jdouble d5, |
| 35 | jint i6, jlong l6, jfloat f6, jdouble d6, |
| 36 | jint i7, jlong l7, jfloat f7, jdouble d7, |
| 37 | jint i8, jlong l8, jfloat f8, jdouble d8) { |
| 38 | return |
| 39 | (i1 == 11) && (l1 == 12) && (f1 == 13.0) && (d1 == 14.0) && |
| 40 | (i2 == 21) && (l2 == 22) && (f2 == 23.0) && (d2 == 24.0) && |
| 41 | (i3 == 31) && (l3 == 32) && (f3 == 33.0) && (d3 == 34.0) && |
| 42 | (i4 == 41) && (l4 == 42) && (f4 == 43.0) && (d4 == 44.0) && |
| 43 | (i5 == 51) && (l5 == 52) && (f5 == 53.0) && (d5 == 54.0) && |
| 44 | (i6 == 61) && (l6 == 62) && (f6 == 63.0) && (d6 == 64.0) && |
| 45 | (i7 == 71) && (l7 == 72) && (f7 == 73.0) && (d7 == 74.0) && |
| 46 | (i8 == 81) && (l8 == 82) && (f8 == 83.0) && (d8 == 84.0); |
| 47 | } |
| 48 | |
Vladimir Marko | fa458ac | 2020-02-12 14:08:07 +0000 | [diff] [blame] | 49 | extern "C" JNIEXPORT jint JNICALL Java_Test_nativeMethodVoid(JNIEnv*, jclass) { |
| 50 | return 42; |
| 51 | } |
| 52 | |
Vladimir Marko | 7dac864 | 2019-11-06 17:09:30 +0000 | [diff] [blame] | 53 | extern "C" JNIEXPORT jint JNICALL Java_Test_nativeMethod(JNIEnv*, jclass, jint i) { |
| 54 | return i; |
| 55 | } |
| 56 | |
| 57 | extern "C" JNIEXPORT jint JNICALL Java_Test_nativeMethodWithManyParameters( |
| 58 | JNIEnv*, jclass, |
| 59 | jint i1, jlong l1, jfloat f1, jdouble d1, |
| 60 | jint i2, jlong l2, jfloat f2, jdouble d2, |
| 61 | jint i3, jlong l3, jfloat f3, jdouble d3, |
| 62 | jint i4, jlong l4, jfloat f4, jdouble d4, |
| 63 | jint i5, jlong l5, jfloat f5, jdouble d5, |
| 64 | jint i6, jlong l6, jfloat f6, jdouble d6, |
| 65 | jint i7, jlong l7, jfloat f7, jdouble d7, |
| 66 | jint i8, jlong l8, jfloat f8, jdouble d8) { |
| 67 | bool ok = VerifyManyParameters( |
| 68 | i1, l1, f1, d1, |
| 69 | i2, l2, f2, d2, |
| 70 | i3, l3, f3, d3, |
| 71 | i4, l4, f4, d4, |
| 72 | i5, l5, f5, d5, |
| 73 | i6, l6, f6, d6, |
| 74 | i7, l7, f7, d7, |
| 75 | i8, l8, f8, d8); |
| 76 | return ok ? 42 : -1; |
| 77 | } |
| 78 | |
Vladimir Marko | fa458ac | 2020-02-12 14:08:07 +0000 | [diff] [blame] | 79 | extern "C" JNIEXPORT jint JNICALL Java_TestFast_nativeMethodVoid(JNIEnv*, jclass) { |
| 80 | return 42; |
| 81 | } |
| 82 | |
Vladimir Marko | 7dac864 | 2019-11-06 17:09:30 +0000 | [diff] [blame] | 83 | extern "C" JNIEXPORT jint JNICALL Java_TestFast_nativeMethod(JNIEnv*, jclass, jint i) { |
| 84 | return i; |
| 85 | } |
| 86 | |
| 87 | extern "C" JNIEXPORT jint JNICALL Java_TestFast_nativeMethodWithManyParameters( |
| 88 | JNIEnv*, jclass, |
| 89 | jint i1, jlong l1, jfloat f1, jdouble d1, |
| 90 | jint i2, jlong l2, jfloat f2, jdouble d2, |
| 91 | jint i3, jlong l3, jfloat f3, jdouble d3, |
| 92 | jint i4, jlong l4, jfloat f4, jdouble d4, |
| 93 | jint i5, jlong l5, jfloat f5, jdouble d5, |
| 94 | jint i6, jlong l6, jfloat f6, jdouble d6, |
| 95 | jint i7, jlong l7, jfloat f7, jdouble d7, |
| 96 | jint i8, jlong l8, jfloat f8, jdouble d8) { |
| 97 | bool ok = VerifyManyParameters( |
| 98 | i1, l1, f1, d1, |
| 99 | i2, l2, f2, d2, |
| 100 | i3, l3, f3, d3, |
| 101 | i4, l4, f4, d4, |
| 102 | i5, l5, f5, d5, |
| 103 | i6, l6, f6, d6, |
| 104 | i7, l7, f7, d7, |
| 105 | i8, l8, f8, d8); |
| 106 | return ok ? 42 : -1; |
| 107 | } |
| 108 | |
Vladimir Marko | fa458ac | 2020-02-12 14:08:07 +0000 | [diff] [blame] | 109 | extern "C" JNIEXPORT jint JNICALL Java_TestCritical_nativeMethodVoid() { |
| 110 | return 42; |
| 111 | } |
| 112 | |
Vladimir Marko | 7dac864 | 2019-11-06 17:09:30 +0000 | [diff] [blame] | 113 | extern "C" JNIEXPORT jint JNICALL Java_TestCritical_nativeMethod(jint i) { |
| 114 | return i; |
| 115 | } |
| 116 | |
| 117 | extern "C" JNIEXPORT jint JNICALL Java_TestCritical_nativeMethodWithManyParameters( |
| 118 | jint i1, jlong l1, jfloat f1, jdouble d1, |
| 119 | jint i2, jlong l2, jfloat f2, jdouble d2, |
| 120 | jint i3, jlong l3, jfloat f3, jdouble d3, |
| 121 | jint i4, jlong l4, jfloat f4, jdouble d4, |
| 122 | jint i5, jlong l5, jfloat f5, jdouble d5, |
| 123 | jint i6, jlong l6, jfloat f6, jdouble d6, |
| 124 | jint i7, jlong l7, jfloat f7, jdouble d7, |
| 125 | jint i8, jlong l8, jfloat f8, jdouble d8) { |
| 126 | bool ok = VerifyManyParameters( |
| 127 | i1, l1, f1, d1, |
| 128 | i2, l2, f2, d2, |
| 129 | i3, l3, f3, d3, |
| 130 | i4, l4, f4, d4, |
| 131 | i5, l5, f5, d5, |
| 132 | i6, l6, f6, d6, |
| 133 | i7, l7, f7, d7, |
| 134 | i8, l8, f8, d8); |
| 135 | return ok ? 42 : -1; |
| 136 | } |
| 137 | |
Vladimir Marko | 0300822 | 2020-03-06 14:04:21 +0000 | [diff] [blame] | 138 | extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeILFFFFD( |
| 139 | jint i, |
| 140 | jlong l, |
| 141 | jfloat f1, |
| 142 | jfloat f2, |
| 143 | jfloat f3, |
| 144 | jfloat f4, |
| 145 | jdouble d) { |
| 146 | if (i != 1) return -1; |
| 147 | if (l != INT64_C(0xf00000002)) return -2; |
| 148 | if (f1 != 3.0f) return -3; |
| 149 | if (f2 != 4.0f) return -4; |
| 150 | if (f3 != 5.0f) return -5; |
| 151 | if (f4 != 6.0f) return -6; |
| 152 | if (d != 7.0) return -7; |
| 153 | return 42; |
| 154 | } |
| 155 | |
| 156 | extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeLIFFFFD( |
| 157 | jlong l, |
| 158 | jint i, |
| 159 | jfloat f1, |
| 160 | jfloat f2, |
| 161 | jfloat f3, |
| 162 | jfloat f4, |
| 163 | jdouble d) { |
| 164 | if (l != INT64_C(0xf00000007)) return -1; |
| 165 | if (i != 6) return -2; |
| 166 | if (f1 != 5.0f) return -3; |
| 167 | if (f2 != 4.0f) return -4; |
| 168 | if (f3 != 3.0f) return -5; |
| 169 | if (f4 != 2.0f) return -6; |
| 170 | if (d != 1.0) return -7; |
| 171 | return 42; |
| 172 | } |
| 173 | |
| 174 | extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeFLIFFFD( |
| 175 | jfloat f1, |
| 176 | jlong l, |
| 177 | jint i, |
| 178 | jfloat f2, |
| 179 | jfloat f3, |
| 180 | jfloat f4, |
| 181 | jdouble d) { |
| 182 | if (f1 != 1.0f) return -3; |
| 183 | if (l != INT64_C(0xf00000002)) return -1; |
| 184 | if (i != 3) return -2; |
| 185 | if (f2 != 4.0f) return -4; |
| 186 | if (f3 != 5.0f) return -5; |
| 187 | if (f4 != 6.0f) return -6; |
| 188 | if (d != 7.0) return -7; |
| 189 | return 42; |
| 190 | } |
| 191 | |
| 192 | extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeDDIIIIII( |
| 193 | jdouble d1, |
| 194 | jdouble d2, |
| 195 | jint i1, |
| 196 | jint i2, |
| 197 | jint i3, |
| 198 | jint i4, |
| 199 | jint i5, |
| 200 | jint i6) { |
| 201 | if (d1 != 8.0) return -1; |
| 202 | if (d2 != 7.0) return -2; |
| 203 | if (i1 != 6) return -3; |
| 204 | if (i2 != 5) return -4; |
| 205 | if (i3 != 4) return -5; |
| 206 | if (i4 != 3) return -6; |
| 207 | if (i5 != 2) return -7; |
| 208 | if (i6 != 1) return -8; |
| 209 | return 42; |
| 210 | } |
| 211 | |
| 212 | extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeDFFILIII( |
| 213 | jdouble d, |
| 214 | jfloat f1, |
| 215 | jfloat f2, |
| 216 | jint i1, |
| 217 | jlong l, |
| 218 | jint i2, |
| 219 | jint i3, |
| 220 | jint i4) { |
| 221 | if (d != 1.0) return -1; |
| 222 | if (f1 != 2.0f) return -2; |
| 223 | if (f2 != 3.0f) return -3; |
| 224 | if (i1 != 4) return -4; |
| 225 | if (l != INT64_C(0xf00000005)) return -5; |
| 226 | if (i2 != 6) return -6; |
| 227 | if (i3 != 7) return -7; |
| 228 | if (i4 != 8) return -8; |
| 229 | return 42; |
| 230 | } |
| 231 | |
| 232 | extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeDDFILIII( |
| 233 | jdouble d1, |
| 234 | jdouble d2, |
| 235 | jfloat f, |
| 236 | jint i1, |
| 237 | jlong l, |
| 238 | jint i2, |
| 239 | jint i3, |
| 240 | jint i4) { |
| 241 | if (d1 != 8.0) return -1; |
| 242 | if (d2 != 7.0) return -2; |
| 243 | if (f != 6.0f) return -3; |
| 244 | if (i1 != 5) return -4; |
| 245 | if (l != INT64_C(0xf00000004)) return -5; |
| 246 | if (i2 != 3) return -6; |
| 247 | if (i3 != 2) return -7; |
| 248 | if (i4 != 1) return -8; |
| 249 | return 42; |
| 250 | } |
| 251 | |
| 252 | extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeDDIFII( |
| 253 | jdouble d1, |
| 254 | jdouble d2, |
| 255 | jint i1, |
| 256 | jfloat f, |
| 257 | jint i2, |
| 258 | jint i3) { |
| 259 | if (d1 != 1.0) return -1; |
| 260 | if (d2 != 2.0) return -2; |
| 261 | if (i1 != 3) return -3; |
| 262 | if (f != 4.0f) return -4; |
| 263 | if (i2 != 5) return -5; |
| 264 | if (i3 != 6) return -6; |
| 265 | return 42; |
| 266 | } |
| 267 | |
| 268 | extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeFullArgs( |
| 269 | // Generated by script (then modified to close argument list): |
| 270 | // for i in {0..84}; do echo " jlong l$((i*3)),"; echo " jint i$((i*3+2)),"; done |
| 271 | jlong l0, |
| 272 | jint i2, |
| 273 | jlong l3, |
| 274 | jint i5, |
| 275 | jlong l6, |
| 276 | jint i8, |
| 277 | jlong l9, |
| 278 | jint i11, |
| 279 | jlong l12, |
| 280 | jint i14, |
| 281 | jlong l15, |
| 282 | jint i17, |
| 283 | jlong l18, |
| 284 | jint i20, |
| 285 | jlong l21, |
| 286 | jint i23, |
| 287 | jlong l24, |
| 288 | jint i26, |
| 289 | jlong l27, |
| 290 | jint i29, |
| 291 | jlong l30, |
| 292 | jint i32, |
| 293 | jlong l33, |
| 294 | jint i35, |
| 295 | jlong l36, |
| 296 | jint i38, |
| 297 | jlong l39, |
| 298 | jint i41, |
| 299 | jlong l42, |
| 300 | jint i44, |
| 301 | jlong l45, |
| 302 | jint i47, |
| 303 | jlong l48, |
| 304 | jint i50, |
| 305 | jlong l51, |
| 306 | jint i53, |
| 307 | jlong l54, |
| 308 | jint i56, |
| 309 | jlong l57, |
| 310 | jint i59, |
| 311 | jlong l60, |
| 312 | jint i62, |
| 313 | jlong l63, |
| 314 | jint i65, |
| 315 | jlong l66, |
| 316 | jint i68, |
| 317 | jlong l69, |
| 318 | jint i71, |
| 319 | jlong l72, |
| 320 | jint i74, |
| 321 | jlong l75, |
| 322 | jint i77, |
| 323 | jlong l78, |
| 324 | jint i80, |
| 325 | jlong l81, |
| 326 | jint i83, |
| 327 | jlong l84, |
| 328 | jint i86, |
| 329 | jlong l87, |
| 330 | jint i89, |
| 331 | jlong l90, |
| 332 | jint i92, |
| 333 | jlong l93, |
| 334 | jint i95, |
| 335 | jlong l96, |
| 336 | jint i98, |
| 337 | jlong l99, |
| 338 | jint i101, |
| 339 | jlong l102, |
| 340 | jint i104, |
| 341 | jlong l105, |
| 342 | jint i107, |
| 343 | jlong l108, |
| 344 | jint i110, |
| 345 | jlong l111, |
| 346 | jint i113, |
| 347 | jlong l114, |
| 348 | jint i116, |
| 349 | jlong l117, |
| 350 | jint i119, |
| 351 | jlong l120, |
| 352 | jint i122, |
| 353 | jlong l123, |
| 354 | jint i125, |
| 355 | jlong l126, |
| 356 | jint i128, |
| 357 | jlong l129, |
| 358 | jint i131, |
| 359 | jlong l132, |
| 360 | jint i134, |
| 361 | jlong l135, |
| 362 | jint i137, |
| 363 | jlong l138, |
| 364 | jint i140, |
| 365 | jlong l141, |
| 366 | jint i143, |
| 367 | jlong l144, |
| 368 | jint i146, |
| 369 | jlong l147, |
| 370 | jint i149, |
| 371 | jlong l150, |
| 372 | jint i152, |
| 373 | jlong l153, |
| 374 | jint i155, |
| 375 | jlong l156, |
| 376 | jint i158, |
| 377 | jlong l159, |
| 378 | jint i161, |
| 379 | jlong l162, |
| 380 | jint i164, |
| 381 | jlong l165, |
| 382 | jint i167, |
| 383 | jlong l168, |
| 384 | jint i170, |
| 385 | jlong l171, |
| 386 | jint i173, |
| 387 | jlong l174, |
| 388 | jint i176, |
| 389 | jlong l177, |
| 390 | jint i179, |
| 391 | jlong l180, |
| 392 | jint i182, |
| 393 | jlong l183, |
| 394 | jint i185, |
| 395 | jlong l186, |
| 396 | jint i188, |
| 397 | jlong l189, |
| 398 | jint i191, |
| 399 | jlong l192, |
| 400 | jint i194, |
| 401 | jlong l195, |
| 402 | jint i197, |
| 403 | jlong l198, |
| 404 | jint i200, |
| 405 | jlong l201, |
| 406 | jint i203, |
| 407 | jlong l204, |
| 408 | jint i206, |
| 409 | jlong l207, |
| 410 | jint i209, |
| 411 | jlong l210, |
| 412 | jint i212, |
| 413 | jlong l213, |
| 414 | jint i215, |
| 415 | jlong l216, |
| 416 | jint i218, |
| 417 | jlong l219, |
| 418 | jint i221, |
| 419 | jlong l222, |
| 420 | jint i224, |
| 421 | jlong l225, |
| 422 | jint i227, |
| 423 | jlong l228, |
| 424 | jint i230, |
| 425 | jlong l231, |
| 426 | jint i233, |
| 427 | jlong l234, |
| 428 | jint i236, |
| 429 | jlong l237, |
| 430 | jint i239, |
| 431 | jlong l240, |
| 432 | jint i242, |
| 433 | jlong l243, |
| 434 | jint i245, |
| 435 | jlong l246, |
| 436 | jint i248, |
| 437 | jlong l249, |
| 438 | jint i251, |
| 439 | jlong l252, |
| 440 | jint i254) { |
| 441 | jlong l = INT64_C(0xf00000000); |
| 442 | // Generated by script (then modified to close argument list): |
| 443 | // for i in {0..84}; do \ |
| 444 | // echo " if (l$((i*3)) != l + $(($i*3))) return -$(($i*3));"; \ |
| 445 | // echo " if (i$(($i*3+2)) != $(($i*3+2))) return -$(($i*3+2));"; \ |
| 446 | // done |
| 447 | if (l0 != l + 0) return -0; |
| 448 | if (i2 != 2) return -2; |
| 449 | if (l3 != l + 3) return -3; |
| 450 | if (i5 != 5) return -5; |
| 451 | if (l6 != l + 6) return -6; |
| 452 | if (i8 != 8) return -8; |
| 453 | if (l9 != l + 9) return -9; |
| 454 | if (i11 != 11) return -11; |
| 455 | if (l12 != l + 12) return -12; |
| 456 | if (i14 != 14) return -14; |
| 457 | if (l15 != l + 15) return -15; |
| 458 | if (i17 != 17) return -17; |
| 459 | if (l18 != l + 18) return -18; |
| 460 | if (i20 != 20) return -20; |
| 461 | if (l21 != l + 21) return -21; |
| 462 | if (i23 != 23) return -23; |
| 463 | if (l24 != l + 24) return -24; |
| 464 | if (i26 != 26) return -26; |
| 465 | if (l27 != l + 27) return -27; |
| 466 | if (i29 != 29) return -29; |
| 467 | if (l30 != l + 30) return -30; |
| 468 | if (i32 != 32) return -32; |
| 469 | if (l33 != l + 33) return -33; |
| 470 | if (i35 != 35) return -35; |
| 471 | if (l36 != l + 36) return -36; |
| 472 | if (i38 != 38) return -38; |
| 473 | if (l39 != l + 39) return -39; |
| 474 | if (i41 != 41) return -41; |
| 475 | if (l42 != l + 42) return -42; |
| 476 | if (i44 != 44) return -44; |
| 477 | if (l45 != l + 45) return -45; |
| 478 | if (i47 != 47) return -47; |
| 479 | if (l48 != l + 48) return -48; |
| 480 | if (i50 != 50) return -50; |
| 481 | if (l51 != l + 51) return -51; |
| 482 | if (i53 != 53) return -53; |
| 483 | if (l54 != l + 54) return -54; |
| 484 | if (i56 != 56) return -56; |
| 485 | if (l57 != l + 57) return -57; |
| 486 | if (i59 != 59) return -59; |
| 487 | if (l60 != l + 60) return -60; |
| 488 | if (i62 != 62) return -62; |
| 489 | if (l63 != l + 63) return -63; |
| 490 | if (i65 != 65) return -65; |
| 491 | if (l66 != l + 66) return -66; |
| 492 | if (i68 != 68) return -68; |
| 493 | if (l69 != l + 69) return -69; |
| 494 | if (i71 != 71) return -71; |
| 495 | if (l72 != l + 72) return -72; |
| 496 | if (i74 != 74) return -74; |
| 497 | if (l75 != l + 75) return -75; |
| 498 | if (i77 != 77) return -77; |
| 499 | if (l78 != l + 78) return -78; |
| 500 | if (i80 != 80) return -80; |
| 501 | if (l81 != l + 81) return -81; |
| 502 | if (i83 != 83) return -83; |
| 503 | if (l84 != l + 84) return -84; |
| 504 | if (i86 != 86) return -86; |
| 505 | if (l87 != l + 87) return -87; |
| 506 | if (i89 != 89) return -89; |
| 507 | if (l90 != l + 90) return -90; |
| 508 | if (i92 != 92) return -92; |
| 509 | if (l93 != l + 93) return -93; |
| 510 | if (i95 != 95) return -95; |
| 511 | if (l96 != l + 96) return -96; |
| 512 | if (i98 != 98) return -98; |
| 513 | if (l99 != l + 99) return -99; |
| 514 | if (i101 != 101) return -101; |
| 515 | if (l102 != l + 102) return -102; |
| 516 | if (i104 != 104) return -104; |
| 517 | if (l105 != l + 105) return -105; |
| 518 | if (i107 != 107) return -107; |
| 519 | if (l108 != l + 108) return -108; |
| 520 | if (i110 != 110) return -110; |
| 521 | if (l111 != l + 111) return -111; |
| 522 | if (i113 != 113) return -113; |
| 523 | if (l114 != l + 114) return -114; |
| 524 | if (i116 != 116) return -116; |
| 525 | if (l117 != l + 117) return -117; |
| 526 | if (i119 != 119) return -119; |
| 527 | if (l120 != l + 120) return -120; |
| 528 | if (i122 != 122) return -122; |
| 529 | if (l123 != l + 123) return -123; |
| 530 | if (i125 != 125) return -125; |
| 531 | if (l126 != l + 126) return -126; |
| 532 | if (i128 != 128) return -128; |
| 533 | if (l129 != l + 129) return -129; |
| 534 | if (i131 != 131) return -131; |
| 535 | if (l132 != l + 132) return -132; |
| 536 | if (i134 != 134) return -134; |
| 537 | if (l135 != l + 135) return -135; |
| 538 | if (i137 != 137) return -137; |
| 539 | if (l138 != l + 138) return -138; |
| 540 | if (i140 != 140) return -140; |
| 541 | if (l141 != l + 141) return -141; |
| 542 | if (i143 != 143) return -143; |
| 543 | if (l144 != l + 144) return -144; |
| 544 | if (i146 != 146) return -146; |
| 545 | if (l147 != l + 147) return -147; |
| 546 | if (i149 != 149) return -149; |
| 547 | if (l150 != l + 150) return -150; |
| 548 | if (i152 != 152) return -152; |
| 549 | if (l153 != l + 153) return -153; |
| 550 | if (i155 != 155) return -155; |
| 551 | if (l156 != l + 156) return -156; |
| 552 | if (i158 != 158) return -158; |
| 553 | if (l159 != l + 159) return -159; |
| 554 | if (i161 != 161) return -161; |
| 555 | if (l162 != l + 162) return -162; |
| 556 | if (i164 != 164) return -164; |
| 557 | if (l165 != l + 165) return -165; |
| 558 | if (i167 != 167) return -167; |
| 559 | if (l168 != l + 168) return -168; |
| 560 | if (i170 != 170) return -170; |
| 561 | if (l171 != l + 171) return -171; |
| 562 | if (i173 != 173) return -173; |
| 563 | if (l174 != l + 174) return -174; |
| 564 | if (i176 != 176) return -176; |
| 565 | if (l177 != l + 177) return -177; |
| 566 | if (i179 != 179) return -179; |
| 567 | if (l180 != l + 180) return -180; |
| 568 | if (i182 != 182) return -182; |
| 569 | if (l183 != l + 183) return -183; |
| 570 | if (i185 != 185) return -185; |
| 571 | if (l186 != l + 186) return -186; |
| 572 | if (i188 != 188) return -188; |
| 573 | if (l189 != l + 189) return -189; |
| 574 | if (i191 != 191) return -191; |
| 575 | if (l192 != l + 192) return -192; |
| 576 | if (i194 != 194) return -194; |
| 577 | if (l195 != l + 195) return -195; |
| 578 | if (i197 != 197) return -197; |
| 579 | if (l198 != l + 198) return -198; |
| 580 | if (i200 != 200) return -200; |
| 581 | if (l201 != l + 201) return -201; |
| 582 | if (i203 != 203) return -203; |
| 583 | if (l204 != l + 204) return -204; |
| 584 | if (i206 != 206) return -206; |
| 585 | if (l207 != l + 207) return -207; |
| 586 | if (i209 != 209) return -209; |
| 587 | if (l210 != l + 210) return -210; |
| 588 | if (i212 != 212) return -212; |
| 589 | if (l213 != l + 213) return -213; |
| 590 | if (i215 != 215) return -215; |
| 591 | if (l216 != l + 216) return -216; |
| 592 | if (i218 != 218) return -218; |
| 593 | if (l219 != l + 219) return -219; |
| 594 | if (i221 != 221) return -221; |
| 595 | if (l222 != l + 222) return -222; |
| 596 | if (i224 != 224) return -224; |
| 597 | if (l225 != l + 225) return -225; |
| 598 | if (i227 != 227) return -227; |
| 599 | if (l228 != l + 228) return -228; |
| 600 | if (i230 != 230) return -230; |
| 601 | if (l231 != l + 231) return -231; |
| 602 | if (i233 != 233) return -233; |
| 603 | if (l234 != l + 234) return -234; |
| 604 | if (i236 != 236) return -236; |
| 605 | if (l237 != l + 237) return -237; |
| 606 | if (i239 != 239) return -239; |
| 607 | if (l240 != l + 240) return -240; |
| 608 | if (i242 != 242) return -242; |
| 609 | if (l243 != l + 243) return -243; |
| 610 | if (i245 != 245) return -245; |
| 611 | if (l246 != l + 246) return -246; |
| 612 | if (i248 != 248) return -248; |
| 613 | if (l249 != l + 249) return -249; |
| 614 | if (i251 != 251) return -251; |
| 615 | if (l252 != l + 252) return -252; |
| 616 | if (i254 != 254) return -254; |
| 617 | return 42; |
| 618 | } |
| 619 | |
Vladimir Marko | 6bc480b | 2020-06-08 09:00:33 +0100 | [diff] [blame] | 620 | extern "C" JNIEXPORT jint JNICALL Java_CriticalClinitCheck_nativeMethodVoid() { |
| 621 | return 42; |
| 622 | } |
| 623 | |
| 624 | extern "C" JNIEXPORT jint JNICALL Java_CriticalClinitCheck_nativeMethod(jint i) { |
| 625 | return i; |
| 626 | } |
| 627 | |
| 628 | extern "C" JNIEXPORT jint JNICALL Java_CriticalClinitCheck_nativeMethodWithManyParameters( |
| 629 | jint i1, jlong l1, jfloat f1, jdouble d1, |
| 630 | jint i2, jlong l2, jfloat f2, jdouble d2, |
| 631 | jint i3, jlong l3, jfloat f3, jdouble d3, |
| 632 | jint i4, jlong l4, jfloat f4, jdouble d4, |
| 633 | jint i5, jlong l5, jfloat f5, jdouble d5, |
| 634 | jint i6, jlong l6, jfloat f6, jdouble d6, |
| 635 | jint i7, jlong l7, jfloat f7, jdouble d7, |
| 636 | jint i8, jlong l8, jfloat f8, jdouble d8) { |
| 637 | bool ok = VerifyManyParameters( |
| 638 | i1, l1, f1, d1, |
| 639 | i2, l2, f2, d2, |
| 640 | i3, l3, f3, d3, |
| 641 | i4, l4, f4, d4, |
| 642 | i5, l5, f5, d5, |
| 643 | i6, l6, f6, d6, |
| 644 | i7, l7, f7, d7, |
| 645 | i8, l8, f8, d8); |
| 646 | return ok ? 42 : -1; |
| 647 | } |
| 648 | |
Vladimir Marko | 654f01c | 2021-05-26 16:40:20 +0100 | [diff] [blame] | 649 | extern "C" JNIEXPORT jint JNICALL Java_Main_b189235039CallThrough(JNIEnv* env, jobject m) { |
| 650 | jclass main_klass = env->GetObjectClass(m); |
| 651 | jmethodID checkLocks = env->GetStaticMethodID(main_klass, "b189235039CheckLocks", "(ILMain;)I"); |
| 652 | if (checkLocks == nullptr) { |
| 653 | return -1; |
| 654 | } |
| 655 | return env->CallStaticIntMethod(main_klass, checkLocks, 42, m); |
| 656 | } |
| 657 | |
| 658 | extern "C" JNIEXPORT jint JNICALL Java_Main_b189235039CheckLocks(JNIEnv*, |
| 659 | jclass, |
| 660 | int arg, |
| 661 | jobject lock) { |
| 662 | // Check that we do not crash when visiting locks and that we find the right lock. |
| 663 | ScopedObjectAccess soa(Thread::Current()); |
| 664 | class VisitLocks : public StackVisitor { |
| 665 | public: |
| 666 | VisitLocks(Thread* thread, Context* context, jobject expected_lock) |
| 667 | : StackVisitor(thread, context, StackWalkKind::kIncludeInlinedFrames), |
| 668 | expected_lock_(expected_lock) { |
| 669 | } |
| 670 | |
| 671 | bool VisitFrame() override REQUIRES_SHARED(Locks::mutator_lock_) { |
| 672 | ArtMethod* m = GetMethod(); |
| 673 | |
| 674 | // Ignore runtime methods. |
| 675 | if (m == nullptr || m->IsRuntimeMethod()) { |
| 676 | return true; |
| 677 | } |
| 678 | |
| 679 | if (m->IsSynchronized()) { |
| 680 | // Interesting frame. |
| 681 | Monitor::VisitLocks(this, Callback, expected_lock_); |
| 682 | return false; |
| 683 | } |
| 684 | |
| 685 | return true; |
| 686 | } |
| 687 | |
| 688 | private: |
| 689 | static void Callback(ObjPtr<mirror::Object> obj, void* expected_lock) |
| 690 | REQUIRES_SHARED(Locks::mutator_lock_) { |
| 691 | CHECK(obj != nullptr); |
| 692 | CHECK(obj == Thread::Current()->DecodeJObject(reinterpret_cast<jobject>(expected_lock))); |
| 693 | } |
| 694 | |
| 695 | jobject expected_lock_; |
| 696 | }; |
| 697 | { |
| 698 | std::unique_ptr<Context> context(Context::Create()); |
| 699 | VisitLocks vl(soa.Self(), context.get(), lock); |
| 700 | vl.WalkStack(); |
| 701 | } |
| 702 | return arg; |
| 703 | } |
| 704 | |
Vladimir Marko | 7dac864 | 2019-11-06 17:09:30 +0000 | [diff] [blame] | 705 | } // namespace art |