mirror of
https://github.com/JetBrains/JetBrainsRuntime.git
synced 2026-01-28 11:20:51 +01:00
Compare commits
842 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d96f38b80c | ||
|
|
10427c023a | ||
|
|
ca3bdfc0c7 | ||
|
|
a5208870e1 | ||
|
|
cf4ede0e54 | ||
|
|
9e98ee6726 | ||
|
|
29d462a072 | ||
|
|
43f31d7385 | ||
|
|
cee44a6255 | ||
|
|
b026d0b480 | ||
|
|
3abd772672 | ||
|
|
202c0137b8 | ||
|
|
c587211bf8 | ||
|
|
42b9ac8a07 | ||
|
|
14090ef603 | ||
|
|
d2d1592dd9 | ||
|
|
c3cdfe2a32 | ||
|
|
ba7d08b819 | ||
|
|
d7205e690f | ||
|
|
5ce718eb17 | ||
|
|
f1dfdc1a79 | ||
|
|
9c819fd3b7 | ||
|
|
1ddf826aea | ||
|
|
1f2a80b78a | ||
|
|
116503754c | ||
|
|
6f352740cb | ||
|
|
e2720987b9 | ||
|
|
54c613acd7 | ||
|
|
e67550cfec | ||
|
|
8879c78d62 | ||
|
|
f9795d0d09 | ||
|
|
d1077d6f14 | ||
|
|
21d8a4725f | ||
|
|
d4b761242d | ||
|
|
bf1a14e367 | ||
|
|
5224e979a1 | ||
|
|
9bfa082970 | ||
|
|
3f446c5156 | ||
|
|
0baa9ecd76 | ||
|
|
4a16d111b1 | ||
|
|
a644670cc6 | ||
|
|
e6f23a90d4 | ||
|
|
fd332da1c8 | ||
|
|
6d3cb459dc | ||
|
|
cb383c05b2 | ||
|
|
4bfe226870 | ||
|
|
08f79148c6 | ||
|
|
728b858c78 | ||
|
|
eb5916729d | ||
|
|
1b150117fd | ||
|
|
5ba9705d60 | ||
|
|
8d9a4b43f4 | ||
|
|
69c0ae23a3 | ||
|
|
c1aeac79ba | ||
|
|
d888b26783 | ||
|
|
bea2d48696 | ||
|
|
9f767aa44b | ||
|
|
bd22d2381f | ||
|
|
c2efd77412 | ||
|
|
99de9bb83f | ||
|
|
704c6ea16c | ||
|
|
7c0a8288b2 | ||
|
|
ff5c5b6541 | ||
|
|
fc29a2e152 | ||
|
|
729f4c5d14 | ||
|
|
4eab39d941 | ||
|
|
ffadd63575 | ||
|
|
ecd25e7d6f | ||
|
|
a876beb63d | ||
|
|
4cf195f00c | ||
|
|
af2f4bfa83 | ||
|
|
a1a62d9964 | ||
|
|
77b2394c46 | ||
|
|
d3ebb4a155 | ||
|
|
66d90d5d9f | ||
|
|
4dfa3799a6 | ||
|
|
158293d251 | ||
|
|
a045258ae2 | ||
|
|
21215753c0 | ||
|
|
200b5a27d4 | ||
|
|
52814994ef | ||
|
|
8065233e8b | ||
|
|
b1228de623 | ||
|
|
5a97411f85 | ||
|
|
91442878b7 | ||
|
|
40106422bd | ||
|
|
fe52917054 | ||
|
|
71c99a0e59 | ||
|
|
2c23391de7 | ||
|
|
deadb9c8d7 | ||
|
|
a03767cf88 | ||
|
|
848ecc1621 | ||
|
|
b07da3ae15 | ||
|
|
6f1d8962df | ||
|
|
8f4ebd8921 | ||
|
|
cd25d1a2bf | ||
|
|
744f206fef | ||
|
|
8099261050 | ||
|
|
138437f2cf | ||
|
|
4812cabaa4 | ||
|
|
bd02cfd96f | ||
|
|
bd3bc2c618 | ||
|
|
292aad2c49 | ||
|
|
387504c9e4 | ||
|
|
d9ce525a1c | ||
|
|
c46a54e018 | ||
|
|
8f5f44070a | ||
|
|
684b91efbb | ||
|
|
1740950036 | ||
|
|
cc8f8da293 | ||
|
|
599560a832 | ||
|
|
9cf334fb64 | ||
|
|
defc7e0f8d | ||
|
|
3c70f2c1e9 | ||
|
|
15acf4b8d7 | ||
|
|
1a098356dd | ||
|
|
47bb1a1cef | ||
|
|
80bd22d093 | ||
|
|
c0e154c876 | ||
|
|
24bc5bd104 | ||
|
|
e25a49a993 | ||
|
|
ce8ebebc77 | ||
|
|
ab135683a6 | ||
|
|
278de7acd2 | ||
|
|
6fc3514231 | ||
|
|
31ef400f31 | ||
|
|
4e77b3c378 | ||
|
|
8dd809642e | ||
|
|
9843c97695 | ||
|
|
7c80cb26df | ||
|
|
adca97b659 | ||
|
|
195c9b2c48 | ||
|
|
072d64c6a9 | ||
|
|
83b6a1278f | ||
|
|
cceb0d8a23 | ||
|
|
2f4d601a56 | ||
|
|
0ba48ef4ab | ||
|
|
5145e5a40a | ||
|
|
c566dfccf8 | ||
|
|
c9985720b9 | ||
|
|
d6679031e0 | ||
|
|
61cc4a011e | ||
|
|
39e2b7a6d3 | ||
|
|
d0ea2a5111 | ||
|
|
6aa837eee6 | ||
|
|
5ca1beb30e | ||
|
|
2bf1863e24 | ||
|
|
15588e08ed | ||
|
|
e649c56324 | ||
|
|
5f4be8cea9 | ||
|
|
a949824e98 | ||
|
|
7e39e664cf | ||
|
|
75b37e6d7e | ||
|
|
34653c1e73 | ||
|
|
d8cd60588a | ||
|
|
8f79d88960 | ||
|
|
b2b8db6533 | ||
|
|
5bd10521eb | ||
|
|
c64bd3d671 | ||
|
|
6ee6171e81 | ||
|
|
7ca0ae9415 | ||
|
|
5521560abd | ||
|
|
e4329a823b | ||
|
|
504b0bdaaa | ||
|
|
7b3917265d | ||
|
|
aed1e810e6 | ||
|
|
741ae06c55 | ||
|
|
8c1bb2b280 | ||
|
|
2d38495b61 | ||
|
|
0d091681c2 | ||
|
|
1a7fd5d419 | ||
|
|
eb7d972d8a | ||
|
|
7028fb9d58 | ||
|
|
36993aea9a | ||
|
|
668d4b077f | ||
|
|
a36eaf03af | ||
|
|
a27fc7efd4 | ||
|
|
37eb98604f | ||
|
|
37aed6f46d | ||
|
|
1e930db3c7 | ||
|
|
0275efac88 | ||
|
|
77d40ce166 | ||
|
|
4ea1b99c1a | ||
|
|
01ea1eff66 | ||
|
|
1d54e73f6a | ||
|
|
56aa1e8dc8 | ||
|
|
f7d6d7a04f | ||
|
|
e942f368c3 | ||
|
|
7cb2e6d65b | ||
|
|
9622de2aa8 | ||
|
|
72c4dcbfee | ||
|
|
32a60cf11d | ||
|
|
b12c471a99 | ||
|
|
605c976729 | ||
|
|
6273ab97dc | ||
|
|
7d31146f4d | ||
|
|
45b7aedabf | ||
|
|
266636deab | ||
|
|
e490cf9c65 | ||
|
|
126f2ace5d | ||
|
|
4d9042043e | ||
|
|
1082c0e767 | ||
|
|
ec310fe809 | ||
|
|
ff0b397e13 | ||
|
|
c88b387881 | ||
|
|
993951b85e | ||
|
|
17535c34bc | ||
|
|
61ce739ac8 | ||
|
|
77fa44fd4f | ||
|
|
0983b54866 | ||
|
|
64ee3c9990 | ||
|
|
32ac72c3d3 | ||
|
|
9728e21db1 | ||
|
|
a8473b7079 | ||
|
|
16fd43c5eb | ||
|
|
c1f698d38b | ||
|
|
935543146b | ||
|
|
32ccf018eb | ||
|
|
4c79e7d59c | ||
|
|
7633a76607 | ||
|
|
00ef9f9c32 | ||
|
|
77dc89115e | ||
|
|
d95b548c78 | ||
|
|
424de295a6 | ||
|
|
6d6c9008d5 | ||
|
|
eca6ea43d0 | ||
|
|
2edf9c3f1e | ||
|
|
839cb19ec2 | ||
|
|
387896fb34 | ||
|
|
8d2ad2b1ae | ||
|
|
b92de54a81 | ||
|
|
2a80160960 | ||
|
|
3f6d01687c | ||
|
|
2d46b29728 | ||
|
|
8f8c45b54a | ||
|
|
8a9c4d5266 | ||
|
|
bcafec54a5 | ||
|
|
731fb4eea2 | ||
|
|
79761519f6 | ||
|
|
ca96fd3b07 | ||
|
|
a9b41da9df | ||
|
|
0fd807118c | ||
|
|
1161e3da14 | ||
|
|
e55c482ce1 | ||
|
|
84b7cc15c2 | ||
|
|
3aa4cba175 | ||
|
|
54861df3d9 | ||
|
|
f40ea5109e | ||
|
|
fec1d49783 | ||
|
|
2b8276aa52 | ||
|
|
33591a30d2 | ||
|
|
fb4098ff1a | ||
|
|
c2abf120bc | ||
|
|
ad7a8e86e0 | ||
|
|
fcff222f92 | ||
|
|
ef41aa02b8 | ||
|
|
ad6dce376d | ||
|
|
e882718a60 | ||
|
|
d313915974 | ||
|
|
053f45695f | ||
|
|
5b311f20df | ||
|
|
8e0686b065 | ||
|
|
5e8d893c48 | ||
|
|
f61499c73f | ||
|
|
3ff5a781db | ||
|
|
508fa71753 | ||
|
|
1f06325142 | ||
|
|
a07a4a3a59 | ||
|
|
7ff19383fd | ||
|
|
a57ae7e7d4 | ||
|
|
6ddbfaae49 | ||
|
|
0cf1a558ba | ||
|
|
bcc986b9d1 | ||
|
|
460ebcd9cb | ||
|
|
dc4bc4f084 | ||
|
|
a4e9168bab | ||
|
|
6c6beba256 | ||
|
|
b62e774e6a | ||
|
|
a64794b1ed | ||
|
|
b3cc0c8431 | ||
|
|
691db5df73 | ||
|
|
ec9ba5dae9 | ||
|
|
7162624d70 | ||
|
|
f0d66d1fd3 | ||
|
|
991ce84e09 | ||
|
|
8a30c2a9b2 | ||
|
|
a1c9587c27 | ||
|
|
a8eacb31ab | ||
|
|
4c5b66dcea | ||
|
|
42be23877c | ||
|
|
a250ae4d1b | ||
|
|
1ed9c76ec8 | ||
|
|
3630af26e6 | ||
|
|
c6c69b579c | ||
|
|
3105538de5 | ||
|
|
36314a90c1 | ||
|
|
ddacf92713 | ||
|
|
4195246fba | ||
|
|
0a3a925ad8 | ||
|
|
b0d6c8472f | ||
|
|
a8549b6367 | ||
|
|
9718f490fb | ||
|
|
0d4de8a71f | ||
|
|
d4c904d819 | ||
|
|
48f1a925e5 | ||
|
|
0b0f8b55a6 | ||
|
|
8c0d026d0f | ||
|
|
f7deaf4bef | ||
|
|
8ff10a0d35 | ||
|
|
1809b8cdd6 | ||
|
|
cfabcbf858 | ||
|
|
b859da9c54 | ||
|
|
b438cffdb9 | ||
|
|
ae796a4e10 | ||
|
|
89987dbf87 | ||
|
|
0e501f66df | ||
|
|
c47a0ce3f0 | ||
|
|
353d139682 | ||
|
|
3bcfac18c3 | ||
|
|
b6a97c0780 | ||
|
|
287b243221 | ||
|
|
26c21f50a3 | ||
|
|
6e1aacdfba | ||
|
|
d2e2c4cef1 | ||
|
|
e25121d1d9 | ||
|
|
5c8366eea4 | ||
|
|
ad81abd2db | ||
|
|
d7d1d42b67 | ||
|
|
f985006142 | ||
|
|
a564d436c7 | ||
|
|
878d27dba1 | ||
|
|
2637e8ddc4 | ||
|
|
8093563bce | ||
|
|
516cfb135f | ||
|
|
59847926b6 | ||
|
|
eeb63cd0fa | ||
|
|
69489427e9 | ||
|
|
795e5dcc85 | ||
|
|
207819a05e | ||
|
|
8fcf70e931 | ||
|
|
93f662f4fc | ||
|
|
b8fa6c23f5 | ||
|
|
fb055e7e53 | ||
|
|
009f5e1fa1 | ||
|
|
47569a256c | ||
|
|
5a6aa569aa | ||
|
|
014c95a54d | ||
|
|
fa0697a637 | ||
|
|
49376e4452 | ||
|
|
a185be0346 | ||
|
|
179792beb4 | ||
|
|
bd918f49d2 | ||
|
|
c45308afac | ||
|
|
bd7bb67d8f | ||
|
|
0259da9283 | ||
|
|
355811a996 | ||
|
|
ecb5e8a03f | ||
|
|
f2c221def1 | ||
|
|
09dad0e96b | ||
|
|
73a47f0c4a | ||
|
|
cfcbfc6cae | ||
|
|
ca5eee2fe3 | ||
|
|
060db1b2a2 | ||
|
|
3481a48571 | ||
|
|
29348b3cf6 | ||
|
|
3f19df685c | ||
|
|
fc98998627 | ||
|
|
065203d44a | ||
|
|
0c55887bfb | ||
|
|
1230aed61d | ||
|
|
d0c1444d92 | ||
|
|
bc5a39bb54 | ||
|
|
3481ecb255 | ||
|
|
798125152b | ||
|
|
77fac0f4c6 | ||
|
|
2d154fcd0d | ||
|
|
42924ed4e5 | ||
|
|
384d2ea6d1 | ||
|
|
84390dd063 | ||
|
|
52073b27a3 | ||
|
|
83c0e45160 | ||
|
|
d3a79b5861 | ||
|
|
750da00129 | ||
|
|
b8cec480f8 | ||
|
|
5350fd6173 | ||
|
|
edcc559f09 | ||
|
|
1be355734d | ||
|
|
347bd15e49 | ||
|
|
b24ad7cf57 | ||
|
|
ad6df41a9e | ||
|
|
45a145e5bc | ||
|
|
50a7a04e9a | ||
|
|
fee9d3362c | ||
|
|
fd52be2a3c | ||
|
|
e39197ec62 | ||
|
|
b659e0343a | ||
|
|
83806abe44 | ||
|
|
2f311d59dc | ||
|
|
65227a3c64 | ||
|
|
788e6e1548 | ||
|
|
ee9776fa23 | ||
|
|
36ac83904c | ||
|
|
efb7e85ecf | ||
|
|
4e1e579e8b | ||
|
|
1f7dfda705 | ||
|
|
20ff603108 | ||
|
|
e510dee162 | ||
|
|
1513e7910f | ||
|
|
52983ed529 | ||
|
|
9e6cb62048 | ||
|
|
3fe6e0faca | ||
|
|
e2e8e8e210 | ||
|
|
0dce4c1758 | ||
|
|
e5f05b5a96 | ||
|
|
be9cc73fca | ||
|
|
b65f4f7220 | ||
|
|
e3201d1d13 | ||
|
|
9291b46bcf | ||
|
|
afa48333ab | ||
|
|
9688ec2d0d | ||
|
|
0f77d250b6 | ||
|
|
311c7461c8 | ||
|
|
0f0c5b2d71 | ||
|
|
3d6e775d71 | ||
|
|
837783c2d3 | ||
|
|
89e068bc19 | ||
|
|
481cfc7985 | ||
|
|
f0ff001dd7 | ||
|
|
a2391a92cd | ||
|
|
d2d7d9a8b7 | ||
|
|
68a9c81040 | ||
|
|
e015e6ce28 | ||
|
|
9aaac2eee3 | ||
|
|
6b8261b8d6 | ||
|
|
9b65b7ddbe | ||
|
|
53516aed38 | ||
|
|
373cdf257d | ||
|
|
f7578e8048 | ||
|
|
b66ded9a5b | ||
|
|
6c61bc1950 | ||
|
|
c90d63105c | ||
|
|
00f585bd22 | ||
|
|
c24c66db97 | ||
|
|
bd2439f3fc | ||
|
|
4b65483921 | ||
|
|
7352bb9105 | ||
|
|
343cc0ce2b | ||
|
|
fe862639e7 | ||
|
|
775e22a8a6 | ||
|
|
a1e03463ac | ||
|
|
c72f00463f | ||
|
|
041510dc21 | ||
|
|
ef49e6c0d7 | ||
|
|
496264c1f9 | ||
|
|
1100dbc6b2 | ||
|
|
d3e8218386 | ||
|
|
4e5717754a | ||
|
|
3b397c8552 | ||
|
|
c698b45a7b | ||
|
|
015f6f5d94 | ||
|
|
83b01cf3c2 | ||
|
|
542b3000f0 | ||
|
|
063790012d | ||
|
|
90bcdbd15f | ||
|
|
8350268c05 | ||
|
|
3809d69ac4 | ||
|
|
38bf1192b6 | ||
|
|
349723cb8d | ||
|
|
8cbe42b94a | ||
|
|
378bcd5985 | ||
|
|
b3d75fe12e | ||
|
|
6a4b665550 | ||
|
|
913e43fea9 | ||
|
|
23ed890f3f | ||
|
|
ca47f5f06d | ||
|
|
1749ba265b | ||
|
|
9f5d2b947f | ||
|
|
a35e96a3fa | ||
|
|
bee7524251 | ||
|
|
ceff47b462 | ||
|
|
df4a25b41c | ||
|
|
84124794c2 | ||
|
|
c04c9ea361 | ||
|
|
5cacf212f0 | ||
|
|
3461c7b165 | ||
|
|
3301fb1e8a | ||
|
|
54028e779b | ||
|
|
7c991cc567 | ||
|
|
a021dbcb9e | ||
|
|
455cfae1e1 | ||
|
|
9e00949a26 | ||
|
|
c43ebd34af | ||
|
|
e30e356442 | ||
|
|
242eeaea47 | ||
|
|
b275bdd9b5 | ||
|
|
e1870d360e | ||
|
|
ec74194cb7 | ||
|
|
2568188630 | ||
|
|
833a82872c | ||
|
|
7ce5bd1590 | ||
|
|
d19e017d3f | ||
|
|
62c0a1b9ac | ||
|
|
0c972468e7 | ||
|
|
d2b2f6759f | ||
|
|
5f6cee86ef | ||
|
|
b685ee00b2 | ||
|
|
e0f8d16833 | ||
|
|
7b1e2bfe0f | ||
|
|
da57d2a1eb | ||
|
|
a6d120d4df | ||
|
|
607bd4ed84 | ||
|
|
f25c920fd3 | ||
|
|
7c5f2a2db9 | ||
|
|
cf74b8c2a3 | ||
|
|
4461eeb31d | ||
|
|
670b4567cf | ||
|
|
fab372d3a2 | ||
|
|
283c360392 | ||
|
|
86115c2a2e | ||
|
|
d038571213 | ||
|
|
138542de78 | ||
|
|
f52e500f80 | ||
|
|
3760a0448d | ||
|
|
f226ceb435 | ||
|
|
24c3d86f32 | ||
|
|
373e37bf13 | ||
|
|
5308bbbcf8 | ||
|
|
dcea9bf087 | ||
|
|
1b104b63a9 | ||
|
|
4421951d8f | ||
|
|
f09b7af685 | ||
|
|
2e2d49c76d | ||
|
|
bf9d1e2071 | ||
|
|
21c2dac159 | ||
|
|
ecce2afc1a | ||
|
|
3828dc913a | ||
|
|
1203e11a8d | ||
|
|
fbc766ee21 | ||
|
|
aa0ebeedb1 | ||
|
|
ca3fe7b3fd | ||
|
|
f44032969f | ||
|
|
4b8f5d031a | ||
|
|
e62419823a | ||
|
|
c92bdb0e91 | ||
|
|
8f46abc938 | ||
|
|
00504472b9 | ||
|
|
149acd186e | ||
|
|
dc5ca1d379 | ||
|
|
8dfde28b28 | ||
|
|
3c743cfea0 | ||
|
|
bd268137ed | ||
|
|
42dc6b5d3a | ||
|
|
31c4e03d5d | ||
|
|
89cb290bb0 | ||
|
|
25f32f3538 | ||
|
|
86dde5e02b | ||
|
|
4f864faf42 | ||
|
|
4070829ae5 | ||
|
|
d575968b4b | ||
|
|
bfbc41c1f1 | ||
|
|
0775bf2f03 | ||
|
|
4a63eb0522 | ||
|
|
8dc2d9280e | ||
|
|
783e44d07e | ||
|
|
96781ba33d | ||
|
|
b55e418a07 | ||
|
|
d475f61fd5 | ||
|
|
4415261688 | ||
|
|
b2e91060db | ||
|
|
2a6fb9ce59 | ||
|
|
ca747f09b6 | ||
|
|
6d47fc6d5b | ||
|
|
c7d306c65c | ||
|
|
c11f8352e9 | ||
|
|
5cea53d372 | ||
|
|
eb1f67b160 | ||
|
|
a57b9dab6c | ||
|
|
3abe7982bf | ||
|
|
83dca6296e | ||
|
|
cfa89012ab | ||
|
|
edd454b502 | ||
|
|
de9b971c2e | ||
|
|
b48dbf6bfa | ||
|
|
8f4dfc443b | ||
|
|
33c62e4fff | ||
|
|
14408bc8f8 | ||
|
|
903b9e8dd9 | ||
|
|
639ba13c4b | ||
|
|
11d431b2c4 | ||
|
|
eb37c7e361 | ||
|
|
23fab1181b | ||
|
|
1741d13b12 | ||
|
|
92ad4a2399 | ||
|
|
ce93d27fe5 | ||
|
|
3b0a6d2a68 | ||
|
|
ff240a9135 | ||
|
|
a731a24c93 | ||
|
|
b3dad2443a | ||
|
|
f9ab115acb | ||
|
|
f804f8652d | ||
|
|
f8df754b9a | ||
|
|
fecd2fd8f2 | ||
|
|
bb6b3f2486 | ||
|
|
2d168c5734 | ||
|
|
36552e7193 | ||
|
|
fe5ef5f20d | ||
|
|
ece9bdfc83 | ||
|
|
a36f5a54ab | ||
|
|
cbbfa0ddfb | ||
|
|
1ebf510e5a | ||
|
|
bd52bbfa27 | ||
|
|
dde11551e2 | ||
|
|
a9679acd5c | ||
|
|
020255a72d | ||
|
|
ac2dfe45d1 | ||
|
|
947dee7f2d | ||
|
|
1d702d28b6 | ||
|
|
e0845163aa | ||
|
|
d75d9774c8 | ||
|
|
fc3e826692 | ||
|
|
347beb21aa | ||
|
|
50158f393e | ||
|
|
6f2684b7ba | ||
|
|
8b4f9a88e6 | ||
|
|
455c471ee3 | ||
|
|
3b422d0dc1 | ||
|
|
f55e799491 | ||
|
|
94800781ea | ||
|
|
d08258f735 | ||
|
|
fda142ff6c | ||
|
|
d0be73a780 | ||
|
|
dd214d0f95 | ||
|
|
877731d2a2 | ||
|
|
d06a564328 | ||
|
|
66b6a5a84f | ||
|
|
4cb4637b79 | ||
|
|
ae08143d3d | ||
|
|
7b3e6970a6 | ||
|
|
1941290b79 | ||
|
|
996b3362bf | ||
|
|
35bccacb66 | ||
|
|
a04c6c1ac6 | ||
|
|
dab1c213fd | ||
|
|
9a83d55887 | ||
|
|
68f69417c7 | ||
|
|
b482e6d902 | ||
|
|
9b0da48915 | ||
|
|
578ded4645 | ||
|
|
dccf670492 | ||
|
|
a62c48b87e | ||
|
|
9559e035d2 | ||
|
|
e409d07ae8 | ||
|
|
ab6a87e670 | ||
|
|
b3dfc399da | ||
|
|
ebc718f5c0 | ||
|
|
4a6bd81432 | ||
|
|
c664f1ca66 | ||
|
|
8ddf9eac00 | ||
|
|
7ef059a75c | ||
|
|
825e0ed2a1 | ||
|
|
dac1727956 | ||
|
|
3c258ac907 | ||
|
|
3a00ec8639 | ||
|
|
806ef0897b | ||
|
|
4b43c25fe3 | ||
|
|
111ecdbaf5 | ||
|
|
716201c77d | ||
|
|
4c6d7fc258 | ||
|
|
7e7ab6ee1b | ||
|
|
0c865a75e6 | ||
|
|
683672c0bb | ||
|
|
9bf3dee242 | ||
|
|
b74805d383 | ||
|
|
1cae0f53a9 | ||
|
|
8f7e29b2cd | ||
|
|
8557205a82 | ||
|
|
2fd870a74f | ||
|
|
81f8c57e4a | ||
|
|
b408a82f9b | ||
|
|
726c9c977d | ||
|
|
fd6442c079 | ||
|
|
e22eb06a3b | ||
|
|
9887cd8adc | ||
|
|
8107eab3c0 | ||
|
|
ab28300a42 | ||
|
|
b05198a4f3 | ||
|
|
4127fbb9ed | ||
|
|
9402548546 | ||
|
|
86a18f5e2e | ||
|
|
bd477810b1 | ||
|
|
25e85db61c | ||
|
|
024133b089 | ||
|
|
62a953f402 | ||
|
|
cfc148930b | ||
|
|
f6c203e616 | ||
|
|
a01b3fb8e9 | ||
|
|
ba1a46392f | ||
|
|
a258fc443f | ||
|
|
5d3fdc1750 | ||
|
|
5cbff24608 | ||
|
|
7a08e6bdd6 | ||
|
|
d3ee704b28 | ||
|
|
aba89f20bf | ||
|
|
1f4cdb327f | ||
|
|
939d7c5d84 | ||
|
|
ebe3127734 | ||
|
|
969fcdb0de | ||
|
|
cef9fff067 | ||
|
|
ed2b4673de | ||
|
|
4b445753e6 | ||
|
|
8647f001bb | ||
|
|
5a2e151d48 | ||
|
|
9013b03244 | ||
|
|
744b3970f9 | ||
|
|
69c9ec92d0 | ||
|
|
fe4f90021f | ||
|
|
8bbebbba8f | ||
|
|
f292268268 | ||
|
|
9def4538ab | ||
|
|
6c821f5e1d | ||
|
|
d7e4087faf | ||
|
|
d1cabe4f22 | ||
|
|
94a74a0a45 | ||
|
|
84425a6290 | ||
|
|
3094fd1ac5 | ||
|
|
0d52c82ed1 | ||
|
|
adfc1d6cd2 | ||
|
|
2dc930de12 | ||
|
|
ab12c5d32f | ||
|
|
ba8d5c2206 | ||
|
|
75d4ac2659 | ||
|
|
4f90abaf17 | ||
|
|
2a11bc41ba | ||
|
|
2f7c65ec48 | ||
|
|
e9e0c5699b | ||
|
|
56b8db11c3 | ||
|
|
0d4cadb824 | ||
|
|
b4f7069c5b | ||
|
|
cf02cf31da | ||
|
|
c32e340d94 | ||
|
|
42f5b9e7aa | ||
|
|
033f311abc | ||
|
|
c2e01eba5a | ||
|
|
81b5d2211e | ||
|
|
764f65c8b4 | ||
|
|
7754ac0506 | ||
|
|
2264667bba | ||
|
|
d5973bdb98 | ||
|
|
63f561fac2 | ||
|
|
2436fb010e | ||
|
|
351c31ea58 | ||
|
|
c12ca885cc | ||
|
|
b38bcae1ba | ||
|
|
c8acab1d91 | ||
|
|
ea5aa61c8c | ||
|
|
29ff1e45b9 | ||
|
|
145d8bc1a3 | ||
|
|
486fa08d4b | ||
|
|
b0353addf2 | ||
|
|
b594f01fe4 | ||
|
|
39f181337b | ||
|
|
47aa6f3a65 | ||
|
|
218829e0a2 | ||
|
|
3c8a6678fe | ||
|
|
df5e6e5d48 | ||
|
|
3eac8905ae | ||
|
|
8419a53bf1 | ||
|
|
c90cd2c060 | ||
|
|
89d18ea40f | ||
|
|
dd64a4a483 | ||
|
|
8e4cda063c | ||
|
|
1ea6463fbb | ||
|
|
93e82c0146 | ||
|
|
7daae1fb42 | ||
|
|
6701eba736 | ||
|
|
e29f0c2d75 | ||
|
|
bf63945ad1 | ||
|
|
cb3f9680d3 | ||
|
|
876a725af9 | ||
|
|
ed1ea5fe7c | ||
|
|
f3aeb024d9 | ||
|
|
1e7e2bcf35 | ||
|
|
ce2a7ea40a | ||
|
|
1c598c2245 | ||
|
|
b2728cb139 | ||
|
|
e22762c010 | ||
|
|
762b652912 | ||
|
|
a4e97aa4eb | ||
|
|
5cc64cc27a | ||
|
|
1d0250709a | ||
|
|
93188bd80c | ||
|
|
8b8182db59 | ||
|
|
3dc266c58b | ||
|
|
25f5df2af2 | ||
|
|
a03954e6c5 | ||
|
|
e5ea9aa9aa | ||
|
|
1cb2cc6587 | ||
|
|
69d1feb83f | ||
|
|
8e2a533df6 | ||
|
|
b4b2fecb42 | ||
|
|
31e26814db | ||
|
|
21916f32c0 | ||
|
|
99ea8bf2b9 | ||
|
|
acb24bf354 | ||
|
|
11da15d142 | ||
|
|
725ec0ce1b | ||
|
|
1c3177eea7 | ||
|
|
dd23f7d5cd | ||
|
|
5c4f1dc43e | ||
|
|
cf2d33ca2e | ||
|
|
1664e793eb | ||
|
|
0901d75e07 | ||
|
|
12de9b0225 | ||
|
|
7fbad4cd5e | ||
|
|
752a438f99 | ||
|
|
acd9310234 | ||
|
|
8a5db6bab3 | ||
|
|
d0cc0439c0 | ||
|
|
837d2e1cac | ||
|
|
320162395d | ||
|
|
e9ba8d5a0e | ||
|
|
837cf85f7d | ||
|
|
7342f5a033 | ||
|
|
f139f30695 | ||
|
|
f2383b3cbd | ||
|
|
dcd6e75671 | ||
|
|
002b594870 | ||
|
|
d024059174 | ||
|
|
2624324ac2 | ||
|
|
8e4240c316 | ||
|
|
d9fc6b6933 | ||
|
|
acaab6fd74 | ||
|
|
76b9011c9e | ||
|
|
e36620d80e | ||
|
|
97b94cb1cd | ||
|
|
75e19e0d5e | ||
|
|
c418933d32 | ||
|
|
de0e46c2f6 | ||
|
|
3699666c93 | ||
|
|
3285a1efc8 | ||
|
|
4a50e87592 | ||
|
|
c077be4768 |
6
.github/actions/get-bootjdk/action.yml
vendored
6
.github/actions/get-bootjdk/action.yml
vendored
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -104,6 +104,6 @@ runs:
|
||||
- name: 'Export path to where BootJDK is installed'
|
||||
id: path-name
|
||||
run: |
|
||||
# Export the path
|
||||
echo 'path=bootjdk/jdk' >> $GITHUB_OUTPUT
|
||||
# Export the absolute path
|
||||
echo "path=`pwd`/bootjdk/jdk" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
||||
|
||||
2
.github/actions/get-gtest/action.yml
vendored
2
.github/actions/get-gtest/action.yml
vendored
@@ -40,7 +40,7 @@ runs:
|
||||
var: GTEST_VERSION
|
||||
|
||||
- name: 'Checkout GTest source'
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: google/googletest
|
||||
ref: 'v${{ steps.version.outputs.value }}'
|
||||
|
||||
2
.github/actions/get-jtreg/action.yml
vendored
2
.github/actions/get-jtreg/action.yml
vendored
@@ -47,7 +47,7 @@ runs:
|
||||
key: jtreg-${{ steps.version.outputs.value }}
|
||||
|
||||
- name: 'Checkout the JTReg source'
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: openjdk/jtreg
|
||||
ref: jtreg-${{ steps.version.outputs.value }}
|
||||
|
||||
6
.github/workflows/build-cross-compile.yml
vendored
6
.github/workflows/build-cross-compile.yml
vendored
@@ -85,7 +85,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: 'Checkout the JDK source'
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 'Get the BootJDK'
|
||||
id: bootjdk
|
||||
@@ -111,8 +111,7 @@ jobs:
|
||||
g++-${{ inputs.gcc-major-version }} \
|
||||
gcc-${{ inputs.gcc-major-version }}-${{ matrix.gnu-arch }}-linux-gnu${{ matrix.gnu-abi}} \
|
||||
g++-${{ inputs.gcc-major-version }}-${{ matrix.gnu-arch }}-linux-gnu${{ matrix.gnu-abi}} \
|
||||
libxrandr-dev libxtst-dev libcups2-dev libasound2-dev \
|
||||
debian-ports-archive-keyring
|
||||
libxrandr-dev libxtst-dev libcups2-dev libasound2-dev
|
||||
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${{ inputs.gcc-major-version }} 100 --slave /usr/bin/g++ g++ /usr/bin/g++-${{ inputs.gcc-major-version }}
|
||||
|
||||
- name: 'Check cache for sysroot'
|
||||
@@ -134,7 +133,6 @@ jobs:
|
||||
--include=fakeroot,symlinks,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype-dev,libpng-dev
|
||||
--resolve-deps
|
||||
--variant=minbase
|
||||
$(test -n "${{ matrix.debian-keyring }}" && echo "--keyring=${{ matrix.debian-keyring }}")
|
||||
${{ matrix.debian-version }}
|
||||
sysroot
|
||||
${{ matrix.debian-repository }}
|
||||
|
||||
2
.github/workflows/build-linux.yml
vendored
2
.github/workflows/build-linux.yml
vendored
@@ -78,7 +78,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: 'Checkout the JDK source'
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 'Get the BootJDK'
|
||||
id: bootjdk
|
||||
|
||||
4
.github/workflows/build-macos.yml
vendored
4
.github/workflows/build-macos.yml
vendored
@@ -55,7 +55,7 @@ on:
|
||||
jobs:
|
||||
build-macos:
|
||||
name: build
|
||||
runs-on: macos-11
|
||||
runs-on: macos-13
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@@ -68,7 +68,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: 'Checkout the JDK source'
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 'Get the BootJDK'
|
||||
id: bootjdk
|
||||
|
||||
2
.github/workflows/build-windows.yml
vendored
2
.github/workflows/build-windows.yml
vendored
@@ -79,7 +79,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: 'Checkout the JDK source'
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 'Get MSYS2'
|
||||
uses: ./.github/actions/get-msys2
|
||||
|
||||
12
.github/workflows/main.yml
vendored
12
.github/workflows/main.yml
vendored
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -146,8 +146,8 @@ jobs:
|
||||
apt-architecture: 'i386'
|
||||
# Some multilib libraries do not have proper inter-dependencies, so we have to
|
||||
# install their dependencies manually.
|
||||
apt-extra-packages: 'libfreetype-dev:i386 libtiff-dev:i386 libcupsimage2-dev:i386 libc6-i386 libgcc-s1:i386 libstdc++6:i386'
|
||||
extra-conf-options: '--with-target-bits=32'
|
||||
apt-extra-packages: 'libfreetype-dev:i386 libtiff-dev:i386 libcupsimage2-dev:i386 libc6-i386 libgcc-s1:i386 libstdc++6:i386 libffi-dev:i386'
|
||||
extra-conf-options: '--with-target-bits=32 --enable-fallback-linker --enable-libffi-bundling'
|
||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||
if: needs.select.outputs.linux-x86 == 'true'
|
||||
@@ -227,7 +227,7 @@ jobs:
|
||||
uses: ./.github/workflows/build-macos.yml
|
||||
with:
|
||||
platform: macos-x64
|
||||
xcode-toolset-version: '12.5.1'
|
||||
xcode-toolset-version: '14.3.1'
|
||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||
if: needs.select.outputs.macos-x64 == 'true'
|
||||
@@ -238,7 +238,7 @@ jobs:
|
||||
uses: ./.github/workflows/build-macos.yml
|
||||
with:
|
||||
platform: macos-aarch64
|
||||
xcode-toolset-version: '12.5.1'
|
||||
xcode-toolset-version: '14.3.1'
|
||||
extra-conf-options: '--openjdk-target=aarch64-apple-darwin'
|
||||
configure-arguments: ${{ github.event.inputs.configure-arguments }}
|
||||
make-arguments: ${{ github.event.inputs.make-arguments }}
|
||||
@@ -318,7 +318,7 @@ jobs:
|
||||
with:
|
||||
platform: macos-x64
|
||||
bootjdk-platform: macos-x64
|
||||
runs-on: macos-11
|
||||
runs-on: macos-13
|
||||
|
||||
test-windows-x64:
|
||||
name: windows-x64
|
||||
|
||||
6
.github/workflows/test.yml
vendored
6
.github/workflows/test.yml
vendored
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -105,7 +105,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: 'Checkout the JDK source'
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 'Get MSYS2'
|
||||
uses: ./.github/actions/get-msys2
|
||||
@@ -132,7 +132,7 @@ jobs:
|
||||
run: |
|
||||
# On macOS we need to install some dependencies for testing
|
||||
brew install make
|
||||
sudo xcode-select --switch /Applications/Xcode_11.7.app/Contents/Developer
|
||||
sudo xcode-select --switch /Applications/Xcode_14.3.1.app/Contents/Developer
|
||||
# This will make GNU make available as 'make' and not only as 'gmake'
|
||||
echo '/usr/local/opt/make/libexec/gnubin' >> $GITHUB_PATH
|
||||
if: runner.os == 'macOS'
|
||||
|
||||
@@ -367,7 +367,7 @@ to date at the time of writing.</p>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td>macOS</td>
|
||||
<td>Mac OS X 10.13 (High Sierra)</td>
|
||||
<td>macOS 13 (Ventura)</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td>Windows</td>
|
||||
@@ -464,9 +464,8 @@ this makes it difficult for a project such as the JDK to keep pace with
|
||||
a continuously updated machine running macOS. See the section on <a
|
||||
href="#apple-xcode">Apple Xcode</a> on some strategies to deal with
|
||||
this.</p>
|
||||
<p>It is recommended that you use at least Mac OS X 10.13 (High Sierra).
|
||||
At the time of writing, the JDK has been successfully compiled on macOS
|
||||
10.12 (Sierra).</p>
|
||||
<p>It is recommended that you use at least macOS 13 (Ventura) and Xcode
|
||||
14, but earlier versions may also work.</p>
|
||||
<p>The standard macOS environment contains the basic tooling needed to
|
||||
build, but for external libraries a package manager is recommended. The
|
||||
JDK uses <a href="https://brew.sh/">homebrew</a> in the examples, but
|
||||
@@ -545,7 +544,7 @@ to compile successfully without issues.</p>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td>macOS</td>
|
||||
<td>Apple Xcode 10.1 (using clang 10.0.0)</td>
|
||||
<td>Apple Xcode 14.3.1 (using clang 14.0.3)</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td>Windows</td>
|
||||
@@ -820,11 +819,11 @@ about the problem.</p>
|
||||
<p>Some command line examples:</p>
|
||||
<ul>
|
||||
<li><p>Create a 32-bit build for Windows with FreeType2 in
|
||||
<code>C:\freetype-i586</code>:
|
||||
<code>bash configure --with-freetype=/cygdrive/c/freetype-i586 --with-target-bits=32</code></p></li>
|
||||
<code>C:\freetype-i586</code>:</p>
|
||||
<pre><code>bash configure --with-freetype=/cygdrive/c/freetype-i586 --with-target-bits=32</code></pre></li>
|
||||
<li><p>Create a debug build with the <code>server</code> JVM and DTrace
|
||||
enabled:
|
||||
<code>bash configure --enable-debug --with-jvm-variants=server --enable-dtrace</code></p></li>
|
||||
enabled:</p>
|
||||
<pre><code>bash configure --enable-debug --with-jvm-variants=server --enable-dtrace</code></pre></li>
|
||||
</ul>
|
||||
<h3 id="common-configure-arguments">Common Configure Arguments</h3>
|
||||
<p>Here follows some of the most common and important
|
||||
@@ -1332,14 +1331,12 @@ Package Search</a> and search for the <code>libasound2</code> and
|
||||
<code>libasound2-dev</code> packages for your <em>target</em> system.
|
||||
Download them to /tmp.</p></li>
|
||||
<li><p>Install the libraries into the cross-compilation toolchain. For
|
||||
instance:</p></li>
|
||||
</ul>
|
||||
instance:</p>
|
||||
<pre><code>cd /tools/gcc-linaro-arm-linux-gnueabihf-raspbian-2012.09-20120921_linux/arm-linux-gnueabihf/libc
|
||||
dpkg-deb -x /tmp/libasound2_1.0.25-4_armhf.deb .
|
||||
dpkg-deb -x /tmp/libasound2-dev_1.0.25-4_armhf.deb .</code></pre>
|
||||
<ul>
|
||||
<li>If alsa is not properly detected by <code>configure</code>, you can
|
||||
point it out by <code>--with-alsa</code>.</li>
|
||||
dpkg-deb -x /tmp/libasound2-dev_1.0.25-4_armhf.deb .</code></pre></li>
|
||||
<li><p>If alsa is not properly detected by <code>configure</code>, you
|
||||
can point it out by <code>--with-alsa</code>.</p></li>
|
||||
</ul>
|
||||
<h4 id="x11-1">X11</h4>
|
||||
<p>You will need X11 libraries suitable for your <em>target</em> system.
|
||||
@@ -1373,21 +1370,18 @@ Package Search</a>, search for the following packages for your
|
||||
</ul></li>
|
||||
<li><p>Install the libraries into the cross-compilation toolchain. For
|
||||
instance:</p>
|
||||
<pre><code> cd /tools/gcc-linaro-arm-linux-gnueabihf-raspbian-2012.09-20120921_linux/arm-linux-gnueabihf/libc/usr
|
||||
mkdir X11R6
|
||||
cd X11R6
|
||||
for deb in /tmp/target-x11/*.deb ; do dpkg-deb -x $deb . ; done
|
||||
mv usr/* .
|
||||
cd lib
|
||||
cp arm-linux-gnueabihf/* .
|
||||
```
|
||||
|
||||
You can ignore the following messages. These libraries are not needed to
|
||||
successfully complete a full JDK build.</code></pre>
|
||||
<p>cp: cannot stat
|
||||
<code>arm-linux-gnueabihf/libICE.so': No such file or directory cp: cannot stat</code>arm-linux-gnueabihf/libSM.so':
|
||||
No such file or directory cp: cannot stat
|
||||
`arm-linux-gnueabihf/libXt.so': No such file or directory ```</p></li>
|
||||
<pre><code>cd /tools/gcc-linaro-arm-linux-gnueabihf-raspbian-2012.09-20120921_linux/arm-linux-gnueabihf/libc/usr
|
||||
mkdir X11R6
|
||||
cd X11R6
|
||||
for deb in /tmp/target-x11/*.deb ; do dpkg-deb -x $deb . ; done
|
||||
mv usr/* .
|
||||
cd lib
|
||||
cp arm-linux-gnueabihf/* .</code></pre>
|
||||
<p>You can ignore the following messages. These libraries are not needed
|
||||
to successfully complete a full JDK build.</p>
|
||||
<pre><code>cp: cannot stat `arm-linux-gnueabihf/libICE.so': No such file or directory
|
||||
cp: cannot stat `arm-linux-gnueabihf/libSM.so': No such file or directory
|
||||
cp: cannot stat `arm-linux-gnueabihf/libXt.so': No such file or directory</code></pre></li>
|
||||
<li><p>If the X11 libraries are not properly detected by
|
||||
<code>configure</code>, you can point them out by
|
||||
<code>--with-x</code>.</p></li>
|
||||
@@ -1405,17 +1399,41 @@ native compilation speed.</p>
|
||||
<p>For example, cross-compiling to AArch64 from x86_64 could be done
|
||||
like this:</p>
|
||||
<ul>
|
||||
<li><p>Install cross-compiler on the <em>build</em> system:
|
||||
<code>apt install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu</code></p></li>
|
||||
<li><p>Install cross-compiler on the <em>build</em> system:</p>
|
||||
<pre><code>apt install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu</code></pre></li>
|
||||
<li><p>Create chroot on the <em>build</em> system, configuring it for
|
||||
<em>target</em> system:
|
||||
<code>sudo debootstrap \ --arch=arm64 \ --verbose \ --include=fakeroot,symlinks,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng-dev,libffi-dev \ --resolve-deps \ buster \ ~/sysroot-arm64 \ http://httpredir.debian.org/debian/ # If the target architecture is `riscv64`, # the path should be `debian-ports` instead of `debian`.</code></p></li>
|
||||
<em>target</em> system:</p>
|
||||
<pre><code>sudo debootstrap \
|
||||
--arch=arm64 \
|
||||
--verbose \
|
||||
--include=fakeroot,symlinks,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng-dev,libffi-dev \
|
||||
--resolve-deps \
|
||||
buster \
|
||||
~/sysroot-arm64 \
|
||||
http://httpredir.debian.org/debian/
|
||||
# If the target architecture is `riscv64`,
|
||||
# the path should be `debian-ports` instead of `debian`.</code></pre></li>
|
||||
<li><p>To create a Ubuntu-based chroot:</p>
|
||||
<pre><code>sudo debootstrap \
|
||||
--arch=arm64 \
|
||||
--verbose \
|
||||
--components=main,universe \
|
||||
--include=fakeroot,symlinks,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng-dev,libffi-dev \
|
||||
--resolve-deps \
|
||||
jammy \
|
||||
~/sysroot-arm64 \
|
||||
http://ports.ubuntu.com/ubuntu-ports/
|
||||
# symlinks is in the universe repository</code></pre></li>
|
||||
<li><p>Make sure the symlinks inside the newly created chroot point to
|
||||
proper locations:
|
||||
<code>sudo chroot ~/sysroot-arm64 symlinks -cr .</code></p></li>
|
||||
proper locations:</p>
|
||||
<pre><code>sudo chroot ~/sysroot-arm64 symlinks -cr .</code></pre></li>
|
||||
<li><p>Configure and build with newly created chroot as
|
||||
sysroot/toolchain-path:
|
||||
<code>sh ./configure \ --openjdk-target=aarch64-linux-gnu \ --with-sysroot=~/sysroot-arm64 make images ls build/linux-aarch64-server-release/</code></p></li>
|
||||
sysroot/toolchain-path:</p>
|
||||
<pre><code>sh ./configure \
|
||||
--openjdk-target=aarch64-linux-gnu \
|
||||
--with-sysroot=~/sysroot-arm64
|
||||
make images
|
||||
ls build/linux-aarch64-server-release/</code></pre></li>
|
||||
</ul>
|
||||
<p>The build does not create new files in that chroot, so it can be
|
||||
reused for multiple builds without additional cleanup.</p>
|
||||
@@ -1567,12 +1585,27 @@ libraries</a> required by OpenJDK complicate the building process. The
|
||||
placeholder <code><toolchain-installed-path></code> shown below is
|
||||
the path where you want to install the toolchain.</p>
|
||||
<ul>
|
||||
<li><p>Install the RISC-V GNU compiler toolchain:
|
||||
<code>git clone --recursive https://github.com/riscv-collab/riscv-gnu-toolchain cd riscv-gnu-toolchain ./configure --prefix=<toolchain-installed-path> make linux export PATH=<toolchain-installed-path>/bin:$PATH</code></p></li>
|
||||
<li><p>Cross-compile all the required libraries:
|
||||
<code># An example for libffi git clone https://github.com/libffi/libffi cd libffi ./configure --host=riscv64-unknown-linux-gnu --prefix=<toolchain-installed-path>/sysroot/usr make make install</code></p></li>
|
||||
<li><p>Configure and build OpenJDK:
|
||||
<code>bash configure \ --with-boot-jdk=$BOOT_JDK \ --openjdk-target=riscv64-linux-gnu \ --with-sysroot=<toolchain-installed-path>/sysroot \ --with-toolchain-path=<toolchain-installed-path>/bin \ --with-extra-path=<toolchain-installed-path>/bin make images</code></p></li>
|
||||
<li><p>Install the RISC-V GNU compiler toolchain:</p>
|
||||
<pre><code>git clone --recursive https://github.com/riscv-collab/riscv-gnu-toolchain
|
||||
cd riscv-gnu-toolchain
|
||||
./configure --prefix=<toolchain-installed-path>
|
||||
make linux
|
||||
export PATH=<toolchain-installed-path>/bin:$PATH</code></pre></li>
|
||||
<li><p>Cross-compile all the required libraries:</p>
|
||||
<pre><code># An example for libffi
|
||||
git clone https://github.com/libffi/libffi
|
||||
cd libffi
|
||||
./configure --host=riscv64-unknown-linux-gnu --prefix=<toolchain-installed-path>/sysroot/usr
|
||||
make
|
||||
make install</code></pre></li>
|
||||
<li><p>Configure and build OpenJDK:</p>
|
||||
<pre><code>bash configure \
|
||||
--with-boot-jdk=$BOOT_JDK \
|
||||
--openjdk-target=riscv64-linux-gnu \
|
||||
--with-sysroot=<toolchain-installed-path>/sysroot \
|
||||
--with-toolchain-path=<toolchain-installed-path>/bin \
|
||||
--with-extra-path=<toolchain-installed-path>/bin
|
||||
make images</code></pre></li>
|
||||
</ul>
|
||||
<h3 id="building-for-musl">Building for musl</h3>
|
||||
<p>Just like it's possible to cross-compile for a different CPU, it's
|
||||
|
||||
@@ -167,7 +167,7 @@ time of writing.
|
||||
| Operating system | Vendor/version used |
|
||||
| ----------------- | ---------------------------------- |
|
||||
| Linux | Oracle Enterprise Linux 6.4 / 7.6 |
|
||||
| macOS | Mac OS X 10.13 (High Sierra) |
|
||||
| macOS | macOS 13 (Ventura) |
|
||||
| Windows | Windows Server 2012 R2 |
|
||||
|
||||
The double version numbers for Linux are due to the hybrid model
|
||||
@@ -270,8 +270,8 @@ difficult for a project such as the JDK to keep pace with a continuously updated
|
||||
machine running macOS. See the section on [Apple Xcode](#apple-xcode) on some
|
||||
strategies to deal with this.
|
||||
|
||||
It is recommended that you use at least Mac OS X 10.13 (High Sierra). At the time
|
||||
of writing, the JDK has been successfully compiled on macOS 10.12 (Sierra).
|
||||
It is recommended that you use at least macOS 13 (Ventura) and Xcode
|
||||
14, but earlier versions may also work.
|
||||
|
||||
The standard macOS environment contains the basic tooling needed to build, but
|
||||
for external libraries a package manager is recommended. The JDK uses
|
||||
@@ -337,7 +337,7 @@ issues.
|
||||
| Operating system | Toolchain version |
|
||||
| ------------------ | ------------------------------------------ |
|
||||
| Linux | gcc 11.2.0 |
|
||||
| macOS | Apple Xcode 10.1 (using clang 10.0.0) |
|
||||
| macOS | Apple Xcode 14.3.1 (using clang 14.0.3) |
|
||||
| Windows | Microsoft Visual Studio 2022 update 17.1.0 |
|
||||
|
||||
All compilers are expected to be able to compile to the C99 language standard,
|
||||
@@ -626,11 +626,13 @@ automatically, it will exit and inform you about the problem.
|
||||
Some command line examples:
|
||||
|
||||
* Create a 32-bit build for Windows with FreeType2 in `C:\freetype-i586`:
|
||||
|
||||
```
|
||||
bash configure --with-freetype=/cygdrive/c/freetype-i586 --with-target-bits=32
|
||||
```
|
||||
|
||||
* Create a debug build with the `server` JVM and DTrace enabled:
|
||||
|
||||
```
|
||||
bash configure --enable-debug --with-jvm-variants=server --enable-dtrace
|
||||
```
|
||||
@@ -1100,11 +1102,12 @@ Note that alsa is needed even if you only want to build a headless JDK.
|
||||
system. Download them to /tmp.
|
||||
|
||||
* Install the libraries into the cross-compilation toolchain. For instance:
|
||||
```
|
||||
cd /tools/gcc-linaro-arm-linux-gnueabihf-raspbian-2012.09-20120921_linux/arm-linux-gnueabihf/libc
|
||||
dpkg-deb -x /tmp/libasound2_1.0.25-4_armhf.deb .
|
||||
dpkg-deb -x /tmp/libasound2-dev_1.0.25-4_armhf.deb .
|
||||
```
|
||||
|
||||
```
|
||||
cd /tools/gcc-linaro-arm-linux-gnueabihf-raspbian-2012.09-20120921_linux/arm-linux-gnueabihf/libc
|
||||
dpkg-deb -x /tmp/libasound2_1.0.25-4_armhf.deb .
|
||||
dpkg-deb -x /tmp/libasound2-dev_1.0.25-4_armhf.deb .
|
||||
```
|
||||
|
||||
* If alsa is not properly detected by `configure`, you can point it out by
|
||||
`--with-alsa`.
|
||||
@@ -1140,6 +1143,7 @@ Note that X11 is needed even if you only want to build a headless JDK.
|
||||
* libxext-dev
|
||||
|
||||
* Install the libraries into the cross-compilation toolchain. For instance:
|
||||
|
||||
```
|
||||
cd /tools/gcc-linaro-arm-linux-gnueabihf-raspbian-2012.09-20120921_linux/arm-linux-gnueabihf/libc/usr
|
||||
mkdir X11R6
|
||||
@@ -1173,11 +1177,13 @@ for foreign architectures with native compilation speed.
|
||||
For example, cross-compiling to AArch64 from x86_64 could be done like this:
|
||||
|
||||
* Install cross-compiler on the *build* system:
|
||||
|
||||
```
|
||||
apt install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu
|
||||
```
|
||||
|
||||
* Create chroot on the *build* system, configuring it for *target* system:
|
||||
|
||||
```
|
||||
sudo debootstrap \
|
||||
--arch=arm64 \
|
||||
@@ -1191,12 +1197,29 @@ For example, cross-compiling to AArch64 from x86_64 could be done like this:
|
||||
# the path should be `debian-ports` instead of `debian`.
|
||||
```
|
||||
|
||||
* To create a Ubuntu-based chroot:
|
||||
|
||||
```
|
||||
sudo debootstrap \
|
||||
--arch=arm64 \
|
||||
--verbose \
|
||||
--components=main,universe \
|
||||
--include=fakeroot,symlinks,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng-dev,libffi-dev \
|
||||
--resolve-deps \
|
||||
jammy \
|
||||
~/sysroot-arm64 \
|
||||
http://ports.ubuntu.com/ubuntu-ports/
|
||||
# symlinks is in the universe repository
|
||||
```
|
||||
|
||||
* Make sure the symlinks inside the newly created chroot point to proper locations:
|
||||
|
||||
```
|
||||
sudo chroot ~/sysroot-arm64 symlinks -cr .
|
||||
```
|
||||
|
||||
* Configure and build with newly created chroot as sysroot/toolchain-path:
|
||||
|
||||
```
|
||||
sh ./configure \
|
||||
--openjdk-target=aarch64-linux-gnu \
|
||||
@@ -1255,6 +1278,7 @@ complicate the building process. The placeholder `<toolchain-installed-path>`
|
||||
shown below is the path where you want to install the toolchain.
|
||||
|
||||
* Install the RISC-V GNU compiler toolchain:
|
||||
|
||||
```
|
||||
git clone --recursive https://github.com/riscv-collab/riscv-gnu-toolchain
|
||||
cd riscv-gnu-toolchain
|
||||
@@ -1264,6 +1288,7 @@ shown below is the path where you want to install the toolchain.
|
||||
```
|
||||
|
||||
* Cross-compile all the required libraries:
|
||||
|
||||
```
|
||||
# An example for libffi
|
||||
git clone https://github.com/libffi/libffi
|
||||
@@ -1274,6 +1299,7 @@ shown below is the path where you want to install the toolchain.
|
||||
```
|
||||
|
||||
* Configure and build OpenJDK:
|
||||
|
||||
```
|
||||
bash configure \
|
||||
--with-boot-jdk=$BOOT_JDK \
|
||||
|
||||
@@ -478,6 +478,27 @@ endif
|
||||
|
||||
################################################################################
|
||||
|
||||
ifneq ($(filter static-libs-graal-bundles, $(MAKECMDGOALS)), )
|
||||
STATIC_LIBS_GRAAL_BUNDLE_FILES := $(call FindFiles, $(STATIC_LIBS_GRAAL_IMAGE_DIR))
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS)-$(DEBUG_LEVEL), macosx-release)
|
||||
STATIC_LIBS_GRAAL_BUNDLE_SUBDIR := $(JDK_MACOSX_CONTENTS_SUBDIR)/Home
|
||||
else
|
||||
STATIC_LIBS_GRAAL_BUNDLE_SUBDIR := $(JDK_BUNDLE_SUBDIR)
|
||||
endif
|
||||
|
||||
$(eval $(call SetupBundleFile, BUILD_STATIC_LIBS_GRAAL_BUNDLE, \
|
||||
BUNDLE_NAME := $(STATIC_LIBS_GRAAL_BUNDLE_NAME), \
|
||||
FILES := $(STATIC_LIBS_GRAAL_BUNDLE_FILES), \
|
||||
BASE_DIRS := $(STATIC_LIBS_GRAAL_IMAGE_DIR), \
|
||||
SUBDIR := $(STATIC_LIBS_GRAAL_BUNDLE_SUBDIR), \
|
||||
))
|
||||
|
||||
STATIC_LIBS_GRAAL_TARGETS += $(BUILD_STATIC_LIBS_GRAAL_BUNDLE)
|
||||
endif
|
||||
|
||||
################################################################################
|
||||
|
||||
# Hook to include the corresponding custom file, if present.
|
||||
$(eval $(call IncludeCustomExtension, Bundles.gmk))
|
||||
|
||||
@@ -490,8 +511,9 @@ docs-jdk-bundles: $(DOCS_JDK_TARGETS)
|
||||
docs-javase-bundles: $(DOCS_JAVASE_TARGETS)
|
||||
docs-reference-bundles: $(DOCS_REFERENCE_TARGETS)
|
||||
static-libs-bundles: $(STATIC_LIBS_TARGETS)
|
||||
static-libs-graal-bundles: $(STATIC_LIBS_GRAAL_TARGETS)
|
||||
jcov-bundles: $(JCOV_TARGETS)
|
||||
|
||||
.PHONY: all default product-bundles test-bundles \
|
||||
docs-jdk-bundles docs-javase-bundles docs-reference-bundles \
|
||||
static-libs-bundles jcov-bundles
|
||||
static-libs-bundles static-libs-graal-bundles jcov-bundles
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -81,13 +81,11 @@ endif
|
||||
ifneq ($(CMDS_DIR), )
|
||||
DEPS += $(call FindFiles, $(CMDS_DIR))
|
||||
ifeq ($(call isTargetOs, windows)+$(SHIP_DEBUG_SYMBOLS), true+public)
|
||||
# For public debug symbols on Windows, we have to use stripped pdbs, rename them
|
||||
# and filter out a few launcher pdbs where there's a lib that goes by the same name
|
||||
# For public debug symbols on Windows, we have to use stripped pdbs and rename them
|
||||
rename_stripped = $(patsubst %.stripped.pdb,%.pdb,$1)
|
||||
CMDS_DIR_FILTERED := $(subst modules_cmds,modules_cmds_filtered, $(CMDS_DIR))
|
||||
FILES_CMDS := $(filter-out %.pdb, $(call FindFiles, $(CMDS_DIR))) \
|
||||
$(filter-out %jimage.stripped.pdb %jpackage.stripped.pdb %java.stripped.pdb, \
|
||||
$(filter %.stripped.pdb, $(call FindFiles, $(CMDS_DIR))))
|
||||
$(filter %.stripped.pdb, $(call FindFiles, $(CMDS_DIR)))
|
||||
$(eval $(call SetupCopyFiles, COPY_FILTERED_CMDS, \
|
||||
SRC := $(CMDS_DIR), \
|
||||
DEST := $(CMDS_DIR_FILTERED), \
|
||||
@@ -96,18 +94,6 @@ ifneq ($(CMDS_DIR), )
|
||||
))
|
||||
DEPS += $(COPY_FILTERED_CMDS)
|
||||
JMOD_FLAGS += --cmds $(CMDS_DIR_FILTERED)
|
||||
else ifeq ($(call isTargetOs, windows)+$(SHIP_DEBUG_SYMBOLS), true+full)
|
||||
# For full debug symbols on Windows, we have to filter out a few launcher pdbs
|
||||
# where there's a lib that goes by the same name
|
||||
CMDS_DIR_FILTERED := $(subst modules_cmds,modules_cmds_filtered, $(CMDS_DIR))
|
||||
$(eval $(call SetupCopyFiles, COPY_FILTERED_CMDS, \
|
||||
SRC := $(CMDS_DIR), \
|
||||
DEST := $(CMDS_DIR_FILTERED), \
|
||||
FILES := $(filter-out %jimage.pdb %jpackage.pdb %java.pdb, \
|
||||
$(call FindFiles, $(CMDS_DIR))), \
|
||||
))
|
||||
DEPS += $(COPY_FILTERED_CMDS)
|
||||
JMOD_FLAGS += --cmds $(CMDS_DIR_FILTERED)
|
||||
else
|
||||
JMOD_FLAGS += --cmds $(CMDS_DIR)
|
||||
endif
|
||||
|
||||
@@ -66,10 +66,6 @@ MODULES_SOURCE_PATH := $(call PathList, $(call GetModuleSrcPath) )
|
||||
# In order to get a specific ordering it's necessary to specify the total
|
||||
# ordering of tags as the tags are otherwise ordered in order of definition.
|
||||
JAVADOC_TAGS := \
|
||||
-tag beaninfo:X \
|
||||
-tag since.unbundled:X \
|
||||
-tag Note:X \
|
||||
-tag ToDo:X \
|
||||
-tag 'apiNote:a:API Note:' \
|
||||
-tag 'implSpec:a:Implementation Requirements:' \
|
||||
-tag 'implNote:a:Implementation Note:' \
|
||||
|
||||
@@ -274,9 +274,6 @@ else
|
||||
endif
|
||||
endif
|
||||
|
||||
FILTERED_PDBS := %jimage.stripped.pdb %jpackage.stripped.pdb %java.stripped.pdb \
|
||||
%jimage.pdb %jpackage.pdb %java.pdb %jimage.map %jpackage.map %java.map
|
||||
|
||||
# Param 1 - either JDK or JRE
|
||||
SetupCopyDebuginfo = \
|
||||
$(foreach m, $(ALL_$1_MODULES), \
|
||||
@@ -290,8 +287,8 @@ SetupCopyDebuginfo = \
|
||||
$(eval $(call SetupCopyFiles, COPY_$1_CMDS_DEBUGINFO_$m, \
|
||||
SRC := $(SUPPORT_OUTPUTDIR)/modules_cmds/$m, \
|
||||
DEST := $($1_IMAGE_DIR)/$(CMDS_TARGET_SUBDIR), \
|
||||
FILES := $(filter-out $(FILTERED_PDBS), $(call FindDebuginfoFiles, \
|
||||
$(SUPPORT_OUTPUTDIR)/modules_cmds/$m)), \
|
||||
FILES := $(call FindDebuginfoFiles, \
|
||||
$(SUPPORT_OUTPUTDIR)/modules_cmds/$m), \
|
||||
)) \
|
||||
$(eval $1_TARGETS += $$(COPY_$1_CMDS_DEBUGINFO_$m)) \
|
||||
)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -46,8 +46,10 @@ JIMAGE_PKGS := \
|
||||
jdk/internal/jrtfs \
|
||||
#
|
||||
|
||||
# Compile jrt-fs.jar with the interim compiler, as it
|
||||
# ends up in the image, this will ensure reproducible classes
|
||||
$(eval $(call SetupJavaCompilation, BUILD_JRTFS, \
|
||||
COMPILER := bootjdk, \
|
||||
COMPILER := interim, \
|
||||
DISABLED_WARNINGS := options, \
|
||||
TARGET_RELEASE := $(TARGET_RELEASE_JDK8), \
|
||||
SRC := $(TOPDIR)/src/java.base/share/classes, \
|
||||
|
||||
@@ -851,6 +851,12 @@ $(eval $(call SetupTarget, static-libs-bundles, \
|
||||
DEPS := static-libs-image, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupTarget, static-libs-graal-bundles, \
|
||||
MAKEFILE := Bundles, \
|
||||
TARGET := static-libs-graal-bundles, \
|
||||
DEPS := static-libs-graal-image, \
|
||||
))
|
||||
|
||||
ifeq ($(JCOV_ENABLED), true)
|
||||
$(eval $(call SetupTarget, jcov-bundles, \
|
||||
MAKEFILE := Bundles, \
|
||||
@@ -1425,13 +1431,13 @@ ALL_TARGETS += $(addsuffix -only, $(filter-out dist-clean clean%, $(ALL_TARGETS)
|
||||
# are internal only, to support Init.gmk.
|
||||
|
||||
print-targets:
|
||||
@$(ECHO) $(sort $(ALL_TARGETS))
|
||||
$(info $(subst $(SPACE),$(NEWLINE),$(sort $(ALL_TARGETS))))
|
||||
|
||||
print-modules:
|
||||
@$(ECHO) $(sort $(ALL_MODULES))
|
||||
$(info $(subst $(SPACE),$(NEWLINE),$(sort $(ALL_MODULES))))
|
||||
|
||||
print-tests:
|
||||
@$(ECHO) $(sort $(ALL_NAMED_TESTS))
|
||||
$(info $(subst $(SPACE),$(NEWLINE),$(sort $(ALL_NAMED_TESTS))))
|
||||
|
||||
create-main-targets-include:
|
||||
$(call LogInfo, Generating main target list)
|
||||
|
||||
@@ -178,7 +178,8 @@ ifeq ($(TEST_JOBS), 0)
|
||||
c = c * $(TEST_JOBS_FACTOR_JDL); \
|
||||
c = c * $(TEST_JOBS_FACTOR_MACHINE); \
|
||||
if (c < 1) c = 1; \
|
||||
printf "%.0f", c; \
|
||||
c = c + 0.5; \
|
||||
printf "%d", c; \
|
||||
}')
|
||||
endif
|
||||
|
||||
@@ -356,7 +357,7 @@ ExpandJtregPath = \
|
||||
# with test id: dir/Test.java#selection -> Test.java#selection -> .java#selection -> #selection
|
||||
# without: dir/Test.java -> Test.java -> .java -> <<empty string>>
|
||||
TestID = \
|
||||
$(subst .sh,,$(subst .html,,$(subst .java,,$(suffix $(notdir $1)))))
|
||||
$(subst .jasm,,$(subst .sh,,$(subst .html,,$(subst .java,,$(suffix $(notdir $1))))))
|
||||
|
||||
# The test id starting with a hash (#testid) will be stripped by all
|
||||
# evals in ParseJtregTestSelectionInner and will be reinserted by calling
|
||||
@@ -862,11 +863,12 @@ define SetupRunJtregTestBody
|
||||
|
||||
$$(eval $$(call SetupRunJtregTestCustom, $1))
|
||||
|
||||
clean-workdir-$1:
|
||||
clean-outputdirs-$1:
|
||||
$$(RM) -r $$($1_TEST_SUPPORT_DIR)
|
||||
$$(RM) -r $$($1_TEST_RESULTS_DIR)
|
||||
|
||||
$1_COMMAND_LINE := \
|
||||
$$(JAVA) $$($1_JTREG_LAUNCHER_OPTIONS) \
|
||||
$$(JTREG_JAVA) $$($1_JTREG_LAUNCHER_OPTIONS) \
|
||||
-Dprogram=jtreg -jar $$(JT_HOME)/lib/jtreg.jar \
|
||||
$$($1_JTREG_BASIC_OPTIONS) \
|
||||
-testjdk:$$(JDK_UNDER_TEST) \
|
||||
@@ -909,7 +911,7 @@ define SetupRunJtregTestBody
|
||||
done
|
||||
endif
|
||||
|
||||
run-test-$1: pre-run-test clean-workdir-$1
|
||||
run-test-$1: pre-run-test clean-outputdirs-$1
|
||||
$$(call LogWarn)
|
||||
$$(call LogWarn, Running test '$$($1_TEST)')
|
||||
$$(call MakeDir, $$($1_TEST_RESULTS_DIR) $$($1_TEST_SUPPORT_DIR) \
|
||||
@@ -946,9 +948,9 @@ define SetupRunJtregTestBody
|
||||
$$(eval $1_TOTAL := 1) \
|
||||
)
|
||||
|
||||
$1: run-test-$1 parse-test-$1 clean-workdir-$1
|
||||
$1: run-test-$1 parse-test-$1 clean-outputdirs-$1
|
||||
|
||||
TARGETS += $1 run-test-$1 parse-test-$1 clean-workdir-$1
|
||||
TARGETS += $1 run-test-$1 parse-test-$1 clean-outputdirs-$1
|
||||
TEST_TARGETS += parse-test-$1
|
||||
|
||||
endef
|
||||
|
||||
@@ -122,6 +122,7 @@ $(eval $(call SetupVariable,JT_HOME))
|
||||
$(eval $(call SetupVariable,JDK_IMAGE_DIR,$(OUTPUTDIR)/images/jdk))
|
||||
$(eval $(call SetupVariable,TEST_IMAGE_DIR,$(OUTPUTDIR)/images/test))
|
||||
$(eval $(call SetupVariable,SYMBOLS_IMAGE_DIR,$(OUTPUTDIR)/images/symbols,NO_CHECK))
|
||||
$(eval $(call SetupVariable,JTREG_JDK,$(BOOT_JDK)))
|
||||
|
||||
# Provide default values for tools that we need
|
||||
$(eval $(call SetupVariable,MAKE,make,NO_CHECK))
|
||||
@@ -157,6 +158,10 @@ ifeq ($(UNAME_OS), CYGWIN)
|
||||
OPENJDK_TARGET_OS := windows
|
||||
OPENJDK_TARGET_OS_TYPE := windows
|
||||
OPENJDK_TARGET_OS_ENV := windows.cygwin
|
||||
else ifeq ($(UNAME_OS), MINGW64)
|
||||
OPENJDK_TARGET_OS := windows
|
||||
OPENJDK_TARGET_OS_TYPE := windows
|
||||
OPENJDK_TARGET_OS_ENV := windows.msys2
|
||||
else
|
||||
OPENJDK_TARGET_OS_TYPE:=unix
|
||||
ifeq ($(UNAME_OS), Linux)
|
||||
@@ -169,6 +174,9 @@ else
|
||||
OPENJDK_TARGET_OS_ENV := $(OPENJDK_TARGET_OS)
|
||||
endif
|
||||
|
||||
# Sanity check env detection
|
||||
$(info Detected target OS, type and env: [$(OPENJDK_TARGET_OS)] [$(OPENJDK_TARGET_OS_TYPE)] [$(OPENJDK_TARGET_OS_ENV)])
|
||||
|
||||
# Assume little endian unless otherwise specified
|
||||
OPENJDK_TARGET_CPU_ENDIAN := little
|
||||
|
||||
@@ -248,6 +256,7 @@ $(call CreateNewSpec, $(NEW_SPEC), \
|
||||
TOPDIR := $(TOPDIR), \
|
||||
OUTPUTDIR := $(OUTPUTDIR), \
|
||||
BOOT_JDK := $(BOOT_JDK), \
|
||||
JTREG_JDK := $(JTREG_JDK), \
|
||||
JT_HOME := $(JT_HOME), \
|
||||
JDK_IMAGE_DIR := $(JDK_IMAGE_DIR), \
|
||||
JCOV_IMAGE_DIR := $(JCOV_IMAGE_DIR), \
|
||||
|
||||
@@ -124,6 +124,8 @@ JAR := $(FIXPATH) $(JAR_CMD)
|
||||
JLINK := $(FIXPATH) $(JLINK_CMD)
|
||||
JMOD := $(FIXPATH) $(JMOD_CMD)
|
||||
|
||||
JTREG_JAVA := $(FIXPATH) $(JTREG_JDK)/bin/java $(JAVA_FLAGS_BIG) $(JAVA_FLAGS)
|
||||
|
||||
BUILD_JAVA := $(JDK_IMAGE_DIR)/bin/JAVA
|
||||
################################################################################
|
||||
# Some common tools. Assume most common name and no path.
|
||||
|
||||
@@ -76,8 +76,8 @@ TOOL_GENERATECACERTS = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_class
|
||||
-Dkeystore.pkcs12.macAlgorithm=NONE \
|
||||
build.tools.generatecacerts.GenerateCacerts
|
||||
|
||||
TOOL_GENERATEEMOJIDATA = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
|
||||
build.tools.generateemojidata.GenerateEmojiData
|
||||
TOOL_GENERATEEXTRAPROPERTIES = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
|
||||
build.tools.generateextraproperties.GenerateExtraProperties
|
||||
|
||||
TOOL_MAKEZIPREPRODUCIBLE = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
|
||||
build.tools.makezipreproducible.MakeZipReproducible
|
||||
@@ -137,4 +137,7 @@ PANDOC_HTML_MANPAGE_FILTER := $(BUILDTOOLS_OUTPUTDIR)/manpages/pandoc-html-manpa
|
||||
|
||||
##########################################################################################
|
||||
|
||||
# Hook to include the corresponding custom post file, if present.
|
||||
$(eval $(call IncludeCustomExtension, ToolsJdk-post.gmk))
|
||||
|
||||
endif # _TOOLS_GMK
|
||||
|
||||
@@ -87,9 +87,9 @@ ifeq ($(call isTargetOs, windows), true)
|
||||
$(eval $(call SetupZipArchive,BUILD_JGSS_BIN_ZIP, \
|
||||
SRC := $(SUPPORT_OUTPUTDIR), \
|
||||
INCLUDE_FILES := modules_libs/java.security.jgss/w2k_lsa_auth.dll \
|
||||
modules_libs/java.security.jgss/w2k_lsa_auth.diz \
|
||||
modules_libs/java.security.jgss/w2k_lsa_auth.map \
|
||||
modules_libs/java.security.jgss/w2k_lsa_auth.pdb, \
|
||||
modules_libs/java.security.jgss/w2k_lsa_auth.dll.diz \
|
||||
modules_libs/java.security.jgss/w2k_lsa_auth.dll.map \
|
||||
modules_libs/java.security.jgss/w2k_lsa_auth.dll.pdb, \
|
||||
ZIP := $(IMAGES_OUTPUTDIR)/$(JGSS_ZIP_NAME)))
|
||||
|
||||
TARGETS += $(IMAGES_OUTPUTDIR)/$(JGSS_ZIP_NAME)
|
||||
|
||||
@@ -479,7 +479,7 @@ AC_DEFUN([BASIC_CHECK_DIR_ON_LOCAL_DISK],
|
||||
# df on AIX does not understand -l. On modern AIXes it understands "-T local" which
|
||||
# is the same. On older AIXes we just continue to live with a "not local build" warning.
|
||||
if test "x$OPENJDK_TARGET_OS" = xaix; then
|
||||
if "$DF -T local > /dev/null 2>&1"; then
|
||||
if $DF -T local > /dev/null 2>&1; then
|
||||
DF_LOCAL_ONLY_OPTION='-T local'
|
||||
else # AIX may use GNU-utils instead
|
||||
DF_LOCAL_ONLY_OPTION='-l'
|
||||
|
||||
@@ -243,8 +243,11 @@ AC_DEFUN([BPERF_SETUP_CCACHE_USAGE],
|
||||
fi
|
||||
fi
|
||||
|
||||
# The CCACHE_BASEDIR needs to end with '/' as ccache will otherwise think
|
||||
# directories next to it, that have the base dir name as a prefix, are sub
|
||||
# directories of CCACHE_BASEDIR.
|
||||
CCACHE="CCACHE_COMPRESS=1 $SET_CCACHE_DIR \
|
||||
CCACHE_SLOPPINESS=$CCACHE_SLOPPINESS CCACHE_BASEDIR=$TOPDIR $CCACHE"
|
||||
CCACHE_SLOPPINESS=$CCACHE_SLOPPINESS CCACHE_BASEDIR=$WORKSPACE_ROOT/ $CCACHE"
|
||||
|
||||
if test "x$SET_CCACHE_DIR" != x; then
|
||||
mkdir -p $CCACHE_DIR > /dev/null 2>&1
|
||||
|
||||
@@ -560,8 +560,10 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER],
|
||||
TOOLCHAIN_CFLAGS_JVM="-qtbtable=full -qtune=balanced -fno-exceptions \
|
||||
-qalias=noansi -qstrict -qtls=default -qnortti -qnoeh -qignerrno -qstackprotect"
|
||||
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
|
||||
TOOLCHAIN_CFLAGS_JVM="-nologo -MD -Zc:preprocessor -Zc:strictStrings -Zc:inline -MP"
|
||||
TOOLCHAIN_CFLAGS_JDK="-nologo -MD -Zc:preprocessor -Zc:strictStrings -Zc:inline -Zc:wchar_t-"
|
||||
# The -utf-8 option sets source and execution character sets to UTF-8 to enable correct
|
||||
# compilation of all source files regardless of the active code page on Windows.
|
||||
TOOLCHAIN_CFLAGS_JVM="-nologo -MD -Zc:preprocessor -Zc:strictStrings -Zc:inline -utf-8 -MP"
|
||||
TOOLCHAIN_CFLAGS_JDK="-nologo -MD -Zc:preprocessor -Zc:strictStrings -Zc:inline -utf-8 -Zc:wchar_t-"
|
||||
fi
|
||||
|
||||
# CFLAGS C language level for JDK sources (hotspot only uses C++)
|
||||
@@ -797,15 +799,6 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_CPU_DEP],
|
||||
$1_TOOLCHAIN_CFLAGS="${$1_GCC6_CFLAGS}"
|
||||
|
||||
$1_WARNING_CFLAGS_JVM="-Wno-format-zero-length -Wtype-limits -Wuninitialized"
|
||||
elif test "x$TOOLCHAIN_TYPE" = xclang; then
|
||||
NO_DELETE_NULL_POINTER_CHECKS_CFLAG="-fno-delete-null-pointer-checks"
|
||||
FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [$NO_DELETE_NULL_POINTER_CHECKS_CFLAG],
|
||||
PREFIX: $3,
|
||||
IF_FALSE: [
|
||||
NO_DELETE_NULL_POINTER_CHECKS_CFLAG=
|
||||
]
|
||||
)
|
||||
$1_TOOLCHAIN_CFLAGS="${NO_DELETE_NULL_POINTER_CHECKS_CFLAG}"
|
||||
fi
|
||||
|
||||
if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
|
||||
@@ -816,6 +809,7 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_CPU_DEP],
|
||||
REPRODUCIBLE_CFLAGS=
|
||||
]
|
||||
)
|
||||
AC_SUBST(REPRODUCIBLE_CFLAGS)
|
||||
fi
|
||||
|
||||
# Prevent the __FILE__ macro from generating absolute paths into the built
|
||||
@@ -849,6 +843,22 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_CPU_DEP],
|
||||
FILE_MACRO_CFLAGS=
|
||||
]
|
||||
)
|
||||
if test "x$FILE_MACRO_CFLAGS" != x; then
|
||||
# Add -pathmap for all VS system include paths using Windows
|
||||
# full Long path name that is generated by the compiler
|
||||
# Not enabled under WSL as there is no easy way to obtain the
|
||||
# Windows full long paths, thus reproducible WSL builds will
|
||||
# depend on building with the same VS toolchain install location.
|
||||
if test "x$OPENJDK_BUILD_OS_ENV" != "xwindows.wsl1" && test "x$OPENJDK_BUILD_OS_ENV" != "xwindows.wsl2"; then
|
||||
for ipath in ${$3SYSROOT_CFLAGS}; do
|
||||
if test "x${ipath:0:2}" == "x-I"; then
|
||||
ipath_path=${ipath#"-I"}
|
||||
UTIL_FIXUP_WIN_LONG_PATH(ipath_path)
|
||||
FILE_MACRO_CFLAGS="$FILE_MACRO_CFLAGS -pathmap:\"$ipath_path\"=vsi"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([how to prevent absolute paths in output])
|
||||
@@ -926,17 +936,12 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_CPU_DEP],
|
||||
# $2 - Prefix for compiler variables (either BUILD_ or nothing).
|
||||
AC_DEFUN([FLAGS_SETUP_GCC6_COMPILER_FLAGS],
|
||||
[
|
||||
# These flags are required for GCC 6 builds as undefined behavior in OpenJDK code
|
||||
# runs afoul of the more aggressive versions of these optimizations.
|
||||
# Notably, value range propagation now assumes that the this pointer of C++
|
||||
# member functions is non-null.
|
||||
NO_DELETE_NULL_POINTER_CHECKS_CFLAG="-fno-delete-null-pointer-checks"
|
||||
FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [$NO_DELETE_NULL_POINTER_CHECKS_CFLAG],
|
||||
PREFIX: $2, IF_FALSE: [NO_DELETE_NULL_POINTER_CHECKS_CFLAG=""])
|
||||
# This flag is required for GCC 6 builds as undefined behavior in OpenJDK code
|
||||
# runs afoul of the more aggressive versions of this optimization.
|
||||
NO_LIFETIME_DSE_CFLAG="-fno-lifetime-dse"
|
||||
FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [$NO_LIFETIME_DSE_CFLAG],
|
||||
PREFIX: $2, IF_FALSE: [NO_LIFETIME_DSE_CFLAG=""])
|
||||
$1_GCC6_CFLAGS="${NO_DELETE_NULL_POINTER_CHECKS_CFLAG} ${NO_LIFETIME_DSE_CFLAG}"
|
||||
$1_GCC6_CFLAGS="${NO_LIFETIME_DSE_CFLAG}"
|
||||
])
|
||||
|
||||
AC_DEFUN_ONCE([FLAGS_SETUP_BRANCH_PROTECTION],
|
||||
|
||||
@@ -60,7 +60,8 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
|
||||
# Add -z,defs, to forbid undefined symbols in object files.
|
||||
# add -z,relro (mark relocations read only) for all libs
|
||||
# add -z,now ("full relro" - more of the Global Offset Table GOT is marked read only)
|
||||
BASIC_LDFLAGS="-Wl,-z,defs -Wl,-z,relro -Wl,-z,now"
|
||||
# add --no-as-needed to disable default --as-needed link flag on some GCC toolchains
|
||||
BASIC_LDFLAGS="-Wl,-z,defs -Wl,-z,relro -Wl,-z,now -Wl,--no-as-needed"
|
||||
# Linux : remove unused code+data in link step
|
||||
if test "x$ENABLE_LINKTIME_GC" = xtrue; then
|
||||
if test "x$OPENJDK_TARGET_CPU" = xs390x; then
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -128,16 +128,12 @@ AC_DEFUN([FLAGS_SETUP_MACOSX_VERSION],
|
||||
# The expected format for <version> is either nn.n.n or nn.nn.nn. See
|
||||
# /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/AvailabilityVersions.h
|
||||
|
||||
# MACOSX_VERSION_MIN specifies the lowest version of Macosx that the built
|
||||
# MACOSX_VERSION_MIN specifies the lowest version of macOS that the built
|
||||
# binaries should be compatible with, even if compiled on a newer version
|
||||
# of the OS. It currently has a hard coded value. Setting this also limits
|
||||
# exposure to API changes in header files. Bumping this is likely to
|
||||
# require code changes to build.
|
||||
if test "x$OPENJDK_TARGET_CPU_ARCH" = xaarch64; then
|
||||
MACOSX_VERSION_MIN=11.00.00
|
||||
else
|
||||
MACOSX_VERSION_MIN=10.12.0
|
||||
fi
|
||||
MACOSX_VERSION_MIN=11.00.00
|
||||
MACOSX_VERSION_MIN_NODOTS=${MACOSX_VERSION_MIN//\./}
|
||||
|
||||
AC_SUBST(MACOSX_VERSION_MIN)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -134,7 +134,8 @@ AC_DEFUN([LIB_BUILD_BINUTILS],
|
||||
BINUTILS_SRC="$with_binutils_src"
|
||||
UTIL_FIXUP_PATH(BINUTILS_SRC)
|
||||
|
||||
BINUTILS_DIR="$CONFIGURESUPPORT_OUTPUTDIR/binutils"
|
||||
BINUTILS_BUILD_DIR="$CONFIGURESUPPORT_OUTPUTDIR/binutils"
|
||||
BINUTILS_INSTALL_DIR="$CONFIGURESUPPORT_OUTPUTDIR/binutils-install"
|
||||
|
||||
if ! test -d $BINUTILS_SRC; then
|
||||
AC_MSG_ERROR([--with-binutils-src is not pointing to a directory])
|
||||
@@ -143,15 +144,15 @@ AC_DEFUN([LIB_BUILD_BINUTILS],
|
||||
AC_MSG_ERROR([--with-binutils-src does not look like a binutils source directory])
|
||||
fi
|
||||
|
||||
if ! test -d $BINUTILS_DIR; then
|
||||
$MKDIR -p $BINUTILS_DIR
|
||||
if ! test -d $BINUTILS_BUILD_DIR; then
|
||||
$MKDIR -p $BINUTILS_BUILD_DIR
|
||||
fi
|
||||
|
||||
if test -e $BINUTILS_DIR/bfd/libbfd.a && \
|
||||
test -e $BINUTILS_DIR/opcodes/libopcodes.a && \
|
||||
test -e $BINUTILS_DIR/libiberty/libiberty.a && \
|
||||
test -e $BINUTILS_DIR/zlib/libz.a; then
|
||||
AC_MSG_NOTICE([Found binutils binaries in binutils source directory -- not building])
|
||||
# We don't know the version, not checking for libsframe.a
|
||||
if test -e $BINUTILS_INSTALL_DIR/lib/libbfd.a && \
|
||||
test -e $BINUTILS_INSTALL_DIR/lib/libopcodes.a && \
|
||||
test -e $BINUTILS_INSTALL_DIR/lib/libiberty.a; then
|
||||
AC_MSG_NOTICE([Found binutils binaries in binutils install directory -- not building])
|
||||
else
|
||||
# On Windows, we cannot build with the normal Microsoft CL, but must instead use
|
||||
# a separate mingw toolchain.
|
||||
@@ -190,20 +191,26 @@ AC_DEFUN([LIB_BUILD_BINUTILS],
|
||||
binutils_cflags="$binutils_cflags $MACHINE_FLAG $JVM_PICFLAG $C_O_FLAG_NORM"
|
||||
|
||||
AC_MSG_NOTICE([Running binutils configure])
|
||||
AC_MSG_NOTICE([configure command line: cd $BINUTILS_DIR && $BINUTILS_SRC/configure --disable-nls CFLAGS="$binutils_cflags" CC="$binutils_cc" AR="$AR" $binutils_target])
|
||||
AC_MSG_NOTICE([configure command line: cd $BINUTILS_BUILD_DIR && $BINUTILS_SRC/configure --disable-werror --prefix=$BINUTILS_INSTALL_DIR --enable-install-libiberty --with-system-zlib --without-zstd --disable-nls CFLAGS="$binutils_cflags" CC="$binutils_cc" AR="$AR" $binutils_target])
|
||||
saved_dir=`pwd`
|
||||
cd "$BINUTILS_DIR"
|
||||
$BINUTILS_SRC/configure --disable-nls CFLAGS="$binutils_cflags" CC="$binutils_cc" AR="$AR" $binutils_target
|
||||
if test $? -ne 0 || ! test -e $BINUTILS_DIR/Makefile; then
|
||||
cd "$BINUTILS_BUILD_DIR"
|
||||
$BINUTILS_SRC/configure --disable-werror --prefix=$BINUTILS_INSTALL_DIR --enable-install-libiberty --with-system-zlib --without-zstd --disable-nls CFLAGS="$binutils_cflags" CC="$binutils_cc" AR="$AR" $binutils_target
|
||||
if test $? -ne 0 || ! test -e $BINUTILS_BUILD_DIR/Makefile; then
|
||||
AC_MSG_NOTICE([Automatic building of binutils failed on configure. Try building it manually])
|
||||
AC_MSG_ERROR([Cannot continue])
|
||||
fi
|
||||
AC_MSG_NOTICE([Running binutils make])
|
||||
$MAKE all-opcodes
|
||||
$MAKE all-opcodes all-libiberty
|
||||
if test $? -ne 0; then
|
||||
AC_MSG_NOTICE([Automatic building of binutils failed on make. Try building it manually])
|
||||
AC_MSG_ERROR([Cannot continue])
|
||||
fi
|
||||
AC_MSG_NOTICE([Running binutils make install])
|
||||
$MAKE install-opcodes install-libiberty
|
||||
if test $? -ne 0; then
|
||||
AC_MSG_NOTICE([Automatic building, install step, of binutils failed on make. Try building it manually])
|
||||
AC_MSG_ERROR([Cannot continue])
|
||||
fi
|
||||
cd $saved_dir
|
||||
AC_MSG_NOTICE([Building of binutils done])
|
||||
fi
|
||||
@@ -223,40 +230,57 @@ AC_DEFUN([LIB_SETUP_HSDIS_BINUTILS],
|
||||
|
||||
# We need the binutils static libs and includes.
|
||||
if test "x$with_binutils_src" != x; then
|
||||
# Try building the source first. If it succeeds, it sets $BINUTILS_DIR.
|
||||
# Try building the source first. If it succeeds, it sets $BINUTILS_INSTALL_DIR.
|
||||
LIB_BUILD_BINUTILS
|
||||
fi
|
||||
|
||||
if test "x$with_binutils" != x; then
|
||||
BINUTILS_DIR="$with_binutils"
|
||||
BINUTILS_INSTALL_DIR="$with_binutils"
|
||||
fi
|
||||
|
||||
binutils_system_error=""
|
||||
HSDIS_LDFLAGS=""
|
||||
HSDIS_LIBS=""
|
||||
if test "x$BINUTILS_DIR" = xsystem; then
|
||||
disasm_header="<dis-asm.h>"
|
||||
|
||||
if test "x$BINUTILS_INSTALL_DIR" = xsystem; then
|
||||
AC_CHECK_LIB(bfd, bfd_openr, [ HSDIS_LIBS="-lbfd" ], [ binutils_system_error="libbfd not found" ])
|
||||
AC_CHECK_LIB(opcodes, disassembler, [ HSDIS_LIBS="$HSDIS_LIBS -lopcodes" ], [ binutils_system_error="libopcodes not found" ])
|
||||
AC_CHECK_LIB(iberty, xmalloc, [ HSDIS_LIBS="$HSDIS_LIBS -liberty" ], [ binutils_system_error="libiberty not found" ])
|
||||
AC_CHECK_LIB(z, deflate, [ HSDIS_LIBS="$HSDIS_LIBS -lz" ], [ binutils_system_error="libz not found" ])
|
||||
# libiberty is not required on Ubuntu
|
||||
AC_CHECK_LIB(iberty, xmalloc, [ HSDIS_LIBS="$HSDIS_LIBS -liberty" ])
|
||||
AC_CHECK_LIB(sframe, frame, [ HSDIS_LIBS="$HSDIS_LIBS -lsframe" ], )
|
||||
HSDIS_CFLAGS="-DLIBARCH_$OPENJDK_TARGET_CPU_LEGACY_LIB"
|
||||
elif test "x$BINUTILS_DIR" != x; then
|
||||
if test -e $BINUTILS_DIR/bfd/libbfd.a && \
|
||||
test -e $BINUTILS_DIR/opcodes/libopcodes.a && \
|
||||
test -e $BINUTILS_DIR/libiberty/libiberty.a && \
|
||||
test -e $BINUTILS_DIR/zlib/libz.a; then
|
||||
HSDIS_CFLAGS="-DLIBARCH_$OPENJDK_TARGET_CPU_LEGACY_LIB"
|
||||
if test -n "$BINUTILS_SRC"; then
|
||||
HSDIS_CFLAGS="$HSDIS_CFLAGS -I$BINUTILS_SRC/include -I$BINUTILS_DIR/bfd"
|
||||
else
|
||||
HSDIS_CFLAGS="$HSDIS_CFLAGS -I$BINUTILS_DIR/include -I$BINUTILS_DIR/bfd"
|
||||
elif test "x$BINUTILS_INSTALL_DIR" != x; then
|
||||
disasm_header="\"$BINUTILS_INSTALL_DIR/include/dis-asm.h\""
|
||||
if test -e $BINUTILS_INSTALL_DIR/lib/libbfd.a && \
|
||||
test -e $BINUTILS_INSTALL_DIR/lib/libopcodes.a && \
|
||||
test -e $BINUTILS_INSTALL_DIR/lib/libiberty.a; then
|
||||
HSDIS_CFLAGS="-DLIBARCH_$OPENJDK_TARGET_CPU_LEGACY_LIB -I$BINUTILS_INSTALL_DIR/include"
|
||||
HSDIS_LIBS="$BINUTILS_INSTALL_DIR/lib/libbfd.a $BINUTILS_INSTALL_DIR/lib/libopcodes.a $BINUTILS_INSTALL_DIR/lib/libiberty.a"
|
||||
# If we have libsframe add it.
|
||||
if test -e $BINUTILS_INSTALL_DIR/lib/libsframe.a; then
|
||||
HSDIS_LIBS="$HSDIS_LIBS $BINUTILS_INSTALL_DIR/lib/libsframe.a"
|
||||
fi
|
||||
HSDIS_LDFLAGS=""
|
||||
HSDIS_LIBS="$BINUTILS_DIR/bfd/libbfd.a $BINUTILS_DIR/opcodes/libopcodes.a $BINUTILS_DIR/libiberty/libiberty.a $BINUTILS_DIR/zlib/libz.a"
|
||||
AC_CHECK_LIB(z, deflate, [ HSDIS_LIBS="$HSDIS_LIBS -lz" ], AC_MSG_ERROR([libz not found]))
|
||||
else
|
||||
AC_MSG_ERROR(["$BINUTILS_INSTALL_DIR/libs/ must contain libbfd.a, libopcodes.a, libiberty.a"])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([Checking binutils API])
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include $disasm_header],[[void foo() {init_disassemble_info(0, 0, 0, 0);}]])],
|
||||
[
|
||||
AC_MSG_RESULT([New API])
|
||||
HSDIS_CFLAGS="$HSDIS_CFLAGS -DBINUTILS_NEW_API"
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([Old API])
|
||||
]
|
||||
)
|
||||
|
||||
AC_MSG_CHECKING([for binutils to use with hsdis])
|
||||
case "x$BINUTILS_DIR" in
|
||||
case "x$BINUTILS_INSTALL_DIR" in
|
||||
xsystem)
|
||||
if test "x$OPENJDK_TARGET_OS" != xlinux; then
|
||||
AC_MSG_RESULT([invalid])
|
||||
@@ -279,10 +303,10 @@ AC_DEFUN([LIB_SETUP_HSDIS_BINUTILS],
|
||||
;;
|
||||
*)
|
||||
if test "x$HSDIS_LIBS" != x; then
|
||||
AC_MSG_RESULT([$BINUTILS_DIR])
|
||||
AC_MSG_RESULT([$BINUTILS_INSTALL_DIR])
|
||||
else
|
||||
AC_MSG_RESULT([invalid])
|
||||
AC_MSG_ERROR([$BINUTILS_DIR does not contain a proper binutils installation])
|
||||
AC_MSG_ERROR([$BINUTILS_INSTALL_DIR does not contain a proper binutils installation])
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -227,12 +227,47 @@ AC_DEFUN_ONCE([LIB_TESTS_SETUP_JTREG],
|
||||
UTIL_FIXUP_PATH(JT_HOME)
|
||||
AC_SUBST(JT_HOME)
|
||||
|
||||
# Specify a JDK for running jtreg. Defaults to the BOOT_JDK.
|
||||
AC_ARG_WITH(jtreg-jdk, [AS_HELP_STRING([--with-jdk],
|
||||
[path to JDK for running jtreg @<:@BOOT_JDK@:>@])])
|
||||
|
||||
AC_MSG_CHECKING([for jtreg jdk])
|
||||
if test "x${with_jtreg_jdk}" != x; then
|
||||
if test "x${with_jtreg_jdk}" = xno; then
|
||||
AC_MSG_RESULT([no, jtreg jdk not specified])
|
||||
elif test "x${with_jtreg_jdk}" = xyes; then
|
||||
AC_MSG_RESULT([not specified])
|
||||
AC_MSG_ERROR([--with-jtreg-jdk needs a value])
|
||||
else
|
||||
JTREG_JDK="${with_jtreg_jdk}"
|
||||
AC_MSG_RESULT([$JTREG_JDK])
|
||||
UTIL_FIXUP_PATH(JTREG_JDK)
|
||||
if test ! -f "$JTREG_JDK/bin/java"; then
|
||||
AC_MSG_ERROR([Could not find jtreg java at $JTREG_JDK/bin/java])
|
||||
fi
|
||||
fi
|
||||
else
|
||||
JTREG_JDK="${BOOT_JDK}"
|
||||
AC_MSG_RESULT([no, using BOOT_JDK])
|
||||
fi
|
||||
|
||||
UTIL_FIXUP_PATH(JTREG_JDK)
|
||||
AC_SUBST([JTREG_JDK])
|
||||
# For use in the configure script
|
||||
JTREG_JAVA="$FIXPATH $JTREG_JDK/bin/java"
|
||||
|
||||
# Verify jtreg version
|
||||
if test "x$JT_HOME" != x; then
|
||||
AC_MSG_CHECKING([jtreg jar existence])
|
||||
if test ! -f "$JT_HOME/lib/jtreg.jar"; then
|
||||
AC_MSG_ERROR([Could not find jtreg jar at $JT_HOME/lib/jtreg.jar])
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([jtreg version number])
|
||||
# jtreg -version looks like this: "jtreg 6.1+1-19"
|
||||
# Extract actual version part ("6.1" in this case)
|
||||
jtreg_version_full=`$JAVA -jar $JT_HOME/lib/jtreg.jar -version | $HEAD -n 1 | $CUT -d ' ' -f 2`
|
||||
jtreg_version_full=$($JTREG_JAVA -jar $JT_HOME/lib/jtreg.jar -version | $HEAD -n 1 | $CUT -d ' ' -f 2)
|
||||
|
||||
jtreg_version=${jtreg_version_full/%+*}
|
||||
AC_MSG_RESULT([$jtreg_version])
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -35,6 +35,7 @@ AC_DEFUN_ONCE([LIB_SETUP_X11],
|
||||
X_CFLAGS=
|
||||
X_LIBS=
|
||||
else
|
||||
x_libraries_orig="$x_libraries"
|
||||
|
||||
if test "x${with_x}" = xno; then
|
||||
AC_MSG_ERROR([It is not possible to disable the use of X11. Remove the --without-x option.])
|
||||
@@ -48,6 +49,7 @@ AC_DEFUN_ONCE([LIB_SETUP_X11],
|
||||
fi
|
||||
if test "x$x_libraries" = xNONE; then
|
||||
x_libraries="${with_x}/lib"
|
||||
x_libraries_orig="$x_libraries"
|
||||
fi
|
||||
else
|
||||
# Check if the user has specified sysroot, but not --with-x, --x-includes or --x-libraries.
|
||||
@@ -82,8 +84,8 @@ AC_DEFUN_ONCE([LIB_SETUP_X11],
|
||||
AC_PATH_XTRA
|
||||
|
||||
# AC_PATH_XTRA creates X_LIBS and sometimes adds -R flags. When cross compiling
|
||||
# this doesn't make sense so we remove it.
|
||||
if test "x$COMPILE_TYPE" = xcross; then
|
||||
# this doesn't make sense so we remove it; same for sysroot (devkit).
|
||||
if test "x$COMPILE_TYPE" = xcross || (test "x$SYSROOT" != "x" && test "x$x_libraries_orig" = xNONE); then
|
||||
X_LIBS=`$ECHO $X_LIBS | $SED 's/-R \{0,1\}[[^ ]]*//g'`
|
||||
fi
|
||||
|
||||
|
||||
@@ -108,12 +108,6 @@ AC_DEFUN([LIB_SETUP_JVM_LIBS],
|
||||
BASIC_JVM_LIBS_$1="$BASIC_JVM_LIBS_$1 -latomic"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Because RISC-V only has word-sized atomics, it requires libatomic where
|
||||
# other common architectures do not, so link libatomic by default.
|
||||
if test "x$OPENJDK_$1_OS" = xlinux && test "x$OPENJDK_$1_CPU" = xriscv64; then
|
||||
BASIC_JVM_LIBS_$1="$BASIC_JVM_LIBS_$1 -latomic"
|
||||
fi
|
||||
])
|
||||
|
||||
################################################################################
|
||||
|
||||
@@ -567,8 +567,6 @@ AC_DEFUN([PLATFORM_SETUP_LEGACY_VARS_HELPER],
|
||||
HOTSPOT_$1_CPU_DEFINE=PPC64
|
||||
elif test "x$OPENJDK_$1_CPU" = xppc64le; then
|
||||
HOTSPOT_$1_CPU_DEFINE=PPC64
|
||||
elif test "x$OPENJDK_$1_CPU" = xriscv32; then
|
||||
HOTSPOT_$1_CPU_DEFINE=RISCV32
|
||||
elif test "x$OPENJDK_$1_CPU" = xriscv64; then
|
||||
HOTSPOT_$1_CPU_DEFINE=RISCV64
|
||||
|
||||
@@ -577,10 +575,14 @@ AC_DEFUN([PLATFORM_SETUP_LEGACY_VARS_HELPER],
|
||||
HOTSPOT_$1_CPU_DEFINE=SPARC
|
||||
elif test "x$OPENJDK_$1_CPU" = xppc; then
|
||||
HOTSPOT_$1_CPU_DEFINE=PPC32
|
||||
elif test "x$OPENJDK_$1_CPU" = xriscv32; then
|
||||
HOTSPOT_$1_CPU_DEFINE=RISCV32
|
||||
elif test "x$OPENJDK_$1_CPU" = xs390; then
|
||||
HOTSPOT_$1_CPU_DEFINE=S390
|
||||
elif test "x$OPENJDK_$1_CPU" = xs390x; then
|
||||
HOTSPOT_$1_CPU_DEFINE=S390
|
||||
elif test "x$OPENJDK_$1_CPU" = xloongarch64; then
|
||||
HOTSPOT_$1_CPU_DEFINE=LOONGARCH64
|
||||
elif test "x$OPENJDK_$1_CPU" != x; then
|
||||
HOTSPOT_$1_CPU_DEFINE=$(echo $OPENJDK_$1_CPU | tr a-z A-Z)
|
||||
fi
|
||||
|
||||
@@ -424,6 +424,7 @@ LIBFFI_CFLAGS:=@LIBFFI_CFLAGS@
|
||||
ENABLE_LIBFFI_BUNDLING:=@ENABLE_LIBFFI_BUNDLING@
|
||||
LIBFFI_LIB_FILE:=@LIBFFI_LIB_FILE@
|
||||
FILE_MACRO_CFLAGS := @FILE_MACRO_CFLAGS@
|
||||
REPRODUCIBLE_CFLAGS := @REPRODUCIBLE_CFLAGS@
|
||||
BRANCH_PROTECTION_CFLAGS := @BRANCH_PROTECTION_CFLAGS@
|
||||
|
||||
STATIC_LIBS_CFLAGS := @STATIC_LIBS_CFLAGS@
|
||||
@@ -684,6 +685,9 @@ JAR = $(JAR_CMD)
|
||||
JLINK = $(JLINK_CMD)
|
||||
JMOD = $(JMOD_CMD)
|
||||
|
||||
JTREG_JDK := @JTREG_JDK@
|
||||
JTREG_JAVA = @FIXPATH@ $(JTREG_JDK)/bin/java $(JAVA_FLAGS_BIG) $(JAVA_FLAGS)
|
||||
|
||||
BUILD_JAVA_FLAGS := @BOOTCYCLE_JVM_ARGS_BIG@
|
||||
BUILD_JAVA=@FIXPATH@ $(BUILD_JDK)/bin/java $(BUILD_JAVA_FLAGS)
|
||||
BUILD_JAVAC=@FIXPATH@ $(BUILD_JDK)/bin/javac
|
||||
@@ -984,6 +988,7 @@ DOCS_JDK_BUNDLE_NAME := jdk-$(BASE_NAME)_doc-api-spec$(DEBUG_PART).tar.gz
|
||||
DOCS_JAVASE_BUNDLE_NAME := javase-$(BASE_NAME)_doc-api-spec$(DEBUG_PART).tar.gz
|
||||
DOCS_REFERENCE_BUNDLE_NAME := jdk-reference-$(BASE_NAME)_doc-api-spec$(DEBUG_PART).tar.gz
|
||||
STATIC_LIBS_BUNDLE_NAME := jdk-$(BASE_NAME)_bin-static-libs$(DEBUG_PART).tar.gz
|
||||
STATIC_LIBS_GRAAL_BUNDLE_NAME := jdk-$(BASE_NAME)_bin-static-libs-graal$(DEBUG_PART).tar.gz
|
||||
JCOV_BUNDLE_NAME := jdk-jcov-$(BASE_NAME)_bin$(DEBUG_PART).$(JDK_BUNDLE_EXTENSION)
|
||||
|
||||
JDK_BUNDLE := $(BUNDLES_OUTPUTDIR)/$(JDK_BUNDLE_NAME)
|
||||
|
||||
@@ -118,6 +118,24 @@ AC_DEFUN([UTIL_FIXUP_PATH],
|
||||
fi
|
||||
])
|
||||
|
||||
##############################################################################
|
||||
# Fixup path to be a Windows full long path
|
||||
# Note: Only supported with cygwin/msys2 (cygpath tool)
|
||||
AC_DEFUN([UTIL_FIXUP_WIN_LONG_PATH],
|
||||
[
|
||||
# Only process if variable expands to non-empty
|
||||
path="[$]$1"
|
||||
if test "x$path" != x; then
|
||||
if test "x$OPENJDK_BUILD_OS" = "xwindows"; then
|
||||
win_path=$($PATHTOOL -wl "$path")
|
||||
if test "x$win_path" != "x$path"; then
|
||||
$1="$win_path"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
###############################################################################
|
||||
# Check if the given file is a unix-style or windows-style executable, that is,
|
||||
# if it expects paths in unix-style or windows-style.
|
||||
|
||||
@@ -62,8 +62,8 @@ endif
|
||||
# Filter out jvmci specific modules if jvmci is disabled
|
||||
ifeq ($(INCLUDE_JVMCI), false)
|
||||
MODULES_FILTER += jdk.internal.vm.ci
|
||||
MODULES_FILTER += jdk.internal.vm.compiler
|
||||
MODULES_FILTER += jdk.internal.vm.compiler.management
|
||||
MODULES_FILTER += jdk.graal.compiler
|
||||
MODULES_FILTER += jdk.graal.compiler.management
|
||||
endif
|
||||
|
||||
# jpackage is only on windows, macosx, and linux
|
||||
|
||||
@@ -224,9 +224,12 @@ endif
|
||||
# object files while CCACHE_BASEDIR will make ccache relativize all paths for
|
||||
# its compiler. The compiler then produces relative dependency files.
|
||||
# make does not know a relative and absolute filename is the same so it will
|
||||
# ignore such dependencies.
|
||||
# ignore such dependencies. This only applies when the OUTPUTDIR is inside
|
||||
# the WORKSPACE_ROOT.
|
||||
ifneq ($(CCACHE), )
|
||||
REWRITE_PATHS_RELATIVE = true
|
||||
ifneq ($(filter $(WORKSPACE_ROOT)/%, $(OUTPUTDIR)), )
|
||||
REWRITE_PATHS_RELATIVE = true
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(REWRITE_PATHS_RELATIVE), true)
|
||||
@@ -1070,13 +1073,13 @@ define SetupNativeCompilationBody
|
||||
ifneq ($$($1_TYPE), STATIC_LIBRARY)
|
||||
# Generate debuginfo files.
|
||||
ifeq ($(call isTargetOs, windows), true)
|
||||
$1_EXTRA_LDFLAGS += -debug "-pdb:$$($1_SYMBOLS_DIR)/$$($1_NOSUFFIX).pdb" \
|
||||
"-map:$$($1_SYMBOLS_DIR)/$$($1_NOSUFFIX).map"
|
||||
$1_EXTRA_LDFLAGS += -debug "-pdb:$$($1_SYMBOLS_DIR)/$$($1_BASENAME).pdb" \
|
||||
"-map:$$($1_SYMBOLS_DIR)/$$($1_BASENAME).map"
|
||||
ifeq ($(SHIP_DEBUG_SYMBOLS), public)
|
||||
$1_EXTRA_LDFLAGS += "-pdbstripped:$$($1_SYMBOLS_DIR)/$$($1_NOSUFFIX).stripped.pdb"
|
||||
$1_EXTRA_LDFLAGS += "-pdbstripped:$$($1_SYMBOLS_DIR)/$$($1_BASENAME).stripped.pdb"
|
||||
endif
|
||||
$1_DEBUGINFO_FILES := $$($1_SYMBOLS_DIR)/$$($1_NOSUFFIX).pdb \
|
||||
$$($1_SYMBOLS_DIR)/$$($1_NOSUFFIX).map
|
||||
$1_DEBUGINFO_FILES := $$($1_SYMBOLS_DIR)/$$($1_BASENAME).pdb \
|
||||
$$($1_SYMBOLS_DIR)/$$($1_BASENAME).map
|
||||
|
||||
else ifeq ($(call isTargetOs, linux), true)
|
||||
$1_DEBUGINFO_FILES := $$($1_SYMBOLS_DIR)/$$($1_NOSUFFIX).debuginfo
|
||||
@@ -1124,7 +1127,11 @@ define SetupNativeCompilationBody
|
||||
$1 += $$($1_DEBUGINFO_FILES)
|
||||
|
||||
ifeq ($$($1_ZIP_EXTERNAL_DEBUG_SYMBOLS), true)
|
||||
$1_DEBUGINFO_ZIP := $$($1_SYMBOLS_DIR)/$$($1_NOSUFFIX).diz
|
||||
ifeq ($(call isTargetOs, windows), true)
|
||||
$1_DEBUGINFO_ZIP := $$($1_SYMBOLS_DIR)/$$($1_BASENAME).diz
|
||||
else
|
||||
$1_DEBUGINFO_ZIP := $$($1_SYMBOLS_DIR)/$$($1_NOSUFFIX).diz
|
||||
endif
|
||||
$1 += $$($1_DEBUGINFO_ZIP)
|
||||
|
||||
# The dependency on TARGET is needed for debuginfo files
|
||||
@@ -1162,9 +1169,9 @@ define SetupNativeCompilationBody
|
||||
$1_LD_OBJ_ARG := `cat $$($1_OBJ_FILE_LIST)`
|
||||
endif
|
||||
|
||||
# If we are building static library, 'AR' on macosx may not support @-file.
|
||||
# If we are building static library, 'AR' on macosx/aix may not support @-file.
|
||||
ifeq ($$($1_TYPE), STATIC_LIBRARY)
|
||||
ifeq ($(call isTargetOs, macosx), true)
|
||||
ifeq ($(call isTargetOs, macosx aix), true)
|
||||
$1_LD_OBJ_ARG := `cat $$($1_OBJ_FILE_LIST)`
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -87,6 +87,15 @@ define SetupTestFilesCompilationBody
|
||||
|
||||
$1_BUILD_INFO := $$($1_OUTPUT_DIR)/_$1-build-info.marker
|
||||
|
||||
# Tests are built with internal debug symbols where supported.
|
||||
# With Visual Studio or on macosx, we revert to external.
|
||||
$1_COPY_DEBUG_SYMBOLS := false
|
||||
ifeq ($(TOOLCHAIN_TYPE), microsoft)
|
||||
$1_COPY_DEBUG_SYMBOLS := true
|
||||
else ifeq ($(call isTargetOs, macosx), true)
|
||||
$1_COPY_DEBUG_SYMBOLS := true
|
||||
endif
|
||||
|
||||
# Setup a compilation for each and every one of them
|
||||
$$(foreach file, $$($1_FILTERED_FILE_LIST),\
|
||||
$$(eval name := $$(strip $$(basename $$(notdir $$(file))))) \
|
||||
@@ -106,7 +115,7 @@ define SetupTestFilesCompilationBody
|
||||
LIBS := $$($1_LIBS_$$(name)), \
|
||||
TOOLCHAIN := $(if $$(filter %.cpp, $$(file)), TOOLCHAIN_LINK_CXX, TOOLCHAIN_DEFAULT), \
|
||||
OPTIMIZATION := $$(if $$($1_OPTIMIZATION_$$(name)),$$($1_OPTIMIZATION_$$(name)),LOW), \
|
||||
COPY_DEBUG_SYMBOLS := $$(if $$($1_COPY_DEBUG_SYMBOLS_$$(name)),$$($1_COPY_DEBUG_SYMBOLS_$$(name)),false), \
|
||||
COPY_DEBUG_SYMBOLS := $$($1_COPY_DEBUG_SYMBOLS), \
|
||||
STRIP_SYMBOLS := $$(if $$($1_STRIP_SYMBOLS_$$(name)),$$($1_STRIP_SYMBOLS_$$(name)),false), \
|
||||
BUILD_INFO_LOG_MACRO := LogInfo, \
|
||||
)) \
|
||||
|
||||
@@ -29,13 +29,13 @@ GTEST_VERSION=1.14.0
|
||||
JTREG_VERSION=7.3.1+1
|
||||
|
||||
LINUX_X64_BOOT_JDK_EXT=tar.gz
|
||||
LINUX_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk20/bdc68b4b9cbc4ebcb30745c85038d91d/36/GPL/openjdk-20_linux-x64_bin.tar.gz
|
||||
LINUX_X64_BOOT_JDK_SHA256=bb863b2d542976d1ae4b7b81af3e78b1e4247a64644350b552d298d8dc5980dc
|
||||
LINUX_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk21/fd2272bbf8e04c3dbaee13770090416c/35/GPL/openjdk-21_linux-x64_bin.tar.gz
|
||||
LINUX_X64_BOOT_JDK_SHA256=a30c454a9bef8f46d5f1bf3122830014a8fbe7ac03b5f8729bc3add4b92a1d0a
|
||||
|
||||
MACOS_X64_BOOT_JDK_EXT=tar.gz
|
||||
MACOS_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk20/bdc68b4b9cbc4ebcb30745c85038d91d/36/GPL/openjdk-20_macos-x64_bin.tar.gz
|
||||
MACOS_X64_BOOT_JDK_SHA256=47cf960d9bb89dbe987535a389f7e26c42de7c984ef5108612d77c81aa8cc6a4
|
||||
MACOS_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk21/fd2272bbf8e04c3dbaee13770090416c/35/GPL/openjdk-21_macos-x64_bin.tar.gz
|
||||
MACOS_X64_BOOT_JDK_SHA256=af32e84c11009f72f783fdcdc9917efc277893988f097e198e2576875d1e88c1
|
||||
|
||||
WINDOWS_X64_BOOT_JDK_EXT=zip
|
||||
WINDOWS_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk20/bdc68b4b9cbc4ebcb30745c85038d91d/36/GPL/openjdk-20_windows-x64_bin.zip
|
||||
WINDOWS_X64_BOOT_JDK_SHA256=c92fae5e42b9aecf444a66c8ec563c652f60b1e231dfdd33a4f5a3e3603058fb
|
||||
WINDOWS_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk21/fd2272bbf8e04c3dbaee13770090416c/35/GPL/openjdk-21_windows-x64_bin.zip
|
||||
WINDOWS_X64_BOOT_JDK_SHA256=5434faaf029e66e7ce6e75770ca384de476750984a7d2881ef7686894c4b4944
|
||||
|
||||
@@ -390,8 +390,8 @@ var getJibProfilesCommon = function (input, data) {
|
||||
};
|
||||
};
|
||||
|
||||
common.boot_jdk_version = "20";
|
||||
common.boot_jdk_build_number = "36";
|
||||
common.boot_jdk_version = "21";
|
||||
common.boot_jdk_build_number = "35";
|
||||
common.boot_jdk_home = input.get("boot_jdk", "install_path") + "/jdk-"
|
||||
+ common.boot_jdk_version
|
||||
+ (input.build_os == "macosx" ? ".jdk/Contents/Home" : "");
|
||||
@@ -426,9 +426,14 @@ var getJibProfilesProfiles = function (input, common, data) {
|
||||
target_os: "linux",
|
||||
target_cpu: "x86",
|
||||
build_cpu: "x64",
|
||||
dependencies: ["devkit", "gtest"],
|
||||
configure_args: concat(common.configure_args_32bit,
|
||||
"--with-jvm-variants=minimal,server", "--with-zlib=system"),
|
||||
dependencies: ["devkit", "gtest", "libffi"],
|
||||
configure_args: concat(common.configure_args_32bit, [
|
||||
"--with-jvm-variants=minimal,server",
|
||||
"--with-zlib=system",
|
||||
"--with-libffi=" + input.get("libffi", "home_path"),
|
||||
"--enable-libffi-bundling",
|
||||
"--enable-fallback-linker"
|
||||
])
|
||||
},
|
||||
|
||||
"macosx-x64": {
|
||||
@@ -436,7 +441,7 @@ var getJibProfilesProfiles = function (input, common, data) {
|
||||
target_cpu: "x64",
|
||||
dependencies: ["devkit", "gtest", "pandoc"],
|
||||
configure_args: concat(common.configure_args_64bit, "--with-zlib=system",
|
||||
"--with-macosx-version-max=10.12.00",
|
||||
"--with-macosx-version-max=11.00.00",
|
||||
"--enable-compatible-cds-alignment",
|
||||
// Use system SetFile instead of the one in the devkit as the
|
||||
// devkit one may not work on Catalina.
|
||||
@@ -945,10 +950,7 @@ var getJibProfilesProfiles = function (input, common, data) {
|
||||
target_os: input.build_os,
|
||||
target_cpu: input.build_cpu,
|
||||
dependencies: [ "jtreg", "gnumake", "boot_jdk", "devkit", "jib" ],
|
||||
labels: "test",
|
||||
environment: {
|
||||
"JT_JAVA": common.boot_jdk_home
|
||||
}
|
||||
labels: "test"
|
||||
}
|
||||
};
|
||||
profiles = concatObjects(profiles, testOnlyProfiles);
|
||||
@@ -1084,7 +1086,7 @@ var getJibProfilesDependencies = function (input, common) {
|
||||
|
||||
var devkit_platform_revisions = {
|
||||
linux_x64: "gcc11.2.0-OL6.4+1.0",
|
||||
macosx: "Xcode12.4+1.1",
|
||||
macosx: "Xcode14.3.1+1.0",
|
||||
windows_x64: "VS2022-17.1.0+1.1",
|
||||
linux_aarch64: input.build_cpu == "x64" ? "gcc11.2.0-OL7.6+1.1" : "gcc11.2.0-OL7.6+1.0",
|
||||
linux_arm: "gcc8.2.0-Fedora27+1.0",
|
||||
|
||||
@@ -60,8 +60,8 @@ BOOT_MODULES= \
|
||||
# should carefully be considered if it should be upgradeable or not.
|
||||
UPGRADEABLE_PLATFORM_MODULES= \
|
||||
java.compiler \
|
||||
jdk.internal.vm.compiler \
|
||||
jdk.internal.vm.compiler.management \
|
||||
jdk.graal.compiler \
|
||||
jdk.graal.compiler.management \
|
||||
#
|
||||
|
||||
PLATFORM_MODULES= \
|
||||
|
||||
@@ -37,6 +37,6 @@ DEFAULT_VERSION_DATE=2024-03-19
|
||||
DEFAULT_VERSION_CLASSFILE_MAJOR=66 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
||||
DEFAULT_VERSION_CLASSFILE_MINOR=0
|
||||
DEFAULT_VERSION_DOCS_API_SINCE=11
|
||||
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="20 21 22"
|
||||
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="21 22"
|
||||
DEFAULT_JDK_SOURCE_TARGET_VERSION=22
|
||||
DEFAULT_PROMOTED_VERSION_PRE=ea
|
||||
|
||||
5019
make/data/charsetmapping/MS950_HKSCS.map
Normal file
5019
make/data/charsetmapping/MS950_HKSCS.map
Normal file
File diff suppressed because it is too large
Load Diff
@@ -57,6 +57,7 @@ JVM_DumpAllStacks
|
||||
JVM_DumpClassListToFile
|
||||
JVM_DumpDynamicArchive
|
||||
JVM_DumpThreads
|
||||
JVM_ExpandStackFrameInfo
|
||||
JVM_FillInStackTrace
|
||||
JVM_FindClassFromCaller
|
||||
JVM_FindClassFromClass
|
||||
|
||||
@@ -106,8 +106,8 @@ for ex in $EXCLUDE_DIRS; do
|
||||
done
|
||||
|
||||
echo "Copying Xcode.app..."
|
||||
echo rsync -rlH $INCLUDE_ARGS $EXCLUDE_ARGS "$XCODE_APP/." $DEVKIT_ROOT/Xcode.app/
|
||||
rsync -rlH $INCLUDE_ARGS $EXCLUDE_ARGS "$XCODE_APP/." $DEVKIT_ROOT/Xcode.app/
|
||||
echo rsync -rlH $INCLUDE_ARGS $EXCLUDE_ARGS "$XCODE_APP/." $DEVKIT_ROOT/Xcode
|
||||
rsync -rlH $INCLUDE_ARGS $EXCLUDE_ARGS "$XCODE_APP/." $DEVKIT_ROOT/Xcode
|
||||
|
||||
################################################################################
|
||||
|
||||
@@ -119,8 +119,8 @@ echo "Generating devkit.info..."
|
||||
rm -f $DEVKIT_ROOT/devkit.info
|
||||
echo-info "# This file describes to configure how to interpret the contents of this devkit"
|
||||
echo-info "DEVKIT_NAME=\"Xcode $XCODE_VERSION (devkit)\""
|
||||
echo-info "DEVKIT_TOOLCHAIN_PATH=\"\$DEVKIT_ROOT/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:\$DEVKIT_ROOT/Xcode.app/Contents/Developer/usr/bin\""
|
||||
echo-info "DEVKIT_SYSROOT=\"\$DEVKIT_ROOT/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/$SDK_VERSION.sdk\""
|
||||
echo-info "DEVKIT_TOOLCHAIN_PATH=\"\$DEVKIT_ROOT/Xcode/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:\$DEVKIT_ROOT/Xcode/Contents/Developer/usr/bin\""
|
||||
echo-info "DEVKIT_SYSROOT=\"\$DEVKIT_ROOT/Xcode/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/$SDK_VERSION.sdk\""
|
||||
echo-info "DEVKIT_EXTRA_PATH=\"\$DEVKIT_TOOLCHAIN_PATH\""
|
||||
|
||||
################################################################################
|
||||
|
||||
@@ -62,7 +62,7 @@ ifeq ($(call check-jvm-feature, compiler2), true)
|
||||
ADLC_CFLAGS += -I$(TOPDIR)/src/hotspot/share
|
||||
|
||||
# Add file macro mappings
|
||||
ADLC_CFLAGS += $(FILE_MACRO_CFLAGS)
|
||||
ADLC_CFLAGS += $(FILE_MACRO_CFLAGS) $(REPRODUCIBLE_CFLAGS)
|
||||
|
||||
ifeq ($(UBSAN_ENABLED), true)
|
||||
ADLC_CFLAGS += $(UBSAN_CFLAGS)
|
||||
@@ -133,6 +133,21 @@ ifeq ($(call check-jvm-feature, compiler2), true)
|
||||
ADLCFLAGS += -DARM=1
|
||||
endif
|
||||
|
||||
# Set ASSERT, NDEBUG and PRODUCT flags just like in JvmFlags.gmk
|
||||
ifeq ($(DEBUG_LEVEL), release)
|
||||
# release builds disable uses of assert macro from <assert.h>.
|
||||
ADLCFLAGS += -DNDEBUG
|
||||
# For hotspot, release builds differ internally between "optimized" and "product"
|
||||
# in that "optimize" does not define PRODUCT.
|
||||
ifneq ($(HOTSPOT_DEBUG_LEVEL), optimized)
|
||||
ADLCFLAGS += -DPRODUCT
|
||||
endif
|
||||
else ifeq ($(DEBUG_LEVEL), fastdebug)
|
||||
ADLCFLAGS += -DASSERT
|
||||
else ifeq ($(DEBUG_LEVEL), slowdebug)
|
||||
ADLCFLAGS += -DASSERT
|
||||
endif
|
||||
|
||||
##############################################################################
|
||||
# Concatenate all ad source files into a single file, which will be fed to
|
||||
# adlc. Also include a #line directive at the start of every included file
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -118,7 +118,7 @@ else ifeq ($(call isTargetOs, windows), true)
|
||||
|
||||
FILTER_SYMBOLS_AWK_SCRIPT := \
|
||||
'{ \
|
||||
if ($$7 ~ /??_7.*@@6B@/ && $$7 !~ /type_info/ && $$7 !~ /lambda/) print $$7; \
|
||||
if ($$7 ~ /\?\?_7.*@@6B@/ && $$7 !~ /type_info/ && $$7 !~ /lambda/) print $$7; \
|
||||
}'
|
||||
|
||||
else
|
||||
|
||||
@@ -61,7 +61,7 @@ ifeq ($(call isTargetOs, windows), true)
|
||||
$(eval $(call SetupCopyFiles, COPY_GTEST_PDB_$v, \
|
||||
SRC := $(HOTSPOT_OUTPUTDIR)/variant-$v/libjvm/gtest, \
|
||||
DEST := $(TEST_IMAGE_DIR)/hotspot/gtest/$v, \
|
||||
FILES := jvm.pdb gtestLauncher.pdb, \
|
||||
FILES := jvm.dll.pdb gtestLauncher.exe.pdb, \
|
||||
)) \
|
||||
$(eval TARGETS += $$(COPY_GTEST_PDB_$v)) \
|
||||
) \
|
||||
|
||||
@@ -329,7 +329,7 @@ class CompilerInterfaceVC10 extends CompilerInterface {
|
||||
addAttr(rv, "PrecompiledHeaderOutputFile", outDir+Util.sep+"vm.pch");
|
||||
addAttr(rv, "AssemblerListingLocation", outDir);
|
||||
addAttr(rv, "ObjectFileName", outDir+Util.sep);
|
||||
addAttr(rv, "ProgramDataBaseFileName", outDir+Util.sep+"jvm.pdb");
|
||||
addAttr(rv, "ProgramDataBaseFileName", outDir+Util.sep+"jvm.dll.pdb");
|
||||
// Set /nologo option
|
||||
addAttr(rv, "SuppressStartupBanner", "true");
|
||||
// Surpass the default /Tc or /Tp.
|
||||
@@ -409,7 +409,7 @@ class CompilerInterfaceVC10 extends CompilerInterface {
|
||||
addAttr(rv, "OutputFile", outDll);
|
||||
addAttr(rv, "SuppressStartupBanner", "true");
|
||||
addAttr(rv, "ModuleDefinitionFile", outDir+Util.sep+"vm.def");
|
||||
addAttr(rv, "ProgramDatabaseFile", outDir+Util.sep+"jvm.pdb");
|
||||
addAttr(rv, "ProgramDatabaseFile", outDir+Util.sep+"jvm.dll.pdb");
|
||||
addAttr(rv, "SubSystem", "Windows");
|
||||
addAttr(rv, "BaseAddress", "0x8000000");
|
||||
addAttr(rv, "ImportLibrary", outDir+Util.sep+"jvm.lib");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -108,6 +108,12 @@ class Bundle {
|
||||
"narrow.Eras"
|
||||
};
|
||||
|
||||
static final String[] LIST_PATTERN_KEYS = {
|
||||
"ListPatterns_standard",
|
||||
"ListPatterns_or",
|
||||
"ListPatterns_unit",
|
||||
};
|
||||
|
||||
// DateFormatItem prefix
|
||||
static final String DATEFORMATITEM_KEY_PREFIX = "DateFormatItem.";
|
||||
static final String DATEFORMATITEM_INPUT_REGIONS_PREFIX = "DateFormatItemInputRegions.";
|
||||
|
||||
@@ -30,7 +30,6 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.nio.file.*;
|
||||
import java.text.MessageFormat;
|
||||
import java.time.*;
|
||||
import java.util.*;
|
||||
import java.util.ResourceBundle.Control;
|
||||
@@ -92,6 +91,12 @@ public class CLDRConverter {
|
||||
static final String[] EMPTY_ZONE = {"", "", "", "", "", ""};
|
||||
static final String META_ETCUTC_ZONE_NAME = "ETC_UTC";
|
||||
|
||||
// constants used for TZDB short names
|
||||
private static final String NBSP = "\u00A0";
|
||||
private static final String STD = "std";
|
||||
private static final String DST = "dst";
|
||||
private static final String NO_SUBST = "-";
|
||||
|
||||
private static SupplementDataParseHandler handlerSuppl;
|
||||
private static LikelySubtagsParseHandler handlerLikelySubtags;
|
||||
private static WinZonesParseHandler handlerWinZones;
|
||||
@@ -114,6 +119,7 @@ public class CLDRConverter {
|
||||
|
||||
private static Set<String> AVAILABLE_TZIDS;
|
||||
static int copyrightYear;
|
||||
static String jdkHeaderTemplate;
|
||||
private static String zoneNameTempFile;
|
||||
private static String tzDataDir;
|
||||
private static final Map<String, String> canonicalTZMap = new HashMap<>();
|
||||
@@ -122,6 +128,10 @@ public class CLDRConverter {
|
||||
static Map<String, String> pluralRules;
|
||||
static Map<String, String> dayPeriodRules;
|
||||
|
||||
// TZDB Short Names Map
|
||||
private static final Map<String, String> tzdbShortNamesMap = HashMap.newHashMap(512);
|
||||
private static final Map<String, String> tzdbSubstLetters = HashMap.newHashMap(512);
|
||||
|
||||
static enum DraftType {
|
||||
UNCONFIRMED,
|
||||
PROVISIONAL,
|
||||
@@ -229,6 +239,10 @@ public class CLDRConverter {
|
||||
tzDataDir = args[++i];
|
||||
break;
|
||||
|
||||
case "-jdk-header-template":
|
||||
jdkHeaderTemplate = Files.readString(Paths.get(args[++i]));
|
||||
break;
|
||||
|
||||
case "-help":
|
||||
usage();
|
||||
System.exit(0);
|
||||
@@ -279,6 +293,9 @@ public class CLDRConverter {
|
||||
pluralRules = generateRules(handlerPlurals);
|
||||
dayPeriodRules = generateRules(handlerDayPeriodRule);
|
||||
|
||||
// TZDB short names map
|
||||
generateTZDBShortNamesMap();
|
||||
|
||||
List<Bundle> bundles = readBundleList();
|
||||
convertBundles(bundles);
|
||||
|
||||
@@ -304,7 +321,9 @@ public class CLDRConverter {
|
||||
+ "\t-year year copyright year in output%n"
|
||||
+ "\t-zntempfile template file for java.time.format.ZoneName.java%n"
|
||||
+ "\t-tzdatadir tzdata directory for java.time.format.ZoneName.java%n"
|
||||
+ "\t-utf8 use UTF-8 rather than \\uxxxx (for debug)%n");
|
||||
+ "\t-utf8 use UTF-8 rather than \\uxxxx (for debug)%n"
|
||||
+ "\t-jdk-header-template <file>%n"
|
||||
+ "\t\t override default GPL header with contents of file%n");
|
||||
}
|
||||
|
||||
static void info(String fmt, Object... args) {
|
||||
@@ -614,7 +633,14 @@ public class CLDRConverter {
|
||||
*/
|
||||
static void handleAliases(Map<String, Object> bundleMap) {
|
||||
for (String key : aliases.keySet()) {
|
||||
var source = bundleMap.get(aliases.get(key));
|
||||
var sourceKey = aliases.get(key);
|
||||
if (key.startsWith("ListPatterns_")) {
|
||||
String k;
|
||||
while ((k = aliases.get(sourceKey)) != null) {
|
||||
sourceKey = k;
|
||||
}
|
||||
}
|
||||
var source = bundleMap.get(sourceKey);
|
||||
if (source != null) {
|
||||
if (bundleMap.get(key) instanceof String[] sa) {
|
||||
// fill missing elements in case of String array
|
||||
@@ -743,21 +769,25 @@ public class CLDRConverter {
|
||||
.orElse(tzid);
|
||||
Object data = map.get(TIMEZONE_ID_PREFIX + tzKey);
|
||||
|
||||
if (data instanceof String[]) {
|
||||
if (data instanceof String[] tznames) {
|
||||
// Hack for UTC. UTC is an alias to Etc/UTC in CLDR
|
||||
if (tzid.equals("Etc/UTC") && !map.containsKey(TIMEZONE_ID_PREFIX + "UTC")) {
|
||||
names.put(METAZONE_ID_PREFIX + META_ETCUTC_ZONE_NAME, data);
|
||||
names.put(METAZONE_ID_PREFIX + META_ETCUTC_ZONE_NAME, tznames);
|
||||
names.put(tzid, META_ETCUTC_ZONE_NAME);
|
||||
names.put("UTC", META_ETCUTC_ZONE_NAME);
|
||||
} else {
|
||||
names.put(tzid, data);
|
||||
// TZDB short names
|
||||
fillTZDBShortNames(tzid, tznames);
|
||||
names.put(tzid, tznames);
|
||||
}
|
||||
} else {
|
||||
String meta = handlerMetaZones.get(tzKey);
|
||||
if (meta != null) {
|
||||
String metaKey = METAZONE_ID_PREFIX + meta;
|
||||
data = map.get(metaKey);
|
||||
if (data instanceof String[]) {
|
||||
if (data instanceof String[] tznames) {
|
||||
// TZDB short names
|
||||
fillTZDBShortNames(tzid, tznames);
|
||||
// Keep the metazone prefix here.
|
||||
names.put(metaKey, data);
|
||||
names.put(tzid, meta);
|
||||
@@ -864,6 +894,7 @@ public class CLDRConverter {
|
||||
"DayPeriodRules",
|
||||
"DateFormatItemInputRegions.allowed",
|
||||
"DateFormatItemInputRegions.preferred",
|
||||
"ListPatterns",
|
||||
};
|
||||
|
||||
static final Set<String> availableSkeletons = new HashSet<>();
|
||||
@@ -928,6 +959,14 @@ public class CLDRConverter {
|
||||
formatData.put(k + ".NumberElements", neNew);
|
||||
});
|
||||
}
|
||||
|
||||
// ListPatterns
|
||||
for (var lpKey : Bundle.LIST_PATTERN_KEYS) {
|
||||
copyIfPresent(map, lpKey, formatData);
|
||||
copyIfPresent(map, lpKey + "-short", formatData);
|
||||
copyIfPresent(map, lpKey + "-narrow", formatData);
|
||||
}
|
||||
|
||||
return formatData;
|
||||
}
|
||||
|
||||
@@ -1161,6 +1200,8 @@ public class CLDRConverter {
|
||||
Files.createDirectories(Paths.get(DESTINATION_DIR, "windows", "conf"));
|
||||
Files.write(Paths.get(DESTINATION_DIR, "windows", "conf", "tzmappings"),
|
||||
handlerWinZones.keySet().stream()
|
||||
.filter(k -> k.endsWith(":001") ||
|
||||
!handlerWinZones.get(k).equals(handlerWinZones.get(k.replaceFirst(":\\w{2,3}$", ":001"))))
|
||||
.map(k -> k + ":" + handlerWinZones.get(k) + ":")
|
||||
.sorted(new Comparator<String>() {
|
||||
public int compare(String t1, String t2) {
|
||||
@@ -1221,6 +1262,125 @@ public class CLDRConverter {
|
||||
return covMap;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generates two maps from TZ database files, where they have usual abbreviation
|
||||
* of the time zone names as "FORMAT".
|
||||
*
|
||||
* `tzdbShortNamesMap` maps the time zone id, such as "America/Los_Angeles" to
|
||||
* its FORMAT and Rule which determines the substitution. In "America/Los_Angeles"
|
||||
* case, its FORMAT is "P%sT" and the Rule is "US". They are concatenated with
|
||||
* an NBSP, so the eventual mapping will be:
|
||||
*
|
||||
* "America/Los_Angeles" -> "P%sT<NBSP>US"
|
||||
*
|
||||
* The other map, `tzdbSubstLetters` maps the Rule to its substitution letters.
|
||||
* The key of the map is the Rule name, appended with "<NBSP>std" or "<NBSP>dst"
|
||||
* depending on the savings, e.g.,
|
||||
*
|
||||
* "US<NBSP>std" -> "S"
|
||||
* "US<NBSP>dst" -> "D"
|
||||
*
|
||||
* These two mappings resolve the short names for time zones in each type,
|
||||
* such as:
|
||||
*
|
||||
* Standard short name for "America/Los_Angeles" -> "PST"
|
||||
* DST short name for "America/Los_Angeles" -> "PDT"
|
||||
* Generic short name for "America/Los_Angeles" -> "PT"
|
||||
*/
|
||||
private static void generateTZDBShortNamesMap() throws IOException {
|
||||
Files.walk(Path.of(tzDataDir), 1, FileVisitOption.FOLLOW_LINKS)
|
||||
.filter(p -> p.toFile().isFile())
|
||||
.forEach(p -> {
|
||||
try {
|
||||
String zone = null;
|
||||
String rule = null;
|
||||
String format = null;
|
||||
for (var line : Files.readAllLines(p)) {
|
||||
if (line.contains("#STDOFF")) continue;
|
||||
line = line.replaceAll("[ \t]*#.*", "");
|
||||
|
||||
// Zone line
|
||||
if (line.startsWith("Zone")) {
|
||||
var zl = line.split("[ \t]+", -1);
|
||||
zone = zl[1];
|
||||
rule = zl[3];
|
||||
format = zl[4];
|
||||
} else {
|
||||
if (zone != null) {
|
||||
if (line.isBlank()) {
|
||||
tzdbShortNamesMap.put(zone, format + NBSP + rule);
|
||||
zone = null;
|
||||
rule = null;
|
||||
format = null;
|
||||
} else {
|
||||
var s = line.split("[ \t]+", -1);
|
||||
rule = s[2];
|
||||
format = s[3];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Rule line
|
||||
if (line.startsWith("Rule")) {
|
||||
var rl = line.split("[ \t]+", -1);
|
||||
tzdbSubstLetters.put(rl[1] + NBSP + (rl[8].equals("0") ? STD : DST),
|
||||
rl[9].replace(NO_SUBST, ""));
|
||||
}
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
throw new UncheckedIOException(ioe);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill the TZDB short names if there is no name provided by the CLDR
|
||||
*/
|
||||
private static void fillTZDBShortNames(String tzid, String[] names) {
|
||||
var val = tzdbShortNamesMap.get(tzid);
|
||||
if (val != null) {
|
||||
var format = val.split(NBSP)[0];
|
||||
var rule = val.split(NBSP)[1];
|
||||
IntStream.of(1, 3, 5).forEach(i -> {
|
||||
if (names[i] == null) {
|
||||
if (format.contains("%s")) {
|
||||
names[i] = switch (i) {
|
||||
case 1 -> format.formatted(tzdbSubstLetters.get(rule + NBSP + STD));
|
||||
case 3 -> format.formatted(tzdbSubstLetters.get(rule + NBSP + DST));
|
||||
case 5 -> format.formatted("");
|
||||
default -> throw new InternalError();
|
||||
};
|
||||
} else if (format.contains("/")) { // such as "+08/+09" or "GMT/BST"
|
||||
names[i] = switch (i) {
|
||||
case 1, 5 -> convertGMTName(format.substring(0, format.indexOf("/")));
|
||||
case 3 -> convertGMTName(format.substring(format.indexOf("/") + 1));
|
||||
default -> throw new InternalError();
|
||||
};
|
||||
} else {
|
||||
names[i] = convertGMTName(format);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert TZDB offsets to JDK's offsets, eg, "-08" to "GMT-08:00".
|
||||
* If it cannot recognize the pattern, return the argument as is.
|
||||
*/
|
||||
private static String convertGMTName(String f) {
|
||||
try {
|
||||
// Should pre-fill GMT format once COMPAT is gone.
|
||||
// Till then, fall back to GMT format at runtime, after COMPAT short
|
||||
// names are populated
|
||||
ZoneOffset.of(f);
|
||||
return null;
|
||||
} catch (DateTimeException dte) {
|
||||
// textual representation. return as is
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
// for debug
|
||||
static void dumpMap(Map<String, Object> map) {
|
||||
map.entrySet().stream()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -35,6 +35,7 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.InputSource;
|
||||
@@ -812,6 +813,7 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
&& ((currentContainer.getqName().equals("decimalFormatLength"))
|
||||
|| (currentContainer.getqName().equals("currencyFormat"))
|
||||
|| (currentContainer.getqName().equals("percentFormat"))
|
||||
|| (currentContainer.getqName().equals("listPattern"))
|
||||
|| (currentCalendarType != null && !currentCalendarType.lname().startsWith("islamic-")))) { // ignore islamic variants
|
||||
pushAliasEntry(qName, attributes, attributes.getValue("path"));
|
||||
} else {
|
||||
@@ -820,6 +822,28 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
}
|
||||
break;
|
||||
|
||||
// ListPatterns
|
||||
case "listPattern":
|
||||
currentStyle = Optional.ofNullable(attributes.getValue("type")).orElse("standard");
|
||||
pushStringArrayEntry(qName, attributes, "ListPatterns_" + currentStyle, 5);
|
||||
break;
|
||||
case "listPatternPart":
|
||||
type = attributes.getValue("type");
|
||||
pushStringArrayElement(qName, attributes,
|
||||
switch (type) {
|
||||
case "start" -> 0;
|
||||
case "middle" -> 1;
|
||||
case "end" -> 2;
|
||||
case "2" -> 3;
|
||||
case "3" -> 4;
|
||||
default -> throw new IllegalArgumentException(
|
||||
"""
|
||||
The "type" attribute value for "listPatternPart" element is not recognized: %s
|
||||
""".formatted(type)
|
||||
);
|
||||
});
|
||||
break;
|
||||
|
||||
default:
|
||||
// treat anything else as a container
|
||||
pushContainer(qName, attributes);
|
||||
@@ -973,6 +997,9 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
"NumberPatterns/" +
|
||||
(type.equals("standard") ? containerqName.replaceFirst("Format", "") : type);
|
||||
break;
|
||||
case "listPattern":
|
||||
keyName = type;
|
||||
break;
|
||||
default:
|
||||
keyName = "";
|
||||
break;
|
||||
@@ -1035,6 +1062,19 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
return toJDKKey(qName, "", style);
|
||||
}
|
||||
|
||||
// listPattern
|
||||
if (path.indexOf("../listPattern") != -1) {
|
||||
typeKey = "[@type='";
|
||||
start = path.indexOf(typeKey);
|
||||
String style;
|
||||
if (start != -1) {
|
||||
style = "ListPatterns_" + path.substring(start + typeKey.length(), path.indexOf("']", start));
|
||||
} else {
|
||||
style = "ListPatterns_standard";
|
||||
}
|
||||
return toJDKKey(qName, "", style);
|
||||
}
|
||||
|
||||
return calType + "." + toJDKKey(qName, context, width);
|
||||
}
|
||||
|
||||
@@ -1107,6 +1147,10 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
case "timeFormatLength":
|
||||
currentStyle = "";
|
||||
break;
|
||||
case "listPattern":
|
||||
currentStyle = "";
|
||||
putIfEntry();
|
||||
break;
|
||||
default:
|
||||
putIfEntry();
|
||||
}
|
||||
@@ -1128,6 +1172,12 @@ class LDMLParseHandler extends AbstractLDMLHandler<Object> {
|
||||
toJDKKey(containerqName, "", kc.getKey()),
|
||||
getTarget(entry.getKey(), "", "", "")
|
||||
);
|
||||
} else if (containerqName.equals("listPattern")) {
|
||||
var sae = (StringArrayEntry)entry.getParent();
|
||||
CLDRConverter.aliases.put(
|
||||
toJDKKey(containerqName, "", sae.getKey()),
|
||||
getTarget(entry.getKey(), "", "", "")
|
||||
);
|
||||
} else {
|
||||
Set<String> keyNames = populateAliasKeys(containerqName, currentContext, currentWidth);
|
||||
if (!keyNames.isEmpty()) {
|
||||
|
||||
@@ -174,7 +174,7 @@ class ResourceBundleGenerator implements BundleGenerator {
|
||||
|
||||
try (PrintWriter out = new PrintWriter(file, encoding)) {
|
||||
// Output copyright headers
|
||||
out.println(CopyrightHeaders.getOpenJDKCopyright(CLDRConverter.copyrightYear));
|
||||
out.println(getOpenJDKCopyright());
|
||||
out.println(CopyrightHeaders.getUnicodeCopyright());
|
||||
|
||||
if (useJava) {
|
||||
@@ -294,7 +294,7 @@ class ResourceBundleGenerator implements BundleGenerator {
|
||||
CLDRConverter.info("Generating file " + file);
|
||||
|
||||
try (PrintWriter out = new PrintWriter(file, "us-ascii")) {
|
||||
out.printf(CopyrightHeaders.getOpenJDKCopyright(CLDRConverter.copyrightYear));
|
||||
out.printf(getOpenJDKCopyright());
|
||||
|
||||
out.printf("""
|
||||
package sun.util.%s;
|
||||
@@ -448,4 +448,12 @@ class ResourceBundleGenerator implements BundleGenerator {
|
||||
});
|
||||
return tags;
|
||||
}
|
||||
|
||||
private static String getOpenJDKCopyright() {
|
||||
if (CLDRConverter.jdkHeaderTemplate != null) {
|
||||
return String.format(CLDRConverter.jdkHeaderTemplate, CLDRConverter.copyrightYear);
|
||||
} else {
|
||||
return CopyrightHeaders.getOpenJDKCopyright(CLDRConverter.copyrightYear);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
package build.tools.compileproperties;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
@@ -33,6 +34,9 @@ import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
@@ -220,8 +224,8 @@ public class CompileProperties {
|
||||
System.out.println("parsing: " + propertiesPath);
|
||||
}
|
||||
Properties p = new Properties();
|
||||
try {
|
||||
p.load(new FileInputStream(propertiesPath));
|
||||
try (BufferedReader input = Files.newBufferedReader(Path.of(propertiesPath))) {
|
||||
p.load(input);
|
||||
} catch ( FileNotFoundException e ) {
|
||||
ok = false;
|
||||
error("Cannot find file " + propertiesPath, e);
|
||||
@@ -267,7 +271,7 @@ public class CompileProperties {
|
||||
Writer writer = null;
|
||||
try {
|
||||
writer = new BufferedWriter(
|
||||
new OutputStreamWriter(new FileOutputStream(outputPath), "8859_1"));
|
||||
new OutputStreamWriter(new FileOutputStream(outputPath), StandardCharsets.US_ASCII));
|
||||
MessageFormat format = new MessageFormat(FORMAT);
|
||||
writer.write(format.format(new Object[] { packageString, className, superClass, data }));
|
||||
} catch ( IOException e ) {
|
||||
|
||||
@@ -64,7 +64,7 @@ public class PropList {
|
||||
|
||||
int i, j;
|
||||
BufferedReader sbfr = new BufferedReader(new FileReader(file));
|
||||
Matcher m = Pattern.compile("(\\p{XDigit}+)(?:\\.{2}(\\p{XDigit}+))?\\s*;\\s+(\\w+)\\s+#.*").matcher("");
|
||||
Matcher m = Pattern.compile("(\\p{XDigit}+)(?:\\.{2}(\\p{XDigit}+))?\\s*;\\s+(\\w+)[;\\s].*").matcher("");
|
||||
String line = null;
|
||||
int lineNo = 0;
|
||||
while ((line = sbfr.readLine()) != null) {
|
||||
|
||||
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package build.tools.generateextraproperties;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* Parses extra properties files of UCD, and replaces the placeholders in
|
||||
* the given template source file with the generated conditions, then emits
|
||||
* .java files. For example, if the properties file has:
|
||||
* <blockquote>
|
||||
* 0009..000D ; Type (; Value)
|
||||
* 0020 ; Type (; Value)
|
||||
* 2000..200A ; Type (; Value)
|
||||
* </blockquote>
|
||||
* and the template file contains
|
||||
* <blockquote>
|
||||
* %%%Type(=Value)%%%
|
||||
* </blockquote>
|
||||
* then the generated .java file would have the following in place:
|
||||
* <blockquote>
|
||||
* (cp >= 0x0009 && cp <= 0x000D) ||
|
||||
* cp == 0x0020 ||
|
||||
* (cp >= 0x2000 && cp <= 0x200A);
|
||||
* </blockquote>
|
||||
* Note that those in parentheses in the properties file and the
|
||||
* template file are optional.
|
||||
*
|
||||
* Arguments to this utility:
|
||||
* args[0]: Full path string to the template file
|
||||
* args[1]: Full path string to the properties file
|
||||
* args[2]: Full path string to the generated .java file
|
||||
* args[3...]: Names of the property to generate the conditions
|
||||
*/
|
||||
public class GenerateExtraProperties {
|
||||
public static void main(String[] args) {
|
||||
var templateFile = Paths.get(args[0]);
|
||||
var propertiesFile = Paths.get(args[1]);
|
||||
var gensrcFile = Paths.get(args[2]);
|
||||
var propertyNames = Arrays.copyOfRange(args, 3, args.length);
|
||||
var replacementMap = new HashMap<String, String>();
|
||||
|
||||
try {
|
||||
for (var propertyName: propertyNames) {
|
||||
var pn = "; " + propertyName.replaceFirst("=", "; ");
|
||||
|
||||
List<Range> ranges = Files.lines(propertiesFile)
|
||||
.filter(Predicate.not(l -> l.startsWith("#") || l.isBlank()))
|
||||
.filter(l -> l.contains(pn))
|
||||
.map(l -> new Range(l.replaceFirst(" .*", "")))
|
||||
.sorted()
|
||||
.collect(ArrayList<Range>::new,
|
||||
(list, r) -> {
|
||||
// collapsing consecutive pictographic ranges
|
||||
int lastIndex = list.size() - 1;
|
||||
if (lastIndex >= 0) {
|
||||
Range lastRange = list.get(lastIndex);
|
||||
if (lastRange.last + 1 == r.start) {
|
||||
list.set(lastIndex, new Range(lastRange.start, r.last));
|
||||
return;
|
||||
}
|
||||
}
|
||||
list.add(r);
|
||||
},
|
||||
ArrayList<Range>::addAll);
|
||||
|
||||
|
||||
replacementMap.put("%%%" + propertyName + "%%%",
|
||||
ranges.stream()
|
||||
.map(GenerateExtraProperties::rangeToString)
|
||||
.collect(Collectors.joining(" ||\n", "", ";")));
|
||||
}
|
||||
|
||||
// Generate .java file
|
||||
Files.write(gensrcFile,
|
||||
Files.lines(templateFile)
|
||||
.flatMap(l -> Stream.of(replacementMap.getOrDefault(l.trim(), l)))
|
||||
.collect(Collectors.toList()),
|
||||
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
static String rangeToString(Range r) {
|
||||
if (r.start == r.last) {
|
||||
return (" ".repeat(12) + "cp == 0x" + toHexString(r.start));
|
||||
} else if (r.start == r.last - 1) {
|
||||
return " ".repeat(12) + "cp == 0x" + toHexString(r.start) + " ||\n" +
|
||||
" ".repeat(12) + "cp == 0x" + toHexString(r.last);
|
||||
} else {
|
||||
return " ".repeat(11) + "(cp >= 0x" + toHexString(r.start) +
|
||||
" && cp <= 0x" + toHexString(r.last) + ")";
|
||||
}
|
||||
}
|
||||
|
||||
static int toInt(String hexStr) {
|
||||
return Integer.parseUnsignedInt(hexStr, 16);
|
||||
}
|
||||
|
||||
static String toHexString(int cp) {
|
||||
String ret = Integer.toUnsignedString(cp, 16).toUpperCase();
|
||||
if (ret.length() < 4) {
|
||||
ret = "0".repeat(4 - ret.length()) + ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static class Range implements Comparable<Range> {
|
||||
int start;
|
||||
int last;
|
||||
|
||||
Range (int start, int last) {
|
||||
this.start = start;
|
||||
this.last = last;
|
||||
}
|
||||
|
||||
Range (String input) {
|
||||
input = input.replaceFirst("\\s#.*", "");
|
||||
start = toInt(input.replaceFirst("[\\s\\.].*", ""));
|
||||
last = input.contains("..") ?
|
||||
toInt(input.replaceFirst(".*\\.\\.", "")
|
||||
.replaceFirst(";.*", "").trim())
|
||||
: start;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Start: " + toHexString(start) + ", Last: " + toHexString(last);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(Range other) {
|
||||
return Integer.compare(start, other.start);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -53,21 +53,38 @@ import java.util.regex.Pattern;
|
||||
public class EquivMapsGenerator {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (args.length != 3) {
|
||||
int i = 0;
|
||||
boolean valid = true;
|
||||
if (args.length != 5 && args.length !=3) {
|
||||
valid = false;
|
||||
} else if (args.length == 5) {
|
||||
if ("-jdk-header-template".equals(args[i])) {
|
||||
jdkHeaderTemplate = Files.readString(Paths.get(args[++i]));
|
||||
i++;
|
||||
} else {
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
if (!valid) {
|
||||
System.err.println("Usage: java EquivMapsGenerator"
|
||||
+ " [-jdk-header-template <file>]"
|
||||
+ " language-subtag-registry.txt LocaleEquivalentMaps.java copyrightYear");
|
||||
System.exit(1);
|
||||
}
|
||||
copyrightYear = Integer.parseInt(args[2]);
|
||||
readLSRfile(args[0]);
|
||||
String lsrFile = args[i++];
|
||||
String outputFile = args[i++];
|
||||
copyrightYear = Integer.parseInt(args[i++]);
|
||||
|
||||
readLSRfile(lsrFile);
|
||||
// Builds the maps from the IANA data
|
||||
generateEquivalentMap();
|
||||
// Writes the maps out to LocaleEquivalentMaps.java
|
||||
generateSourceCode(args[1]);
|
||||
generateSourceCode(outputFile);
|
||||
}
|
||||
|
||||
private static String LSRrevisionDate;
|
||||
private static int copyrightYear;
|
||||
private static String jdkHeaderTemplate;
|
||||
private static Map<String, StringBuilder> initialLanguageMap =
|
||||
new TreeMap<>();
|
||||
private static Map<String, StringBuilder> initialRegionVariantMap =
|
||||
@@ -225,6 +242,7 @@ public class EquivMapsGenerator {
|
||||
try (BufferedWriter writer = Files.newBufferedWriter(
|
||||
Paths.get(fileName))) {
|
||||
writer.write(getOpenJDKCopyright());
|
||||
writer.write("\n");
|
||||
writer.write(HEADER_TEXT);
|
||||
writer.write(getMapsText());
|
||||
writer.write(getLSRText());
|
||||
@@ -241,7 +259,8 @@ public class EquivMapsGenerator {
|
||||
}
|
||||
|
||||
private static String getOpenJDKCopyright() {
|
||||
return String.format(Locale.US, COPYRIGHT, copyrightYear);
|
||||
return String.format(Locale.US,
|
||||
(jdkHeaderTemplate != null ? jdkHeaderTemplate : COPYRIGHT), copyrightYear);
|
||||
}
|
||||
|
||||
private static final String COPYRIGHT =
|
||||
@@ -270,7 +289,6 @@ public class EquivMapsGenerator {
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
""";
|
||||
|
||||
private static final String HEADER_TEXT =
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -52,7 +52,7 @@ public class Incubating implements Taglet {
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Incubating";
|
||||
return "incubating";
|
||||
}
|
||||
|
||||
private static final String MESSAGE =
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
package compileproperties;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
@@ -33,6 +34,9 @@ import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
@@ -199,8 +203,8 @@ public class CompileProperties {
|
||||
boolean ok = true;
|
||||
log.verbose("parsing: " + propertiesPath);
|
||||
Properties p = new Properties();
|
||||
try {
|
||||
p.load(new FileInputStream(propertiesPath));
|
||||
try (BufferedReader input = Files.newBufferedReader(Path.of(propertiesPath))) {
|
||||
p.load(input);
|
||||
} catch ( FileNotFoundException e ) {
|
||||
ok = false;
|
||||
log.error("Cannot find file " + propertiesPath, e);
|
||||
@@ -246,7 +250,7 @@ public class CompileProperties {
|
||||
Writer writer = null;
|
||||
try {
|
||||
writer = new BufferedWriter(
|
||||
new OutputStreamWriter(new FileOutputStream(outputPath), "8859_1"));
|
||||
new OutputStreamWriter(new FileOutputStream(outputPath), StandardCharsets.US_ASCII));
|
||||
MessageFormat format = new MessageFormat(FORMAT);
|
||||
writer.write(format.format(new Object[] { packageString, className, superClass, data }));
|
||||
} catch ( IOException e ) {
|
||||
|
||||
@@ -35,6 +35,7 @@ include gensrc/GensrcExceptions.gmk
|
||||
include gensrc/GensrcVarHandles.gmk
|
||||
include gensrc/GensrcModuleLoaderMap.gmk
|
||||
include gensrc/GensrcScopedMemoryAccess.gmk
|
||||
include gensrc/GensrcRegex.gmk
|
||||
|
||||
# GensrcLocaleData.gmk does not set TARGETS, so we must choose which targets
|
||||
# to include.
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
# questions.
|
||||
#
|
||||
|
||||
DISABLED_WARNINGS_java += this-escape
|
||||
DISABLED_WARNINGS_java += this-escape restricted
|
||||
|
||||
DOCLINT += -Xdoclint:all/protected \
|
||||
'-Xdoclint/package:java.*,javax.*'
|
||||
|
||||
@@ -52,7 +52,8 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBNET, \
|
||||
DISABLED_WARNINGS_microsoft_ResolverConfigurationImpl.c := 4996, \
|
||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||
LDFLAGS_windows := -delayload:secur32.dll -delayload:iphlpapi.dll, \
|
||||
LDFLAGS_windows := -delayload:secur32.dll -delayload:iphlpapi.dll \
|
||||
-delayload:winhttp.dll, \
|
||||
LIBS_unix := -ljvm -ljava, \
|
||||
LIBS_linux := $(LIBDL), \
|
||||
LIBS_aix := $(LIBDL),\
|
||||
@@ -233,3 +234,23 @@ ifeq ($(ENABLE_FALLBACK_LINKER), true)
|
||||
|
||||
TARGETS += $(BUILD_LIBFALLBACKLINKER)
|
||||
endif
|
||||
|
||||
################################################################################
|
||||
|
||||
ifeq ($(call isTargetOs, linux)+$(call isTargetCpu, x86_64)+$(INCLUDE_COMPILER2)+$(filter $(TOOLCHAIN_TYPE), gcc), true+true+true+gcc)
|
||||
$(eval $(call SetupJdkLibrary, BUILD_LIB_SIMD_SORT, \
|
||||
NAME := simdsort, \
|
||||
TOOLCHAIN := TOOLCHAIN_LINK_CXX, \
|
||||
OPTIMIZATION := HIGH, \
|
||||
CFLAGS := $(CFLAGS_JDKLIB), \
|
||||
CXXFLAGS := $(CXXFLAGS_JDKLIB), \
|
||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||
LIBS := $(LIBCXX), \
|
||||
LIBS_linux := -lc -lm -ldl, \
|
||||
))
|
||||
|
||||
TARGETS += $(BUILD_LIB_SIMD_SORT)
|
||||
endif
|
||||
|
||||
################################################################################
|
||||
|
||||
46
make/modules/java.base/gensrc/GensrcRegex.gmk
Normal file
46
make/modules/java.base/gensrc/GensrcRegex.gmk
Normal file
@@ -0,0 +1,46 @@
|
||||
#
|
||||
# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
|
||||
#
|
||||
# Rules to create java files under
|
||||
# $(SUPPORT_OUTPUTDIR)/gensrc/java.base/jdk/internal/util/regex/
|
||||
#
|
||||
|
||||
GENSRC_INDICCONJUNCTBREAK := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/jdk/internal/util/regex/IndicConjunctBreak.java
|
||||
|
||||
INDICCONJUNCTBREAKTEMP := $(MODULE_SRC)/share/classes/jdk/internal/util/regex/IndicConjunctBreak.java.template
|
||||
INDICCONJUNCTBREAKPROPS := $(MODULE_SRC)/share/data/unicodedata/DerivedCoreProperties.txt
|
||||
INDICCONJUNCTBREAKPARAMS := InCB=Linker InCB=Extend InCB=Consonant
|
||||
|
||||
$(GENSRC_INDICCONJUNCTBREAK): $(BUILD_TOOLS_JDK) $(INDICCONJUNCTBREAKTEMP) $(INDICCONJUNCTBREAKPROPS)
|
||||
$(call LogInfo, Generating $@)
|
||||
$(call MakeTargetDir)
|
||||
$(TOOL_GENERATEEXTRAPROPERTIES) \
|
||||
$(INDICCONJUNCTBREAKTEMP) \
|
||||
$(INDICCONJUNCTBREAKPROPS) \
|
||||
$(GENSRC_INDICCONJUNCTBREAK) \
|
||||
$(INDICCONJUNCTBREAKPARAMS)
|
||||
|
||||
TARGETS += $(GENSRC_INDICCONJUNCTBREAK)
|
||||
@@ -64,7 +64,6 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBJAVA, \
|
||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||
LDFLAGS_macosx := -L$(SUPPORT_OUTPUTDIR)/native/$(MODULE)/, \
|
||||
LDFLAGS_windows := -delayload:shell32.dll, \
|
||||
LIBS_unix := -ljvm, \
|
||||
LIBS_linux := $(LIBDL), \
|
||||
LIBS_aix := $(LIBDL) $(LIBM),\
|
||||
@@ -72,7 +71,7 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBJAVA, \
|
||||
-framework Foundation \
|
||||
-framework SystemConfiguration, \
|
||||
LIBS_windows := jvm.lib \
|
||||
shell32.lib delayimp.lib \
|
||||
shell32.lib ole32.lib \
|
||||
advapi32.lib version.lib, \
|
||||
))
|
||||
|
||||
|
||||
@@ -919,19 +919,6 @@ endif
|
||||
|
||||
################################################################################
|
||||
|
||||
# MACOSX_METAL_VERSION_MIN specifies the lowest version of Macosx
|
||||
# that should be used to compile Metal shaders. We support Metal
|
||||
# pipeline only on Macosx >=10.14. For Macosx versions <10.14 even if
|
||||
# we enable Metal pipeline using -Dsun.java2d.metal=true, at
|
||||
# runtime we force it to use OpenGL pipeline. And MACOSX_VERSION_MIN
|
||||
# for aarch64 has always been >10.14 so we use continue to use
|
||||
# MACOSX_VERSION_MIN for aarch64.
|
||||
ifeq ($(OPENJDK_TARGET_CPU_ARCH), xaarch64)
|
||||
MACOSX_METAL_VERSION_MIN=$(MACOSX_VERSION_MIN)
|
||||
else
|
||||
MACOSX_METAL_VERSION_MIN=10.14.0
|
||||
endif
|
||||
|
||||
ifeq ($(call isTargetOs, macosx), true)
|
||||
SHADERS_SRC := $(TOPDIR)/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/shaders.metal
|
||||
SHADERS_SUPPORT_DIR := $(SUPPORT_OUTPUTDIR)/native/java.desktop/libosxui
|
||||
@@ -944,7 +931,7 @@ ifeq ($(call isTargetOs, macosx), true)
|
||||
OUTPUT_FILE := $(SHADERS_AIR), \
|
||||
SUPPORT_DIR := $(SHADERS_SUPPORT_DIR), \
|
||||
COMMAND := $(METAL) -c -std=osx-metal2.0 \
|
||||
-mmacosx-version-min=$(MACOSX_METAL_VERSION_MIN) \
|
||||
-mmacosx-version-min=$(MACOSX_VERSION_MIN) \
|
||||
-o $(SHADERS_AIR) $(SHADERS_SRC), \
|
||||
))
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -36,6 +36,7 @@ TARGETS += $(GENSRC_LOCALEDATA)
|
||||
CLDR_DATA_DIR := $(TOPDIR)/make/data/cldr/common
|
||||
GENSRC_DIR := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.localedata
|
||||
CLDR_GEN_DONE := $(GENSRC_DIR)/_cldr-gensrc.marker
|
||||
TZ_DATA_DIR := $(TOPDIR)/src/java.base/share/data/tzdata
|
||||
|
||||
$(CLDR_GEN_DONE): $(wildcard $(CLDR_DATA_DIR)/dtd/*.dtd) \
|
||||
$(wildcard $(CLDR_DATA_DIR)/main/*.xml) \
|
||||
@@ -47,7 +48,8 @@ $(CLDR_GEN_DONE): $(wildcard $(CLDR_DATA_DIR)/dtd/*.dtd) \
|
||||
$(TOOL_CLDRCONVERTER) -base $(CLDR_DATA_DIR) \
|
||||
-baselocales "en-US" \
|
||||
-year $(COPYRIGHT_YEAR) \
|
||||
-o $(GENSRC_DIR))
|
||||
-o $(GENSRC_DIR) \
|
||||
-tzdatadir $(TZ_DATA_DIR))
|
||||
$(TOUCH) $@
|
||||
|
||||
TARGETS += $(CLDR_GEN_DONE)
|
||||
|
||||
@@ -49,8 +49,8 @@ elif [ "$OPENJDK_TARGET_OS" = "windows" ]; then
|
||||
SKIP_BIN_DIFF="true"
|
||||
SKIP_FULLDUMP_DIFF="true"
|
||||
ACCEPTED_JARZIP_CONTENTS="
|
||||
/modules_libs/java.security.jgss/w2k_lsa_auth.pdb
|
||||
/modules_libs/java.security.jgss/w2k_lsa_auth.map
|
||||
/modules_libs/java.security.jgss/w2k_lsa_auth.dll.pdb
|
||||
/modules_libs/java.security.jgss/w2k_lsa_auth.dll.map
|
||||
/modules_libs/java.security.jgss/w2k_lsa_auth.dll
|
||||
"
|
||||
elif [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
|
||||
|
||||
@@ -326,7 +326,9 @@ function convert_path() {
|
||||
suffix="${BASH_REMATCH[6]}"
|
||||
|
||||
# We only believe this is a path if the first part is an existing directory
|
||||
if [[ -d "/$firstdir" ]]; then
|
||||
# and the prefix is not a subdirectory in the current working directory. Remove
|
||||
# any part leading up to a : or = in the prefix before checking.
|
||||
if [[ -d "/$firstdir" && ! -d "${prefix##*:}" && ! -d "${prefix##*=}" ]]; then
|
||||
if [[ $ENVROOT == "" ]]; then
|
||||
if [[ $QUIET != true ]]; then
|
||||
echo fixpath: failure: Path "'"$pathmatch"'" cannot be converted to Windows path >&2
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@@ -84,14 +84,16 @@ $(eval $(call SetupJavaCompilation, BUILD_INDIFY, \
|
||||
#### Compile Targets
|
||||
|
||||
# Building microbenchmark requires the jdk.unsupported and java.management modules.
|
||||
# sun.security.util is required to compile Cache benchmark
|
||||
# sun.security.util is required to compile Cache benchmark.
|
||||
# jmh uses annotation processors to generate the benchmark jar and thus
|
||||
# requires the use of -processor option during benchmark compilation.
|
||||
|
||||
# Build microbenchmark suite for the current JDK
|
||||
$(eval $(call SetupJavaCompilation, BUILD_JDK_MICROBENCHMARK, \
|
||||
TARGET_RELEASE := $(TARGET_RELEASE_NEWJDK_UPGRADED), \
|
||||
SMALL_JAVA := false, \
|
||||
CLASSPATH := $(MICROBENCHMARK_CLASSPATH), \
|
||||
DISABLED_WARNINGS := this-escape processing rawtypes cast serial preview, \
|
||||
DISABLED_WARNINGS := restricted this-escape processing rawtypes cast serial preview, \
|
||||
SRC := $(MICROBENCHMARK_SRC), \
|
||||
BIN := $(MICROBENCHMARK_CLASSES), \
|
||||
JAVAC_FLAGS := --add-exports java.base/sun.security.util=ALL-UNNAMED \
|
||||
@@ -105,7 +107,11 @@ $(eval $(call SetupJavaCompilation, BUILD_JDK_MICROBENCHMARK, \
|
||||
--add-exports java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED \
|
||||
--add-exports java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED \
|
||||
--add-exports java.base/jdk.internal.vm=ALL-UNNAMED \
|
||||
--enable-preview, \
|
||||
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED \
|
||||
--add-exports java.base/jdk.internal.event=ALL-UNNAMED \
|
||||
--add-exports java.base/jdk.internal.foreign=ALL-UNNAMED \
|
||||
--enable-preview \
|
||||
-processor org.openjdk.jmh.generators.BenchmarkProcessor, \
|
||||
JAVA_FLAGS := --add-modules jdk.unsupported --limit-modules java.management \
|
||||
--add-exports java.base/jdk.internal.vm=ALL-UNNAMED \
|
||||
--enable-preview, \
|
||||
@@ -155,10 +161,10 @@ $(eval $(call SetupTestFilesCompilation, BUILD_MICROBENCHMARK_LIBRARIES, \
|
||||
|
||||
# Setup copy of native dependencies to image output dir
|
||||
$(eval $(call SetupCopyFiles, COPY_MICROBENCHMARK_NATIVE, \
|
||||
SRC := $(MICROBENCHMARK_NATIVE_OUTPUT), \
|
||||
SRC := $(MICROBENCHMARK_NATIVE_OUTPUT)/lib, \
|
||||
DEST := $(MICROBENCHMARK_IMAGE_DIR)/native, \
|
||||
FILES := $(BUILD_MICROBENCHMARK_LIBRARIES), \
|
||||
FLATTEN := true, \
|
||||
FILES := $(filter $(MICROBENCHMARK_NATIVE_OUTPUT)/lib/%, \
|
||||
$(BUILD_MICROBENCHMARK_LIBRARIES)), \
|
||||
))
|
||||
|
||||
all: $(MICROBENCHMARK_JAR) $(BUILD_MICROBENCHMARK_LIBRARIES) $(COPY_MICROBENCHMARK_NATIVE)
|
||||
|
||||
@@ -863,7 +863,6 @@ ifeq ($(call isTargetOs, windows), true)
|
||||
BUILD_HOTSPOT_JTREG_EXCLUDE += exesigtest.c libterminatedThread.c libTestJNI.c libCompleteExit.c libTestPsig.c exeGetCreatedJavaVMs.c
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libatExit := jvm.lib
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libnativeStack := jvm.lib
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_COPY_DEBUG_SYMBOLS_libnativeStack := true
|
||||
BUILD_HOTSPOT_JTREG_EXECUTABLES_LIBS_exedaemonDestroy := jvm.lib
|
||||
else
|
||||
BUILD_HOTSPOT_JTREG_EXECUTABLES_LIBS_exedaemonDestroy := -ljvm
|
||||
@@ -1505,6 +1504,8 @@ else
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libCompleteExit += -lpthread
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libnativeStack += -lpthread
|
||||
BUILD_HOTSPOT_JTREG_EXECUTABLES_LIBS_exeGetCreatedJavaVMs := -ljvm -lpthread
|
||||
|
||||
BUILD_HOTSPOT_JTREG_EXCLUDE += libNativeException.c
|
||||
endif
|
||||
|
||||
ifeq ($(ASAN_ENABLED), true)
|
||||
|
||||
@@ -32,5 +32,5 @@
|
||||
# Resource strings for CodePointIM
|
||||
#
|
||||
|
||||
warning=Diese Demoeingabemethode kann nicht direkt als Anwendung ausgef\u00FChrt werden.\nIn der Datei README.html in diesem Verzeichnis erfahren Sie, wie Sie diese \nEingabemethode verwenden.
|
||||
warning=Diese Demoeingabemethode kann nicht direkt als Anwendung ausgeführt werden.\nIn der Datei README.html in diesem Verzeichnis erfahren Sie, wie Sie diese \nEingabemethode verwenden.
|
||||
|
||||
|
||||
@@ -32,5 +32,5 @@
|
||||
# Resource strings for CodePointIM
|
||||
#
|
||||
|
||||
warning=\u3053\u308C\u306F\u30C7\u30E2\u7528\u306E\u5165\u529B\u30E1\u30BD\u30C3\u30C9\u3067\u3059\u3002\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u3068\u3057\u3066\u5358\u4F53\u3067\u5B9F\u884C\u3059\u308B\n\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002\u3053\u306E\u5165\u529B\u30E1\u30BD\u30C3\u30C9\u306E\u4F7F\u7528\u65B9\u6CD5\u306B\u3064\u3044\u3066\u306F\u3001\u3053\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\n\u306B\u3042\u308BREADME.html\u3092\u3054\u89A7\u304F\u3060\u3055\u3044\u3002
|
||||
warning=これはデモ用の入力メソッドです。アプリケーションとして単体で実行する\nことはできません。この入力メソッドの使用方法については、このディレクトリ\nにあるREADME.htmlをご覧ください。
|
||||
|
||||
|
||||
@@ -32,5 +32,5 @@
|
||||
# Resource strings for CodePointIM
|
||||
#
|
||||
|
||||
warning=\u8FD9\u662F\u6F14\u793A\u8F93\u5165\u6CD5; \u4E0D\u80FD\u5C06\u5176\u76F4\u63A5\u4F5C\u4E3A\u5E94\u7528\u7A0B\u5E8F\u6765\u8FD0\u884C\u3002\n\u8BF7\u9605\u8BFB\u6B64\u76EE\u5F55\u4E2D\u7684 README.html \u6587\u4EF6\u4EE5\u4E86\u89E3\u5982\u4F55\u4F7F\u7528\n\u6B64\u8F93\u5165\u6CD5\u3002
|
||||
warning=这是演示输入法; 不能将其直接作为应用程序来运行。\n请阅读此目录中的 README.html 文件以了解如何使用\n此输入法。
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ ElementTreeFrameTitle=Elemente
|
||||
# exit -> Notepad.exitAction
|
||||
|
||||
fileLabel=Datei
|
||||
openLabel=\u00D6ffnen
|
||||
openLabel=Öffnen
|
||||
openImage=resources/open.gif
|
||||
newLabel=Neu
|
||||
newImage=resources/new.gif
|
||||
@@ -65,9 +65,9 @@ cutLabel=Ausschneiden
|
||||
cutImage=resources/cut.gif
|
||||
copyLabel=Kopieren
|
||||
copyImage=resources/copy.gif
|
||||
pasteLabel=Einf\u00FCgen
|
||||
pasteLabel=Einfügen
|
||||
pasteImage=resources/paste.gif
|
||||
undoLabel=R\u00FCckg\u00E4ngig
|
||||
undoLabel=Rückgängig
|
||||
redoLabel=Wiederherstellen
|
||||
|
||||
#
|
||||
@@ -86,8 +86,8 @@ showElementTreeLabel=Elemente anzeigen
|
||||
# with the menu items.
|
||||
|
||||
newTooltip=Neue Datei erstellen
|
||||
openTooltip=Datei \u00F6ffnen
|
||||
openTooltip=Datei öffnen
|
||||
saveTooltip=In Datei speichern
|
||||
cutTooltip=Auswahl in Zwischenablage verschieben
|
||||
copyTooltip=Auswahl in Zwischenablage kopieren
|
||||
pasteTooltip=Zwischenablage in Auswahl einf\u00FCgen
|
||||
pasteTooltip=Zwischenablage in Auswahl einfügen
|
||||
|
||||
@@ -31,8 +31,8 @@
|
||||
#
|
||||
# Resource strings for Notepad example
|
||||
|
||||
Title=\u30E1\u30E2\u5E33
|
||||
ElementTreeFrameTitle=\u8981\u7D20
|
||||
Title=メモ帳
|
||||
ElementTreeFrameTitle=要素
|
||||
|
||||
# file Menu definition
|
||||
#
|
||||
@@ -44,14 +44,14 @@ ElementTreeFrameTitle=\u8981\u7D20
|
||||
# save -> Notepad.saveAction
|
||||
# exit -> Notepad.exitAction
|
||||
|
||||
fileLabel=\u30D5\u30A1\u30A4\u30EB
|
||||
openLabel=\u958B\u304F
|
||||
fileLabel=ファイル
|
||||
openLabel=開く
|
||||
openImage=resources/open.gif
|
||||
newLabel=\u65B0\u898F
|
||||
newLabel=新規
|
||||
newImage=resources/new.gif
|
||||
saveLabel=\u4FDD\u5B58
|
||||
saveLabel=保存
|
||||
saveImage=resources/save.gif
|
||||
exitLabel=\u7D42\u4E86
|
||||
exitLabel=終了
|
||||
|
||||
#
|
||||
# edit Menu definition
|
||||
@@ -60,23 +60,23 @@ exitLabel=\u7D42\u4E86
|
||||
# copy -> JTextComponent.copyAction
|
||||
# paste -> JTextComponent.pasteAction
|
||||
|
||||
editLabel=\u7DE8\u96C6
|
||||
cutLabel=\u5207\u53D6\u308A
|
||||
editLabel=編集
|
||||
cutLabel=切取り
|
||||
cutImage=resources/cut.gif
|
||||
copyLabel=\u30B3\u30D4\u30FC
|
||||
copyLabel=コピー
|
||||
copyImage=resources/copy.gif
|
||||
pasteLabel=\u8CBC\u4ED8\u3051
|
||||
pasteLabel=貼付け
|
||||
pasteImage=resources/paste.gif
|
||||
undoLabel=\u5143\u306B\u623B\u3059
|
||||
redoLabel=\u518D\u5B9F\u884C
|
||||
undoLabel=元に戻す
|
||||
redoLabel=再実行
|
||||
|
||||
#
|
||||
# debug Menu definition
|
||||
#
|
||||
|
||||
debugLabel=\u30C7\u30D0\u30C3\u30B0
|
||||
dumpLabel=\u30E2\u30C7\u30EB\u3092System.err\u306B\u30C0\u30F3\u30D7
|
||||
showElementTreeLabel=\u8981\u7D20\u306E\u8868\u793A
|
||||
debugLabel=デバッグ
|
||||
dumpLabel=モデルをSystem.errにダンプ
|
||||
showElementTreeLabel=要素の表示
|
||||
|
||||
# toolbar definition
|
||||
#
|
||||
@@ -85,9 +85,9 @@ showElementTreeLabel=\u8981\u7D20\u306E\u8868\u793A
|
||||
# are of course sharable, and in this case are shared
|
||||
# with the menu items.
|
||||
|
||||
newTooltip=\u30D5\u30A1\u30A4\u30EB\u3092\u65B0\u898F\u4F5C\u6210\u3059\u308B
|
||||
openTooltip=\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u304F
|
||||
saveTooltip=\u30D5\u30A1\u30A4\u30EB\u306B\u4FDD\u5B58
|
||||
cutTooltip=\u9078\u629E\u3092\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u79FB\u52D5
|
||||
copyTooltip=\u9078\u629E\u3092\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC
|
||||
pasteTooltip=\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u3092\u9078\u629E\u306B\u8CBC\u4ED8\u3051
|
||||
newTooltip=ファイルを新規作成する
|
||||
openTooltip=ファイルを開く
|
||||
saveTooltip=ファイルに保存
|
||||
cutTooltip=選択をクリップボードに移動
|
||||
copyTooltip=選択をクリップボードにコピー
|
||||
pasteTooltip=クリップボードを選択に貼付け
|
||||
|
||||
@@ -31,8 +31,8 @@
|
||||
#
|
||||
# Resource strings for Notepad example
|
||||
|
||||
Title=\u8BB0\u4E8B\u672C
|
||||
ElementTreeFrameTitle=\u5143\u7D20
|
||||
Title=记事本
|
||||
ElementTreeFrameTitle=元素
|
||||
|
||||
# file Menu definition
|
||||
#
|
||||
@@ -44,14 +44,14 @@ ElementTreeFrameTitle=\u5143\u7D20
|
||||
# save -> Notepad.saveAction
|
||||
# exit -> Notepad.exitAction
|
||||
|
||||
fileLabel=\u6587\u4EF6
|
||||
openLabel=\u6253\u5F00
|
||||
fileLabel=文件
|
||||
openLabel=打开
|
||||
openImage=resources/open.gif
|
||||
newLabel=\u65B0\u5EFA
|
||||
newLabel=新建
|
||||
newImage=resources/new.gif
|
||||
saveLabel=\u4FDD\u5B58
|
||||
saveLabel=保存
|
||||
saveImage=resources/save.gif
|
||||
exitLabel=\u9000\u51FA
|
||||
exitLabel=退出
|
||||
|
||||
#
|
||||
# edit Menu definition
|
||||
@@ -60,23 +60,23 @@ exitLabel=\u9000\u51FA
|
||||
# copy -> JTextComponent.copyAction
|
||||
# paste -> JTextComponent.pasteAction
|
||||
|
||||
editLabel=\u7F16\u8F91
|
||||
cutLabel=\u526A\u5207
|
||||
editLabel=编辑
|
||||
cutLabel=剪切
|
||||
cutImage=resources/cut.gif
|
||||
copyLabel=\u590D\u5236
|
||||
copyLabel=复制
|
||||
copyImage=resources/copy.gif
|
||||
pasteLabel=\u7C98\u8D34
|
||||
pasteLabel=粘贴
|
||||
pasteImage=resources/paste.gif
|
||||
undoLabel=\u64A4\u6D88
|
||||
redoLabel=\u91CD\u505A
|
||||
undoLabel=撤消
|
||||
redoLabel=重做
|
||||
|
||||
#
|
||||
# debug Menu definition
|
||||
#
|
||||
|
||||
debugLabel=\u8C03\u8BD5
|
||||
dumpLabel=\u5C06\u6A21\u578B\u8F6C\u50A8\u5230 System.err
|
||||
showElementTreeLabel=\u663E\u793A\u5143\u7D20
|
||||
debugLabel=调试
|
||||
dumpLabel=将模型转储到 System.err
|
||||
showElementTreeLabel=显示元素
|
||||
|
||||
# toolbar definition
|
||||
#
|
||||
@@ -85,9 +85,9 @@ showElementTreeLabel=\u663E\u793A\u5143\u7D20
|
||||
# are of course sharable, and in this case are shared
|
||||
# with the menu items.
|
||||
|
||||
newTooltip=\u521B\u5EFA\u65B0\u6587\u4EF6
|
||||
openTooltip=\u6253\u5F00\u6587\u4EF6
|
||||
saveTooltip=\u4FDD\u5B58\u6587\u4EF6
|
||||
cutTooltip=\u526A\u5207\u9009\u5B9A\u5185\u5BB9\u5230\u526A\u5E16\u677F\u4E2D
|
||||
copyTooltip=\u590D\u5236\u9009\u5B9A\u5185\u5BB9\u5230\u526A\u5E16\u677F\u4E2D
|
||||
pasteTooltip=\u7C98\u8D34\u9009\u5B9A\u5185\u5BB9\u5230\u526A\u5E16\u677F\u4E2D
|
||||
newTooltip=创建新文件
|
||||
openTooltip=打开文件
|
||||
saveTooltip=保存文件
|
||||
cutTooltip=剪切选定内容到剪帖板中
|
||||
copyTooltip=复制选定内容到剪帖板中
|
||||
pasteTooltip=粘贴选定内容到剪帖板中
|
||||
|
||||
@@ -36,7 +36,7 @@ Title=Stylepad
|
||||
# Menu labels
|
||||
colorLabel=Farbe
|
||||
Red=Rot
|
||||
Green=Gr\u00FCn
|
||||
Green=Grün
|
||||
Blue=Blau
|
||||
|
||||
boldLabel=Fett
|
||||
@@ -75,11 +75,11 @@ underlineImage=resources/underline.gif
|
||||
underlineTooltip=Unterstrichen
|
||||
foregroundImage=resources/fg.gif
|
||||
leftImage=resources/left.gif
|
||||
leftTooltip=Linksb\u00FCndig
|
||||
leftTooltip=Linksbündig
|
||||
centerImage=resources/center.gif
|
||||
centerTooltip=Zentriert
|
||||
rightImage=resources/right.gif
|
||||
rightTooltip=Rechtsb\u00FCndig
|
||||
rightTooltip=Rechtsbündig
|
||||
bulletsImage=resources/bullets.gif
|
||||
|
||||
# wonderland example images
|
||||
|
||||
@@ -31,22 +31,22 @@
|
||||
#
|
||||
# Resource strings for Stylepad example
|
||||
|
||||
Title=\u30B9\u30BF\u30A4\u30EB\u30D1\u30C3\u30C9
|
||||
Title=スタイルパッド
|
||||
|
||||
# Menu labels
|
||||
colorLabel=\u30AB\u30E9\u30FC
|
||||
Red=\u8D64
|
||||
Green=\u7DD1
|
||||
Blue=\u9752
|
||||
colorLabel=カラー
|
||||
Red=赤
|
||||
Green=緑
|
||||
Blue=青
|
||||
|
||||
boldLabel=\u592A\u5B57
|
||||
italicLabel=\u30A4\u30BF\u30EA\u30C3\u30AF
|
||||
boldLabel=太字
|
||||
italicLabel=イタリック
|
||||
|
||||
# font menu
|
||||
|
||||
fontLabel=\u30D5\u30A9\u30F3\u30C8
|
||||
fontLabel=フォント
|
||||
family1Label=SansSerif
|
||||
family2Label=\u30E2\u30CE\u30B9\u30DA\u30FC\u30B9
|
||||
family2Label=モノスペース
|
||||
family3Label=Serif
|
||||
family4Label=Lucida Sans
|
||||
size1Label=10
|
||||
@@ -54,32 +54,32 @@ size2Label=12
|
||||
size3Label=18
|
||||
size4Label=24
|
||||
size5Label=48
|
||||
boldLabel=\u592A\u5B57
|
||||
italicLabel=\u30A4\u30BF\u30EA\u30C3\u30AF
|
||||
underlineLabel=\u4E0B\u7DDA
|
||||
boldLabel=太字
|
||||
italicLabel=イタリック
|
||||
underlineLabel=下線
|
||||
|
||||
#
|
||||
# debug Menu definition
|
||||
#
|
||||
debugLabel=\u30C7\u30D0\u30C3\u30B0
|
||||
dumpLabel=\u30E2\u30C7\u30EB\u3092System.err\u306B\u30C0\u30F3\u30D7
|
||||
showElementTreeLabel=\u8981\u7D20\u306E\u8868\u793A
|
||||
debugLabel=デバッグ
|
||||
dumpLabel=モデルをSystem.errにダンプ
|
||||
showElementTreeLabel=要素の表示
|
||||
|
||||
|
||||
# toolbar definition
|
||||
boldImage=resources/bold.gif
|
||||
boldTooltip=\u592A\u5B57
|
||||
boldTooltip=太字
|
||||
italicImage=resources/italic.gif
|
||||
italicTooltip=\u30A4\u30BF\u30EA\u30C3\u30AF
|
||||
italicTooltip=イタリック
|
||||
underlineImage=resources/underline.gif
|
||||
underlineTooltip=\u4E0B\u7DDA
|
||||
underlineTooltip=下線
|
||||
foregroundImage=resources/fg.gif
|
||||
leftImage=resources/left.gif
|
||||
leftTooltip=\u5DE6\u63C3\u3048
|
||||
leftTooltip=左揃え
|
||||
centerImage=resources/center.gif
|
||||
centerTooltip=\u4E2D\u592E\u63C3\u3048
|
||||
centerTooltip=中央揃え
|
||||
rightImage=resources/right.gif
|
||||
rightTooltip=\u53F3\u63C3\u3048
|
||||
rightTooltip=右揃え
|
||||
bulletsImage=resources/bullets.gif
|
||||
|
||||
# wonderland example images
|
||||
|
||||
@@ -34,17 +34,17 @@
|
||||
Title=StylePad
|
||||
|
||||
# Menu labels
|
||||
colorLabel=\u989C\u8272
|
||||
Red=\u7EA2\u8272
|
||||
Green=\u7EFF\u8272
|
||||
Blue=\u84DD\u8272
|
||||
colorLabel=颜色
|
||||
Red=红色
|
||||
Green=绿色
|
||||
Blue=蓝色
|
||||
|
||||
boldLabel=\u7C97\u4F53
|
||||
italicLabel=\u659C\u4F53
|
||||
boldLabel=粗体
|
||||
italicLabel=斜体
|
||||
|
||||
# font menu
|
||||
|
||||
fontLabel=\u5B57\u4F53
|
||||
fontLabel=字体
|
||||
family1Label=SansSerif
|
||||
family2Label=Monospaced
|
||||
family3Label=Serif
|
||||
@@ -54,32 +54,32 @@ size2Label=12
|
||||
size3Label=18
|
||||
size4Label=24
|
||||
size5Label=48
|
||||
boldLabel=\u7C97\u4F53
|
||||
italicLabel=\u659C\u4F53
|
||||
underlineLabel=\u4E0B\u5212\u7EBF
|
||||
boldLabel=粗体
|
||||
italicLabel=斜体
|
||||
underlineLabel=下划线
|
||||
|
||||
#
|
||||
# debug Menu definition
|
||||
#
|
||||
debugLabel=\u8C03\u8BD5
|
||||
dumpLabel=\u5C06\u6A21\u578B\u8F6C\u50A8\u5230 System.err
|
||||
showElementTreeLabel=\u663E\u793A\u5143\u7D20
|
||||
debugLabel=调试
|
||||
dumpLabel=将模型转储到 System.err
|
||||
showElementTreeLabel=显示元素
|
||||
|
||||
|
||||
# toolbar definition
|
||||
boldImage=resources/bold.gif
|
||||
boldTooltip=\u7C97\u4F53
|
||||
boldTooltip=粗体
|
||||
italicImage=resources/italic.gif
|
||||
italicTooltip=\u659C\u4F53
|
||||
italicTooltip=斜体
|
||||
underlineImage=resources/underline.gif
|
||||
underlineTooltip=\u4E0B\u5212\u7EBF
|
||||
underlineTooltip=下划线
|
||||
foregroundImage=resources/fg.gif
|
||||
leftImage=resources/left.gif
|
||||
leftTooltip=\u5DE6\u5BF9\u9F50
|
||||
leftTooltip=左对齐
|
||||
centerImage=resources/center.gif
|
||||
centerTooltip=\u4E2D\u95F4\u5BF9\u9F50
|
||||
centerTooltip=中间对齐
|
||||
rightImage=resources/right.gif
|
||||
rightTooltip=\u53F3\u5BF9\u9F50
|
||||
rightTooltip=右对齐
|
||||
bulletsImage=resources/bullets.gif
|
||||
|
||||
# wonderland example images
|
||||
|
||||
@@ -49,11 +49,11 @@ SourceCode.loading=<html><body bgcolor="#ffffff">Quellcode wird geladen und form
|
||||
### Status ###
|
||||
|
||||
Status.loading=Wird geladen:
|
||||
Status.popupMenuAccessible=Dr\u00FCcken Sie Umschalt-F10, um das Popup-Men\u00FC zu aktivieren
|
||||
Status.popupMenuAccessible=Drücken Sie Umschalt-F10, um das Popup-Menü zu aktivieren
|
||||
|
||||
### Menu Bar ###
|
||||
|
||||
MenuBar.accessible_description=Men\u00FCleiste der Swing-Demo
|
||||
MenuBar.accessible_description=Menüleiste der Swing-Demo
|
||||
|
||||
|
||||
### Frame ###
|
||||
@@ -64,13 +64,13 @@ Frame.title=SwingSet2
|
||||
### Tabbed Pane ###
|
||||
|
||||
TabbedPane.src.labelAndMnemonic=Quellcode
|
||||
TabbedPane.src_tooltip=Quellcode f\u00FCr diese Demo anzeigen
|
||||
TabbedPane.src_tooltip=Quellcode für diese Demo anzeigen
|
||||
|
||||
|
||||
### Look & Feel Menu ###
|
||||
|
||||
LafMenu.laf.labelAndMnemonic=&Look-and-Feel
|
||||
LafMenu.laf_accessible_description=Men\u00FC, \u00FCber das Sie das Look-and-Feel wechseln k\u00F6nnen
|
||||
LafMenu.laf_accessible_description=Menü, über das Sie das Look-and-Feel wechseln können
|
||||
|
||||
LafMenu.java.labelAndMnemonic=&Java-Look-and-Feel
|
||||
LafMenu.java_accessible_description=Das Java-Look-and-Feel
|
||||
@@ -94,10 +94,10 @@ LafMenu.gtk_accessible_description=GTK-Look-and-Feel
|
||||
### Themes Menu ###
|
||||
|
||||
ThemesMenu.themes.labelAndMnemonic=&Themes
|
||||
ThemesMenu.themes_accessible_description=Men\u00FC zum Wechseln der Metal-Farb-Themes
|
||||
ThemesMenu.themes_accessible_description=Menü zum Wechseln der Metal-Farb-Themes
|
||||
|
||||
ThemesMenu.aqua.labelAndMnemonic=A&qua
|
||||
ThemesMenu.aqua_accessible_description=Ein Metal-Theme mit blau-gr\u00FCnen Farben
|
||||
ThemesMenu.aqua_accessible_description=Ein Metal-Theme mit blau-grünen Farben
|
||||
|
||||
ThemesMenu.charcoal.labelAndMnemonic=&Anthrazit
|
||||
ThemesMenu.charcoal_accessible_description=Ein Metal-Theme mit dunkelgrauen Farben
|
||||
@@ -111,8 +111,8 @@ ThemesMenu.ocean_accessible_description=Das Metal-Theme "Ozean"
|
||||
ThemesMenu.steel.labelAndMnemonic=&Stahl
|
||||
ThemesMenu.steel_accessible_description=Das blaue/violette Metal-Theme
|
||||
|
||||
ThemesMenu.emerald.labelAndMnemonic=&Smaragdgr\u00FCn
|
||||
ThemesMenu.emerald_accessible_description=Ein Metal-Theme mit gr\u00FCnen Farben
|
||||
ThemesMenu.emerald.labelAndMnemonic=&Smaragdgrün
|
||||
ThemesMenu.emerald_accessible_description=Ein Metal-Theme mit grünen Farben
|
||||
|
||||
ThemesMenu.ruby.labelAndMnemonic=&Rubinrot
|
||||
ThemesMenu.ruby_accessible_description=Ein Metal-Theme mit roten Farben
|
||||
@@ -120,33 +120,33 @@ ThemesMenu.ruby_accessible_description=Ein Metal-Theme mit roten Farben
|
||||
|
||||
### Font SubMenu (under Themes)
|
||||
FontMenu.fonts.labelAndMnemonic=Schri&ftarten
|
||||
FontMenu.fonts_accessible_description=Men\u00FC, in dem Sie Schriftarten f\u00FCr das Java-Look-and-Feel ausw\u00E4hlen
|
||||
FontMenu.fonts_accessible_description=Menü, in dem Sie Schriftarten für das Java-Look-and-Feel auswählen
|
||||
|
||||
FontMenu.bold.labelAndMnemonic=&Fett
|
||||
FontMenu.bold_accessible_description=Deaktiviert fettgedruckte Schriftarten f\u00FCr das Java-Look-and-Feel
|
||||
FontMenu.bold_accessible_description=Deaktiviert fettgedruckte Schriftarten für das Java-Look-and-Feel
|
||||
|
||||
FontMenu.plain.labelAndMnemonic=&Normal
|
||||
FontMenu.plain_accessible_description=Deaktiviert normale Schriftarten f\u00FCr das Java-Look-and-Feel
|
||||
FontMenu.plain_accessible_description=Deaktiviert normale Schriftarten für das Java-Look-and-Feel
|
||||
|
||||
|
||||
### Audio SubMenu (under Themes) ###
|
||||
|
||||
AudioMenu.audio.labelAndMnemonic=&Audio
|
||||
AudioMenu.audio_accessible_description=Men\u00FC, in dem Sie die verf\u00FCgbare Audio-Feedbackmenge im Java-Look-and-Feel \u00E4ndern
|
||||
AudioMenu.audio_accessible_description=Menü, in dem Sie die verfügbare Audio-Feedbackmenge im Java-Look-and-Feel ändern
|
||||
|
||||
AudioMenu.on.labelAndMnemonic=&Ein
|
||||
AudioMenu.on_accessible_description=Aktiviert das gesamte Audiofeedback f\u00FCr das Java-Look-and-Feel
|
||||
AudioMenu.on_accessible_description=Aktiviert das gesamte Audiofeedback für das Java-Look-and-Feel
|
||||
|
||||
AudioMenu.default.labelAndMnemonic=Stan&dard
|
||||
AudioMenu.default_accessible_description=Aktiviert die standardm\u00E4\u00DFige Audio-Feedbackmenge f\u00FCr das Java-Look-and-Feel
|
||||
AudioMenu.default_accessible_description=Aktiviert die standardmäßige Audio-Feedbackmenge für das Java-Look-and-Feel
|
||||
|
||||
AudioMenu.off.labelAndMnemonic=A&us
|
||||
AudioMenu.off_accessible_description=Deaktiviert das gesamte Audiofeedback f\u00FCr das Java-Look-and-Feel
|
||||
AudioMenu.off_accessible_description=Deaktiviert das gesamte Audiofeedback für das Java-Look-and-Feel
|
||||
|
||||
### Options Menu ###
|
||||
|
||||
OptionsMenu.options.labelAndMnemonic=O&ptionen
|
||||
OptionsMenu.options_accessible_description=Men\u00FC mit anderen Optionen
|
||||
OptionsMenu.options_accessible_description=Menü mit anderen Optionen
|
||||
|
||||
OptionsMenu.tooltip.labelAndMnemonic=QuickInfo ak&tivieren
|
||||
OptionsMenu.tooltip_accessible_description=QuickInfo aktivieren oder deaktivieren
|
||||
@@ -157,21 +157,21 @@ OptionsMenu.dragEnabled_accessible_description=Drag-und-Drop aktivieren oder dea
|
||||
### File Menu ###
|
||||
|
||||
FileMenu.file.labelAndMnemonic=Dat&ei
|
||||
FileMenu.accessible_description=Men\u00FC "Datei"
|
||||
FileMenu.accessible_description=Menü "Datei"
|
||||
FileMenu.about.labelAndMnemonic=&Info
|
||||
FileMenu.about_accessible_description=Weitere Informationen zur SwingSet2-Anwendung
|
||||
FileMenu.open.labelAndMnemonic=\u00D6&ffnen
|
||||
FileMenu.open_accessible_description=Platzhaltermen\u00FCoption zum \u00D6ffnen einer Datei
|
||||
FileMenu.open.labelAndMnemonic=Ö&ffnen
|
||||
FileMenu.open_accessible_description=Platzhaltermenüoption zum Öffnen einer Datei
|
||||
FileMenu.save.labelAndMnemonic=&Speichern
|
||||
FileMenu.save_accessible_description=Platzhaltermen\u00FCoption zum Speichern einer Datei
|
||||
FileMenu.save_accessible_description=Platzhaltermenüoption zum Speichern einer Datei
|
||||
FileMenu.save_as.labelAndMnemonic=Speichern &unter...
|
||||
FileMenu.save_as_accessible_description=Platzhaltermen\u00FCoption zum Speichern einer Datei mit einem neuen Namen
|
||||
FileMenu.save_as_accessible_description=Platzhaltermenüoption zum Speichern einer Datei mit einem neuen Namen
|
||||
FileMenu.exit.labelAndMnemonic=B&eenden
|
||||
FileMenu.exit_accessible_description=SwingSet2-Anwendung beenden
|
||||
|
||||
### Multi-Screen menu ###
|
||||
MultiMenu.multi.labelAndMnemonic=&Multiscreen
|
||||
MultiMenu.multi_accessible_description=Multiscreen-Men\u00FC
|
||||
MultiMenu.multi_accessible_description=Multiscreen-Menü
|
||||
MultiMenu.all.labelAndMnemonic=SwingSet2 &auf allen Bildschirmen erstellen
|
||||
MultiMenu.all_accessible_description=SwingSet2-Fenster auf jedem Bildschirm erstellen
|
||||
MultiMenu.single.labelAndMnemonic=SwingSet2 auf Bildschirm erstellen
|
||||
@@ -184,23 +184,23 @@ MultiMenu.single_accessible_description=SwingSet2-Fenster auf Bildschirm erstell
|
||||
|
||||
### Button Demo ###
|
||||
|
||||
ButtonDemo.accessible_description=Die ButtonDemo zeigt Beispiele f\u00FCr die Verwendung von JButton, JRadioButton, JToggleButton und JCheckBox
|
||||
ButtonDemo.tooltip=Demos f\u00FCr JButton, JRadioButton, JToggleButton, JCheckbox
|
||||
ButtonDemo.name=Schaltfl\u00E4chendemo
|
||||
ButtonDemo.accessible_description=Die ButtonDemo zeigt Beispiele für die Verwendung von JButton, JRadioButton, JToggleButton und JCheckBox
|
||||
ButtonDemo.tooltip=Demos für JButton, JRadioButton, JToggleButton, JCheckbox
|
||||
ButtonDemo.name=Schaltflächendemo
|
||||
|
||||
ButtonDemo.buttons=Schaltfl\u00E4chen
|
||||
ButtonDemo.checkboxes=Kontrollk\u00E4stchen
|
||||
ButtonDemo.buttons=Schaltflächen
|
||||
ButtonDemo.checkboxes=Kontrollkästchen
|
||||
ButtonDemo.radiobuttons=Optionsfelder
|
||||
ButtonDemo.togglebuttons=Umschalt-Schaltfl\u00E4chen
|
||||
ButtonDemo.togglebuttons=Umschalt-Schaltflächen
|
||||
|
||||
ButtonDemo.textbuttons=Textschaltfl\u00E4chen
|
||||
ButtonDemo.imagebuttons=Bildschaltfl\u00E4chen
|
||||
ButtonDemo.textbuttons=Textschaltflächen
|
||||
ButtonDemo.imagebuttons=Bildschaltflächen
|
||||
ButtonDemo.textradiobuttons=Textoptionsfelder
|
||||
ButtonDemo.imageradiobuttons=Bildoptionsfelder
|
||||
ButtonDemo.texttogglebuttons=Text-Umschalt-Schaltfl\u00E4chen
|
||||
ButtonDemo.imagetogglebuttons=Bild-Umschalt-Schaltfl\u00E4chen
|
||||
ButtonDemo.textcheckboxes=Textkontrollk\u00E4stchen
|
||||
ButtonDemo.imagecheckboxes=Bildkontrollk\u00E4stchen
|
||||
ButtonDemo.texttogglebuttons=Text-Umschalt-Schaltflächen
|
||||
ButtonDemo.imagetogglebuttons=Bild-Umschalt-Schaltflächen
|
||||
ButtonDemo.textcheckboxes=Textkontrollkästchen
|
||||
ButtonDemo.imagecheckboxes=Bildkontrollkästchen
|
||||
|
||||
ButtonDemo.button1=Eins
|
||||
ButtonDemo.button2=Zwei
|
||||
@@ -217,21 +217,21 @@ ButtonDemo.check3=Drei
|
||||
ButtonDemo.checkX=<html><font size=2 color=red>Drei<bold>(HTML!)</bold></font></html>
|
||||
|
||||
ButtonDemo.customradio=Ein benutzerdefiniertes "Chrome"-Optionsfeld.
|
||||
ButtonDemo.customcheck=Ein benutzerdefinierbares Gl\u00FChbirnenkontrollk\u00E4stchen.
|
||||
ButtonDemo.customcheck=Ein benutzerdefinierbares Glühbirnenkontrollkästchen.
|
||||
|
||||
ButtonDemo.phone=Telefon
|
||||
ButtonDemo.write=Schreiben
|
||||
ButtonDemo.peace=Peace
|
||||
|
||||
ButtonDemo.controlpanel.labelAndMnemonic=Anzeigeoptionen:
|
||||
ButtonDemo.paintborder.labelAndMnemonic=Rahmen f\u00E4r&ben
|
||||
ButtonDemo.paintborder_tooltip=Klicken Sie hier, um die Rahmenf\u00E4rbung ein- oder auszuschalten.
|
||||
ButtonDemo.paintfocus.labelAndMnemonic=&Fokus f\u00E4rben
|
||||
ButtonDemo.paintfocus_tooltip=Klicken Sie hier, um die Fokusf\u00E4rbung ein- oder auszuschalten.
|
||||
ButtonDemo.paintborder.labelAndMnemonic=Rahmen fär&ben
|
||||
ButtonDemo.paintborder_tooltip=Klicken Sie hier, um die Rahmenfärbung ein- oder auszuschalten.
|
||||
ButtonDemo.paintfocus.labelAndMnemonic=&Fokus färben
|
||||
ButtonDemo.paintfocus_tooltip=Klicken Sie hier, um die Fokusfärbung ein- oder auszuschalten.
|
||||
ButtonDemo.enabled.labelAndMnemonic=Aktivi&ert
|
||||
ButtonDemo.enabled_tooltip=Klicken Sie hier, um die Schaltfl\u00E4chen zu aktivieren oder zu deaktivieren.
|
||||
ButtonDemo.contentfilled.labelAndMnemonic=&Inhalt gef\u00FCllt
|
||||
ButtonDemo.contentfilled_tooltip=Klicken Sie hier, um die F\u00FCllung des Inhaltsbereichs zu steuern.
|
||||
ButtonDemo.enabled_tooltip=Klicken Sie hier, um die Schaltflächen zu aktivieren oder zu deaktivieren.
|
||||
ButtonDemo.contentfilled.labelAndMnemonic=&Inhalt gefüllt
|
||||
ButtonDemo.contentfilled_tooltip=Klicken Sie hier, um die Füllung des Inhaltsbereichs zu steuern.
|
||||
|
||||
ButtonDemo.padamount.labelAndMnemonic=Abstand:
|
||||
ButtonDemo.default.labelAndMnemonic=Stan&dard
|
||||
@@ -246,10 +246,10 @@ LayoutControlPanel.contentalignment.labelAndMnemonic=Inhaltsausrichtung:
|
||||
|
||||
### ColorChooser Demo ###
|
||||
|
||||
ColorChooserDemo.accessible_description=Mit dem ColorChooser k\u00F6nnen Sie eine Farbe \u00FCber eine Palette oder unter RGB- oder HSB-Werten ausw\u00E4hlen
|
||||
ColorChooserDemo.accessible_description=Mit dem ColorChooser können Sie eine Farbe über eine Palette oder unter RGB- oder HSB-Werten auswählen
|
||||
ColorChooserDemo.tooltip=JColorChooser-Demo
|
||||
ColorChooserDemo.name=ColorChooser-Demo
|
||||
ColorChooserDemo.chooser_title=Farbe w\u00E4hlen
|
||||
ColorChooserDemo.chooser_title=Farbe wählen
|
||||
ColorChooserDemo.background=Hintergrund
|
||||
ColorChooserDemo.grad_a=Farbverlauf 1
|
||||
ColorChooserDemo.grad_b=Farbverlauf 2
|
||||
@@ -258,7 +258,7 @@ ColorChooserDemo.cup=Bild der Kaffeetasse der Java-Marke
|
||||
|
||||
### ComboBox Demo ###
|
||||
|
||||
ComboBoxDemo.accessible_description=Diese Demo zeigt ein Beispiel f\u00FCr die Verwendung der JComboBox-Komponente.
|
||||
ComboBoxDemo.accessible_description=Diese Demo zeigt ein Beispiel für die Verwendung der JComboBox-Komponente.
|
||||
ComboBoxDemo.tooltip=JComboBox-Demo
|
||||
ComboBoxDemo.name=ComboBox-Demo
|
||||
|
||||
@@ -300,7 +300,7 @@ ComboBoxDemo.scott=Scott
|
||||
|
||||
### FileChooser Demo ###
|
||||
|
||||
FileChooserDemo.accessible_description=\u00DCber den FileChooser k\u00F6nnen Benutzer eine Datei zum \u00D6ffnen oder Erstellen/Speichern ausw\u00E4hlen.
|
||||
FileChooserDemo.accessible_description=Über den FileChooser können Benutzer eine Datei zum Öffnen oder Erstellen/Speichern auswählen.
|
||||
FileChooserDemo.tooltip=JFileChooser-Demo
|
||||
FileChooserDemo.name=FileChooser-Demo
|
||||
|
||||
@@ -308,18 +308,18 @@ FileChooserDemo.plainbutton=Einfachen JFileChooser anzeigen
|
||||
FileChooserDemo.previewbutton=Vorschau-JFileChooser anzeigen
|
||||
FileChooserDemo.custombutton=Benutzerdefinierten JFileChooser anzeigen
|
||||
|
||||
FileChooserDemo.description=<html>&  &  Beachten Sie, dass Sie ganz einfach Ihren eigenen FileChooser<br> &  &  mit beliebig vielen Komponenten erstellen k\u00F6nnen. </html>
|
||||
FileChooserDemo.description=<html>&  &  Beachten Sie, dass Sie ganz einfach Ihren eigenen FileChooser<br> &  &  mit beliebig vielen Komponenten erstellen können. </html>
|
||||
|
||||
FileChooserDemo.filterdescription=JPEG- und GIF-Bilddateien
|
||||
|
||||
FileChooserDemo.nofileselected=W\u00E4hlen Sie zun\u00E4chst eine Datei aus.
|
||||
FileChooserDemo.nofileselected=Wählen Sie zunächst eine Datei aus.
|
||||
FileChooserDemo.thefile=die Datei:
|
||||
FileChooserDemo.isprobably=ist wahrscheinlich ein Bild.
|
||||
|
||||
FileChooserDemo.helptext=<html>Suchen: Datei suchen.<br>Info: Weitere Informationen zur Datei.<br>OK: Diese Datei ausw\u00E4hlen.<br>Abbrechen: Dieses Dialogfeld ohne Aktion verlassen.</html>
|
||||
FileChooserDemo.helptext=<html>Suchen: Datei suchen.<br>Info: Weitere Informationen zur Datei.<br>OK: Diese Datei auswählen.<br>Abbrechen: Dieses Dialogfeld ohne Aktion verlassen.</html>
|
||||
|
||||
FileChooserDemo.findquestion=Datei suchen:
|
||||
FileChooserDemo.findresponse=<html><center>Sie m\u00F6chten wirklich eine Datei suchen? <br>Das ist mit dieser Demo nicht m\u00F6glich.</center></html>
|
||||
FileChooserDemo.findresponse=<html><center>Sie möchten wirklich eine Datei suchen? <br>Das ist mit dieser Demo nicht möglich.</center></html>
|
||||
|
||||
FileChooserDemo.dialogtitle=FileChooser mit benutzerdefiniertem Layout
|
||||
FileChooserDemo.help=Hilfe
|
||||
@@ -342,8 +342,8 @@ InternalFrameDemo.accessible_description=JInternal-Framedemo
|
||||
InternalFrameDemo.create_frames.labelAndMnemonic=Angepasste interne Frames erstellen
|
||||
InternalFrameDemo.title_text_field.labelAndMnemonic=Frametitel:
|
||||
InternalFrameDemo.frame.labelAndMnemonic=Frame
|
||||
InternalFrameDemo.palette.labelAndMnemonic=Generator f\u00FCr interne Frames
|
||||
InternalFrameDemo.name=Demo f\u00FCr interne Frames
|
||||
InternalFrameDemo.palette.labelAndMnemonic=Generator für interne Frames
|
||||
InternalFrameDemo.name=Demo für interne Frames
|
||||
InternalFrameDemo.tooltip=JInternalFrame-Demo
|
||||
InternalFrameDemo.closable.labelAndMnemonic=Kann geschlossen werden
|
||||
InternalFrameDemo.resizable.labelAndMnemonic=Skalierbar
|
||||
@@ -360,52 +360,52 @@ InternalFrameDemo.cab=Braucht jemand ein Taxi?
|
||||
ListDemo.accessible_description=JList-Demo
|
||||
ListDemo.name=Listendemo
|
||||
ListDemo.tooltip=JList-Demo
|
||||
ListDemo.prefixes=Pr\u00E4fixe
|
||||
ListDemo.prefixes=Präfixe
|
||||
ListDemo.suffixes=Suffixe
|
||||
ListDemo.count.labelAndMnemonic=Anzahl generierte Listeneintr\u00E4ge:
|
||||
ListDemo.count.labelAndMnemonic=Anzahl generierte Listeneinträge:
|
||||
ListDemo.all=Alle
|
||||
ListDemo.none=Kein Wert
|
||||
ListDemo.red=Rotes Firmenlogobild
|
||||
ListDemo.yellow=Rotes Firmenlogobild
|
||||
ListDemo.blue=Blaues Firmenlogobild
|
||||
ListDemo.gray=Graues Firmenlogobild
|
||||
ListDemo.green=Gr\u00FCnes Firmenlogobild
|
||||
ListDemo.green=Grünes Firmenlogobild
|
||||
ListDemo.magenta=Firmenlogobild in Magenta
|
||||
ListDemo.cyan=Firmenlogobild in Zyan
|
||||
ListDemo.description=<html><P STYLE="margin-left: .25in; margin-right: .25in">Diese Demo zeigt die Pr\u00E4sentation von Datenlisten auf zwei verschiedene Arten. Links steht eine <b>JList</b>-Komponente mit Listenelementen, die aus den Permutationen der aktivierten Pr\u00E4fixe und Suffixe bestehen. Die Kontrollk\u00E4stchenspalten f\u00FCr Pr\u00E4fix und Suffix rechts werden mit einer <b>JPanel</b>-Komponente mit einem Y-Achsen-<b>BoxLayout</b> in einer <b>JScrollPane</b>-Komponente erstellt.</P></html>
|
||||
ListDemo.description=<html><P STYLE="margin-left: .25in; margin-right: .25in">Diese Demo zeigt die Präsentation von Datenlisten auf zwei verschiedene Arten. Links steht eine <b>JList</b>-Komponente mit Listenelementen, die aus den Permutationen der aktivierten Präfixe und Suffixe bestehen. Die Kontrollkästchenspalten für Präfix und Suffix rechts werden mit einer <b>JPanel</b>-Komponente mit einem Y-Achsen-<b>BoxLayout</b> in einer <b>JScrollPane</b>-Komponente erstellt.</P></html>
|
||||
|
||||
|
||||
### OptionPane Demo ###
|
||||
|
||||
OptionPaneDemo.accessible_description=Die OptionPane-Demo zeigt Beispiele f\u00FCr die Verwendung von JOptionPane zum Generieren verschiedener g\u00E4ngiger Optionsdialogfelder
|
||||
OptionPaneDemo.accessible_description=Die OptionPane-Demo zeigt Beispiele für die Verwendung von JOptionPane zum Generieren verschiedener gängiger Optionsdialogfelder
|
||||
OptionPaneDemo.tooltip=JOptionPane-Demo
|
||||
OptionPaneDemo.name=Optionsbereichsdemo
|
||||
|
||||
OptionPaneDemo.warningbutton=Warnungsdialogfeld anzeigen
|
||||
OptionPaneDemo.componentbutton=Komponentendialogfeld anzeigen
|
||||
OptionPaneDemo.inputbutton=Eingabedialogfeld anzeigen
|
||||
OptionPaneDemo.confirmbutton=Best\u00E4tigungsdialogfeld anzeigen
|
||||
OptionPaneDemo.confirmbutton=Bestätigungsdialogfeld anzeigen
|
||||
OptionPaneDemo.messagebutton=Meldungsdialog anzeigen
|
||||
|
||||
OptionPaneDemo.warningtitle=Beispiel f\u00FCr Warnungsdialogfeld
|
||||
OptionPaneDemo.warningtext=<html><P><font color=black>Das ist ein Test des <font color=red><b>Notfallwarnsystems</b></font>. <i><b>Das ist<br> nur ein Test</b></i>. Der Webmaster Ihres lokalen Intranets hat dieses System in freiwilliger <br> Zusammenarbeit mit den <font color=blue><b>Bundes-</b></font> und <font color=blue><b>L\u00E4nderbeh\u00F6rden</b></font> <br> entwickelt, um Sie bei Bedarf \u00FCber <br> Notf\u00E4lle zu informieren. Bei einem tats\u00E4chlichen Notfall w\u00FCrden auf das Signal, das Sie <br> eben geh\u00F6rt haben, offizielle Informationen, Nachrichten <br> oder Anweisungen folgen. Damit ist dieser Test des <font color=red><b><br>Notfallwarnsystems</b></font> abgeschlossen.</font></P><P><br>Entwicklerhinweis: Der Text in dieser Dialogfelddemo wurde mit HTML formatiert.</P></html>
|
||||
OptionPaneDemo.warningtitle=Beispiel für Warnungsdialogfeld
|
||||
OptionPaneDemo.warningtext=<html><P><font color=black>Das ist ein Test des <font color=red><b>Notfallwarnsystems</b></font>. <i><b>Das ist<br> nur ein Test</b></i>. Der Webmaster Ihres lokalen Intranets hat dieses System in freiwilliger <br> Zusammenarbeit mit den <font color=blue><b>Bundes-</b></font> und <font color=blue><b>Länderbehörden</b></font> <br> entwickelt, um Sie bei Bedarf über <br> Notfälle zu informieren. Bei einem tatsächlichen Notfall würden auf das Signal, das Sie <br> eben gehört haben, offizielle Informationen, Nachrichten <br> oder Anweisungen folgen. Damit ist dieser Test des <font color=red><b><br>Notfallwarnsystems</b></font> abgeschlossen.</font></P><P><br>Entwicklerhinweis: Der Text in dieser Dialogfelddemo wurde mit HTML formatiert.</P></html>
|
||||
|
||||
OptionPaneDemo.messagetext=Flaschenpost
|
||||
|
||||
OptionPaneDemo.confirmquestion=Scheint heute die Sonne?
|
||||
OptionPaneDemo.confirmyes=<html>Warum sitzen Sie noch am Computer?<br> Gehen Sie raus! Machen Sie einen Ausflug zum Strand! Legen Sie sich in die Sonne!</html>
|
||||
OptionPaneDemo.confirmno=Gut, dass Sie hier drinnen vor dem Wetter gesch\u00FCtzt sind.
|
||||
OptionPaneDemo.confirmno=Gut, dass Sie hier drinnen vor dem Wetter geschützt sind.
|
||||
|
||||
OptionPaneDemo.inputquestion=Was ist Ihr Lieblingsfilm?
|
||||
OptionPaneDemo.inputresponse=Das ist ein guter Film!
|
||||
|
||||
OptionPaneDemo.componenttitle=Beispiel f\u00FCr Komponentendialogfeld
|
||||
OptionPaneDemo.componenttitle=Beispiel für Komponentendialogfeld
|
||||
OptionPaneDemo.componentmessage=<html>JOptionPane kann beliebig viele Komponenten <br> enthalten, wie ein Textfeld:</html>
|
||||
OptionPaneDemo.componenttextfield=oder ein Kombinationsfeld:
|
||||
OptionPaneDemo.component_cb1=Element 1
|
||||
OptionPaneDemo.component_cb2=Element 2
|
||||
OptionPaneDemo.component_cb3=Element 3
|
||||
OptionPaneDemo.componentmessage2=<html>JOptionPane kann au\u00DFerdem beliebig viele <br> Optionen anzeigen:</html>
|
||||
OptionPaneDemo.componentmessage2=<html>JOptionPane kann außerdem beliebig viele <br> Optionen anzeigen:</html>
|
||||
OptionPaneDemo.component_op1=Ja
|
||||
OptionPaneDemo.component_op2=Nein
|
||||
OptionPaneDemo.component_op3=Vielleicht
|
||||
@@ -414,28 +414,28 @@ OptionPaneDemo.component_op5=Abbrechen
|
||||
|
||||
OptionPaneDemo.component_r1=Optimistisch und positiv! Das ist gut.
|
||||
OptionPaneDemo.component_r2=Definitiv nicht. Da haben Sie ganz recht.
|
||||
OptionPaneDemo.component_r3=<html><font color=black> Ja, momentan ist die Situation <br> noch ungekl\u00E4rt. Sagen Sie sp\u00E4ter Bescheid, wenn Sie es genau wissen.</font></html>
|
||||
OptionPaneDemo.component_r4=<html><font color=black>Sie wollen doch "Ja" sagen. Sie h\u00E4tten sich <br> einfach darauf einlassen und "Ja" klicken sollen.</font></html>
|
||||
OptionPaneDemo.component_r3=<html><font color=black> Ja, momentan ist die Situation <br> noch ungeklärt. Sagen Sie später Bescheid, wenn Sie es genau wissen.</font></html>
|
||||
OptionPaneDemo.component_r4=<html><font color=black>Sie wollen doch "Ja" sagen. Sie hätten sich <br> einfach darauf einlassen und "Ja" klicken sollen.</font></html>
|
||||
|
||||
### ProgressBar Demo ###
|
||||
|
||||
ProgressBarDemo.accessible_description=Diese Demo zeigt ein Beispiel f\u00FCr die Verwendung der JProgressBar-Komponente.
|
||||
ProgressBarDemo.accessible_description=Diese Demo zeigt ein Beispiel für die Verwendung der JProgressBar-Komponente.
|
||||
ProgressBarDemo.tooltip=JProgressBar-Demo
|
||||
ProgressBarDemo.name=ProgressBar-Demo
|
||||
ProgressBarDemo.start_button=Laden von Text starten
|
||||
ProgressBarDemo.stop_button=Laden von Text stoppen
|
||||
ProgressBarDemo.accessible_text_loading_progress=Ladefortschritt f\u00FCr Text
|
||||
ProgressBarDemo.accessible_text_loading_progress=Ladefortschritt für Text
|
||||
ProgressBarDemo.accessible_text_area_name=Text wird progressiv geladen
|
||||
|
||||
ProgressBarDemo.accessible_text_area_description=Diese JTextArea-Komponente wird progressiv mit Text aus einem Puffer gef\u00FCllt (ein Buchstabe nach dem anderen). Dabei wird der Ladefortschritt im Fortschrittsbalken unten im Fenster angezeigt
|
||||
ProgressBarDemo.accessible_text_area_description=Diese JTextArea-Komponente wird progressiv mit Text aus einem Puffer gefüllt (ein Buchstabe nach dem anderen). Dabei wird der Ladefortschritt im Fortschrittsbalken unten im Fenster angezeigt
|
||||
|
||||
ProgressBarDemo.text=Man sagt ja, dass unendlich viele Affen, die unendlich lange auf unendlich vielen Schreibmaschinen herumtippen, \nirgendwann alle Meisterwerke der Menschheit schreiben w\u00FCrden. Mit den modernen Hochgeschwindigkeitsrechnern k\u00F6nnen wir \ndiese Theorie endlich testen... \n\n\tLzskd jfy 92y;ho4 th;qlh sd 6yty;q2 hnlj 8sdf. Djfy 92y;ho4, th;qxhz d7yty; \n\tQ0hnlj 23&&^ (# ljask djf y92y; fy92y; Sd6y ty;q2h nl jk la gfa harvin garvel\n\tlasdfsd a83sl la8z ks8l 92y;ho4 th;qlh sd 6yty;q2 hnlj 8sdf. Djfy 92y;ho4,\n\tth;qxhz d7yty; Q0hnlj 23&&^ nknod mrs88 jsd79lfm#%$JLaoz6df lso7dj f2 jfls\n\t67d9ol1@2fou99s 1lkj2 @l.k1 2; a89o7aljf 1l3i7ou8 d8l3 lqwerty0092 #1!\n\tja9o do8lkjj139rojsd9**!l6*hd # ljasd78 l2awkjad78 3ol7asljf 3 ldif && l.js\n\tLl ls ewan la8uj 23lll7u 8l 3h hhxx8 8d lsd fixx 891lkjno99sl d8l@@@!!8#8\n\tdfoil jarooda mklaoorj nowai the smisthliylka jkdlfjiw ladajadra lthhheeejfjl\n\tdkddooolda bub mirznod of the koojgaf!! But 2 be or not to be... that is the\n\tquestion. Then when shall we three meet again In thunder, lightning, or in\n\train? When the hurlyburly's done, When the battle's lost and won. That will\n\tbe ere the set of sun. Where the place? Upon the heath. There to meet with\n\tMacbeth. But hath forth not to want..... a banana, or to be.... a banana.\n\tBanana, I knew him banana. Banana banana. Banana banana banana banana.\n\n\n\n\nNun, das war scheinbar eine gute Idee...
|
||||
ProgressBarDemo.text=Man sagt ja, dass unendlich viele Affen, die unendlich lange auf unendlich vielen Schreibmaschinen herumtippen, \nirgendwann alle Meisterwerke der Menschheit schreiben würden. Mit den modernen Hochgeschwindigkeitsrechnern können wir \ndiese Theorie endlich testen... \n\n\tLzskd jfy 92y;ho4 th;qlh sd 6yty;q2 hnlj 8sdf. Djfy 92y;ho4, th;qxhz d7yty; \n\tQ0hnlj 23&&^ (# ljask djf y92y; fy92y; Sd6y ty;q2h nl jk la gfa harvin garvel\n\tlasdfsd a83sl la8z ks8l 92y;ho4 th;qlh sd 6yty;q2 hnlj 8sdf. Djfy 92y;ho4,\n\tth;qxhz d7yty; Q0hnlj 23&&^ nknod mrs88 jsd79lfm#%$JLaoz6df lso7dj f2 jfls\n\t67d9ol1@2fou99s 1lkj2 @l.k1 2; a89o7aljf 1l3i7ou8 d8l3 lqwerty0092 #1!\n\tja9o do8lkjj139rojsd9**!l6*hd # ljasd78 l2awkjad78 3ol7asljf 3 ldif && l.js\n\tLl ls ewan la8uj 23lll7u 8l 3h hhxx8 8d lsd fixx 891lkjno99sl d8l@@@!!8#8\n\tdfoil jarooda mklaoorj nowai the smisthliylka jkdlfjiw ladajadra lthhheeejfjl\n\tdkddooolda bub mirznod of the koojgaf!! But 2 be or not to be... that is the\n\tquestion. Then when shall we three meet again In thunder, lightning, or in\n\train? When the hurlyburly's done, When the battle's lost and won. That will\n\tbe ere the set of sun. Where the place? Upon the heath. There to meet with\n\tMacbeth. But hath forth not to want..... a banana, or to be.... a banana.\n\tBanana, I knew him banana. Banana banana. Banana banana banana banana.\n\n\n\n\nNun, das war scheinbar eine gute Idee...
|
||||
|
||||
|
||||
### ScrollPane Demo ###
|
||||
|
||||
ScrollPaneDemo.accessible_description=JScrollPane-Demo
|
||||
ScrollPaneDemo.name=Demo f\u00FCr Bildlaufbereich
|
||||
ScrollPaneDemo.name=Demo für Bildlaufbereich
|
||||
ScrollPaneDemo.tooltip=JScrollPane-Demo
|
||||
ScrollPaneDemo.crayons=Viele Stifte
|
||||
ScrollPaneDemo.colheader=Spaltenheader
|
||||
@@ -447,7 +447,7 @@ ScrollPaneDemo.lowerleft=Unten links im Spaltenheader
|
||||
|
||||
### Slider Demo ###
|
||||
|
||||
SliderDemo.accessible_description=Diese Demo zeigt ein Beispiel f\u00FCr die Verwendung der JSlider-Komponente.
|
||||
SliderDemo.accessible_description=Diese Demo zeigt ein Beispiel für die Verwendung der JSlider-Komponente.
|
||||
SliderDemo.tooltip=JSlider-Demo
|
||||
SliderDemo.name=Schiebereglerdemo
|
||||
|
||||
@@ -474,19 +474,19 @@ SplitPaneDemo.moon=Ein Astronaut auf dem Mond
|
||||
SplitPaneDemo.vert_split.labelAndMnemonic=&Vertikal geteilt
|
||||
SplitPaneDemo.horz_split.labelAndMnemonic=Ho&rizontal geteilt
|
||||
SplitPaneDemo.cont_layout.labelAndMnemonic=Kontinuierli&ches Layout
|
||||
SplitPaneDemo.one_touch_expandable.labelAndMnemonic=&Mit einer Ber\u00FChrung einblendbar
|
||||
SplitPaneDemo.divider_size.labelAndMnemonic=Trennliniengr\u00F6\u00DFe
|
||||
SplitPaneDemo.invalid_divider_size=Ung\u00FCltige Trennliniengr\u00F6\u00DFe
|
||||
SplitPaneDemo.one_touch_expandable.labelAndMnemonic=&Mit einer Berührung einblendbar
|
||||
SplitPaneDemo.divider_size.labelAndMnemonic=Trennliniengröße
|
||||
SplitPaneDemo.invalid_divider_size=Ungültige Trennliniengröße
|
||||
SplitPaneDemo.error=Fehler
|
||||
SplitPaneDemo.first_component_min_size.labelAndMnemonic=M&indestgr\u00F6\u00DFe der ersten Komponente
|
||||
SplitPaneDemo.second_component_min_size.labelAndMnemonic=Mi&ndestgr\u00F6\u00DFe der zweiten Komponente
|
||||
SplitPaneDemo.invalid_min_size=Ung\u00FCltige Mindestgr\u00F6\u00DFe
|
||||
SplitPaneDemo.must_be_greater_than=muss gr\u00F6\u00DFer sein als
|
||||
SplitPaneDemo.first_component_min_size.labelAndMnemonic=M&indestgröße der ersten Komponente
|
||||
SplitPaneDemo.second_component_min_size.labelAndMnemonic=Mi&ndestgröße der zweiten Komponente
|
||||
SplitPaneDemo.invalid_min_size=Ungültige Mindestgröße
|
||||
SplitPaneDemo.must_be_greater_than=muss größer sein als
|
||||
|
||||
|
||||
### TabbedPane Demo ###
|
||||
|
||||
TabbedPaneDemo.accessible_description=Diese Demo zeigt ein Beispiel f\u00FCr die Verwendung der JTabbedPane-Komponente.
|
||||
TabbedPaneDemo.accessible_description=Diese Demo zeigt ein Beispiel für die Verwendung der JTabbedPane-Komponente.
|
||||
TabbedPaneDemo.tooltip=JTabbedPane-Demo
|
||||
TabbedPaneDemo.name=TabbedPane-Demo
|
||||
|
||||
@@ -523,9 +523,9 @@ TableDemo.intercell_spacing_colon=Abstand zwischen Zellen:
|
||||
TableDemo.last_column=Letzte Spalte
|
||||
TableDemo.multiple_ranges=Mehrere Bereiche
|
||||
TableDemo.one_range=Ein Bereich
|
||||
TableDemo.reordering_allowed=Neuanordnung zul\u00E4ssig
|
||||
TableDemo.row_height=Zeilenh\u00F6he
|
||||
TableDemo.row_height_colon=Zeilenh\u00F6he:
|
||||
TableDemo.reordering_allowed=Neuanordnung zulässig
|
||||
TableDemo.row_height=Zeilenhöhe
|
||||
TableDemo.row_height_colon=Zeilenhöhe:
|
||||
TableDemo.row_selection=Zeilenauswahl
|
||||
TableDemo.selection_mode=Auswahlmodus
|
||||
TableDemo.subsequent_columns=Nachfolgende Spalten
|
||||
@@ -543,45 +543,45 @@ TableDemo.aqua=Aquamarin
|
||||
TableDemo.beige=Beige
|
||||
TableDemo.black=Schwarz
|
||||
TableDemo.blue=Blau
|
||||
TableDemo.cybergreen=Gr\u00FCn
|
||||
TableDemo.darkgreen=Dunkelgr\u00FCn
|
||||
TableDemo.cybergreen=Grün
|
||||
TableDemo.darkgreen=Dunkelgrün
|
||||
TableDemo.eblue=Neonblau
|
||||
TableDemo.jfcblue=JFC prim\u00E4r
|
||||
TableDemo.jfcblue2=JFC sekund\u00E4r
|
||||
TableDemo.forestgreen=Waldgr\u00FCn
|
||||
TableDemo.jfcblue=JFC primär
|
||||
TableDemo.jfcblue2=JFC sekundär
|
||||
TableDemo.forestgreen=Waldgrün
|
||||
TableDemo.gray=Grau
|
||||
TableDemo.green=Gr\u00FCn
|
||||
TableDemo.green=Grün
|
||||
TableDemo.orange=Orange
|
||||
TableDemo.purple=Lila
|
||||
TableDemo.red=Rot
|
||||
TableDemo.rustred=Rostrot
|
||||
TableDemo.sunpurple=Purpur
|
||||
TableDemo.suspectpink=Pink
|
||||
TableDemo.turquoise=T\u00FCrkis
|
||||
TableDemo.turquoise=Türkis
|
||||
TableDemo.violet=Violett
|
||||
TableDemo.yellow=Gelb
|
||||
TableDemo.2001=2001: Odyssee im Weltraum
|
||||
TableDemo.buckaroo=Buckaroo Banzai - Die 8. Dimension
|
||||
TableDemo.firstsight=Auf den ersten Blick
|
||||
TableDemo.airplane=Die unglaubliche Reise in einem verr\u00FCckten Flugzeug (und Fortsetzung)
|
||||
TableDemo.aliens=Aliens - Die R\u00FCckkehr
|
||||
TableDemo.airplane=Die unglaubliche Reise in einem verrückten Flugzeug (und Fortsetzung)
|
||||
TableDemo.aliens=Aliens - Die Rückkehr
|
||||
TableDemo.bicycle=Fahrraddiebe
|
||||
TableDemo.bladerunner=Blade Runner (Director's Cut)
|
||||
TableDemo.bluesbros=Blues Brothers
|
||||
TableDemo.brazil=Brazil
|
||||
TableDemo.bugs=Das gro\u00DFe Krabbeln
|
||||
TableDemo.bugs=Das große Krabbeln
|
||||
TableDemo.city=Die Stadt der verlorenen Kinder
|
||||
TableDemo.chusingura=Chusingura (1962)
|
||||
TableDemo.clock=Uhrwerk Orange
|
||||
TableDemo.curse=Der Fluch des D\u00E4monen
|
||||
TableDemo.curse=Der Fluch des Dämonen
|
||||
TableDemo.dasboot=Das Boot
|
||||
TableDemo.dazed=Confusion - Sommer der Ausgeflippten
|
||||
TableDemo.defending=Rendezvous im Jenseits
|
||||
TableDemo.eraserhead=Eraserhead
|
||||
TableDemo.fifthelement=Das f\u00FCnfte Element
|
||||
TableDemo.fifthelement=Das fünfte Element
|
||||
TableDemo.goodfellas=GoodFellas - Drei Jahrzehnte in der Mafia
|
||||
TableDemo.harold=Harold und Maude
|
||||
TableDemo.joyluck=T\u00F6chter des Himmels
|
||||
TableDemo.joyluck=Töchter des Himmels
|
||||
TableDemo.jules=Jules und Jim
|
||||
TableDemo.ladyvanishes=Eine Dame verschwindet
|
||||
TableDemo.mohicans=Der letzte Mohikaner
|
||||
@@ -591,14 +591,14 @@ TableDemo.musicman=Music Man
|
||||
TableDemo.dog=Mein Leben als Hund
|
||||
TableDemo.oncewest=Spiel mir das Lied vom Tod
|
||||
TableDemo.pulpfiction=Pulp Fiction
|
||||
TableDemo.raiders=J\u00E4ger des verlorenen Schatzes
|
||||
TableDemo.raiders=Jäger des verlorenen Schatzes
|
||||
TableDemo.reservoir=Reservoir Dogs - Wilde Hunde
|
||||
TableDemo.repoman=Repoman
|
||||
TableDemo.spinaltap=This is Spinal Tap
|
||||
TableDemo.schindlerslist=Schindlers Liste
|
||||
TableDemo.starwars=Star Wars
|
||||
TableDemo.stuntman=Der lange Tod des Stuntman Cameron
|
||||
TableDemo.thinman=Der d\u00FCnne Mann
|
||||
TableDemo.thinman=Der dünne Mann
|
||||
TableDemo.withnail=Withnail && I
|
||||
TableDemo.labyrinth=Die Reise ins Labyrinth
|
||||
TableDemo.shawshank=Die Verurteilten
|
||||
@@ -619,7 +619,7 @@ TableDemo.pepper=Rote Paprika
|
||||
TableDemo.pickle=Essiggurke
|
||||
TableDemo.pineapple=Ananas
|
||||
TableDemo.raspberry=Himbeere
|
||||
TableDemo.sparegrass=Gr\u00FCnzeug
|
||||
TableDemo.sparegrass=Grünzeug
|
||||
TableDemo.strawberry=Erdbeere
|
||||
TableDemo.tomato=Tomate
|
||||
TableDemo.watermelon=Wassermelone
|
||||
@@ -653,21 +653,21 @@ TableDemo.printingFailed=Druck nicht erfolgreich: {0}
|
||||
|
||||
### ToolTip Demo ###
|
||||
|
||||
ToolTipDemo.accessible_description=QuickInfos zeigen kurze Hilfebeschreibungen f\u00FCr eine Komponente an
|
||||
ToolTipDemo.accessible_description=QuickInfos zeigen kurze Hilfebeschreibungen für eine Komponente an
|
||||
ToolTipDemo.accessible_cow=Das ist eine Kuh.
|
||||
ToolTipDemo.tooltip=QuickInfo-Demo
|
||||
ToolTipDemo.name=QuickInfo-Demo
|
||||
ToolTipDemo.bessie=Bessie, die Kuh
|
||||
ToolTipDemo.cow=Kuh.
|
||||
ToolTipDemo.got_milk=Milch gef\u00E4llig?
|
||||
ToolTipDemo.got_milk=Milch gefällig?
|
||||
ToolTipDemo.tail=Schweif.
|
||||
ToolTipDemo.moo=Muuuh
|
||||
ToolTipDemo.tooltip_features=<html>QuickInfos m\u00FCssen nicht immer<p>langweilige, einzeilige Beschreibungen sein. Das <font color=blue size=+2>Swing!</font>-Team<p> zeigt Ihnen gerne, dass es auch anders geht.<p>In Swing k\u00F6nnen QuickInfos HTML f\u00FCr Folgendes verwenden: <ul><li>Listen<li><b>fettgedruckten</b> Text<li><em>betonten</em> Text<li>Text mit <font color=red>Farben</font><li>Text in unterschiedlichen <font size=+3>Gr\u00F6\u00DFen</font><li>und <font face=AvantGarde>Schriftarten</font></ul>Au\u00DFerdem k\u00F6nnen sie auch mehrere Zeilen umfassen.</html>
|
||||
ToolTipDemo.tooltip_features=<html>QuickInfos müssen nicht immer<p>langweilige, einzeilige Beschreibungen sein. Das <font color=blue size=+2>Swing!</font>-Team<p> zeigt Ihnen gerne, dass es auch anders geht.<p>In Swing können QuickInfos HTML für Folgendes verwenden: <ul><li>Listen<li><b>fettgedruckten</b> Text<li><em>betonten</em> Text<li>Text mit <font color=red>Farben</font><li>Text in unterschiedlichen <font size=+3>Größen</font><li>und <font face=AvantGarde>Schriftarten</font></ul>Außerdem können sie auch mehrere Zeilen umfassen.</html>
|
||||
|
||||
|
||||
### Tree Demo ###
|
||||
|
||||
TreeDemo.accessible_description=Diese Demo zeigt ein Beispiel f\u00FCr die Verwendung einer JTree-Komponente.
|
||||
TreeDemo.accessible_description=Diese Demo zeigt ein Beispiel für die Verwendung einer JTree-Komponente.
|
||||
TreeDemo.tooltip=JTree-Demo
|
||||
TreeDemo.name=Baumdemo
|
||||
TreeDemo.music=Musik
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1721,8 +1721,8 @@ void MachPrologNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
|
||||
st->print("# stack bang size=%d\n\t", framesize);
|
||||
|
||||
if (VM_Version::use_rop_protection()) {
|
||||
st->print("ldr zr, [lr]\n\t");
|
||||
st->print("pacia lr, rfp\n\t");
|
||||
st->print("ldr zr, [lr]\n\t");
|
||||
st->print("paciaz\n\t");
|
||||
}
|
||||
if (framesize < ((1 << 9) + 2 * wordSize)) {
|
||||
st->print("sub sp, sp, #%d\n\t", framesize);
|
||||
@@ -1851,8 +1851,8 @@ void MachEpilogNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
|
||||
st->print("ldp lr, rfp, [sp],#%d\n\t", (2 * wordSize));
|
||||
}
|
||||
if (VM_Version::use_rop_protection()) {
|
||||
st->print("autia lr, rfp\n\t");
|
||||
st->print("ldr zr, [lr]\n\t");
|
||||
st->print("autiaz\n\t");
|
||||
st->print("ldr zr, [lr]\n\t");
|
||||
}
|
||||
|
||||
if (do_polling() && C->is_method_compilation()) {
|
||||
@@ -3816,202 +3816,6 @@ encode %{
|
||||
__ br(target_reg);
|
||||
%}
|
||||
|
||||
enc_class aarch64_enc_fast_lock(iRegP object, iRegP box, iRegP tmp, iRegP tmp2) %{
|
||||
C2_MacroAssembler _masm(&cbuf);
|
||||
Register oop = as_Register($object$$reg);
|
||||
Register box = as_Register($box$$reg);
|
||||
Register disp_hdr = as_Register($tmp$$reg);
|
||||
Register tmp = as_Register($tmp2$$reg);
|
||||
Label cont;
|
||||
Label object_has_monitor;
|
||||
Label count, no_count;
|
||||
|
||||
assert_different_registers(oop, box, tmp, disp_hdr);
|
||||
|
||||
// Load markWord from object into displaced_header.
|
||||
__ ldr(disp_hdr, Address(oop, oopDesc::mark_offset_in_bytes()));
|
||||
|
||||
if (DiagnoseSyncOnValueBasedClasses != 0) {
|
||||
__ load_klass(tmp, oop);
|
||||
__ ldrw(tmp, Address(tmp, Klass::access_flags_offset()));
|
||||
__ tstw(tmp, JVM_ACC_IS_VALUE_BASED_CLASS);
|
||||
__ br(Assembler::NE, cont);
|
||||
}
|
||||
|
||||
// Check for existing monitor
|
||||
__ tbnz(disp_hdr, exact_log2(markWord::monitor_value), object_has_monitor);
|
||||
|
||||
if (LockingMode == LM_MONITOR) {
|
||||
__ tst(oop, oop); // Set NE to indicate 'failure' -> take slow-path. We know that oop != 0.
|
||||
__ b(cont);
|
||||
} else if (LockingMode == LM_LEGACY) {
|
||||
// Set tmp to be (markWord of object | UNLOCK_VALUE).
|
||||
__ orr(tmp, disp_hdr, markWord::unlocked_value);
|
||||
|
||||
// Initialize the box. (Must happen before we update the object mark!)
|
||||
__ str(tmp, Address(box, BasicLock::displaced_header_offset_in_bytes()));
|
||||
|
||||
// Compare object markWord with an unlocked value (tmp) and if
|
||||
// equal exchange the stack address of our box with object markWord.
|
||||
// On failure disp_hdr contains the possibly locked markWord.
|
||||
__ cmpxchg(oop, tmp, box, Assembler::xword, /*acquire*/ true,
|
||||
/*release*/ true, /*weak*/ false, disp_hdr);
|
||||
__ br(Assembler::EQ, cont);
|
||||
|
||||
assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0");
|
||||
|
||||
// If the compare-and-exchange succeeded, then we found an unlocked
|
||||
// object, will have now locked it will continue at label cont
|
||||
|
||||
// Check if the owner is self by comparing the value in the
|
||||
// markWord of object (disp_hdr) with the stack pointer.
|
||||
__ mov(rscratch1, sp);
|
||||
__ sub(disp_hdr, disp_hdr, rscratch1);
|
||||
__ mov(tmp, (address) (~(os::vm_page_size()-1) | markWord::lock_mask_in_place));
|
||||
// If condition is true we are cont and hence we can store 0 as the
|
||||
// displaced header in the box, which indicates that it is a recursive lock.
|
||||
__ ands(tmp/*==0?*/, disp_hdr, tmp); // Sets flags for result
|
||||
__ str(tmp/*==0, perhaps*/, Address(box, BasicLock::displaced_header_offset_in_bytes()));
|
||||
__ b(cont);
|
||||
} else {
|
||||
assert(LockingMode == LM_LIGHTWEIGHT, "must be");
|
||||
__ fast_lock(oop, disp_hdr, tmp, rscratch1, no_count);
|
||||
__ b(count);
|
||||
}
|
||||
|
||||
// Handle existing monitor.
|
||||
__ bind(object_has_monitor);
|
||||
|
||||
// The object's monitor m is unlocked iff m->owner == NULL,
|
||||
// otherwise m->owner may contain a thread or a stack address.
|
||||
//
|
||||
// Try to CAS m->owner from NULL to current thread.
|
||||
__ add(tmp, disp_hdr, (in_bytes(ObjectMonitor::owner_offset())-markWord::monitor_value));
|
||||
__ cmpxchg(tmp, zr, rthread, Assembler::xword, /*acquire*/ true,
|
||||
/*release*/ true, /*weak*/ false, rscratch1); // Sets flags for result
|
||||
|
||||
if (LockingMode != LM_LIGHTWEIGHT) {
|
||||
// Store a non-null value into the box to avoid looking like a re-entrant
|
||||
// lock. The fast-path monitor unlock code checks for
|
||||
// markWord::monitor_value so use markWord::unused_mark which has the
|
||||
// relevant bit set, and also matches ObjectSynchronizer::enter.
|
||||
__ mov(tmp, (address)markWord::unused_mark().value());
|
||||
__ str(tmp, Address(box, BasicLock::displaced_header_offset_in_bytes()));
|
||||
}
|
||||
__ br(Assembler::EQ, cont); // CAS success means locking succeeded
|
||||
|
||||
__ cmp(rscratch1, rthread);
|
||||
__ br(Assembler::NE, cont); // Check for recursive locking
|
||||
|
||||
// Recursive lock case
|
||||
__ increment(Address(disp_hdr, in_bytes(ObjectMonitor::recursions_offset()) - markWord::monitor_value), 1);
|
||||
// flag == EQ still from the cmp above, checking if this is a reentrant lock
|
||||
|
||||
__ bind(cont);
|
||||
// flag == EQ indicates success
|
||||
// flag == NE indicates failure
|
||||
__ br(Assembler::NE, no_count);
|
||||
|
||||
__ bind(count);
|
||||
__ increment(Address(rthread, JavaThread::held_monitor_count_offset()));
|
||||
|
||||
__ bind(no_count);
|
||||
%}
|
||||
|
||||
enc_class aarch64_enc_fast_unlock(iRegP object, iRegP box, iRegP tmp, iRegP tmp2) %{
|
||||
C2_MacroAssembler _masm(&cbuf);
|
||||
Register oop = as_Register($object$$reg);
|
||||
Register box = as_Register($box$$reg);
|
||||
Register disp_hdr = as_Register($tmp$$reg);
|
||||
Register tmp = as_Register($tmp2$$reg);
|
||||
Label cont;
|
||||
Label object_has_monitor;
|
||||
Label count, no_count;
|
||||
|
||||
assert_different_registers(oop, box, tmp, disp_hdr);
|
||||
|
||||
if (LockingMode == LM_LEGACY) {
|
||||
// Find the lock address and load the displaced header from the stack.
|
||||
__ ldr(disp_hdr, Address(box, BasicLock::displaced_header_offset_in_bytes()));
|
||||
|
||||
// If the displaced header is 0, we have a recursive unlock.
|
||||
__ cmp(disp_hdr, zr);
|
||||
__ br(Assembler::EQ, cont);
|
||||
}
|
||||
|
||||
// Handle existing monitor.
|
||||
__ ldr(tmp, Address(oop, oopDesc::mark_offset_in_bytes()));
|
||||
__ tbnz(tmp, exact_log2(markWord::monitor_value), object_has_monitor);
|
||||
|
||||
if (LockingMode == LM_MONITOR) {
|
||||
__ tst(oop, oop); // Set NE to indicate 'failure' -> take slow-path. We know that oop != 0.
|
||||
__ b(cont);
|
||||
} else if (LockingMode == LM_LEGACY) {
|
||||
// Check if it is still a light weight lock, this is is true if we
|
||||
// see the stack address of the basicLock in the markWord of the
|
||||
// object.
|
||||
|
||||
__ cmpxchg(oop, box, disp_hdr, Assembler::xword, /*acquire*/ false,
|
||||
/*release*/ true, /*weak*/ false, tmp);
|
||||
__ b(cont);
|
||||
} else {
|
||||
assert(LockingMode == LM_LIGHTWEIGHT, "must be");
|
||||
__ fast_unlock(oop, tmp, box, disp_hdr, no_count);
|
||||
__ b(count);
|
||||
}
|
||||
|
||||
assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0");
|
||||
|
||||
// Handle existing monitor.
|
||||
__ bind(object_has_monitor);
|
||||
STATIC_ASSERT(markWord::monitor_value <= INT_MAX);
|
||||
__ add(tmp, tmp, -(int)markWord::monitor_value); // monitor
|
||||
|
||||
if (LockingMode == LM_LIGHTWEIGHT) {
|
||||
// If the owner is anonymous, we need to fix it -- in an outline stub.
|
||||
Register tmp2 = disp_hdr;
|
||||
__ ldr(tmp2, Address(tmp, ObjectMonitor::owner_offset()));
|
||||
// We cannot use tbnz here, the target might be too far away and cannot
|
||||
// be encoded.
|
||||
__ tst(tmp2, (uint64_t)ObjectMonitor::ANONYMOUS_OWNER);
|
||||
C2HandleAnonOMOwnerStub* stub = new (Compile::current()->comp_arena()) C2HandleAnonOMOwnerStub(tmp, tmp2);
|
||||
Compile::current()->output()->add_stub(stub);
|
||||
__ br(Assembler::NE, stub->entry());
|
||||
__ bind(stub->continuation());
|
||||
}
|
||||
|
||||
__ ldr(disp_hdr, Address(tmp, ObjectMonitor::recursions_offset()));
|
||||
|
||||
Label notRecursive;
|
||||
__ cbz(disp_hdr, notRecursive);
|
||||
|
||||
// Recursive lock
|
||||
__ sub(disp_hdr, disp_hdr, 1u);
|
||||
__ str(disp_hdr, Address(tmp, ObjectMonitor::recursions_offset()));
|
||||
__ cmp(disp_hdr, disp_hdr); // Sets flags for result
|
||||
__ b(cont);
|
||||
|
||||
__ bind(notRecursive);
|
||||
__ ldr(rscratch1, Address(tmp, ObjectMonitor::EntryList_offset()));
|
||||
__ ldr(disp_hdr, Address(tmp, ObjectMonitor::cxq_offset()));
|
||||
__ orr(rscratch1, rscratch1, disp_hdr); // Will be 0 if both are 0.
|
||||
__ cmp(rscratch1, zr); // Sets flags for result
|
||||
__ cbnz(rscratch1, cont);
|
||||
// need a release store here
|
||||
__ lea(tmp, Address(tmp, ObjectMonitor::owner_offset()));
|
||||
__ stlr(zr, tmp); // set unowned
|
||||
|
||||
__ bind(cont);
|
||||
// flag == EQ indicates success
|
||||
// flag == NE indicates failure
|
||||
__ br(Assembler::NE, no_count);
|
||||
|
||||
__ bind(count);
|
||||
__ decrement(Address(rthread, JavaThread::held_monitor_count_offset()));
|
||||
|
||||
__ bind(no_count);
|
||||
%}
|
||||
|
||||
%}
|
||||
|
||||
//----------FRAME--------------------------------------------------------------
|
||||
@@ -16616,17 +16420,19 @@ instruct branchLoopEnd(cmpOp cmp, rFlagsReg cr, label lbl)
|
||||
// ============================================================================
|
||||
// inlined locking and unlocking
|
||||
|
||||
instruct cmpFastLock(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2)
|
||||
instruct cmpFastLock(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2, iRegPNoSp tmp3)
|
||||
%{
|
||||
match(Set cr (FastLock object box));
|
||||
effect(TEMP tmp, TEMP tmp2);
|
||||
effect(TEMP tmp, TEMP tmp2, TEMP tmp3);
|
||||
|
||||
// TODO
|
||||
// identify correct cost
|
||||
ins_cost(5 * INSN_COST);
|
||||
format %{ "fastlock $object,$box\t! kills $tmp,$tmp2" %}
|
||||
|
||||
ins_encode(aarch64_enc_fast_lock(object, box, tmp, tmp2));
|
||||
ins_encode %{
|
||||
__ fast_lock($object$$Register, $box$$Register, $tmp$$Register, $tmp2$$Register, $tmp3$$Register);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_serial);
|
||||
%}
|
||||
@@ -16639,7 +16445,9 @@ instruct cmpFastUnlock(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRe
|
||||
ins_cost(5 * INSN_COST);
|
||||
format %{ "fastunlock $object,$box\t! kills $tmp, $tmp2" %}
|
||||
|
||||
ins_encode(aarch64_enc_fast_unlock(object, box, tmp, tmp2));
|
||||
ins_encode %{
|
||||
__ fast_unlock($object$$Register, $box$$Register, $tmp$$Register, $tmp2$$Register);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_serial);
|
||||
%}
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include "asm/register.hpp"
|
||||
#include "metaprogramming/enableIf.hpp"
|
||||
#include "utilities/checkedCast.hpp"
|
||||
#include "utilities/debug.hpp"
|
||||
#include "utilities/globalDefinitions.hpp"
|
||||
#include "utilities/macros.hpp"
|
||||
@@ -573,7 +574,7 @@ class Address {
|
||||
if (size == 0) // It's a byte
|
||||
i->f(ext().shift() >= 0, 12);
|
||||
else {
|
||||
assert(ext().shift() <= 0 || ext().shift() == (int)size, "bad shift");
|
||||
guarantee(ext().shift() <= 0 || ext().shift() == (int)size, "bad shift");
|
||||
i->f(ext().shift() > 0, 12);
|
||||
}
|
||||
i->f(0b10, 11, 10);
|
||||
|
||||
@@ -434,7 +434,7 @@ int LIR_Assembler::emit_unwind_handler() {
|
||||
if (LockingMode == LM_MONITOR) {
|
||||
__ b(*stub->entry());
|
||||
} else {
|
||||
__ unlock_object(r5, r4, r0, *stub->entry());
|
||||
__ unlock_object(r5, r4, r0, r6, *stub->entry());
|
||||
}
|
||||
__ bind(*stub->continuation());
|
||||
}
|
||||
@@ -1296,9 +1296,8 @@ void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, L
|
||||
assert(data != nullptr, "need data for type check");
|
||||
assert(data->is_ReceiverTypeData(), "need ReceiverTypeData for type check");
|
||||
}
|
||||
Label profile_cast_success, profile_cast_failure;
|
||||
Label *success_target = should_profile ? &profile_cast_success : success;
|
||||
Label *failure_target = should_profile ? &profile_cast_failure : failure;
|
||||
Label* success_target = success;
|
||||
Label* failure_target = failure;
|
||||
|
||||
if (obj == k_RInfo) {
|
||||
k_RInfo = dst;
|
||||
@@ -1314,24 +1313,33 @@ void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, L
|
||||
|
||||
assert_different_registers(obj, k_RInfo, klass_RInfo);
|
||||
|
||||
if (should_profile) {
|
||||
Label not_null;
|
||||
__ cbnz(obj, not_null);
|
||||
// Object is null; update MDO and exit
|
||||
Register mdo = klass_RInfo;
|
||||
__ mov_metadata(mdo, md->constant_encoding());
|
||||
Address data_addr
|
||||
= __ form_address(rscratch2, mdo,
|
||||
md->byte_offset_of_slot(data, DataLayout::flags_offset()),
|
||||
0);
|
||||
__ ldrb(rscratch1, data_addr);
|
||||
__ orr(rscratch1, rscratch1, BitData::null_seen_byte_constant());
|
||||
__ strb(rscratch1, data_addr);
|
||||
__ b(*obj_is_null);
|
||||
__ bind(not_null);
|
||||
} else {
|
||||
__ cbz(obj, *obj_is_null);
|
||||
}
|
||||
if (should_profile) {
|
||||
Register mdo = klass_RInfo;
|
||||
__ mov_metadata(mdo, md->constant_encoding());
|
||||
Label not_null;
|
||||
__ cbnz(obj, not_null);
|
||||
// Object is null; update MDO and exit
|
||||
Address data_addr
|
||||
= __ form_address(rscratch2, mdo,
|
||||
md->byte_offset_of_slot(data, DataLayout::flags_offset()),
|
||||
0);
|
||||
__ ldrb(rscratch1, data_addr);
|
||||
__ orr(rscratch1, rscratch1, BitData::null_seen_byte_constant());
|
||||
__ strb(rscratch1, data_addr);
|
||||
__ b(*obj_is_null);
|
||||
__ bind(not_null);
|
||||
|
||||
Label update_done;
|
||||
Register recv = k_RInfo;
|
||||
__ load_klass(recv, obj);
|
||||
type_profile_helper(mdo, md, data, recv, &update_done);
|
||||
Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
|
||||
__ addptr(counter_addr, DataLayout::counter_increment);
|
||||
|
||||
__ bind(update_done);
|
||||
} else {
|
||||
__ cbz(obj, *obj_is_null);
|
||||
}
|
||||
|
||||
if (!k->is_loaded()) {
|
||||
klass2reg_with_patching(k_RInfo, op->info_for_patch());
|
||||
@@ -1385,26 +1393,6 @@ void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, L
|
||||
// successful cast, fall through to profile or jump
|
||||
}
|
||||
}
|
||||
if (should_profile) {
|
||||
Register mdo = klass_RInfo, recv = k_RInfo;
|
||||
__ bind(profile_cast_success);
|
||||
__ mov_metadata(mdo, md->constant_encoding());
|
||||
__ load_klass(recv, obj);
|
||||
Label update_done;
|
||||
type_profile_helper(mdo, md, data, recv, success);
|
||||
__ b(*success);
|
||||
|
||||
__ bind(profile_cast_failure);
|
||||
__ mov_metadata(mdo, md->constant_encoding());
|
||||
Address counter_addr
|
||||
= __ form_address(rscratch2, mdo,
|
||||
md->byte_offset_of_slot(data, CounterData::count_offset()),
|
||||
0);
|
||||
__ ldr(rscratch1, counter_addr);
|
||||
__ sub(rscratch1, rscratch1, DataLayout::counter_increment);
|
||||
__ str(rscratch1, counter_addr);
|
||||
__ b(*failure);
|
||||
}
|
||||
__ b(*success);
|
||||
}
|
||||
|
||||
@@ -1436,16 +1424,16 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
|
||||
assert(data != nullptr, "need data for type check");
|
||||
assert(data->is_ReceiverTypeData(), "need ReceiverTypeData for type check");
|
||||
}
|
||||
Label profile_cast_success, profile_cast_failure, done;
|
||||
Label *success_target = should_profile ? &profile_cast_success : &done;
|
||||
Label *failure_target = should_profile ? &profile_cast_failure : stub->entry();
|
||||
Label done;
|
||||
Label* success_target = &done;
|
||||
Label* failure_target = stub->entry();
|
||||
|
||||
if (should_profile) {
|
||||
Label not_null;
|
||||
__ cbnz(value, not_null);
|
||||
// Object is null; update MDO and exit
|
||||
Register mdo = klass_RInfo;
|
||||
__ mov_metadata(mdo, md->constant_encoding());
|
||||
__ cbnz(value, not_null);
|
||||
// Object is null; update MDO and exit
|
||||
Address data_addr
|
||||
= __ form_address(rscratch2, mdo,
|
||||
md->byte_offset_of_slot(data, DataLayout::flags_offset()),
|
||||
@@ -1455,6 +1443,14 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
|
||||
__ strb(rscratch1, data_addr);
|
||||
__ b(done);
|
||||
__ bind(not_null);
|
||||
|
||||
Label update_done;
|
||||
Register recv = k_RInfo;
|
||||
__ load_klass(recv, value);
|
||||
type_profile_helper(mdo, md, data, recv, &update_done);
|
||||
Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
|
||||
__ addptr(counter_addr, DataLayout::counter_increment);
|
||||
__ bind(update_done);
|
||||
} else {
|
||||
__ cbz(value, done);
|
||||
}
|
||||
@@ -1475,25 +1471,6 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
|
||||
__ cbzw(k_RInfo, *failure_target);
|
||||
// fall through to the success case
|
||||
|
||||
if (should_profile) {
|
||||
Register mdo = klass_RInfo, recv = k_RInfo;
|
||||
__ bind(profile_cast_success);
|
||||
__ mov_metadata(mdo, md->constant_encoding());
|
||||
__ load_klass(recv, value);
|
||||
Label update_done;
|
||||
type_profile_helper(mdo, md, data, recv, &done);
|
||||
__ b(done);
|
||||
|
||||
__ bind(profile_cast_failure);
|
||||
__ mov_metadata(mdo, md->constant_encoding());
|
||||
Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
|
||||
__ lea(rscratch2, counter_addr);
|
||||
__ ldr(rscratch1, Address(rscratch2));
|
||||
__ sub(rscratch1, rscratch1, DataLayout::counter_increment);
|
||||
__ str(rscratch1, Address(rscratch2));
|
||||
__ b(*stub->entry());
|
||||
}
|
||||
|
||||
__ bind(done);
|
||||
} else if (code == lir_checkcast) {
|
||||
Register obj = op->object()->as_register();
|
||||
@@ -2558,6 +2535,7 @@ void LIR_Assembler::emit_lock(LIR_OpLock* op) {
|
||||
Register obj = op->obj_opr()->as_register(); // may not be an oop
|
||||
Register hdr = op->hdr_opr()->as_register();
|
||||
Register lock = op->lock_opr()->as_register();
|
||||
Register temp = op->scratch_opr()->as_register();
|
||||
if (LockingMode == LM_MONITOR) {
|
||||
if (op->info() != nullptr) {
|
||||
add_debug_info_for_null_check_here(op->info());
|
||||
@@ -2567,14 +2545,14 @@ void LIR_Assembler::emit_lock(LIR_OpLock* op) {
|
||||
} else if (op->code() == lir_lock) {
|
||||
assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header");
|
||||
// add debug info for NullPointerException only if one is possible
|
||||
int null_check_offset = __ lock_object(hdr, obj, lock, *op->stub()->entry());
|
||||
int null_check_offset = __ lock_object(hdr, obj, lock, temp, *op->stub()->entry());
|
||||
if (op->info() != nullptr) {
|
||||
add_debug_info_for_null_check(null_check_offset, op->info());
|
||||
}
|
||||
// done
|
||||
} else if (op->code() == lir_unlock) {
|
||||
assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header");
|
||||
__ unlock_object(hdr, obj, lock, *op->stub()->entry());
|
||||
__ unlock_object(hdr, obj, lock, temp, *op->stub()->entry());
|
||||
} else {
|
||||
Unimplemented();
|
||||
}
|
||||
|
||||
@@ -314,6 +314,7 @@ void LIRGenerator::do_MonitorEnter(MonitorEnter* x) {
|
||||
|
||||
// "lock" stores the address of the monitor stack slot, so this is not an oop
|
||||
LIR_Opr lock = new_register(T_INT);
|
||||
LIR_Opr scratch = new_register(T_INT);
|
||||
|
||||
CodeEmitInfo* info_for_exception = nullptr;
|
||||
if (x->needs_null_check()) {
|
||||
@@ -322,7 +323,7 @@ void LIRGenerator::do_MonitorEnter(MonitorEnter* x) {
|
||||
// this CodeEmitInfo must not have the xhandlers because here the
|
||||
// object is already locked (xhandlers expect object to be unlocked)
|
||||
CodeEmitInfo* info = state_for(x, x->state(), true);
|
||||
monitor_enter(obj.result(), lock, syncTempOpr(), LIR_OprFact::illegalOpr,
|
||||
monitor_enter(obj.result(), lock, syncTempOpr(), scratch,
|
||||
x->monitor_no(), info_for_exception, info);
|
||||
}
|
||||
|
||||
@@ -335,8 +336,9 @@ void LIRGenerator::do_MonitorExit(MonitorExit* x) {
|
||||
|
||||
LIR_Opr lock = new_register(T_INT);
|
||||
LIR_Opr obj_temp = new_register(T_INT);
|
||||
LIR_Opr scratch = new_register(T_INT);
|
||||
set_no_result(x);
|
||||
monitor_exit(obj_temp, lock, syncTempOpr(), LIR_OprFact::illegalOpr, x->monitor_no());
|
||||
monitor_exit(obj_temp, lock, syncTempOpr(), scratch, x->monitor_no());
|
||||
}
|
||||
|
||||
void LIRGenerator::do_NegateOp(NegateOp* x) {
|
||||
|
||||
@@ -60,10 +60,10 @@ void C1_MacroAssembler::float_cmp(bool is_float, int unordered_result,
|
||||
}
|
||||
}
|
||||
|
||||
int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr, Label& slow_case) {
|
||||
int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr, Register temp, Label& slow_case) {
|
||||
const int aligned_mask = BytesPerWord -1;
|
||||
const int hdr_offset = oopDesc::mark_offset_in_bytes();
|
||||
assert_different_registers(hdr, obj, disp_hdr);
|
||||
assert_different_registers(hdr, obj, disp_hdr, temp, rscratch2);
|
||||
int null_check_offset = -1;
|
||||
|
||||
verify_oop(obj);
|
||||
@@ -83,7 +83,7 @@ int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr
|
||||
// Load object header
|
||||
ldr(hdr, Address(obj, hdr_offset));
|
||||
if (LockingMode == LM_LIGHTWEIGHT) {
|
||||
fast_lock(obj, hdr, rscratch1, rscratch2, slow_case);
|
||||
lightweight_lock(obj, hdr, temp, rscratch2, slow_case);
|
||||
} else if (LockingMode == LM_LEGACY) {
|
||||
Label done;
|
||||
// and mark it as unlocked
|
||||
@@ -125,10 +125,10 @@ int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr
|
||||
}
|
||||
|
||||
|
||||
void C1_MacroAssembler::unlock_object(Register hdr, Register obj, Register disp_hdr, Label& slow_case) {
|
||||
void C1_MacroAssembler::unlock_object(Register hdr, Register obj, Register disp_hdr, Register temp, Label& slow_case) {
|
||||
const int aligned_mask = BytesPerWord -1;
|
||||
const int hdr_offset = oopDesc::mark_offset_in_bytes();
|
||||
assert(hdr != obj && hdr != disp_hdr && obj != disp_hdr, "registers must be different");
|
||||
assert_different_registers(hdr, obj, disp_hdr, temp, rscratch2);
|
||||
Label done;
|
||||
|
||||
if (LockingMode != LM_LIGHTWEIGHT) {
|
||||
@@ -149,7 +149,7 @@ void C1_MacroAssembler::unlock_object(Register hdr, Register obj, Register disp_
|
||||
// be encoded.
|
||||
tst(hdr, markWord::monitor_value);
|
||||
br(Assembler::NE, slow_case);
|
||||
fast_unlock(obj, hdr, rscratch1, rscratch2, slow_case);
|
||||
lightweight_unlock(obj, hdr, temp, rscratch2, slow_case);
|
||||
} else if (LockingMode == LM_LEGACY) {
|
||||
// test if object header is pointing to the displaced header, and if so, restore
|
||||
// the displaced header in the object - if the object header is not pointing to
|
||||
|
||||
@@ -58,14 +58,16 @@ using MacroAssembler::null_check;
|
||||
// hdr : must be r0, contents destroyed
|
||||
// obj : must point to the object to lock, contents preserved
|
||||
// disp_hdr: must point to the displaced header location, contents preserved
|
||||
// temp : temporary register, must not be rscratch1 or rscratch2
|
||||
// returns code offset at which to add null check debug information
|
||||
int lock_object (Register swap, Register obj, Register disp_hdr, Label& slow_case);
|
||||
int lock_object (Register swap, Register obj, Register disp_hdr, Register temp, Label& slow_case);
|
||||
|
||||
// unlocking
|
||||
// hdr : contents destroyed
|
||||
// obj : must point to the object to lock, contents preserved
|
||||
// disp_hdr: must be r0 & must point to the displaced header location, contents destroyed
|
||||
void unlock_object(Register swap, Register obj, Register lock, Label& slow_case);
|
||||
// temp : temporary register, must not be rscratch1 or rscratch2
|
||||
void unlock_object(Register swap, Register obj, Register lock, Register temp, Label& slow_case);
|
||||
|
||||
void initialize_object(
|
||||
Register obj, // result: pointer to object after successful allocation
|
||||
|
||||
@@ -385,7 +385,7 @@ OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) {
|
||||
|
||||
// load issuing PC (the return address for this stub) into r3
|
||||
__ ldr(exception_pc, Address(rfp, 1*BytesPerWord));
|
||||
__ authenticate_return_address(exception_pc, rscratch1);
|
||||
__ authenticate_return_address(exception_pc);
|
||||
|
||||
// make sure that the vm_results are cleared (may be unnecessary)
|
||||
__ str(zr, Address(rthread, JavaThread::vm_result_offset()));
|
||||
@@ -434,7 +434,7 @@ OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) {
|
||||
__ str(exception_pc, Address(rthread, JavaThread::exception_pc_offset()));
|
||||
|
||||
// patch throwing pc into return address (has bci & oop map)
|
||||
__ protect_return_address(exception_pc, rscratch1);
|
||||
__ protect_return_address(exception_pc);
|
||||
__ str(exception_pc, Address(rfp, 1*BytesPerWord));
|
||||
|
||||
// compute the exception handler.
|
||||
@@ -450,7 +450,7 @@ OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) {
|
||||
__ invalidate_registers(false, true, true, true, true, true);
|
||||
|
||||
// patch the return address, this stub will directly return to the exception handler
|
||||
__ protect_return_address(r0, rscratch1);
|
||||
__ protect_return_address(r0);
|
||||
__ str(r0, Address(rfp, 1*BytesPerWord));
|
||||
|
||||
switch (id) {
|
||||
|
||||
@@ -45,6 +45,202 @@
|
||||
|
||||
typedef void (MacroAssembler::* chr_insn)(Register Rt, const Address &adr);
|
||||
|
||||
void C2_MacroAssembler::fast_lock(Register objectReg, Register boxReg, Register tmpReg,
|
||||
Register tmp2Reg, Register tmp3Reg) {
|
||||
Register oop = objectReg;
|
||||
Register box = boxReg;
|
||||
Register disp_hdr = tmpReg;
|
||||
Register tmp = tmp2Reg;
|
||||
Label cont;
|
||||
Label object_has_monitor;
|
||||
Label count, no_count;
|
||||
|
||||
assert_different_registers(oop, box, tmp, disp_hdr);
|
||||
|
||||
// Load markWord from object into displaced_header.
|
||||
ldr(disp_hdr, Address(oop, oopDesc::mark_offset_in_bytes()));
|
||||
|
||||
if (DiagnoseSyncOnValueBasedClasses != 0) {
|
||||
load_klass(tmp, oop);
|
||||
ldrw(tmp, Address(tmp, Klass::access_flags_offset()));
|
||||
tstw(tmp, JVM_ACC_IS_VALUE_BASED_CLASS);
|
||||
br(Assembler::NE, cont);
|
||||
}
|
||||
|
||||
// Check for existing monitor
|
||||
tbnz(disp_hdr, exact_log2(markWord::monitor_value), object_has_monitor);
|
||||
|
||||
if (LockingMode == LM_MONITOR) {
|
||||
tst(oop, oop); // Set NE to indicate 'failure' -> take slow-path. We know that oop != 0.
|
||||
b(cont);
|
||||
} else if (LockingMode == LM_LEGACY) {
|
||||
// Set tmp to be (markWord of object | UNLOCK_VALUE).
|
||||
orr(tmp, disp_hdr, markWord::unlocked_value);
|
||||
|
||||
// Initialize the box. (Must happen before we update the object mark!)
|
||||
str(tmp, Address(box, BasicLock::displaced_header_offset_in_bytes()));
|
||||
|
||||
// Compare object markWord with an unlocked value (tmp) and if
|
||||
// equal exchange the stack address of our box with object markWord.
|
||||
// On failure disp_hdr contains the possibly locked markWord.
|
||||
cmpxchg(oop, tmp, box, Assembler::xword, /*acquire*/ true,
|
||||
/*release*/ true, /*weak*/ false, disp_hdr);
|
||||
br(Assembler::EQ, cont);
|
||||
|
||||
assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0");
|
||||
|
||||
// If the compare-and-exchange succeeded, then we found an unlocked
|
||||
// object, will have now locked it will continue at label cont
|
||||
|
||||
// Check if the owner is self by comparing the value in the
|
||||
// markWord of object (disp_hdr) with the stack pointer.
|
||||
mov(rscratch1, sp);
|
||||
sub(disp_hdr, disp_hdr, rscratch1);
|
||||
mov(tmp, (address) (~(os::vm_page_size()-1) | markWord::lock_mask_in_place));
|
||||
// If condition is true we are cont and hence we can store 0 as the
|
||||
// displaced header in the box, which indicates that it is a recursive lock.
|
||||
ands(tmp/*==0?*/, disp_hdr, tmp); // Sets flags for result
|
||||
str(tmp/*==0, perhaps*/, Address(box, BasicLock::displaced_header_offset_in_bytes()));
|
||||
b(cont);
|
||||
} else {
|
||||
assert(LockingMode == LM_LIGHTWEIGHT, "must be");
|
||||
lightweight_lock(oop, disp_hdr, tmp, tmp3Reg, no_count);
|
||||
b(count);
|
||||
}
|
||||
|
||||
// Handle existing monitor.
|
||||
bind(object_has_monitor);
|
||||
|
||||
// The object's monitor m is unlocked iff m->owner == NULL,
|
||||
// otherwise m->owner may contain a thread or a stack address.
|
||||
//
|
||||
// Try to CAS m->owner from NULL to current thread.
|
||||
add(tmp, disp_hdr, (in_bytes(ObjectMonitor::owner_offset())-markWord::monitor_value));
|
||||
cmpxchg(tmp, zr, rthread, Assembler::xword, /*acquire*/ true,
|
||||
/*release*/ true, /*weak*/ false, tmp3Reg); // Sets flags for result
|
||||
|
||||
if (LockingMode != LM_LIGHTWEIGHT) {
|
||||
// Store a non-null value into the box to avoid looking like a re-entrant
|
||||
// lock. The fast-path monitor unlock code checks for
|
||||
// markWord::monitor_value so use markWord::unused_mark which has the
|
||||
// relevant bit set, and also matches ObjectSynchronizer::enter.
|
||||
mov(tmp, (address)markWord::unused_mark().value());
|
||||
str(tmp, Address(box, BasicLock::displaced_header_offset_in_bytes()));
|
||||
}
|
||||
br(Assembler::EQ, cont); // CAS success means locking succeeded
|
||||
|
||||
cmp(tmp3Reg, rthread);
|
||||
br(Assembler::NE, cont); // Check for recursive locking
|
||||
|
||||
// Recursive lock case
|
||||
increment(Address(disp_hdr, in_bytes(ObjectMonitor::recursions_offset()) - markWord::monitor_value), 1);
|
||||
// flag == EQ still from the cmp above, checking if this is a reentrant lock
|
||||
|
||||
bind(cont);
|
||||
// flag == EQ indicates success
|
||||
// flag == NE indicates failure
|
||||
br(Assembler::NE, no_count);
|
||||
|
||||
bind(count);
|
||||
increment(Address(rthread, JavaThread::held_monitor_count_offset()));
|
||||
|
||||
bind(no_count);
|
||||
}
|
||||
|
||||
void C2_MacroAssembler::fast_unlock(Register objectReg, Register boxReg, Register tmpReg,
|
||||
Register tmp2Reg) {
|
||||
Register oop = objectReg;
|
||||
Register box = boxReg;
|
||||
Register disp_hdr = tmpReg;
|
||||
Register tmp = tmp2Reg;
|
||||
Label cont;
|
||||
Label object_has_monitor;
|
||||
Label count, no_count;
|
||||
|
||||
assert_different_registers(oop, box, tmp, disp_hdr);
|
||||
|
||||
if (LockingMode == LM_LEGACY) {
|
||||
// Find the lock address and load the displaced header from the stack.
|
||||
ldr(disp_hdr, Address(box, BasicLock::displaced_header_offset_in_bytes()));
|
||||
|
||||
// If the displaced header is 0, we have a recursive unlock.
|
||||
cmp(disp_hdr, zr);
|
||||
br(Assembler::EQ, cont);
|
||||
}
|
||||
|
||||
// Handle existing monitor.
|
||||
ldr(tmp, Address(oop, oopDesc::mark_offset_in_bytes()));
|
||||
tbnz(tmp, exact_log2(markWord::monitor_value), object_has_monitor);
|
||||
|
||||
if (LockingMode == LM_MONITOR) {
|
||||
tst(oop, oop); // Set NE to indicate 'failure' -> take slow-path. We know that oop != 0.
|
||||
b(cont);
|
||||
} else if (LockingMode == LM_LEGACY) {
|
||||
// Check if it is still a light weight lock, this is is true if we
|
||||
// see the stack address of the basicLock in the markWord of the
|
||||
// object.
|
||||
|
||||
cmpxchg(oop, box, disp_hdr, Assembler::xword, /*acquire*/ false,
|
||||
/*release*/ true, /*weak*/ false, tmp);
|
||||
b(cont);
|
||||
} else {
|
||||
assert(LockingMode == LM_LIGHTWEIGHT, "must be");
|
||||
lightweight_unlock(oop, tmp, box, disp_hdr, no_count);
|
||||
b(count);
|
||||
}
|
||||
|
||||
assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0");
|
||||
|
||||
// Handle existing monitor.
|
||||
bind(object_has_monitor);
|
||||
STATIC_ASSERT(markWord::monitor_value <= INT_MAX);
|
||||
add(tmp, tmp, -(int)markWord::monitor_value); // monitor
|
||||
|
||||
if (LockingMode == LM_LIGHTWEIGHT) {
|
||||
// If the owner is anonymous, we need to fix it -- in an outline stub.
|
||||
Register tmp2 = disp_hdr;
|
||||
ldr(tmp2, Address(tmp, ObjectMonitor::owner_offset()));
|
||||
// We cannot use tbnz here, the target might be too far away and cannot
|
||||
// be encoded.
|
||||
tst(tmp2, (uint64_t)ObjectMonitor::ANONYMOUS_OWNER);
|
||||
C2HandleAnonOMOwnerStub* stub = new (Compile::current()->comp_arena()) C2HandleAnonOMOwnerStub(tmp, tmp2);
|
||||
Compile::current()->output()->add_stub(stub);
|
||||
br(Assembler::NE, stub->entry());
|
||||
bind(stub->continuation());
|
||||
}
|
||||
|
||||
ldr(disp_hdr, Address(tmp, ObjectMonitor::recursions_offset()));
|
||||
|
||||
Label notRecursive;
|
||||
cbz(disp_hdr, notRecursive);
|
||||
|
||||
// Recursive lock
|
||||
sub(disp_hdr, disp_hdr, 1u);
|
||||
str(disp_hdr, Address(tmp, ObjectMonitor::recursions_offset()));
|
||||
cmp(disp_hdr, disp_hdr); // Sets flags for result
|
||||
b(cont);
|
||||
|
||||
bind(notRecursive);
|
||||
ldr(rscratch1, Address(tmp, ObjectMonitor::EntryList_offset()));
|
||||
ldr(disp_hdr, Address(tmp, ObjectMonitor::cxq_offset()));
|
||||
orr(rscratch1, rscratch1, disp_hdr); // Will be 0 if both are 0.
|
||||
cmp(rscratch1, zr); // Sets flags for result
|
||||
cbnz(rscratch1, cont);
|
||||
// need a release store here
|
||||
lea(tmp, Address(tmp, ObjectMonitor::owner_offset()));
|
||||
stlr(zr, tmp); // set unowned
|
||||
|
||||
bind(cont);
|
||||
// flag == EQ indicates success
|
||||
// flag == NE indicates failure
|
||||
br(Assembler::NE, no_count);
|
||||
|
||||
bind(count);
|
||||
decrement(Address(rthread, JavaThread::held_monitor_count_offset()));
|
||||
|
||||
bind(no_count);
|
||||
}
|
||||
|
||||
// Search for str1 in str2 and return index or -1
|
||||
// Clobbers: rscratch1, rscratch2, rflags. May also clobber v0-v1, when icnt1==-1.
|
||||
void C2_MacroAssembler::string_indexof(Register str2, Register str1,
|
||||
|
||||
@@ -35,6 +35,11 @@
|
||||
enum shift_kind kind = Assembler::LSL, unsigned shift = 0);
|
||||
|
||||
public:
|
||||
// Code used by cmpFastLock and cmpFastUnlock mach instructions in .ad file.
|
||||
// See full description in macroAssembler_aarch64.cpp.
|
||||
void fast_lock(Register object, Register box, Register tmp, Register tmp2, Register tmp3);
|
||||
void fast_unlock(Register object, Register box, Register tmp, Register tmp2);
|
||||
|
||||
void string_compare(Register str1, Register str2,
|
||||
Register cnt1, Register cnt2, Register result,
|
||||
Register tmp1, Register tmp2, FloatRegister vtmp1,
|
||||
|
||||
@@ -62,7 +62,7 @@ inline frame FreezeBase::sender(const frame& f) {
|
||||
intptr_t** link_addr = link_address<FKind>(f);
|
||||
|
||||
intptr_t* sender_sp = (intptr_t*)(link_addr + frame::sender_sp_offset); // f.unextended_sp() + (fsize/wordSize); //
|
||||
address sender_pc = (address) *(sender_sp-1);
|
||||
address sender_pc = ContinuationHelper::return_address_at(sender_sp - 1);
|
||||
assert(sender_sp != f.sp(), "must have changed");
|
||||
|
||||
int slot = 0;
|
||||
@@ -129,20 +129,11 @@ void FreezeBase::adjust_interpreted_frame_unextended_sp(frame& f) {
|
||||
}
|
||||
}
|
||||
|
||||
static inline void relativize_one(intptr_t* const vfp, intptr_t* const hfp, int offset) {
|
||||
assert(*(hfp + offset) == *(vfp + offset), "");
|
||||
intptr_t* addr = hfp + offset;
|
||||
intptr_t value = *(intptr_t**)addr - vfp;
|
||||
*addr = value;
|
||||
}
|
||||
|
||||
inline void FreezeBase::relativize_interpreted_frame_metadata(const frame& f, const frame& hf) {
|
||||
intptr_t* vfp = f.fp();
|
||||
intptr_t* hfp = hf.fp();
|
||||
assert(hfp == hf.unextended_sp() + (f.fp() - f.unextended_sp()), "");
|
||||
assert(hf.fp() == hf.unextended_sp() + (f.fp() - f.unextended_sp()), "");
|
||||
assert((f.at(frame::interpreter_frame_last_sp_offset) != 0)
|
||||
|| (f.unextended_sp() == f.sp()), "");
|
||||
assert(f.fp() > (intptr_t*)f.at(frame::interpreter_frame_initial_sp_offset), "");
|
||||
assert(f.fp() > (intptr_t*)f.at_relative(frame::interpreter_frame_initial_sp_offset), "");
|
||||
|
||||
// on AARCH64, we may insert padding between the locals and the rest of the frame
|
||||
// (see TemplateInterpreterGenerator::generate_normal_entry, and AbstractInterpreter::layout_activation)
|
||||
@@ -152,12 +143,16 @@ inline void FreezeBase::relativize_interpreted_frame_metadata(const frame& f, co
|
||||
// Make sure that last_sp is already relativized.
|
||||
assert((intptr_t*)hf.at_relative(frame::interpreter_frame_last_sp_offset) == hf.unextended_sp(), "");
|
||||
|
||||
relativize_one(vfp, hfp, frame::interpreter_frame_initial_sp_offset); // == block_top == block_bottom
|
||||
relativize_one(vfp, hfp, frame::interpreter_frame_extended_sp_offset);
|
||||
// Make sure that monitor_block_top is already relativized.
|
||||
assert(hf.at_absolute(frame::interpreter_frame_monitor_block_top_offset) <= frame::interpreter_frame_initial_sp_offset, "");
|
||||
|
||||
// extended_sp is already relativized by TemplateInterpreterGenerator::generate_normal_entry or
|
||||
// AbstractInterpreter::layout_activation
|
||||
|
||||
assert((hf.fp() - hf.unextended_sp()) == (f.fp() - f.unextended_sp()), "");
|
||||
assert(hf.unextended_sp() == (intptr_t*)hf.at(frame::interpreter_frame_last_sp_offset), "");
|
||||
assert(hf.unextended_sp() <= (intptr_t*)hf.at(frame::interpreter_frame_initial_sp_offset), "");
|
||||
assert(hf.unextended_sp() > (intptr_t*)hf.at(frame::interpreter_frame_extended_sp_offset), "");
|
||||
assert(hf.fp() > (intptr_t*)hf.at(frame::interpreter_frame_initial_sp_offset), "");
|
||||
assert(hf.fp() <= (intptr_t*)hf.at(frame::interpreter_frame_locals_offset), "");
|
||||
}
|
||||
@@ -282,19 +277,15 @@ inline void ThawBase::patch_pd(frame& f, const frame& caller) {
|
||||
patch_callee_link(caller, caller.fp());
|
||||
}
|
||||
|
||||
static inline void derelativize_one(intptr_t* const fp, int offset) {
|
||||
intptr_t* addr = fp + offset;
|
||||
*addr = (intptr_t)(fp + *addr);
|
||||
}
|
||||
|
||||
inline void ThawBase::derelativize_interpreted_frame_metadata(const frame& hf, const frame& f) {
|
||||
intptr_t* vfp = f.fp();
|
||||
|
||||
// Make sure that last_sp is kept relativized.
|
||||
assert((intptr_t*)f.at_relative(frame::interpreter_frame_last_sp_offset) == f.unextended_sp(), "");
|
||||
|
||||
derelativize_one(vfp, frame::interpreter_frame_initial_sp_offset);
|
||||
derelativize_one(vfp, frame::interpreter_frame_extended_sp_offset);
|
||||
// Make sure that monitor_block_top is still relativized.
|
||||
assert(f.at_absolute(frame::interpreter_frame_monitor_block_top_offset) <= frame::interpreter_frame_initial_sp_offset, "");
|
||||
|
||||
// Make sure that extended_sp is kept relativized.
|
||||
assert((intptr_t*)f.at_relative(frame::interpreter_frame_extended_sp_offset) < f.unextended_sp(), "");
|
||||
}
|
||||
|
||||
#endif // CPU_AARCH64_CONTINUATIONFREEZETHAW_AARCH64_INLINE_HPP
|
||||
|
||||
@@ -68,6 +68,17 @@ inline void ContinuationHelper::push_pd(const frame& f) {
|
||||
*(intptr_t**)(f.sp() - frame::sender_sp_offset) = f.fp();
|
||||
}
|
||||
|
||||
#define CPU_OVERRIDES_RETURN_ADDRESS_ACCESSORS
|
||||
|
||||
inline address ContinuationHelper::return_address_at(intptr_t* sp) {
|
||||
return pauth_strip_verifiable(*(address*)sp);
|
||||
}
|
||||
|
||||
inline void ContinuationHelper::patch_return_address_at(intptr_t* sp,
|
||||
address pc) {
|
||||
*(address*)sp = pauth_sign_return_address(pc);
|
||||
}
|
||||
|
||||
inline void ContinuationHelper::set_anchor_to_entry_pd(JavaFrameAnchor* anchor, ContinuationEntry* entry) {
|
||||
anchor->set_last_Java_fp(entry->entry_fp());
|
||||
}
|
||||
@@ -80,7 +91,8 @@ inline void ContinuationHelper::set_anchor_pd(JavaFrameAnchor* anchor, intptr_t*
|
||||
|
||||
inline bool ContinuationHelper::Frame::assert_frame_laid_out(frame f) {
|
||||
intptr_t* sp = f.sp();
|
||||
address pc = *(address*)(sp - frame::sender_sp_ret_address_offset());
|
||||
address pc = ContinuationHelper::return_address_at(
|
||||
sp - frame::sender_sp_ret_address_offset());
|
||||
intptr_t* fp = *(intptr_t**)(sp - frame::sender_sp_offset);
|
||||
assert(f.raw_pc() == pc, "f.ra_pc: " INTPTR_FORMAT " actual: " INTPTR_FORMAT, p2i(f.raw_pc()), p2i(pc));
|
||||
assert(f.fp() == fp, "f.fp: " INTPTR_FORMAT " actual: " INTPTR_FORMAT, p2i(f.fp()), p2i(fp));
|
||||
@@ -108,20 +120,21 @@ inline void ContinuationHelper::InterpretedFrame::patch_sender_sp(frame& f, cons
|
||||
}
|
||||
|
||||
inline address ContinuationHelper::Frame::real_pc(const frame& f) {
|
||||
// Always used in assertions. Just strip it.
|
||||
address* pc_addr = &(((address*) f.sp())[-1]);
|
||||
return *pc_addr;
|
||||
return pauth_strip_pointer(*pc_addr);
|
||||
}
|
||||
|
||||
inline void ContinuationHelper::Frame::patch_pc(const frame& f, address pc) {
|
||||
address* pc_addr = &(((address*) f.sp())[-1]);
|
||||
*pc_addr = pc;
|
||||
*pc_addr = pauth_sign_return_address(pc);
|
||||
}
|
||||
|
||||
inline intptr_t* ContinuationHelper::InterpretedFrame::frame_top(const frame& f, InterpreterOopMap* mask) { // inclusive; this will be copied with the frame
|
||||
// interpreter_frame_last_sp_offset, points to unextended_sp includes arguments in the frame
|
||||
// interpreter_frame_initial_sp_offset excludes expression stack slots
|
||||
int expression_stack_sz = expression_stack_size(f, mask);
|
||||
intptr_t* res = *(intptr_t**)f.addr_at(frame::interpreter_frame_initial_sp_offset) - expression_stack_sz;
|
||||
intptr_t* res = (intptr_t*)f.at_relative(frame::interpreter_frame_initial_sp_offset) - expression_stack_sz;
|
||||
assert(res == (intptr_t*)f.interpreter_frame_monitor_end() - expression_stack_sz, "");
|
||||
assert(res >= f.unextended_sp(),
|
||||
"res: " INTPTR_FORMAT " initial_sp: " INTPTR_FORMAT " last_sp: " INTPTR_FORMAT " unextended_sp: " INTPTR_FORMAT " expression_stack_size: %d",
|
||||
|
||||
@@ -139,8 +139,7 @@ bool frame::safe_for_sender(JavaThread *thread) {
|
||||
sender_sp = (intptr_t*) addr_at(sender_sp_offset);
|
||||
sender_unextended_sp = (intptr_t*) this->fp()[interpreter_frame_sender_sp_offset];
|
||||
saved_fp = (intptr_t*) this->fp()[link_offset];
|
||||
sender_pc = pauth_strip_verifiable((address) this->fp()[return_addr_offset], (address)saved_fp);
|
||||
|
||||
sender_pc = pauth_strip_verifiable((address) this->fp()[return_addr_offset]);
|
||||
} else {
|
||||
// must be some sort of compiled/runtime frame
|
||||
// fp does not have to be safe (although it could be check for c1?)
|
||||
@@ -158,7 +157,9 @@ bool frame::safe_for_sender(JavaThread *thread) {
|
||||
sender_unextended_sp = sender_sp;
|
||||
// Note: frame::sender_sp_offset is only valid for compiled frame
|
||||
saved_fp = (intptr_t*) *(sender_sp - frame::sender_sp_offset);
|
||||
sender_pc = pauth_strip_verifiable((address) *(sender_sp-1), (address)saved_fp);
|
||||
// Note: PAC authentication may fail in case broken frame is passed in.
|
||||
// Just strip it for now.
|
||||
sender_pc = pauth_strip_pointer((address) *(sender_sp - 1));
|
||||
}
|
||||
|
||||
if (Continuation::is_return_barrier_entry(sender_pc)) {
|
||||
@@ -276,9 +277,8 @@ bool frame::safe_for_sender(JavaThread *thread) {
|
||||
void frame::patch_pc(Thread* thread, address pc) {
|
||||
assert(_cb == CodeCache::find_blob(pc), "unexpected pc");
|
||||
address* pc_addr = &(((address*) sp())[-1]);
|
||||
address signing_sp = (((address*) sp())[-2]);
|
||||
address signed_pc = pauth_sign_return_address(pc, (address)signing_sp);
|
||||
address pc_old = pauth_strip_verifiable(*pc_addr, (address)signing_sp);
|
||||
address signed_pc = pauth_sign_return_address(pc);
|
||||
address pc_old = pauth_strip_verifiable(*pc_addr);
|
||||
|
||||
if (TracePcPatching) {
|
||||
tty->print("patch_pc at address " INTPTR_FORMAT " [" INTPTR_FORMAT " -> " INTPTR_FORMAT "]",
|
||||
@@ -342,7 +342,7 @@ BasicObjectLock* frame::interpreter_frame_monitor_begin() const {
|
||||
}
|
||||
|
||||
BasicObjectLock* frame::interpreter_frame_monitor_end() const {
|
||||
BasicObjectLock* result = (BasicObjectLock*) at(interpreter_frame_monitor_block_top_offset);
|
||||
BasicObjectLock* result = (BasicObjectLock*) at_relative(interpreter_frame_monitor_block_top_offset);
|
||||
// make sure the pointer points inside the frame
|
||||
assert(sp() <= (intptr_t*) result, "monitor end should be above the stack pointer");
|
||||
assert((intptr_t*) result < fp(), "monitor end should be strictly below the frame pointer");
|
||||
@@ -350,7 +350,10 @@ BasicObjectLock* frame::interpreter_frame_monitor_end() const {
|
||||
}
|
||||
|
||||
void frame::interpreter_frame_set_monitor_end(BasicObjectLock* value) {
|
||||
*((BasicObjectLock**)addr_at(interpreter_frame_monitor_block_top_offset)) = value;
|
||||
assert(is_interpreted_frame(), "interpreted frame expected");
|
||||
// set relativized monitor_block_top
|
||||
ptr_at_put(interpreter_frame_monitor_block_top_offset, (intptr_t*)value - fp());
|
||||
assert(at_absolute(interpreter_frame_monitor_block_top_offset) <= interpreter_frame_monitor_block_top_offset, "");
|
||||
}
|
||||
|
||||
// Used by template based interpreter deoptimization
|
||||
@@ -362,7 +365,9 @@ void frame::interpreter_frame_set_last_sp(intptr_t* sp) {
|
||||
|
||||
// Used by template based interpreter deoptimization
|
||||
void frame::interpreter_frame_set_extended_sp(intptr_t* sp) {
|
||||
*((intptr_t**)addr_at(interpreter_frame_extended_sp_offset)) = sp;
|
||||
assert(is_interpreted_frame(), "interpreted frame expected");
|
||||
// set relativized extended_sp
|
||||
ptr_at_put(interpreter_frame_extended_sp_offset, (sp - fp()));
|
||||
}
|
||||
|
||||
frame frame::sender_for_entry_frame(RegisterMap* map) const {
|
||||
@@ -474,8 +479,9 @@ frame frame::sender_for_interpreter_frame(RegisterMap* map) const {
|
||||
}
|
||||
#endif // COMPILER2_OR_JVMCI
|
||||
|
||||
// For ROP protection, Interpreter will have signed the sender_pc, but there is no requirement to authenticate it here.
|
||||
address sender_pc = pauth_strip_verifiable(sender_pc_maybe_signed(), (address)link());
|
||||
// For ROP protection, Interpreter will have signed the sender_pc,
|
||||
// but there is no requirement to authenticate it here.
|
||||
address sender_pc = pauth_strip_verifiable(sender_pc_maybe_signed());
|
||||
|
||||
if (Continuation::is_return_barrier_entry(sender_pc)) {
|
||||
if (map->walk_cont()) { // about to walk into an h-stack
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
|
||||
frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc);
|
||||
|
||||
frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc, CodeBlob* cb);
|
||||
frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc, CodeBlob* cb, bool allow_cb_null = false);
|
||||
// used for fast frame construction by continuations
|
||||
frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc, CodeBlob* cb, const ImmutableOopMap* oop_map, bool on_heap);
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ inline frame::frame(intptr_t* sp, intptr_t* fp, address pc) {
|
||||
init(sp, fp, pc);
|
||||
}
|
||||
|
||||
inline frame::frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc, CodeBlob* cb) {
|
||||
inline frame::frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc, CodeBlob* cb, bool allow_cb_null) {
|
||||
assert(pauth_ptr_is_raw(pc), "cannot be signed");
|
||||
intptr_t a = intptr_t(sp);
|
||||
intptr_t b = intptr_t(fp);
|
||||
@@ -102,7 +102,7 @@ inline frame::frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address
|
||||
assert(pc != nullptr, "no pc?");
|
||||
_cb = cb;
|
||||
_oop_map = nullptr;
|
||||
assert(_cb != nullptr, "pc: " INTPTR_FORMAT, p2i(pc));
|
||||
assert(_cb != nullptr || allow_cb_null, "pc: " INTPTR_FORMAT, p2i(pc));
|
||||
_on_heap = false;
|
||||
DEBUG_ONLY(_frame_index = -1;)
|
||||
|
||||
@@ -151,7 +151,10 @@ inline frame::frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address
|
||||
setup(pc);
|
||||
}
|
||||
|
||||
inline frame::frame(intptr_t* sp) : frame(sp, sp, *(intptr_t**)(sp - frame::sender_sp_offset), *(address*)(sp - 1)) {}
|
||||
inline frame::frame(intptr_t* sp)
|
||||
: frame(sp, sp,
|
||||
*(intptr_t**)(sp - frame::sender_sp_offset),
|
||||
pauth_strip_verifiable(*(address*)(sp - 1))) {}
|
||||
|
||||
inline frame::frame(intptr_t* sp, intptr_t* fp) {
|
||||
intptr_t a = intptr_t(sp);
|
||||
@@ -417,9 +420,10 @@ inline frame frame::sender_for_compiled_frame(RegisterMap* map) const {
|
||||
: sender_sp();
|
||||
assert(!_sp_is_trusted || l_sender_sp == real_fp(), "");
|
||||
|
||||
// the return_address is always the word on the stack
|
||||
// For ROP protection, C1/C2 will have signed the sender_pc, but there is no requirement to authenticate it here.
|
||||
address sender_pc = pauth_strip_verifiable((address) *(l_sender_sp-1), (address) *(l_sender_sp-2));
|
||||
// The return_address is always the word on the stack.
|
||||
// For ROP protection, C1/C2 will have signed the sender_pc,
|
||||
// but there is no requirement to authenticate it here.
|
||||
address sender_pc = pauth_strip_verifiable((address) *(l_sender_sp - 1));
|
||||
|
||||
intptr_t** saved_fp_addr = (intptr_t**) (l_sender_sp - frame::sender_sp_offset);
|
||||
|
||||
|
||||
@@ -327,9 +327,6 @@ void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass,
|
||||
|
||||
// Do the check.
|
||||
check_klass_subtype(Rsub_klass, r0, r2, ok_is_subtype); // blows r2
|
||||
|
||||
// Profile the failure of the check.
|
||||
profile_typecheck_failed(r2); // blows r2
|
||||
}
|
||||
|
||||
// Java Expression Stack
|
||||
@@ -626,7 +623,7 @@ void InterpreterMacroAssembler::remove_activation(
|
||||
// Check that all monitors are unlocked
|
||||
{
|
||||
Label loop, exception, entry, restart;
|
||||
const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
|
||||
const int entry_size = frame::interpreter_frame_monitor_size_in_bytes();
|
||||
const Address monitor_block_top(
|
||||
rfp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
|
||||
const Address monitor_block_bot(
|
||||
@@ -635,8 +632,10 @@ void InterpreterMacroAssembler::remove_activation(
|
||||
bind(restart);
|
||||
// We use c_rarg1 so that if we go slow path it will be the correct
|
||||
// register for unlock_object to pass to VM directly
|
||||
ldr(c_rarg1, monitor_block_top); // points to current entry, starting
|
||||
// with top-most entry
|
||||
ldr(c_rarg1, monitor_block_top); // derelativize pointer
|
||||
lea(c_rarg1, Address(rfp, c_rarg1, Address::lsl(Interpreter::logStackElementSize)));
|
||||
// c_rarg1 points to current entry, starting with top-most entry
|
||||
|
||||
lea(r19, monitor_block_bot); // points to word before bottom of
|
||||
// monitor block
|
||||
b(entry);
|
||||
@@ -735,7 +734,7 @@ void InterpreterMacroAssembler::remove_activation(
|
||||
//
|
||||
// Kills:
|
||||
// r0
|
||||
// c_rarg0, c_rarg1, c_rarg2, c_rarg3, .. (param regs)
|
||||
// c_rarg0, c_rarg1, c_rarg2, c_rarg3, c_rarg4, .. (param regs)
|
||||
// rscratch1, rscratch2 (scratch regs)
|
||||
void InterpreterMacroAssembler::lock_object(Register lock_reg)
|
||||
{
|
||||
@@ -750,6 +749,8 @@ void InterpreterMacroAssembler::lock_object(Register lock_reg)
|
||||
const Register swap_reg = r0;
|
||||
const Register tmp = c_rarg2;
|
||||
const Register obj_reg = c_rarg3; // Will contain the oop
|
||||
const Register tmp2 = c_rarg4;
|
||||
const Register tmp3 = c_rarg5;
|
||||
|
||||
const int obj_offset = in_bytes(BasicObjectLock::obj_offset());
|
||||
const int lock_offset = in_bytes(BasicObjectLock::lock_offset());
|
||||
@@ -770,7 +771,7 @@ void InterpreterMacroAssembler::lock_object(Register lock_reg)
|
||||
|
||||
if (LockingMode == LM_LIGHTWEIGHT) {
|
||||
ldr(tmp, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
|
||||
fast_lock(obj_reg, tmp, rscratch1, rscratch2, slow_case);
|
||||
lightweight_lock(obj_reg, tmp, tmp2, tmp3, slow_case);
|
||||
b(count);
|
||||
} else if (LockingMode == LM_LEGACY) {
|
||||
// Load (object->mark() | 1) into swap_reg
|
||||
@@ -868,6 +869,7 @@ void InterpreterMacroAssembler::unlock_object(Register lock_reg)
|
||||
const Register swap_reg = r0;
|
||||
const Register header_reg = c_rarg2; // Will contain the old oopMark
|
||||
const Register obj_reg = c_rarg3; // Will contain the oop
|
||||
const Register tmp_reg = c_rarg4; // Temporary used by lightweight_unlock
|
||||
|
||||
save_bcp(); // Save in case of exception
|
||||
|
||||
@@ -901,7 +903,7 @@ void InterpreterMacroAssembler::unlock_object(Register lock_reg)
|
||||
|
||||
ldr(header_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
|
||||
tbnz(header_reg, exact_log2(markWord::monitor_value), slow_case);
|
||||
fast_unlock(obj_reg, header_reg, swap_reg, rscratch1, slow_case);
|
||||
lightweight_unlock(obj_reg, header_reg, swap_reg, tmp_reg, slow_case);
|
||||
b(count);
|
||||
bind(slow_case);
|
||||
} else if (LockingMode == LM_LEGACY) {
|
||||
@@ -1223,7 +1225,7 @@ void InterpreterMacroAssembler::profile_virtual_call(Register receiver,
|
||||
}
|
||||
|
||||
// Record the receiver type.
|
||||
record_klass_in_profile(receiver, mdp, reg2, true);
|
||||
record_klass_in_profile(receiver, mdp, reg2);
|
||||
bind(skip_receiver_profile);
|
||||
|
||||
// The method data pointer needs to be updated to reflect the new target.
|
||||
@@ -1246,36 +1248,18 @@ void InterpreterMacroAssembler::profile_virtual_call(Register receiver,
|
||||
void InterpreterMacroAssembler::record_klass_in_profile_helper(
|
||||
Register receiver, Register mdp,
|
||||
Register reg2, int start_row,
|
||||
Label& done, bool is_virtual_call) {
|
||||
Label& done) {
|
||||
if (TypeProfileWidth == 0) {
|
||||
if (is_virtual_call) {
|
||||
increment_mdp_data_at(mdp, in_bytes(CounterData::count_offset()));
|
||||
}
|
||||
#if INCLUDE_JVMCI
|
||||
else if (EnableJVMCI) {
|
||||
increment_mdp_data_at(mdp, in_bytes(ReceiverTypeData::nonprofiled_receiver_count_offset()));
|
||||
}
|
||||
#endif // INCLUDE_JVMCI
|
||||
increment_mdp_data_at(mdp, in_bytes(CounterData::count_offset()));
|
||||
} else {
|
||||
int non_profiled_offset = -1;
|
||||
if (is_virtual_call) {
|
||||
non_profiled_offset = in_bytes(CounterData::count_offset());
|
||||
}
|
||||
#if INCLUDE_JVMCI
|
||||
else if (EnableJVMCI) {
|
||||
non_profiled_offset = in_bytes(ReceiverTypeData::nonprofiled_receiver_count_offset());
|
||||
}
|
||||
#endif // INCLUDE_JVMCI
|
||||
|
||||
record_item_in_profile_helper(receiver, mdp, reg2, 0, done, TypeProfileWidth,
|
||||
&VirtualCallData::receiver_offset, &VirtualCallData::receiver_count_offset, non_profiled_offset);
|
||||
&VirtualCallData::receiver_offset, &VirtualCallData::receiver_count_offset);
|
||||
}
|
||||
}
|
||||
|
||||
void InterpreterMacroAssembler::record_item_in_profile_helper(Register item, Register mdp,
|
||||
Register reg2, int start_row, Label& done, int total_rows,
|
||||
OffsetFunction item_offset_fn, OffsetFunction item_count_offset_fn,
|
||||
int non_profiled_offset) {
|
||||
OffsetFunction item_offset_fn, OffsetFunction item_count_offset_fn) {
|
||||
int last_row = total_rows - 1;
|
||||
assert(start_row <= last_row, "must be work left to do");
|
||||
// Test this row for both the item and for null.
|
||||
@@ -1306,16 +1290,12 @@ void InterpreterMacroAssembler::record_item_in_profile_helper(Register item, Reg
|
||||
// Failed the equality check on item[n]... Test for null.
|
||||
if (start_row == last_row) {
|
||||
// The only thing left to do is handle the null case.
|
||||
if (non_profiled_offset >= 0) {
|
||||
cbz(reg2, found_null);
|
||||
// Item did not match any saved item and there is no empty row for it.
|
||||
// Increment total counter to indicate polymorphic case.
|
||||
increment_mdp_data_at(mdp, non_profiled_offset);
|
||||
b(done);
|
||||
bind(found_null);
|
||||
} else {
|
||||
cbnz(reg2, done);
|
||||
}
|
||||
cbz(reg2, found_null);
|
||||
// Item did not match any saved item and there is no empty row for it.
|
||||
// Increment total counter to indicate polymorphic case.
|
||||
increment_mdp_data_at(mdp, in_bytes(CounterData::count_offset()));
|
||||
b(done);
|
||||
bind(found_null);
|
||||
break;
|
||||
}
|
||||
// Since null is rare, make it be the branch-taken case.
|
||||
@@ -1323,7 +1303,7 @@ void InterpreterMacroAssembler::record_item_in_profile_helper(Register item, Reg
|
||||
|
||||
// Put all the "Case 3" tests here.
|
||||
record_item_in_profile_helper(item, mdp, reg2, start_row + 1, done, total_rows,
|
||||
item_offset_fn, item_count_offset_fn, non_profiled_offset);
|
||||
item_offset_fn, item_count_offset_fn);
|
||||
|
||||
// Found a null. Keep searching for a matching item,
|
||||
// but remember that this is an empty (unused) slot.
|
||||
@@ -1370,12 +1350,11 @@ void InterpreterMacroAssembler::record_item_in_profile_helper(Register item, Reg
|
||||
// done:
|
||||
|
||||
void InterpreterMacroAssembler::record_klass_in_profile(Register receiver,
|
||||
Register mdp, Register reg2,
|
||||
bool is_virtual_call) {
|
||||
Register mdp, Register reg2) {
|
||||
assert(ProfileInterpreter, "must be profiling");
|
||||
Label done;
|
||||
|
||||
record_klass_in_profile_helper(receiver, mdp, reg2, 0, done, is_virtual_call);
|
||||
record_klass_in_profile_helper(receiver, mdp, reg2, 0, done);
|
||||
|
||||
bind (done);
|
||||
}
|
||||
@@ -1437,24 +1416,6 @@ void InterpreterMacroAssembler::profile_null_seen(Register mdp) {
|
||||
}
|
||||
}
|
||||
|
||||
void InterpreterMacroAssembler::profile_typecheck_failed(Register mdp) {
|
||||
if (ProfileInterpreter && TypeProfileCasts) {
|
||||
Label profile_continue;
|
||||
|
||||
// If no method data exists, go to profile_continue.
|
||||
test_method_data_pointer(mdp, profile_continue);
|
||||
|
||||
int count_offset = in_bytes(CounterData::count_offset());
|
||||
// Back up the address, since we have already bumped the mdp.
|
||||
count_offset -= in_bytes(VirtualCallData::virtual_call_data_size());
|
||||
|
||||
// *Decrement* the counter. We expect to see zero or small negatives.
|
||||
increment_mdp_data_at(mdp, count_offset, true);
|
||||
|
||||
bind (profile_continue);
|
||||
}
|
||||
}
|
||||
|
||||
void InterpreterMacroAssembler::profile_typecheck(Register mdp, Register klass, Register reg2) {
|
||||
if (ProfileInterpreter) {
|
||||
Label profile_continue;
|
||||
@@ -1468,7 +1429,7 @@ void InterpreterMacroAssembler::profile_typecheck(Register mdp, Register klass,
|
||||
mdp_delta = in_bytes(VirtualCallData::virtual_call_data_size());
|
||||
|
||||
// Record the object type.
|
||||
record_klass_in_profile(klass, mdp, reg2, false);
|
||||
record_klass_in_profile(klass, mdp, reg2);
|
||||
}
|
||||
update_mdp_by_constant(mdp, mdp_delta);
|
||||
|
||||
|
||||
@@ -86,6 +86,7 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
||||
void restore_sp_after_call() {
|
||||
Label L;
|
||||
ldr(rscratch1, Address(rfp, frame::interpreter_frame_extended_sp_offset * wordSize));
|
||||
lea(rscratch1, Address(rfp, rscratch1, Address::lsl(LogBytesPerWord)));
|
||||
#ifdef ASSERT
|
||||
cbnz(rscratch1, L);
|
||||
stop("SP is null");
|
||||
@@ -98,6 +99,7 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
||||
#ifdef ASSERT
|
||||
Label L;
|
||||
ldr(rscratch1, Address(rfp, frame::interpreter_frame_extended_sp_offset * wordSize));
|
||||
lea(rscratch1, Address(rfp, rscratch1, Address::lsl(LogBytesPerWord)));
|
||||
cmp(sp, rscratch1);
|
||||
br(EQ, L);
|
||||
stop(msg);
|
||||
@@ -174,7 +176,8 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
||||
void push(RegSet regs, Register stack) { ((MacroAssembler*)this)->push(regs, stack); }
|
||||
|
||||
void empty_expression_stack() {
|
||||
ldr(esp, Address(rfp, frame::interpreter_frame_monitor_block_top_offset * wordSize));
|
||||
ldr(rscratch1, Address(rfp, frame::interpreter_frame_monitor_block_top_offset * wordSize));
|
||||
lea(esp, Address(rfp, rscratch1, Address::lsl(LogBytesPerWord)));
|
||||
// null last_sp until next java call
|
||||
str(zr, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize));
|
||||
}
|
||||
@@ -264,14 +267,13 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
||||
Label& not_equal_continue);
|
||||
|
||||
void record_klass_in_profile(Register receiver, Register mdp,
|
||||
Register reg2, bool is_virtual_call);
|
||||
Register reg2);
|
||||
void record_klass_in_profile_helper(Register receiver, Register mdp,
|
||||
Register reg2, int start_row,
|
||||
Label& done, bool is_virtual_call);
|
||||
Label& done);
|
||||
void record_item_in_profile_helper(Register item, Register mdp,
|
||||
Register reg2, int start_row, Label& done, int total_rows,
|
||||
OffsetFunction item_offset_fn, OffsetFunction item_count_offset_fn,
|
||||
int non_profiled_offset);
|
||||
OffsetFunction item_offset_fn, OffsetFunction item_count_offset_fn);
|
||||
|
||||
void update_mdp_by_offset(Register mdp_in, int offset_of_offset);
|
||||
void update_mdp_by_offset(Register mdp_in, Register reg, int offset_of_disp);
|
||||
|
||||
@@ -1196,6 +1196,110 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
}
|
||||
}
|
||||
|
||||
// Look up the method for a megamorphic invokeinterface call in a single pass over itable:
|
||||
// - check recv_klass (actual object class) is a subtype of resolved_klass from CompiledICHolder
|
||||
// - find a holder_klass (class that implements the method) vtable offset and get the method from vtable by index
|
||||
// The target method is determined by <holder_klass, itable_index>.
|
||||
// The receiver klass is in recv_klass.
|
||||
// On success, the result will be in method_result, and execution falls through.
|
||||
// On failure, execution transfers to the given label.
|
||||
void MacroAssembler::lookup_interface_method_stub(Register recv_klass,
|
||||
Register holder_klass,
|
||||
Register resolved_klass,
|
||||
Register method_result,
|
||||
Register temp_itbl_klass,
|
||||
Register scan_temp,
|
||||
int itable_index,
|
||||
Label& L_no_such_interface) {
|
||||
// 'method_result' is only used as output register at the very end of this method.
|
||||
// Until then we can reuse it as 'holder_offset'.
|
||||
Register holder_offset = method_result;
|
||||
assert_different_registers(resolved_klass, recv_klass, holder_klass, temp_itbl_klass, scan_temp, holder_offset);
|
||||
|
||||
int vtable_start_offset = in_bytes(Klass::vtable_start_offset());
|
||||
int itable_offset_entry_size = itableOffsetEntry::size() * wordSize;
|
||||
int ioffset = in_bytes(itableOffsetEntry::interface_offset());
|
||||
int ooffset = in_bytes(itableOffsetEntry::offset_offset());
|
||||
|
||||
Label L_loop_search_resolved_entry, L_resolved_found, L_holder_found;
|
||||
|
||||
ldrw(scan_temp, Address(recv_klass, Klass::vtable_length_offset()));
|
||||
add(recv_klass, recv_klass, vtable_start_offset + ioffset);
|
||||
// itableOffsetEntry[] itable = recv_klass + Klass::vtable_start_offset() + sizeof(vtableEntry) * recv_klass->_vtable_len;
|
||||
// temp_itbl_klass = itable[0]._interface;
|
||||
int vtblEntrySize = vtableEntry::size_in_bytes();
|
||||
assert(vtblEntrySize == wordSize, "ldr lsl shift amount must be 3");
|
||||
ldr(temp_itbl_klass, Address(recv_klass, scan_temp, Address::lsl(exact_log2(vtblEntrySize))));
|
||||
mov(holder_offset, zr);
|
||||
// scan_temp = &(itable[0]._interface)
|
||||
lea(scan_temp, Address(recv_klass, scan_temp, Address::lsl(exact_log2(vtblEntrySize))));
|
||||
|
||||
// Initial checks:
|
||||
// - if (holder_klass != resolved_klass), go to "scan for resolved"
|
||||
// - if (itable[0] == holder_klass), shortcut to "holder found"
|
||||
// - if (itable[0] == 0), no such interface
|
||||
cmp(resolved_klass, holder_klass);
|
||||
br(Assembler::NE, L_loop_search_resolved_entry);
|
||||
cmp(holder_klass, temp_itbl_klass);
|
||||
br(Assembler::EQ, L_holder_found);
|
||||
cbz(temp_itbl_klass, L_no_such_interface);
|
||||
|
||||
// Loop: Look for holder_klass record in itable
|
||||
// do {
|
||||
// temp_itbl_klass = *(scan_temp += itable_offset_entry_size);
|
||||
// if (temp_itbl_klass == holder_klass) {
|
||||
// goto L_holder_found; // Found!
|
||||
// }
|
||||
// } while (temp_itbl_klass != 0);
|
||||
// goto L_no_such_interface // Not found.
|
||||
Label L_search_holder;
|
||||
bind(L_search_holder);
|
||||
ldr(temp_itbl_klass, Address(pre(scan_temp, itable_offset_entry_size)));
|
||||
cmp(holder_klass, temp_itbl_klass);
|
||||
br(Assembler::EQ, L_holder_found);
|
||||
cbnz(temp_itbl_klass, L_search_holder);
|
||||
|
||||
b(L_no_such_interface);
|
||||
|
||||
// Loop: Look for resolved_class record in itable
|
||||
// while (true) {
|
||||
// temp_itbl_klass = *(scan_temp += itable_offset_entry_size);
|
||||
// if (temp_itbl_klass == 0) {
|
||||
// goto L_no_such_interface;
|
||||
// }
|
||||
// if (temp_itbl_klass == resolved_klass) {
|
||||
// goto L_resolved_found; // Found!
|
||||
// }
|
||||
// if (temp_itbl_klass == holder_klass) {
|
||||
// holder_offset = scan_temp;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
Label L_loop_search_resolved;
|
||||
bind(L_loop_search_resolved);
|
||||
ldr(temp_itbl_klass, Address(pre(scan_temp, itable_offset_entry_size)));
|
||||
bind(L_loop_search_resolved_entry);
|
||||
cbz(temp_itbl_klass, L_no_such_interface);
|
||||
cmp(resolved_klass, temp_itbl_klass);
|
||||
br(Assembler::EQ, L_resolved_found);
|
||||
cmp(holder_klass, temp_itbl_klass);
|
||||
br(Assembler::NE, L_loop_search_resolved);
|
||||
mov(holder_offset, scan_temp);
|
||||
b(L_loop_search_resolved);
|
||||
|
||||
// See if we already have a holder klass. If not, go and scan for it.
|
||||
bind(L_resolved_found);
|
||||
cbz(holder_offset, L_search_holder);
|
||||
mov(scan_temp, holder_offset);
|
||||
|
||||
// Finally, scan_temp contains holder_klass vtable offset
|
||||
bind(L_holder_found);
|
||||
ldrw(method_result, Address(scan_temp, ooffset - ioffset));
|
||||
add(recv_klass, recv_klass, itable_index * wordSize + in_bytes(itableMethodEntry::method_offset())
|
||||
- vtable_start_offset - ioffset); // substract offsets to restore the original value of recv_klass
|
||||
ldr(method_result, Address(recv_klass, method_result, Address::uxtw(0)));
|
||||
}
|
||||
|
||||
// virtual method calling
|
||||
void MacroAssembler::lookup_virtual_method(Register recv_klass,
|
||||
RegisterOrConstant vtable_index,
|
||||
@@ -2735,6 +2839,10 @@ void MacroAssembler::cmpxchg(Register addr, Register expected,
|
||||
mov(result, expected);
|
||||
lse_cas(result, new_val, addr, size, acquire, release, /*not_pair*/ true);
|
||||
compare_eq(result, expected, size);
|
||||
#ifdef ASSERT
|
||||
// Poison rscratch1 which is written on !UseLSE branch
|
||||
mov(rscratch1, 0x1f1f1f1f1f1f1f1f);
|
||||
#endif
|
||||
} else {
|
||||
Label retry_load, done;
|
||||
prfm(Address(addr), PSTL1STRM);
|
||||
@@ -5963,51 +6071,43 @@ void MacroAssembler::leave() {
|
||||
// For more details on PAC see pauth_aarch64.hpp.
|
||||
|
||||
// Sign the LR. Use during construction of a stack frame, before storing the LR to memory.
|
||||
// Uses the FP as the modifier.
|
||||
// Uses value zero as the modifier.
|
||||
//
|
||||
void MacroAssembler::protect_return_address() {
|
||||
if (VM_Version::use_rop_protection()) {
|
||||
check_return_address();
|
||||
// The standard convention for C code is to use paciasp, which uses SP as the modifier. This
|
||||
// works because in C code, FP and SP match on function entry. In the JDK, SP and FP may not
|
||||
// match, so instead explicitly use the FP.
|
||||
pacia(lr, rfp);
|
||||
paciaz();
|
||||
}
|
||||
}
|
||||
|
||||
// Sign the return value in the given register. Use before updating the LR in the existing stack
|
||||
// frame for the current function.
|
||||
// Uses the FP from the start of the function as the modifier - which is stored at the address of
|
||||
// the current FP.
|
||||
// Uses value zero as the modifier.
|
||||
//
|
||||
void MacroAssembler::protect_return_address(Register return_reg, Register temp_reg) {
|
||||
void MacroAssembler::protect_return_address(Register return_reg) {
|
||||
if (VM_Version::use_rop_protection()) {
|
||||
assert(PreserveFramePointer, "PreserveFramePointer must be set for ROP protection");
|
||||
check_return_address(return_reg);
|
||||
ldr(temp_reg, Address(rfp));
|
||||
pacia(return_reg, temp_reg);
|
||||
paciza(return_reg);
|
||||
}
|
||||
}
|
||||
|
||||
// Authenticate the LR. Use before function return, after restoring FP and loading LR from memory.
|
||||
// Uses value zero as the modifier.
|
||||
//
|
||||
void MacroAssembler::authenticate_return_address(Register return_reg) {
|
||||
void MacroAssembler::authenticate_return_address() {
|
||||
if (VM_Version::use_rop_protection()) {
|
||||
autia(return_reg, rfp);
|
||||
check_return_address(return_reg);
|
||||
autiaz();
|
||||
check_return_address();
|
||||
}
|
||||
}
|
||||
|
||||
// Authenticate the return value in the given register. Use before updating the LR in the existing
|
||||
// stack frame for the current function.
|
||||
// Uses the FP from the start of the function as the modifier - which is stored at the address of
|
||||
// the current FP.
|
||||
// Uses value zero as the modifier.
|
||||
//
|
||||
void MacroAssembler::authenticate_return_address(Register return_reg, Register temp_reg) {
|
||||
void MacroAssembler::authenticate_return_address(Register return_reg) {
|
||||
if (VM_Version::use_rop_protection()) {
|
||||
assert(PreserveFramePointer, "PreserveFramePointer must be set for ROP protection");
|
||||
ldr(temp_reg, Address(rfp));
|
||||
autia(return_reg, temp_reg);
|
||||
autiza(return_reg);
|
||||
check_return_address(return_reg);
|
||||
}
|
||||
}
|
||||
@@ -6210,16 +6310,16 @@ void MacroAssembler::double_move(VMRegPair src, VMRegPair dst, Register tmp) {
|
||||
}
|
||||
}
|
||||
|
||||
// Implements fast-locking.
|
||||
// Implements lightweight-locking.
|
||||
// Branches to slow upon failure to lock the object, with ZF cleared.
|
||||
// Falls through upon success with ZF set.
|
||||
//
|
||||
// - obj: the object to be locked
|
||||
// - hdr: the header, already loaded from obj, will be destroyed
|
||||
// - t1, t2: temporary registers, will be destroyed
|
||||
void MacroAssembler::fast_lock(Register obj, Register hdr, Register t1, Register t2, Label& slow) {
|
||||
void MacroAssembler::lightweight_lock(Register obj, Register hdr, Register t1, Register t2, Label& slow) {
|
||||
assert(LockingMode == LM_LIGHTWEIGHT, "only used with new lightweight locking");
|
||||
assert_different_registers(obj, hdr, t1, t2);
|
||||
assert_different_registers(obj, hdr, t1, t2, rscratch1);
|
||||
|
||||
// Check if we would have space on lock-stack for the object.
|
||||
ldrw(t1, Address(rthread, JavaThread::lock_stack_top_offset()));
|
||||
@@ -6231,6 +6331,7 @@ void MacroAssembler::fast_lock(Register obj, Register hdr, Register t1, Register
|
||||
// Clear lock-bits, into t2
|
||||
eor(t2, hdr, markWord::unlocked_value);
|
||||
// Try to swing header from unlocked to locked
|
||||
// Clobbers rscratch1 when UseLSE is false
|
||||
cmpxchg(/*addr*/ obj, /*expected*/ hdr, /*new*/ t2, Assembler::xword,
|
||||
/*acquire*/ true, /*release*/ true, /*weak*/ false, t1);
|
||||
br(Assembler::NE, slow);
|
||||
@@ -6242,16 +6343,16 @@ void MacroAssembler::fast_lock(Register obj, Register hdr, Register t1, Register
|
||||
strw(t1, Address(rthread, JavaThread::lock_stack_top_offset()));
|
||||
}
|
||||
|
||||
// Implements fast-unlocking.
|
||||
// Implements lightweight-unlocking.
|
||||
// Branches to slow upon failure, with ZF cleared.
|
||||
// Falls through upon success, with ZF set.
|
||||
//
|
||||
// - obj: the object to be unlocked
|
||||
// - hdr: the (pre-loaded) header of the object
|
||||
// - t1, t2: temporary registers
|
||||
void MacroAssembler::fast_unlock(Register obj, Register hdr, Register t1, Register t2, Label& slow) {
|
||||
void MacroAssembler::lightweight_unlock(Register obj, Register hdr, Register t1, Register t2, Label& slow) {
|
||||
assert(LockingMode == LM_LIGHTWEIGHT, "only used with new lightweight locking");
|
||||
assert_different_registers(obj, hdr, t1, t2);
|
||||
assert_different_registers(obj, hdr, t1, t2, rscratch1);
|
||||
|
||||
#ifdef ASSERT
|
||||
{
|
||||
@@ -6291,6 +6392,7 @@ void MacroAssembler::fast_unlock(Register obj, Register hdr, Register t1, Regist
|
||||
orr(t1, hdr, markWord::unlocked_value);
|
||||
|
||||
// Try to swing header from locked to unlocked
|
||||
// Clobbers rscratch1 when UseLSE is false
|
||||
cmpxchg(obj, hdr, t1, Assembler::xword,
|
||||
/*acquire*/ true, /*release*/ true, /*weak*/ false, t2);
|
||||
br(Assembler::NE, slow);
|
||||
|
||||
@@ -717,9 +717,9 @@ public:
|
||||
|
||||
// ROP Protection
|
||||
void protect_return_address();
|
||||
void protect_return_address(Register return_reg, Register temp_reg);
|
||||
void authenticate_return_address(Register return_reg = lr);
|
||||
void authenticate_return_address(Register return_reg, Register temp_reg);
|
||||
void protect_return_address(Register return_reg);
|
||||
void authenticate_return_address();
|
||||
void authenticate_return_address(Register return_reg);
|
||||
void strip_return_address();
|
||||
void check_return_address(Register return_reg=lr) PRODUCT_RETURN;
|
||||
|
||||
@@ -943,6 +943,15 @@ public:
|
||||
Label& no_such_interface,
|
||||
bool return_method = true);
|
||||
|
||||
void lookup_interface_method_stub(Register recv_klass,
|
||||
Register holder_klass,
|
||||
Register resolved_klass,
|
||||
Register method_result,
|
||||
Register temp_reg,
|
||||
Register temp_reg2,
|
||||
int itable_index,
|
||||
Label& L_no_such_interface);
|
||||
|
||||
// virtual method calling
|
||||
// n.b. x86 allows RegisterOrConstant for vtable_index
|
||||
void lookup_virtual_method(Register recv_klass,
|
||||
@@ -1583,8 +1592,8 @@ public:
|
||||
// Code for java.lang.Thread::onSpinWait() intrinsic.
|
||||
void spin_wait();
|
||||
|
||||
void fast_lock(Register obj, Register hdr, Register t1, Register t2, Label& slow);
|
||||
void fast_unlock(Register obj, Register hdr, Register t1, Register t2, Label& slow);
|
||||
void lightweight_lock(Register obj, Register hdr, Register t1, Register t2, Label& slow);
|
||||
void lightweight_unlock(Register obj, Register hdr, Register t1, Register t2, Label& slow);
|
||||
|
||||
private:
|
||||
// Check the current thread doesn't need a cross modify fence.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2021, 2022, Arm Limited. All rights reserved.
|
||||
* Copyright (c) 2021, 2023, Arm Limited. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -77,9 +77,9 @@ inline bool pauth_ptr_is_raw(address ptr) {
|
||||
// Strip a return value (same as pauth_strip_pointer). When debug is enabled then authenticate
|
||||
// instead.
|
||||
//
|
||||
inline address pauth_strip_verifiable(address ret_addr, address modifier) {
|
||||
inline address pauth_strip_verifiable(address ret_addr) {
|
||||
if (VM_Version::use_rop_protection()) {
|
||||
DEBUG_ONLY(ret_addr = pauth_authenticate_return_address(ret_addr, modifier);)
|
||||
DEBUG_ONLY(ret_addr = pauth_authenticate_return_address(ret_addr);)
|
||||
NOT_DEBUG(ret_addr = pauth_strip_pointer(ret_addr));
|
||||
}
|
||||
return ret_addr;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user