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