xref: /aosp_15_r20/art/test/178-app-image-native-method/native_methods.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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