mirror of
https://github.com/JetBrains/JetBrainsRuntime.git
synced 2025-12-06 17:39:40 +01:00
Compare commits
818 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5609719c49 | ||
|
|
b762e86c05 | ||
|
|
8548f50270 | ||
|
|
1db63e86ed | ||
|
|
ac4b525da3 | ||
|
|
dee928bd5d | ||
|
|
44ceb886ac | ||
|
|
7c01824b6e | ||
|
|
f384d6d955 | ||
|
|
32a8087610 | ||
|
|
0cd0b7ff8e | ||
|
|
4bdaf472a8 | ||
|
|
8ba4251ad5 | ||
|
|
2d029761c2 | ||
|
|
91a5488284 | ||
|
|
49536a0988 | ||
|
|
3641a3d262 | ||
|
|
c3c844caab | ||
|
|
4165302aed | ||
|
|
d6600f1ccd | ||
|
|
8c8728873a | ||
|
|
e4f6f6308c | ||
|
|
db1699c5eb | ||
|
|
e11878c0b8 | ||
|
|
b2d03d5cb9 | ||
|
|
07afb903e6 | ||
|
|
fc24e5fa7b | ||
|
|
56c82ffa44 | ||
|
|
9409bc69f7 | ||
|
|
19f159ede7 | ||
|
|
81ff7dee0c | ||
|
|
7f094b020e | ||
|
|
12bb636c5f | ||
|
|
d4aa4cef24 | ||
|
|
a0582f582d | ||
|
|
fed7797313 | ||
|
|
181652c300 | ||
|
|
0cf709a181 | ||
|
|
a1de736544 | ||
|
|
c4652d8ab4 | ||
|
|
5ff1f7fae4 | ||
|
|
5c5b3b032a | ||
|
|
3b52ea1aa3 | ||
|
|
ceef54ac0a | ||
|
|
85b8bac5e1 | ||
|
|
727fcd37a7 | ||
|
|
9a610ddc73 | ||
|
|
f0c0b86f90 | ||
|
|
9a7c6bea31 | ||
|
|
f9a9101f57 | ||
|
|
fb847c4826 | ||
|
|
80601bbc19 | ||
|
|
acd17c74c4 | ||
|
|
462f3efa87 | ||
|
|
08a4d41204 | ||
|
|
126a349e06 | ||
|
|
1ba0d66607 | ||
|
|
0ac93f103b | ||
|
|
34095d9e40 | ||
|
|
6164766ac8 | ||
|
|
d45fb152cd | ||
|
|
0eb220c53f | ||
|
|
c70fb9a9f0 | ||
|
|
5b5a1ec040 | ||
|
|
042e9bde60 | ||
|
|
983c12795d | ||
|
|
94b02105aa | ||
|
|
665dc9f72c | ||
|
|
e4a5f15a17 | ||
|
|
5e4c9fa497 | ||
|
|
3b442f1387 | ||
|
|
2bc5573c0d | ||
|
|
97fe70e623 | ||
|
|
4bf5b250e8 | ||
|
|
6a6b306d4b | ||
|
|
d1f850624e | ||
|
|
f3fdcb0714 | ||
|
|
4880125640 | ||
|
|
0c68210497 | ||
|
|
7541d7b433 | ||
|
|
5927fc769b | ||
|
|
8236ede496 | ||
|
|
d67378295f | ||
|
|
7d0ad85c28 | ||
|
|
9b692eeaf0 | ||
|
|
3a15dfad37 | ||
|
|
b3ce2ef163 | ||
|
|
4517168648 | ||
|
|
3bae514df5 | ||
|
|
68cfc784e7 | ||
|
|
4bc0b1e833 | ||
|
|
a87d48867a | ||
|
|
de10f3a55e | ||
|
|
18e1552b9d | ||
|
|
7714eca9e2 | ||
|
|
5b559a8764 | ||
|
|
34b306300d | ||
|
|
0cf6d2da8d | ||
|
|
67ab7032c8 | ||
|
|
cd4ef878a0 | ||
|
|
5b43a3aef3 | ||
|
|
ce2a99a6ec | ||
|
|
882d1064e7 | ||
|
|
45ca486b96 | ||
|
|
a3bfa02ec0 | ||
|
|
a9ed023347 | ||
|
|
92c7e3a9c3 | ||
|
|
e1724ac304 | ||
|
|
51bb3ddb2f | ||
|
|
10c7694d60 | ||
|
|
59ea9d809d | ||
|
|
ab146e18bd | ||
|
|
0ca9b169b0 | ||
|
|
289f756f70 | ||
|
|
ba84093c7d | ||
|
|
46702cad3c | ||
|
|
ac8ffa0ba7 | ||
|
|
fae062d45f | ||
|
|
0e87047b7e | ||
|
|
0106ef8fef | ||
|
|
a69031c54b | ||
|
|
8b96b1e115 | ||
|
|
48186ebbfb | ||
|
|
6877bb6cd1 | ||
|
|
aab6c2301d | ||
|
|
8b63dd1c22 | ||
|
|
9baaee86b0 | ||
|
|
9e0ff20be5 | ||
|
|
f51e55a20f | ||
|
|
e68d154a63 | ||
|
|
b526f948ff | ||
|
|
fdbb6f02b8 | ||
|
|
6743f36c32 | ||
|
|
f706b93717 | ||
|
|
6f046e9f68 | ||
|
|
bac641fe77 | ||
|
|
8dfcb3fd5a | ||
|
|
ef651ca1bb | ||
|
|
3092ca0461 | ||
|
|
3caa06a639 | ||
|
|
6c50ed6690 | ||
|
|
805a5b4f75 | ||
|
|
efabfd0370 | ||
|
|
f757a39090 | ||
|
|
1039653b97 | ||
|
|
65fa801231 | ||
|
|
3d9ae4dbe8 | ||
|
|
ef8e01b0d4 | ||
|
|
eaa9c1618e | ||
|
|
ee3c7edd84 | ||
|
|
8a19c38728 | ||
|
|
4fcd80acf0 | ||
|
|
6f5dd836de | ||
|
|
2ff21b425e | ||
|
|
28e26bc344 | ||
|
|
1333261006 | ||
|
|
519d67cd4c | ||
|
|
096484d199 | ||
|
|
56dd7358a3 | ||
|
|
bf33424c15 | ||
|
|
a2405cbfee | ||
|
|
a09d00d0bc | ||
|
|
6105c96011 | ||
|
|
8c77e17444 | ||
|
|
9a0069f134 | ||
|
|
fc79bda8dd | ||
|
|
ce8bb4ce8b | ||
|
|
6bb0b6266a | ||
|
|
4b4310ed38 | ||
|
|
d221c5484e | ||
|
|
d31f71ece1 | ||
|
|
b5c9d1299d | ||
|
|
61a3a7b8e8 | ||
|
|
7b936ee500 | ||
|
|
5e807aadd3 | ||
|
|
9c224d7db0 | ||
|
|
b5e58a8c3b | ||
|
|
af6b251d65 | ||
|
|
4500eca7d1 | ||
|
|
24b37db586 | ||
|
|
c60f4a2a24 | ||
|
|
eec8b0fa8c | ||
|
|
5c43e5aab7 | ||
|
|
5867250cfd | ||
|
|
a48389b346 | ||
|
|
6a6a9ad953 | ||
|
|
b5781d975c | ||
|
|
c8f7de81c2 | ||
|
|
8f58bb84d6 | ||
|
|
cdeb52b3e6 | ||
|
|
658dff0901 | ||
|
|
61a02261ed | ||
|
|
7863913daf | ||
|
|
4cfbbdad3e | ||
|
|
c21ea4475c | ||
|
|
adc2dc1924 | ||
|
|
591834dd4f | ||
|
|
90a5f1b1f0 | ||
|
|
e965842e27 | ||
|
|
e2bf64a981 | ||
|
|
385892a4cc | ||
|
|
58ab9627eb | ||
|
|
37bf4ef3e2 | ||
|
|
9493774cb7 | ||
|
|
f974f69c59 | ||
|
|
4dbf97b0ae | ||
|
|
7694dc9b9a | ||
|
|
141ef26706 | ||
|
|
46eefed923 | ||
|
|
bc88a4f828 | ||
|
|
30364d564d | ||
|
|
36e35cd187 | ||
|
|
3a158aa101 | ||
|
|
a78f7f9944 | ||
|
|
7c75a911f7 | ||
|
|
4fa577e6f4 | ||
|
|
f6b7b7c042 | ||
|
|
1357d8d714 | ||
|
|
3649fdd3ff | ||
|
|
861b487f85 | ||
|
|
8ea9d44f2c | ||
|
|
d5b55f9a38 | ||
|
|
8837d9f313 | ||
|
|
77e740e5b3 | ||
|
|
702b2b2891 | ||
|
|
b59c13b2ff | ||
|
|
3b8c9e6177 | ||
|
|
baf3c2335c | ||
|
|
1d23636724 | ||
|
|
2f3090185b | ||
|
|
978413cf09 | ||
|
|
1b373fe80d | ||
|
|
ad0ce132e9 | ||
|
|
e915da51db | ||
|
|
c640f098dd | ||
|
|
afa513bf99 | ||
|
|
e992826344 | ||
|
|
9d1b6ab67f | ||
|
|
d217c0224c | ||
|
|
f18aaed3ce | ||
|
|
cede9b40a0 | ||
|
|
e7acf5cd13 | ||
|
|
9813ac154e | ||
|
|
f68f262fbd | ||
|
|
8612216f60 | ||
|
|
815e51804e | ||
|
|
f7c4619f5e | ||
|
|
90c3971d74 | ||
|
|
f6edc4234d | ||
|
|
6bfa198ee9 | ||
|
|
da0fcc518a | ||
|
|
7a7cdd3b68 | ||
|
|
5acc501904 | ||
|
|
d4bc283f20 | ||
|
|
70b9911d53 | ||
|
|
023bb10f71 | ||
|
|
5bf5168c92 | ||
|
|
e388ccea61 | ||
|
|
d0d118bb55 | ||
|
|
aa01e45ca6 | ||
|
|
5c1e58b79f | ||
|
|
803ac22b6b | ||
|
|
9909566102 | ||
|
|
388a1416f7 | ||
|
|
b862093dac | ||
|
|
a4454856fd | ||
|
|
bab149d8b1 | ||
|
|
d1d91195d9 | ||
|
|
d4620dbb86 | ||
|
|
e4df27e296 | ||
|
|
6f3c06da75 | ||
|
|
b364b5cf9d | ||
|
|
9ba8f9c9ed | ||
|
|
ca438e64c5 | ||
|
|
a8cfa4294c | ||
|
|
1e6ea40764 | ||
|
|
63f8516aeb | ||
|
|
f96765e155 | ||
|
|
a48118e7ef | ||
|
|
a26f53bdf1 | ||
|
|
479a31ac0c | ||
|
|
e1a1dfbbe6 | ||
|
|
5fa7692e35 | ||
|
|
aaec4f2632 | ||
|
|
7e75265125 | ||
|
|
f6e0c51f4e | ||
|
|
90c72465df | ||
|
|
11d8b4c79e | ||
|
|
095240f421 | ||
|
|
6dbe81fb17 | ||
|
|
953b61ad5b | ||
|
|
70fa9155fa | ||
|
|
761faa1298 | ||
|
|
6ec1bb5f41 | ||
|
|
9fa5548588 | ||
|
|
d815eb0d7a | ||
|
|
177cbdd112 | ||
|
|
0cee20e65f | ||
|
|
e435aad3c9 | ||
|
|
dd28f92425 | ||
|
|
c678e99e32 | ||
|
|
4c27978cbc | ||
|
|
be37a60ed6 | ||
|
|
31dee4fb83 | ||
|
|
f8685a7abc | ||
|
|
4aa623e53b | ||
|
|
3f1cace058 | ||
|
|
debea16d3d | ||
|
|
a01037bdff | ||
|
|
340db3385e | ||
|
|
d36101f251 | ||
|
|
e1e0ae826c | ||
|
|
ee6ea9ef15 | ||
|
|
4b8a63e362 | ||
|
|
3655420bff | ||
|
|
fbcff00d33 | ||
|
|
3ca10f742d | ||
|
|
e923c2d1f3 | ||
|
|
61cdd9d052 | ||
|
|
34dcccd5ed | ||
|
|
4ec6d1e9ab | ||
|
|
b26d081b93 | ||
|
|
f205149794 | ||
|
|
230e39283d | ||
|
|
470b7c4988 | ||
|
|
5868c93f64 | ||
|
|
dabbf2615a | ||
|
|
6e8b41c964 | ||
|
|
a4ba3f2dad | ||
|
|
cb9ef412b0 | ||
|
|
1327635718 | ||
|
|
91ef0bcc74 | ||
|
|
5cfeb00814 | ||
|
|
bc5b89f2dc | ||
|
|
ff5fe2d979 | ||
|
|
b3644582ab | ||
|
|
859283a07c | ||
|
|
9e9fcfbaa4 | ||
|
|
23d3fb6be2 | ||
|
|
32058159aa | ||
|
|
06fbd5c211 | ||
|
|
6a5ab3d595 | ||
|
|
9b4eab82e9 | ||
|
|
93e2c94ee0 | ||
|
|
cbebd8b51d | ||
|
|
a5a7892de4 | ||
|
|
ddf6d7811f | ||
|
|
46f1f2ed10 | ||
|
|
6c6693cb46 | ||
|
|
8403603dc8 | ||
|
|
2a33a67003 | ||
|
|
6948b8d749 | ||
|
|
1ffc3f9840 | ||
|
|
68011d4190 | ||
|
|
e9a70a8ab3 | ||
|
|
d81ce2f65c | ||
|
|
6c41e2ee42 | ||
|
|
4c2e112513 | ||
|
|
c5e9f9e5b8 | ||
|
|
658fb51f14 | ||
|
|
2659fbfca9 | ||
|
|
897f0afd57 | ||
|
|
0168f4f3d4 | ||
|
|
de359bd9dd | ||
|
|
ff82205e88 | ||
|
|
0c86ae72f1 | ||
|
|
f4a2bb8896 | ||
|
|
6cd4d74fa3 | ||
|
|
b83badc8be | ||
|
|
7067da9803 | ||
|
|
fe9d001c4d | ||
|
|
736917f300 | ||
|
|
d38d8d43ae | ||
|
|
286c96e606 | ||
|
|
5b6c64c6f7 | ||
|
|
84d66eab71 | ||
|
|
dca1987fb5 | ||
|
|
089e6ac746 | ||
|
|
2da9bf356d | ||
|
|
c6ddafe42b | ||
|
|
702dc54df1 | ||
|
|
bb2915684a | ||
|
|
5cdc76b6b4 | ||
|
|
6e1a887629 | ||
|
|
df2255dc38 | ||
|
|
daa33b828f | ||
|
|
6d971e656e | ||
|
|
e7ecf5f164 | ||
|
|
2b805791d8 | ||
|
|
2b88d5f79f | ||
|
|
3235582a15 | ||
|
|
7daa88599a | ||
|
|
c1c2294526 | ||
|
|
80cb66e92c | ||
|
|
83c9e70a81 | ||
|
|
efa74fc5bf | ||
|
|
d4d5831465 | ||
|
|
42214ff9e8 | ||
|
|
73ee629668 | ||
|
|
5d4576306a | ||
|
|
c072e7f84d | ||
|
|
d6569503d5 | ||
|
|
5f74c7d374 | ||
|
|
7faec92ebe | ||
|
|
d7e51fe60c | ||
|
|
84d33b36d9 | ||
|
|
2fc7d6a06e | ||
|
|
6be375b1cb | ||
|
|
1428d2222c | ||
|
|
66aa78a29d | ||
|
|
baa0e2b390 | ||
|
|
a190730b65 | ||
|
|
666fb34a50 | ||
|
|
6f3533688d | ||
|
|
b2dc10b682 | ||
|
|
37197303c8 | ||
|
|
fd8be6da0e | ||
|
|
0f742d7307 | ||
|
|
1d59e7a82d | ||
|
|
e0f51f967a | ||
|
|
90452c5d8d | ||
|
|
6c49aff129 | ||
|
|
b73ffc9f8a | ||
|
|
5ed0df1831 | ||
|
|
4d09bd3585 | ||
|
|
ef38f08cf3 | ||
|
|
58e65f63ec | ||
|
|
6776019bf6 | ||
|
|
d8a9899adb | ||
|
|
26c3855d83 | ||
|
|
2023dd87ef | ||
|
|
652904e67b | ||
|
|
5c42b00ddc | ||
|
|
49e44238ce | ||
|
|
8f05a1ce68 | ||
|
|
1d45486ac6 | ||
|
|
bfe00c828d | ||
|
|
69c11fceae | ||
|
|
93aededb81 | ||
|
|
60e75803ac | ||
|
|
a6aa8067d0 | ||
|
|
425ac11443 | ||
|
|
f4afe449dc | ||
|
|
a0aa5648bc | ||
|
|
e71b914cb8 | ||
|
|
b2d4f0797c | ||
|
|
0d69196a64 | ||
|
|
61a1b99c13 | ||
|
|
85a6e859ba | ||
|
|
298bf55b39 | ||
|
|
0d9d566017 | ||
|
|
2763578a61 | ||
|
|
5853fc0a5c | ||
|
|
eee5f887d2 | ||
|
|
0b89a68acc | ||
|
|
cd2d122aae | ||
|
|
a345d6bf2b | ||
|
|
af57a07bc9 | ||
|
|
0f32a2912d | ||
|
|
bb7a6a5e99 | ||
|
|
4c1fc5c81d | ||
|
|
b126a231f2 | ||
|
|
6c502a326a | ||
|
|
8e8d622b22 | ||
|
|
3aea062227 | ||
|
|
33e96a85e4 | ||
|
|
c4e5dfaae3 | ||
|
|
4b45577ac9 | ||
|
|
54665fce33 | ||
|
|
aa82961a76 | ||
|
|
603f214e2c | ||
|
|
6a2a16c6b1 | ||
|
|
6cc7a3b84f | ||
|
|
7566863a4f | ||
|
|
c405c7acb7 | ||
|
|
788e352701 | ||
|
|
b62f8af476 | ||
|
|
d7fbef52ba | ||
|
|
ed5cdfa144 | ||
|
|
bc5a700665 | ||
|
|
475a2ce0a0 | ||
|
|
bffbcf2a6a | ||
|
|
2938315764 | ||
|
|
0cde0dd327 | ||
|
|
0cf08d613a | ||
|
|
30da8a6373 | ||
|
|
493048e6c6 | ||
|
|
c569d6e9c8 | ||
|
|
5547506845 | ||
|
|
980b08e0b4 | ||
|
|
48a7c6052f | ||
|
|
7561ca52ba | ||
|
|
20583a52d7 | ||
|
|
803ce276fd | ||
|
|
8ced002288 | ||
|
|
56eef5d861 | ||
|
|
8a040acaeb | ||
|
|
8ad5177715 | ||
|
|
98e5289b7f | ||
|
|
a283748561 | ||
|
|
b54dc58652 | ||
|
|
3db46764e4 | ||
|
|
0ea7ea90bd | ||
|
|
5de9756c44 | ||
|
|
9e49fcd052 | ||
|
|
7aeda8cec5 | ||
|
|
96cbcb047e | ||
|
|
df09ece395 | ||
|
|
e50c3ec7f8 | ||
|
|
8e2cb933b7 | ||
|
|
4d2dbd2d44 | ||
|
|
42a5fa0d1e | ||
|
|
5c90093b73 | ||
|
|
776e5ecec6 | ||
|
|
92d767791d | ||
|
|
e1908fa301 | ||
|
|
be4d5d7671 | ||
|
|
0972ea48a9 | ||
|
|
83e811b64f | ||
|
|
b78d1ec333 | ||
|
|
85ae37da78 | ||
|
|
bec5276b9f | ||
|
|
cb30efb89e | ||
|
|
61fe1a668e | ||
|
|
0953651f6e | ||
|
|
d263283326 | ||
|
|
ab0cb6a773 | ||
|
|
1b99fdbe03 | ||
|
|
f25ec931ad | ||
|
|
9e71fe211a | ||
|
|
f3344cf11d | ||
|
|
2dbce65b75 | ||
|
|
b022adc3a3 | ||
|
|
fd0d59b9cb | ||
|
|
e4ce4ce9c2 | ||
|
|
a19e846fb7 | ||
|
|
dfa9da928f | ||
|
|
a6b4a9237e | ||
|
|
957ba2a03c | ||
|
|
e3bd483d6d | ||
|
|
06c43c698d | ||
|
|
206fb3cf8a | ||
|
|
c63cccddc4 | ||
|
|
4b84bc3b93 | ||
|
|
63722ffd25 | ||
|
|
d63734bd7c | ||
|
|
3a8cbb74ba | ||
|
|
0a9826f72e | ||
|
|
2c2e35e558 | ||
|
|
b7a12ea662 | ||
|
|
dcee97a48c | ||
|
|
100ec5b7d8 | ||
|
|
e37ac4394d | ||
|
|
2fca3d8b3b | ||
|
|
a0714881b4 | ||
|
|
dc7d5bd44d | ||
|
|
f5c2644e2d | ||
|
|
14c136bd0a | ||
|
|
4453316fa4 | ||
|
|
dece0a4c69 | ||
|
|
703ccf6538 | ||
|
|
44bad6a17d | ||
|
|
af4325a847 | ||
|
|
37076d0944 | ||
|
|
882afee8bf | ||
|
|
c09469ba83 | ||
|
|
dada50011d | ||
|
|
0fbced8b2d | ||
|
|
f1175b9b7f | ||
|
|
1d5270bce0 | ||
|
|
4e8727c89b | ||
|
|
846eb23b55 | ||
|
|
43a0f7d0f1 | ||
|
|
decc261f32 | ||
|
|
ec41c15e74 | ||
|
|
8ed2a4ef10 | ||
|
|
6387eb8a28 | ||
|
|
aa9325096f | ||
|
|
6272a6fe04 | ||
|
|
f849f526cc | ||
|
|
b7449a593a | ||
|
|
335c8f0290 | ||
|
|
f3d4125604 | ||
|
|
dd0cda9333 | ||
|
|
31a8500fec | ||
|
|
5e4e0a9a43 | ||
|
|
d47131b7ab | ||
|
|
24508041d9 | ||
|
|
95cb510621 | ||
|
|
280275eaae | ||
|
|
7ca6eb25d7 | ||
|
|
93261b19f9 | ||
|
|
ce23ff88d6 | ||
|
|
285d573e76 | ||
|
|
6b3cf6a99b | ||
|
|
c4dc813dae | ||
|
|
3e64a73ed2 | ||
|
|
adf55cf01f | ||
|
|
dfcc8aed7a | ||
|
|
33f1eecc5b | ||
|
|
6a8e099fb5 | ||
|
|
283587c032 | ||
|
|
280b1ae0e1 | ||
|
|
81ea8eff5a | ||
|
|
101a3d97f8 | ||
|
|
713b02c036 | ||
|
|
a9aa04dac1 | ||
|
|
d92caad2bc | ||
|
|
18d0024c30 | ||
|
|
15b1c19501 | ||
|
|
4c56854a4c | ||
|
|
2103e42bc5 | ||
|
|
999b23b9cb | ||
|
|
31b97772a4 | ||
|
|
4144c9ddf9 | ||
|
|
f1958bb005 | ||
|
|
1186ad23b3 | ||
|
|
3837ba418f | ||
|
|
f2958638f4 | ||
|
|
2303fcb2c6 | ||
|
|
a8c58cc330 | ||
|
|
c712f4642d | ||
|
|
178eae1c33 | ||
|
|
3398d86c5e | ||
|
|
25ffee6d3a | ||
|
|
8a1e3fa9a2 | ||
|
|
eb6f1ab945 | ||
|
|
b34ea2d32f | ||
|
|
f4e184b6da | ||
|
|
6ac99f7bd4 | ||
|
|
cf4430dc17 | ||
|
|
af8e00fc84 | ||
|
|
b7aac6e05d | ||
|
|
727892af71 | ||
|
|
ebfdbff82b | ||
|
|
c6565a1f94 | ||
|
|
d8b090823e | ||
|
|
36733638a8 | ||
|
|
5995010a02 | ||
|
|
7dd1010299 | ||
|
|
645eecc9e0 | ||
|
|
4b77c976ca | ||
|
|
245099e33b | ||
|
|
6b0572e738 | ||
|
|
9ecaafa2cb | ||
|
|
edacc6c4f0 | ||
|
|
fb78102ab6 | ||
|
|
62a5665bf7 | ||
|
|
47dee01dff | ||
|
|
a48d7a23e2 | ||
|
|
436429c870 | ||
|
|
1ffbb44449 | ||
|
|
981d03b524 | ||
|
|
1df892c53a | ||
|
|
5c12770f59 | ||
|
|
233e4b7466 | ||
|
|
4a7683dd32 | ||
|
|
bbbfc9f661 | ||
|
|
a40dffc1b2 | ||
|
|
18bfc3e241 | ||
|
|
bd89999539 | ||
|
|
7bdc16f2c5 | ||
|
|
7ce28495d4 | ||
|
|
a91dbcdeef | ||
|
|
1401557381 | ||
|
|
18b47ed7f5 | ||
|
|
4aee1f6a8d | ||
|
|
d56a66b04f | ||
|
|
1e5e7e1ab7 | ||
|
|
67d5aaf19e | ||
|
|
8c14be8382 | ||
|
|
11311a71f0 | ||
|
|
4ba80c3f60 | ||
|
|
dd8fc4ea12 | ||
|
|
43f18a9559 | ||
|
|
03e8b654a5 | ||
|
|
127d5e05ca | ||
|
|
b22687d856 | ||
|
|
80f6eb133a | ||
|
|
e08a83bce2 | ||
|
|
70b5ec36a2 | ||
|
|
d9bbf267a4 | ||
|
|
e27f2d31d1 | ||
|
|
f4e6b1cc64 | ||
|
|
820dec6612 | ||
|
|
5e7c16965f | ||
|
|
50566bf303 | ||
|
|
4f55bc2839 | ||
|
|
3c76faebbf | ||
|
|
8b74350436 | ||
|
|
a028fe1e49 | ||
|
|
28600b046a | ||
|
|
2ac6a4aed8 | ||
|
|
a205f73f8e | ||
|
|
56cdf95bb4 | ||
|
|
2031d25572 | ||
|
|
f364feb7b5 | ||
|
|
236b64d8f6 | ||
|
|
3f02003ed3 | ||
|
|
df978a2824 | ||
|
|
c04ca455ea | ||
|
|
7774ef9ba2 | ||
|
|
40a2df2a73 | ||
|
|
11bff77826 | ||
|
|
fd8ed694b8 | ||
|
|
6f0bb4a82f | ||
|
|
f492d938ed | ||
|
|
a8f3411e53 | ||
|
|
4341a77257 | ||
|
|
990f3ece05 | ||
|
|
96e1833971 | ||
|
|
3dfc653eb6 | ||
|
|
ce4f0a09ef | ||
|
|
187be0e513 | ||
|
|
982b63afe8 | ||
|
|
b93c17931f | ||
|
|
1145299f1b | ||
|
|
51fe41504a | ||
|
|
aaaade5dae | ||
|
|
0c94851700 | ||
|
|
fc89040251 | ||
|
|
abfa6f0f54 | ||
|
|
b11eefd25d | ||
|
|
b37affa771 | ||
|
|
4292586fd0 | ||
|
|
6e62a8fcf9 | ||
|
|
de6b76848a | ||
|
|
5249f29b22 | ||
|
|
e19f4be4db | ||
|
|
c0eb1d0ba8 | ||
|
|
1e8525ba94 | ||
|
|
63e892c254 | ||
|
|
bbc3a287ab | ||
|
|
ff99281985 | ||
|
|
9e339dbbb8 | ||
|
|
e62006872c | ||
|
|
844f80bac5 | ||
|
|
addaa817e7 | ||
|
|
c3d3131470 | ||
|
|
7bbefb58bd | ||
|
|
7631a99b6c | ||
|
|
e6a0f240ea | ||
|
|
dccf5eca52 | ||
|
|
18a7887f46 | ||
|
|
1a75b54dac | ||
|
|
2ed8c0f9ae | ||
|
|
cf35c168f8 | ||
|
|
27cf8fbeb9 | ||
|
|
ecdae129f6 | ||
|
|
e25280ba09 | ||
|
|
8e739ea8f1 | ||
|
|
f5f40c7ccf | ||
|
|
fcadab21b6 | ||
|
|
74f544ab6b | ||
|
|
8286f1a0b6 | ||
|
|
b40dc31579 | ||
|
|
f30b2bca83 | ||
|
|
c9298c88c5 | ||
|
|
adc99a2416 | ||
|
|
723e423aa5 | ||
|
|
950d7c4725 | ||
|
|
9900fe019a | ||
|
|
acedb2b62f | ||
|
|
babb384fba | ||
|
|
1f5f0de751 | ||
|
|
f6d10cf5dc | ||
|
|
ff5eb1a9ac | ||
|
|
842f7296fa | ||
|
|
8efc1ba172 | ||
|
|
afa3b96044 | ||
|
|
8360c5b884 | ||
|
|
6658a7250b | ||
|
|
63a890d6ab | ||
|
|
7cbc3b072a | ||
|
|
6904200d9f | ||
|
|
7896275527 | ||
|
|
87e3ddb706 | ||
|
|
cb2966b1b8 | ||
|
|
bcad1ecd59 | ||
|
|
49881d71d1 | ||
|
|
8c6712d3f0 | ||
|
|
4563419f9f | ||
|
|
9f20756e4e | ||
|
|
8a0f4af8b5 | ||
|
|
4141615700 | ||
|
|
7d8b8e4508 | ||
|
|
c27a6ca555 | ||
|
|
0735fcc76b | ||
|
|
7459a56409 | ||
|
|
cecbb4b81a | ||
|
|
d6ee02fca5 | ||
|
|
4fefe54b4c | ||
|
|
5adc75835e | ||
|
|
e63bc31c09 | ||
|
|
ed62a76261 | ||
|
|
fd4d08b584 | ||
|
|
e81aea6ced | ||
|
|
ebdd6292aa | ||
|
|
4d091e6689 | ||
|
|
f2452f01e4 | ||
|
|
9837370712 | ||
|
|
d0f7d81b8b | ||
|
|
53e9b1c194 | ||
|
|
115277c443 | ||
|
|
5baec57d29 | ||
|
|
3dd9bf9212 | ||
|
|
bdd3b0e48b | ||
|
|
0ebf81c267 | ||
|
|
d6a27a168a | ||
|
|
4363bc3667 | ||
|
|
b68025ec01 | ||
|
|
0159fc4751 | ||
|
|
cc386232d2 | ||
|
|
80b949cdb6 | ||
|
|
46184bc6ca | ||
|
|
3f84dac089 | ||
|
|
2370ef5473 | ||
|
|
1d71d0eb6c |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -16,3 +16,7 @@ NashornProfile.txt
|
|||||||
**/JTreport/**
|
**/JTreport/**
|
||||||
**/JTwork/**
|
**/JTwork/**
|
||||||
/src/utils/LogCompilation/target/
|
/src/utils/LogCompilation/target/
|
||||||
|
/.project/
|
||||||
|
/.settings/
|
||||||
|
*.class
|
||||||
|
.idea/workspace.xml
|
||||||
|
|||||||
180
README.md
180
README.md
@@ -1,11 +1,175 @@
|
|||||||
# Welcome to the JDK!
|
[](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
|
||||||
|
|
||||||
For build instructions please see the
|
# Welcome to JetBrains Runtime!
|
||||||
[online documentation](https://openjdk.java.net/groups/build/doc/building.html),
|
|
||||||
or either of these files:
|
|
||||||
|
|
||||||
- [doc/building.html](doc/building.html) (html version)
|
JetBrains Runtime is a fork of [OpenJDK](https://github.com/openjdk/jdk) available for Windows, Mac OS X, and Linux.
|
||||||
- [doc/building.md](doc/building.md) (markdown version)
|
It includes a number enhancements in font rendering, HiDPI support, ligatures, performance improvements, and bugfixes.
|
||||||
|
|
||||||
See <https://openjdk.java.net/> for more information about
|
## Releases
|
||||||
the OpenJDK Community and the JDK.
|
Download the latest releases of JetBrains Runtime to use with JetBrains IDEs. The full list
|
||||||
|
can be found on the [releases page](https://github.com/JetBrains/JetBrainsRuntime/releases).
|
||||||
|
|
||||||
|
| IDE Version | Latest JBR | Date Released |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 2021.3 | [17-b106.1](https://github.com/JetBrains/JetBrainsRuntime/releases/tag/jbr17b106.1) | 28-Sep-2021 |
|
||||||
|
|
||||||
|
## Contents
|
||||||
|
- [Welcome to JetBrains Runtime](#jetbrains-runtime)
|
||||||
|
- [Products Built on JetBrains Runtime](#products-built-on-jetbrains-runtime)
|
||||||
|
- [Getting Sources](#getting-sources)
|
||||||
|
- [macOS, Linux](#macos-linux)
|
||||||
|
- [Windows](#sources-windows)
|
||||||
|
- [Configuring the Build Environment](#configuring-the-build-environment)
|
||||||
|
- [Linux (Docker)](#linux-docker)
|
||||||
|
- [Ubuntu Linux](#ubuntu-linux)
|
||||||
|
- [Windows](#build-windows)
|
||||||
|
- [macOS](#macos)
|
||||||
|
- [Developing](#developing)
|
||||||
|
- [Contributing](#contributing)
|
||||||
|
- [Resources](#resources)
|
||||||
|
|
||||||
|
## Products Built on JetBrains Runtime
|
||||||
|
* [Android Studio](https://developer.android.com/studio). The official IDE for Google's Android operating system.
|
||||||
|
* [CLion](https://www.jetbrains.com/clion/). A cross-platform IDE for C and C++ from JetBrains.
|
||||||
|
* [DataGrip](https://www.jetbrains.com/datagrip/). The IDE for Databases and SQL from JetBrains.
|
||||||
|
* [GoLand](https://www.jetbrains.com/go/). The cross-platform Go IDE from JetBrains.
|
||||||
|
* [IntelliJ IDEA](https://www.jetbrains.com/idea/). The IDE for JVM from JetBrains.
|
||||||
|
* [JProfiler](https://www.ej-technologies.com/products/jprofiler/overview.html). The Java profiler.
|
||||||
|
* [PhpStorm](https://www.jetbrains.com/phpstorm/). The PHP IDE from JetBrains.
|
||||||
|
* [PyCharm](https://www.jetbrains.com/pycharm/). The Python IDE from JetBrains.
|
||||||
|
* [Rider](https://www.jetbrains.com/rider/). The cross-platform .NET IDE from JetBrains.
|
||||||
|
* [RubyMine](https://www.jetbrains.com/ruby/). The Ruby and Rails IDE from JetBrains.
|
||||||
|
* [WebStorm](https://www.jetbrains.com/webstorm/). The JavaScript IDE from JetBrains.
|
||||||
|
* [YourKit](https://www.yourkit.com/). Java and .NET profilers.
|
||||||
|
|
||||||
|
## Getting Sources
|
||||||
|
### macOS, Linux
|
||||||
|
```
|
||||||
|
git config --global core.autocrlf input
|
||||||
|
git clone git@github.com:JetBrains/JetBrainsRuntime.git
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
<a name="sources-windows"></a>
|
||||||
|
```
|
||||||
|
git config --global core.autocrlf false
|
||||||
|
git clone git@github.com:JetBrains/JetBrainsRuntime.git
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuring the Build Environment
|
||||||
|
Here are quick per-platform instructions for those who can't wait to get started.
|
||||||
|
Please refer to [OpenJDK build docs](https://openjdk.java.net/groups/build/doc/building.html) for in-depth
|
||||||
|
coverage of all the details.
|
||||||
|
|
||||||
|
> **_TIP:_** To get a preliminary report of what's missing, run `./configure` and check its output.
|
||||||
|
> It would usually have a meaningful advice on how to solve the problem.
|
||||||
|
|
||||||
|
### Linux (Docker)
|
||||||
|
Create a container:
|
||||||
|
```
|
||||||
|
$ cd jb/project/docker
|
||||||
|
$ docker build .
|
||||||
|
...
|
||||||
|
Successfully built 942ea9900054
|
||||||
|
```
|
||||||
|
Run these commands in the new container:
|
||||||
|
```
|
||||||
|
$ docker run -v `pwd`../../../../:/JetBrainsRuntime -it 942ea9900054
|
||||||
|
# cd /JetBrainsRuntime
|
||||||
|
# git checkout master17
|
||||||
|
# sh ./configure
|
||||||
|
# make images CONF=linux-x86_64-normal-server-release
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ubuntu Linux
|
||||||
|
Install the necessary tools, libraries, and headers with:
|
||||||
|
```
|
||||||
|
$ sudo apt-get install autoconf make build-essential libx11-dev libxext-dev libxrender-dev libxtst-dev \
|
||||||
|
libxt-dev libxrandr-dev libcups2-dev libfontconfig1-dev libasound2-dev \
|
||||||
|
java-16-amazon-corretto-jdk
|
||||||
|
```
|
||||||
|
Then run the following:
|
||||||
|
```
|
||||||
|
$ cd JetBrainsRuntime
|
||||||
|
$ git checkout master17
|
||||||
|
$ sh ./configure
|
||||||
|
$ make images
|
||||||
|
```
|
||||||
|
This will build the release configuration under `./build/linux-x86_64-server-release/`.
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
<a name="build-windows"></a>
|
||||||
|
Install the following:
|
||||||
|
* [Cygwin x64](http://www.cygwin.com/).
|
||||||
|
Required packages: `autoconf`, `binutils`, `cpio`, `diffutils`, `file`, `gawk`, `gcc-core`, `make`, `m4`, `unzip`, `zip`.
|
||||||
|
Install those together with Cygwin.
|
||||||
|
* [Visual Studio compiler toolset](https://visualstudio.microsoft.com/downloads/).
|
||||||
|
Install with the desktop development kit, which includes Windows SDK and compilers.
|
||||||
|
Visual Studio 2019 is supported by default.
|
||||||
|
* Java 16 (for instance, from [AdoptOpenJDK](https://adoptopenjdk.net/installation.html?variant=openjdk16&jvmVariant=hotspot#)).
|
||||||
|
If you have problems while configuring, read [Java tips on Cygwin](http://horstmann.com/articles/cygwin-tips.html).
|
||||||
|
|
||||||
|
From the command line:
|
||||||
|
```
|
||||||
|
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64
|
||||||
|
"c:\Program_Files\cygwin64\bin\mintty.exe" /bin/bash -l
|
||||||
|
```
|
||||||
|
The first command sets up environment variables, the second starts a Cygwin shell with the proper environment.
|
||||||
|
|
||||||
|
In the Cygwin shell:
|
||||||
|
```
|
||||||
|
$ cd JetBrainsRuntime
|
||||||
|
$ git checkout master17
|
||||||
|
$ bash configure --with-toolchain-version=2019
|
||||||
|
$ make images
|
||||||
|
```
|
||||||
|
This will build the release configuration under `./build/windows-x86_64-server-release/`.
|
||||||
|
|
||||||
|
### macOS
|
||||||
|
Install the following:
|
||||||
|
* Xcode command line developer tools and `autoconf` via [Homebrew](getDpiInfo).
|
||||||
|
* Java 16 (for instance, from [AdoptOpenJDK](https://adoptopenjdk.net/installation.html?variant=openjdk16&jvmVariant=hotspot#)).
|
||||||
|
|
||||||
|
From the command line:
|
||||||
|
```
|
||||||
|
$ cd JetBrainsRuntime
|
||||||
|
$ git checkout master17
|
||||||
|
$ sh ./configure
|
||||||
|
$ make images
|
||||||
|
```
|
||||||
|
This will build the release configuration under `./build/macosx-x86_64-server-release/`.
|
||||||
|
|
||||||
|
## Developing
|
||||||
|
You can use [CLion](https://www.jetbrains.com/clion/) to develop native parts of the JetBrains Runtime and
|
||||||
|
[IntelliJ IDEA](https://www.jetbrains.com/idea/) for the parts written in Java.
|
||||||
|
Both require projects to be created.
|
||||||
|
|
||||||
|
### CLion
|
||||||
|
Run
|
||||||
|
```
|
||||||
|
$ make compile-commands
|
||||||
|
```
|
||||||
|
in the git root and open the resulting `build/.../compile_commands.json` file as a project.
|
||||||
|
Then use `Tools | Compilation Database | Change Project Root` to point to git root of this repository.
|
||||||
|
|
||||||
|
See also this detailed step-by-step tutorial for all platforms:
|
||||||
|
[How to develop OpenJDK with CLion](https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/).
|
||||||
|
|
||||||
|
### IDEA
|
||||||
|
Run
|
||||||
|
```
|
||||||
|
$ sh ./bin/idea.sh
|
||||||
|
```
|
||||||
|
in the git root to generate project files (add `--help` for options). If you have multiple
|
||||||
|
configurations (for example, `release` and `fastdebug`), supply the `--conf <conf_name>` argument.
|
||||||
|
Then open the git root directory as a project in IDEA.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
We are happy to receive your pull requests!
|
||||||
|
Before you submit one, please sign our [Contributor License Agreement (CLA)](https://www.jetbrains.com/agreements/cla/).
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
* [JetBrains Runtime on github](https://github.com/JetBrains/JetBrainsRuntime).
|
||||||
|
* [OpenJDK build instructions](https://openjdk.java.net/groups/build/doc/building.html).
|
||||||
|
* [OpenJDK test instructions](https://htmlpreview.github.io/?https://raw.githubusercontent.com/openjdk/jdk/master/doc/building.html#running-tests).
|
||||||
|
* [How to develop OpenJDK with CLion](https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/).
|
||||||
|
|||||||
292
bin/idea.sh
292
bin/idea.sh
@@ -25,7 +25,26 @@
|
|||||||
# Shell script for generating an IDEA project from a given list of modules
|
# Shell script for generating an IDEA project from a given list of modules
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
echo "usage: $0 [-h|--help] [-v|--verbose] [-o|--output <path>] [modules]+"
|
echo "Usage: $0 [-h|--help] [-q|--quiet] [-a|--absolute-paths] [-r|--root <path>] [-o|--output <path>] [-c|--conf <conf_name>] [modules...]"
|
||||||
|
echo " -h | --help"
|
||||||
|
echo " -q | --quiet
|
||||||
|
No stdout output"
|
||||||
|
echo " -a | --absolute-paths
|
||||||
|
Use absolute paths to this jdk, so that generated .idea
|
||||||
|
project files can be moved independently of jdk sources"
|
||||||
|
echo " -r | --root <path>
|
||||||
|
Project content root
|
||||||
|
Default: $TOPLEVEL_DIR"
|
||||||
|
echo " -o | --output <path>
|
||||||
|
Where .idea directory with project files will be generated
|
||||||
|
(e.g. using '-o .' will place project files in './.idea')
|
||||||
|
Default: same as --root"
|
||||||
|
echo " -c | --conf <conf_name>
|
||||||
|
make configuration (release, slowdebug etc)"
|
||||||
|
echo " [modules...]
|
||||||
|
Generate project modules for specific java modules
|
||||||
|
(e.g. 'java.base java.desktop')
|
||||||
|
Default: all existing modules (java.* and jdk.*)"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,10 +52,14 @@ SCRIPT_DIR=`dirname $0`
|
|||||||
#assume TOP is the dir from which the script has been called
|
#assume TOP is the dir from which the script has been called
|
||||||
TOP=`pwd`
|
TOP=`pwd`
|
||||||
cd $SCRIPT_DIR; SCRIPT_DIR=`pwd`
|
cd $SCRIPT_DIR; SCRIPT_DIR=`pwd`
|
||||||
|
if [ "x$TOPLEVEL_DIR" = "x" ] ; then
|
||||||
|
cd .. ; TOPLEVEL_DIR=`pwd`
|
||||||
|
fi
|
||||||
cd $TOP;
|
cd $TOP;
|
||||||
|
|
||||||
IDEA_OUTPUT=$TOP/.idea
|
VERBOSE=true
|
||||||
VERBOSE="false"
|
ABSOLUTE_PATHS=false
|
||||||
|
CONF_ARG=
|
||||||
while [ $# -gt 0 ]
|
while [ $# -gt 0 ]
|
||||||
do
|
do
|
||||||
case $1 in
|
case $1 in
|
||||||
@@ -44,12 +67,26 @@ do
|
|||||||
usage
|
usage
|
||||||
;;
|
;;
|
||||||
|
|
||||||
-v | --vebose )
|
-q | --quiet )
|
||||||
VERBOSE="true"
|
VERBOSE=false
|
||||||
|
;;
|
||||||
|
|
||||||
|
-a | --absolute-paths )
|
||||||
|
ABSOLUTE_PATHS=true
|
||||||
|
;;
|
||||||
|
|
||||||
|
-r | --root )
|
||||||
|
TOPLEVEL_DIR="$2"
|
||||||
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
||||||
-o | --output )
|
-o | --output )
|
||||||
IDEA_OUTPUT=$2/.idea
|
IDEA_OUTPUT="$2/.idea"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
|
-c | --conf )
|
||||||
|
CONF_ARG="CONF_NAME=$2"
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -64,20 +101,21 @@ do
|
|||||||
shift
|
shift
|
||||||
done
|
done
|
||||||
|
|
||||||
mkdir -p $IDEA_OUTPUT || exit 1
|
if [ "x$IDEA_OUTPUT" = "x" ] ; then
|
||||||
cd $IDEA_OUTPUT; IDEA_OUTPUT=`pwd`
|
IDEA_OUTPUT="$TOPLEVEL_DIR/.idea"
|
||||||
|
|
||||||
if [ "x$TOPLEVEL_DIR" = "x" ] ; then
|
|
||||||
cd $SCRIPT_DIR/..
|
|
||||||
TOPLEVEL_DIR=`pwd`
|
|
||||||
cd $IDEA_OUTPUT
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
MAKE_DIR="$SCRIPT_DIR/../make"
|
mkdir -p $IDEA_OUTPUT || exit 1
|
||||||
IDEA_MAKE="$MAKE_DIR/ide/idea/jdk"
|
cd "$TOP" ; cd $TOPLEVEL_DIR; TOPLEVEL_DIR=`pwd`
|
||||||
|
cd "$TOP" ; cd $IDEA_OUTPUT; IDEA_OUTPUT=`pwd`
|
||||||
|
cd ..; IDEA_OUTPUT_PARENT=`pwd`
|
||||||
|
cd "$SCRIPT_DIR/.." ; OPENJDK_DIR=`pwd`
|
||||||
|
|
||||||
|
IDEA_MAKE="$OPENJDK_DIR/make/ide/idea/jdk"
|
||||||
IDEA_TEMPLATE="$IDEA_MAKE/template"
|
IDEA_TEMPLATE="$IDEA_MAKE/template"
|
||||||
|
|
||||||
cp -r "$IDEA_TEMPLATE"/* "$IDEA_OUTPUT"
|
cp -rn "$TOPLEVEL_DIR/jb/project/idea-project-files"/* "$IDEA_OUTPUT"
|
||||||
|
cp -rn "$IDEA_TEMPLATE"/* "$IDEA_OUTPUT"
|
||||||
|
|
||||||
#override template
|
#override template
|
||||||
if [ -d "$TEMPLATES_OVERRIDE" ] ; then
|
if [ -d "$TEMPLATES_OVERRIDE" ] ; then
|
||||||
@@ -86,31 +124,31 @@ if [ -d "$TEMPLATES_OVERRIDE" ] ; then
|
|||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$VERBOSE" = "true" ] ; then
|
if [ "$VERBOSE" = true ] ; then
|
||||||
echo "output dir: $IDEA_OUTPUT"
|
echo "Will generate IDEA project files in \"$IDEA_OUTPUT\" for project \"$TOPLEVEL_DIR\""
|
||||||
echo "idea template dir: $IDEA_TEMPLATE"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd $TOP ; make -f "$IDEA_MAKE/idea.gmk" -I $MAKE_DIR/.. idea MAKEOVERRIDES= OUT=$IDEA_OUTPUT/env.cfg MODULES="$*" || exit 1
|
cd $TOP ; make -f "$IDEA_MAKE/idea.gmk" -I "$OPENJDK_DIR" idea TOPLEVEL_DIR="$TOPLEVEL_DIR" \
|
||||||
|
MAKEOVERRIDES= IDEA_OUTPUT_PARENT="$IDEA_OUTPUT_PARENT" OUT="$IDEA_OUTPUT/env.cfg" MODULES="$*" $CONF_ARG || exit 1
|
||||||
cd $SCRIPT_DIR
|
cd $SCRIPT_DIR
|
||||||
|
|
||||||
. $IDEA_OUTPUT/env.cfg
|
. $IDEA_OUTPUT/env.cfg
|
||||||
|
|
||||||
# Expect MODULE_ROOTS, MODULE_NAMES, BOOT_JDK & SPEC to be set
|
# Expect MODULES, MODULE_NAMES, RELATIVE_PROJECT_DIR, RELATIVE_BUILD_DIR to be set
|
||||||
if [ "x$MODULE_ROOTS" = "x" ] ; then
|
if [ "xMODULES" = "x" ] ; then
|
||||||
echo "FATAL: MODULE_ROOTS is empty" >&2; exit 1
|
echo "FATAL: MODULES is empty" >&2; exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "x$MODULE_NAMES" = "x" ] ; then
|
if [ "x$MODULE_NAMES" = "x" ] ; then
|
||||||
echo "FATAL: MODULE_NAMES is empty" >&2; exit 1
|
echo "FATAL: MODULE_NAMES is empty" >&2; exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "x$BOOT_JDK" = "x" ] ; then
|
if [ "x$RELATIVE_PROJECT_DIR" = "x" ] ; then
|
||||||
echo "FATAL: BOOT_JDK is empty" >&2; exit 1
|
echo "FATAL: RELATIVE_PROJECT_DIR is empty" >&2; exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "x$SPEC" = "x" ] ; then
|
if [ "x$RELATIVE_BUILD_DIR" = "x" ] ; then
|
||||||
echo "FATAL: SPEC is empty" >&2; exit 1
|
echo "FATAL: RELATIVE_BUILD_DIR is empty" >&2; exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -d "$TOPLEVEL_DIR/.hg" ] ; then
|
if [ -d "$TOPLEVEL_DIR/.hg" ] ; then
|
||||||
@@ -121,6 +159,43 @@ if [ -d "$TOPLEVEL_DIR/.git" ] ; then
|
|||||||
VCS_TYPE="Git"
|
VCS_TYPE="Git"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$ABSOLUTE_PATHS" = true ] ; then
|
||||||
|
if [ "x$PATHTOOL" != "x" ]; then
|
||||||
|
PROJECT_DIR="`$PATHTOOL -am $OPENJDK_DIR`"
|
||||||
|
TOPLEVEL_PROJECT_DIR="`$PATHTOOL -am $TOPLEVEL_DIR`"
|
||||||
|
else
|
||||||
|
PROJECT_DIR="$OPENJDK_DIR"
|
||||||
|
TOPLEVEL_PROJECT_DIR="$TOPLEVEL_DIR"
|
||||||
|
fi
|
||||||
|
MODULE_DIR="$PROJECT_DIR"
|
||||||
|
TOPLEVEL_MODULE_DIR="$TOPLEVEL_PROJECT_DIR"
|
||||||
|
cd "$IDEA_OUTPUT_PARENT" && cd "$RELATIVE_BUILD_DIR" && BUILD_DIR="`pwd`"
|
||||||
|
CLION_SCRIPT_TOPDIR="$OPENJDK_DIR"
|
||||||
|
CLION_PROJECT_DIR="$PROJECT_DIR"
|
||||||
|
else
|
||||||
|
if [ "$RELATIVE_PROJECT_DIR" = "." ] ; then
|
||||||
|
PROJECT_DIR=""
|
||||||
|
else
|
||||||
|
PROJECT_DIR="/$RELATIVE_PROJECT_DIR"
|
||||||
|
fi
|
||||||
|
if [ "$RELATIVE_TOPLEVEL_PROJECT_DIR" = "." ] ; then
|
||||||
|
TOPLEVEL_PROJECT_DIR=""
|
||||||
|
else
|
||||||
|
TOPLEVEL_PROJECT_DIR="/$RELATIVE_TOPLEVEL_PROJECT_DIR"
|
||||||
|
fi
|
||||||
|
MODULE_DIR="\$MODULE_DIR\$$PROJECT_DIR"
|
||||||
|
PROJECT_DIR="\$PROJECT_DIR\$$PROJECT_DIR"
|
||||||
|
TOPLEVEL_MODULE_DIR="\$MODULE_DIR\$$TOPLEVEL_PROJECT_DIR"
|
||||||
|
TOPLEVEL_PROJECT_DIR="\$PROJECT_DIR\$$TOPLEVEL_PROJECT_DIR"
|
||||||
|
BUILD_DIR="\$PROJECT_DIR\$/$RELATIVE_BUILD_DIR"
|
||||||
|
CLION_SCRIPT_TOPDIR="$CLION_RELATIVE_PROJECT_DIR"
|
||||||
|
CLION_PROJECT_DIR="\$PROJECT_DIR\$/$CLION_SCRIPT_TOPDIR"
|
||||||
|
fi
|
||||||
|
if [ "$VERBOSE" = true ] ; then
|
||||||
|
echo "Project root: $PROJECT_DIR"
|
||||||
|
echo "Generating IDEA project files..."
|
||||||
|
fi
|
||||||
|
|
||||||
### Replace template variables
|
### Replace template variables
|
||||||
|
|
||||||
NUM_REPLACEMENTS=0
|
NUM_REPLACEMENTS=0
|
||||||
@@ -144,105 +219,106 @@ add_replacement() {
|
|||||||
eval TO$NUM_REPLACEMENTS='$2'
|
eval TO$NUM_REPLACEMENTS='$2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
add_replacement "###PATHTOOL###" "$PATHTOOL"
|
||||||
|
add_replacement "###CLION_SCRIPT_TOPDIR###" "$CLION_SCRIPT_TOPDIR"
|
||||||
|
add_replacement "###CLION_PROJECT_DIR###" "$CLION_PROJECT_DIR"
|
||||||
|
add_replacement "###PROJECT_DIR###" "$PROJECT_DIR"
|
||||||
|
add_replacement "###MODULE_DIR###" "$MODULE_DIR"
|
||||||
|
add_replacement "###TOPLEVEL_PROJECT_DIR###" "$TOPLEVEL_PROJECT_DIR"
|
||||||
|
add_replacement "###TOPLEVEL_MODULE_DIR###" "$TOPLEVEL_MODULE_DIR"
|
||||||
add_replacement "###MODULE_NAMES###" "$MODULE_NAMES"
|
add_replacement "###MODULE_NAMES###" "$MODULE_NAMES"
|
||||||
add_replacement "###VCS_TYPE###" "$VCS_TYPE"
|
add_replacement "###VCS_TYPE###" "$VCS_TYPE"
|
||||||
SPEC_DIR=`dirname $SPEC`
|
add_replacement "###BUILD_DIR###" "$BUILD_DIR"
|
||||||
if [ "x$CYGPATH" != "x" ]; then
|
add_replacement "###RELATIVE_BUILD_DIR###" "$RELATIVE_BUILD_DIR"
|
||||||
add_replacement "###BUILD_DIR###" "`cygpath -am $SPEC_DIR`"
|
if [ "x$PATHTOOL" != "x" ]; then
|
||||||
add_replacement "###IMAGES_DIR###" "`cygpath -am $SPEC_DIR`/images/jdk"
|
add_replacement "###BASH_RUNNER_PREFIX###" "\$PROJECT_DIR\$/.idea/bash.bat"
|
||||||
add_replacement "###ROOT_DIR###" "`cygpath -am $TOPLEVEL_DIR`"
|
else
|
||||||
add_replacement "###IDEA_DIR###" "`cygpath -am $IDEA_OUTPUT`"
|
add_replacement "###BASH_RUNNER_PREFIX###" ""
|
||||||
|
fi
|
||||||
|
if [ "x$PATHTOOL" != "x" ]; then
|
||||||
if [ "x$JT_HOME" = "x" ]; then
|
if [ "x$JT_HOME" = "x" ]; then
|
||||||
add_replacement "###JTREG_HOME###" ""
|
add_replacement "###JTREG_HOME###" ""
|
||||||
else
|
else
|
||||||
add_replacement "###JTREG_HOME###" "`cygpath -am $JT_HOME`"
|
add_replacement "###JTREG_HOME###" "`$PATHTOOL -am $JT_HOME`"
|
||||||
fi
|
|
||||||
elif [ "x$WSL_DISTRO_NAME" != "x" ]; then
|
|
||||||
add_replacement "###BUILD_DIR###" "`wslpath -am $SPEC_DIR`"
|
|
||||||
add_replacement "###IMAGES_DIR###" "`wslpath -am $SPEC_DIR`/images/jdk"
|
|
||||||
add_replacement "###ROOT_DIR###" "`wslpath -am $TOPLEVEL_DIR`"
|
|
||||||
add_replacement "###IDEA_DIR###" "`wslpath -am $IDEA_OUTPUT`"
|
|
||||||
if [ "x$JT_HOME" = "x" ]; then
|
|
||||||
add_replacement "###JTREG_HOME###" ""
|
|
||||||
else
|
|
||||||
add_replacement "###JTREG_HOME###" "`wslpath -am $JT_HOME`"
|
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
add_replacement "###BUILD_DIR###" "$SPEC_DIR"
|
|
||||||
add_replacement "###JTREG_HOME###" "$JT_HOME"
|
add_replacement "###JTREG_HOME###" "$JT_HOME"
|
||||||
add_replacement "###IMAGES_DIR###" "$SPEC_DIR/images/jdk"
|
|
||||||
add_replacement "###ROOT_DIR###" "$TOPLEVEL_DIR"
|
|
||||||
add_replacement "###IDEA_DIR###" "$IDEA_OUTPUT"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
SOURCE_PREFIX="<sourceFolder url=\"file://"
|
MODULE_IMLS=""
|
||||||
SOURCE_POSTFIX="\" isTestSource=\"false\" />"
|
TEST_MODULE_DEPENDENCIES=""
|
||||||
|
for module in $MODULE_NAMES; do
|
||||||
for root in $MODULE_ROOTS; do
|
MODULE_IMLS="$MODULE_IMLS<module fileurl=\"file://\$PROJECT_DIR$/.idea/$module.iml\" filepath=\"\$PROJECT_DIR$/.idea/$module.iml\" /> "
|
||||||
if [ "x$CYGPATH" != "x" ]; then
|
TEST_MODULE_DEPENDENCIES="$TEST_MODULE_DEPENDENCIES<orderEntry type=\"module\" module-name=\"$module\" scope=\"TEST\" /> "
|
||||||
root=`cygpath -am $root`
|
|
||||||
elif [ "x$WSL_DISTRO_NAME" != "x" ]; then
|
|
||||||
root=`wslpath -am $root`
|
|
||||||
fi
|
|
||||||
|
|
||||||
VM_CI="jdk.internal.vm.ci/share/classes"
|
|
||||||
VM_COMPILER="src/jdk.internal.vm.compiler/share/classes"
|
|
||||||
if test "${root#*$VM_CI}" != "$root" || test "${root#*$VM_COMPILER}" != "$root"; then
|
|
||||||
for subdir in "$root"/*; do
|
|
||||||
if [ -d "$subdir" ]; then
|
|
||||||
SOURCES=$SOURCES" $SOURCE_PREFIX""$subdir"/src"$SOURCE_POSTFIX"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
SOURCES=$SOURCES" $SOURCE_PREFIX""$root""$SOURCE_POSTFIX"
|
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
|
add_replacement "###MODULE_IMLS###" "$MODULE_IMLS"
|
||||||
add_replacement "###SOURCE_ROOTS###" "$SOURCES"
|
add_replacement "###TEST_MODULE_DEPENDENCIES###" "$TEST_MODULE_DEPENDENCIES"
|
||||||
|
|
||||||
replace_template_dir "$IDEA_OUTPUT"
|
replace_template_dir "$IDEA_OUTPUT"
|
||||||
|
|
||||||
### Compile the custom Logger
|
### Generate module project files
|
||||||
|
|
||||||
CLASSES=$IDEA_OUTPUT/classes
|
if [ "$VERBOSE" = true ] ; then
|
||||||
|
echo "Generating project modules:"
|
||||||
|
fi
|
||||||
|
(
|
||||||
|
DEFAULT_IFS="$IFS"
|
||||||
|
IFS='#'
|
||||||
|
for value in $MODULES; do
|
||||||
|
(
|
||||||
|
eval "$value"
|
||||||
|
if [ "$VERBOSE" = true ] ; then
|
||||||
|
echo " $module"
|
||||||
|
fi
|
||||||
|
MAIN_SOURCE_DIRS=""
|
||||||
|
CONTENT_ROOTS=""
|
||||||
|
IFS=' '
|
||||||
|
for dir in $moduleSrcDirs; do
|
||||||
|
case $dir in
|
||||||
|
"src/"*) MAIN_SOURCE_DIRS="$MAIN_SOURCE_DIRS <sourceFolder url=\"file://$MODULE_DIR/$dir\" isTestSource=\"false\" />" ;;
|
||||||
|
*"/support/gensrc/$module") ;; # Exclude generated sources to avoid module-info conflicts, see https://youtrack.jetbrains.com/issue/IDEA-185108
|
||||||
|
*) CONTENT_ROOTS="$CONTENT_ROOTS <content url=\"file://$MODULE_DIR/$dir\">\
|
||||||
|
<sourceFolder url=\"file://$MODULE_DIR/$dir\" isTestSource=\"false\" generated=\"true\" /></content>" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
if [ "x$MAIN_SOURCE_DIRS" != "x" ] ; then
|
||||||
|
CONTENT_ROOTS="<content url=\"file://$MODULE_DIR/src/$module\">$MAIN_SOURCE_DIRS</content>$CONTENT_ROOTS"
|
||||||
|
fi
|
||||||
|
add_replacement "###MODULE_CONTENT_ROOTS###" "$CONTENT_ROOTS"
|
||||||
|
DEPENDENCIES=""
|
||||||
|
for dep in $moduleDependencies; do
|
||||||
|
case $MODULE_NAMES in # Exclude skipped modules from dependencies
|
||||||
|
*"$dep"*) DEPENDENCIES="$DEPENDENCIES<orderEntry type=\"module\" module-name=\"$dep\" /> "
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
add_replacement "###DEPENDENCIES###" "$DEPENDENCIES"
|
||||||
|
cp "$IDEA_OUTPUT/module.iml" "$IDEA_OUTPUT/$module.iml"
|
||||||
|
IFS="$DEFAULT_IFS"
|
||||||
|
replace_template_file "$IDEA_OUTPUT/$module.iml"
|
||||||
|
)
|
||||||
|
done
|
||||||
|
)
|
||||||
|
rm "$IDEA_OUTPUT/module.iml"
|
||||||
|
|
||||||
if [ "x$ANT_HOME" = "x" ] ; then
|
### Create shell script runner for Windows
|
||||||
# try some common locations, before giving up
|
|
||||||
if [ -f "/usr/share/ant/lib/ant.jar" ] ; then
|
|
||||||
ANT_HOME="/usr/share/ant"
|
|
||||||
elif [ -f "/usr/local/Cellar/ant/1.9.4/libexec/lib/ant.jar" ] ; then
|
|
||||||
ANT_HOME="/usr/local/Cellar/ant/1.9.4/libexec"
|
|
||||||
else
|
|
||||||
echo "FATAL: cannot find ant. Try setting ANT_HOME." >&2; exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
CP=$ANT_HOME/lib/ant.jar
|
|
||||||
rm -rf $CLASSES; mkdir $CLASSES
|
|
||||||
|
|
||||||
if [ "x$CYGPATH" != "x" ] ; then ## CYGPATH may be set in env.cfg
|
if [ "x$PATHTOOL" != "x" ]; then
|
||||||
JAVAC_SOURCE_FILE=`cygpath -am $IDEA_OUTPUT/src/idea/IdeaLoggerWrapper.java`
|
echo "@echo off" > "$IDEA_OUTPUT/bash.bat"
|
||||||
JAVAC_SOURCE_PATH=`cygpath -am $IDEA_OUTPUT/src`
|
if [ "x$WSL_DISTRO_NAME" != "x" ] ; then
|
||||||
JAVAC_CLASSES=`cygpath -am $CLASSES`
|
echo "wsl -d $WSL_DISTRO_NAME --cd \"%cd%\" -e %*" >> "$IDEA_OUTPUT/bash.bat"
|
||||||
JAVAC_CP=`cygpath -am $CP`
|
else
|
||||||
JAVAC=javac
|
echo "$WINENV_ROOT\bin\bash.exe -l -c \"cd %CD:\=/%/ && %*\"" >> "$IDEA_OUTPUT/bash.bat"
|
||||||
elif [ "x$WSL_DISTRO_NAME" != "x" ]; then
|
fi
|
||||||
JAVAC_SOURCE_FILE=`realpath --relative-to=./ $IDEA_OUTPUT/src/idea/IdeaLoggerWrapper.java`
|
|
||||||
JAVAC_SOURCE_PATH=`realpath --relative-to=./ $IDEA_OUTPUT/src`
|
|
||||||
JAVAC_CLASSES=`realpath --relative-to=./ $CLASSES`
|
|
||||||
ANT_TEMP=`mktemp -d -p ./`
|
|
||||||
cp $ANT_HOME/lib/ant.jar $ANT_TEMP/ant.jar
|
|
||||||
JAVAC_CP=$ANT_TEMP/ant.jar
|
|
||||||
JAVAC=javac.exe
|
|
||||||
else
|
|
||||||
JAVAC_SOURCE_FILE=$IDEA_OUTPUT/src/idea/IdeaLoggerWrapper.java
|
|
||||||
JAVAC_SOURCE_PATH=$IDEA_OUTPUT/src
|
|
||||||
JAVAC_CLASSES=$CLASSES
|
|
||||||
JAVAC_CP=$CP
|
|
||||||
JAVAC=javac
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$BOOT_JDK/bin/$JAVAC -d $JAVAC_CLASSES -sourcepath $JAVAC_SOURCE_PATH -cp $JAVAC_CP $JAVAC_SOURCE_FILE
|
|
||||||
|
|
||||||
if [ "x$WSL_DISTRO_NAME" != "x" ]; then
|
|
||||||
rm -rf $ANT_TEMP
|
if [ "$VERBOSE" = true ] ; then
|
||||||
|
IDEA_PROJECT_DIR="`dirname $IDEA_OUTPUT`"
|
||||||
|
if [ "x$PATHTOOL" != "x" ]; then
|
||||||
|
IDEA_PROJECT_DIR="`$PATHTOOL -am $IDEA_PROJECT_DIR`"
|
||||||
|
fi
|
||||||
|
echo "
|
||||||
|
Now you can open \"$IDEA_PROJECT_DIR\" as IDEA project
|
||||||
|
You can also run 'bash \"$IDEA_OUTPUT/jdk-clion/update-project.sh\"' to generate Clion project"
|
||||||
fi
|
fi
|
||||||
13
jb/project/docker/Dockerfile
Normal file
13
jb/project/docker/Dockerfile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# jetbrains/runtime:jbr15env
|
||||||
|
FROM centos:7
|
||||||
|
RUN yum -y install centos-release-scl
|
||||||
|
RUN yum -y install devtoolset-8
|
||||||
|
RUN yum -y install zip bzip2 unzip tar wget make autoconf automake libtool gcc gcc-c++ libstdc++-devel alsa-devel cups-devel xorg-x11-devel libjpeg62-devel giflib-devel freetype-devel file which libXtst-devel libXt-devel libXrender-devel alsa-lib-devel fontconfig-devel libXrandr-devel libXi-devel git
|
||||||
|
# Install Java 16
|
||||||
|
RUN wget https://cdn.azul.com/zulu/bin/zulu16.28.11-ca-jdk16.0.0-linux_x64.tar.gz \
|
||||||
|
-O - | tar xz -C /
|
||||||
|
RUN mv /zulu16.28.11-ca-jdk16.0.0-linux_x64 /jdk16.0.0
|
||||||
|
ENV PATH /opt/rh/devtoolset-8/root/usr/bin:$PATH
|
||||||
|
RUN mkdir .git
|
||||||
|
RUN git config user.email "teamcity@jetbrains.com"
|
||||||
|
RUN git config user.name "builduser"
|
||||||
7
jb/project/docker/Dockerfile.x86
Normal file
7
jb/project/docker/Dockerfile.x86
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
FROM i386/ubuntu:xenial
|
||||||
|
|
||||||
|
RUN linux32 apt-get update && apt-get install -y --no-install-recommends apt-utils
|
||||||
|
COPY jbrsdk-11.0.5-b1 /jbrsdk-11.0.5-b1
|
||||||
|
RUN linux32 apt-get -y install file build-essential zip unzip curl libx11-dev libxext-dev \
|
||||||
|
libxrender-dev libxrandr-dev libxtst-dev libxt-dev libcups2-dev libasound2-data \
|
||||||
|
libpng12-0 libasound2 libfreetype6 libfontconfig1-dev libasound2-dev autoconf
|
||||||
9
jb/project/idea-project-files/copyright/JetBrains.xml
Normal file
9
jb/project/idea-project-files/copyright/JetBrains.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<component name="CopyrightManager">
|
||||||
|
<copyright>
|
||||||
|
<option name="notice" value="Copyright &#36;originalComment.match("Copyright (\d+)", 1, "-")&#36;today.year JetBrains s.r.o. 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. 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." />
|
||||||
|
<option name="keyword" value="Copyright" />
|
||||||
|
<option name="allowReplaceKeyword" value="JetBrains" />
|
||||||
|
<option name="myName" value="JetBrains" />
|
||||||
|
<option name="myLocal" value="true" />
|
||||||
|
</copyright>
|
||||||
|
</component>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<component name="CopyrightManager">
|
||||||
|
<settings default="JetBrains" />
|
||||||
|
</component>
|
||||||
1
jb/project/idea-project-files/jdk-clion/.idea/.name
generated
Normal file
1
jb/project/idea-project-files/jdk-clion/.idea/.name
generated
Normal file
@@ -0,0 +1 @@
|
|||||||
|
JetBrainsRuntime
|
||||||
9
jb/project/idea-project-files/jdk-clion/.idea/copyright/JetBrains.xml
generated
Normal file
9
jb/project/idea-project-files/jdk-clion/.idea/copyright/JetBrains.xml
generated
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<component name="CopyrightManager">
|
||||||
|
<copyright>
|
||||||
|
<option name="notice" value="Copyright 2000-&#36;today.year JetBrains s.r.o. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." />
|
||||||
|
<option name="keyword" value="Copyright" />
|
||||||
|
<option name="allowReplaceKeyword" value="JetBrains" />
|
||||||
|
<option name="myName" value="JetBrains" />
|
||||||
|
<option name="myLocal" value="true" />
|
||||||
|
</copyright>
|
||||||
|
</component>
|
||||||
3
jb/project/idea-project-files/jdk-clion/.idea/copyright/profiles_settings.xml
generated
Normal file
3
jb/project/idea-project-files/jdk-clion/.idea/copyright/profiles_settings.xml
generated
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<component name="CopyrightManager">
|
||||||
|
<settings default="JetBrains" />
|
||||||
|
</component>
|
||||||
20
jb/project/idea-project-files/jdk-clion/.idea/vcs.xml
generated
Normal file
20
jb/project/idea-project-files/jdk-clion/.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="IssueNavigationConfiguration">
|
||||||
|
<option name="links">
|
||||||
|
<list>
|
||||||
|
<IssueNavigationLink>
|
||||||
|
<option name="issueRegexp" value="(?:^|\s|\p{Punct})([A-Z]+\-\d+)(?=$|\s|\p{Punct})" />
|
||||||
|
<option name="linkRegexp" value="https://youtrack.jetbrains.com/issue/$1" />
|
||||||
|
</IssueNavigationLink>
|
||||||
|
<IssueNavigationLink>
|
||||||
|
<option name="issueRegexp" value="(?:^|\s|\p{Punct})(?:JDK-)?(\d{7})(?=$|\s|\p{Punct})" />
|
||||||
|
<option name="linkRegexp" value="https://bugs.openjdk.java.net/browse/JDK-$1" />
|
||||||
|
</IssueNavigationLink>
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
13
jb/project/idea-project-files/jetbrains.api.iml
Normal file
13
jb/project/idea-project-files/jetbrains.api.iml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$/src/jetbrains.api">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/jetbrains.api/src" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/jetbrains.api/templates" isTestSource="false" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
|
|
||||||
12
jb/project/idea-project-files/modules.xml
Normal file
12
jb/project/idea-project-files/modules.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/jdk.iml" filepath="$PROJECT_DIR$/.idea/jdk.iml" />
|
||||||
|
###MODULE_IMLS###
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/jetbrains.api.iml" filepath="$PROJECT_DIR$/.idea/jetbrains.api.iml" />
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/test.iml" filepath="$PROJECT_DIR$/.idea/test.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
|
|
||||||
20
jb/project/idea-project-files/vcs.xml
Normal file
20
jb/project/idea-project-files/vcs.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="IssueNavigationConfiguration">
|
||||||
|
<option name="links">
|
||||||
|
<list>
|
||||||
|
<IssueNavigationLink>
|
||||||
|
<option name="issueRegexp" value="(?:^|\s|\p{Punct})([A-Z]+\-\d+)(?=$|\s|\p{Punct})" />
|
||||||
|
<option name="linkRegexp" value="https://youtrack.jetbrains.com/issue/$1" />
|
||||||
|
</IssueNavigationLink>
|
||||||
|
<IssueNavigationLink>
|
||||||
|
<option name="issueRegexp" value="(?:^|\s|\p{Punct})(?:JDK-)?(\d{7})(?=$|\s|\p{Punct})" />
|
||||||
|
<option name="linkRegexp" value="https://bugs.openjdk.java.net/browse/JDK-$1" />
|
||||||
|
</IssueNavigationLink>
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
135
jb/project/java-gradle/build.gradle
Normal file
135
jb/project/java-gradle/build.gradle
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
apply plugin: 'java'
|
||||||
|
import org.gradle.internal.os.OperatingSystem
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
def test_jvm = {
|
||||||
|
if (project.hasProperty('jbsdkhome')) {
|
||||||
|
file(jbsdkhome + (OperatingSystem.current().isWindows()?"/bin/java.exe" : "/bin/java")).absolutePath
|
||||||
|
} else {
|
||||||
|
if (OperatingSystem.current().isMacOsX()) {
|
||||||
|
file('../../../build/macosx-x86_64-normal-server-release/images/jdk-bundle/jdk-11.0.4.jdk/Contents/Home/bin/java').absolutePath
|
||||||
|
} else if (OperatingSystem.current().isLinux()) {
|
||||||
|
file('../../../build/linux-x86_64-normal-server-release/images/jdk/bin/java').absolutePath
|
||||||
|
} else {
|
||||||
|
file('../../../build/windows-x86_64-normal-server-release/images/jdk/bin/java.exe').absolutePath
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
testCompile('junit:junit:4.12'){
|
||||||
|
exclude group: 'org.hamcrest'
|
||||||
|
}
|
||||||
|
testCompile 'org.hamcrest:hamcrest-library:1.3'
|
||||||
|
testCompile 'net.java.dev.jna:jna:4.4.0'
|
||||||
|
testCompile 'com.twelvemonkeys.imageio:imageio-tiff:3.3.2'
|
||||||
|
testCompile 'org.apache.commons:commons-lang3:3.0'
|
||||||
|
}
|
||||||
|
|
||||||
|
def jdk_modules = ["java.base", "java.logging", "java.prefs",
|
||||||
|
"java.se.ee", "java.sql", "java.datatransfer",
|
||||||
|
"java.management", "java.rmi", "java.security.jgss",
|
||||||
|
"java.sql.rowset", "java.desktop", "java.management.rmi",
|
||||||
|
"java.scripting", "java.security.sasl", "java.transaction",
|
||||||
|
"java.instrument", "java.naming", "java.se",
|
||||||
|
"java.smartcardio", "java.xml.crypto"]
|
||||||
|
|
||||||
|
def jdk_class_dirs = []
|
||||||
|
|
||||||
|
jdk_modules.collect(jdk_class_dirs) {
|
||||||
|
new File("../../../src/" + it + "/share/classes")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OperatingSystem.current().isMacOsX())
|
||||||
|
jdk_modules.collect(jdk_class_dirs) {
|
||||||
|
"../../../src/" + it + "/macosx/classes"
|
||||||
|
}
|
||||||
|
else if (OperatingSystem.current().isLinux()) {
|
||||||
|
jdk_modules.collect(jdk_class_dirs) {
|
||||||
|
"../../../src/" + it + "/solaris/classes"
|
||||||
|
}
|
||||||
|
jdk_modules.collect(jdk_class_dirs) {
|
||||||
|
"../../../src/" + it + "/unix/classes"
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
jdk_modules.collect(jdk_class_dirs) {
|
||||||
|
"../../../src/" + it + "/windows/classes"
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceSets.main.java.srcDirs = jdk_class_dirs
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
test {
|
||||||
|
java {
|
||||||
|
srcDir "../../../test/jdk/jbu"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test.dependsOn.clear()
|
||||||
|
|
||||||
|
test.dependsOn tasks.compileTestJava
|
||||||
|
|
||||||
|
test {
|
||||||
|
systemProperty "jb.java2d.metal", "true"
|
||||||
|
systemProperty "testdata", file('../../../test/jdk/jbu/testdata').absolutePath
|
||||||
|
|
||||||
|
// Generate golden images for DroidFontTest and MixedTextTest
|
||||||
|
// systemProperty "gentestdata", ""
|
||||||
|
|
||||||
|
// Enable Java2D logging (https://confluence.jetbrains.com/display/JRE/Java2D+Rendering+Logging)
|
||||||
|
// systemProperty "sun.java2d.trace", "log"
|
||||||
|
// systemProperty "sun.java2d.trace", "log,pimpl"
|
||||||
|
|
||||||
|
outputs.upToDateWhen { false }
|
||||||
|
executable = test_jvm()
|
||||||
|
|
||||||
|
// Enable async/dtrace profiler
|
||||||
|
jvmArgs "-XX:+PreserveFramePointer"
|
||||||
|
// Enable native J2D logging (only in debug build)
|
||||||
|
// Can be turned on for J2D by adding "#define DEBUG 1" into jdk/src/share/native/sun/java2d/Trace.h
|
||||||
|
|
||||||
|
// environment 'J2D_TRACE_LEVEL', '4'
|
||||||
|
}
|
||||||
|
|
||||||
|
def buildDir = project.buildscript.sourceFile.parentFile.parentFile.parentFile.parentFile
|
||||||
|
|
||||||
|
def make_cmd = "make"
|
||||||
|
if (OperatingSystem.current().isWindows()) {
|
||||||
|
def cyg_make_cmd = new File("c:/cygwin64/bin/make.exe")
|
||||||
|
if (cyg_make_cmd.exists()) make_cmd = cyg_make_cmd.absolutePath
|
||||||
|
}
|
||||||
|
def test_run = false
|
||||||
|
task make_images {
|
||||||
|
doLast {
|
||||||
|
if (!test_run) {
|
||||||
|
def pb = new ProcessBuilder().command(make_cmd.toString(), "-C", buildDir.absolutePath, "images")
|
||||||
|
def proc = pb.redirectErrorStream(true).start()
|
||||||
|
proc.inputStream.eachLine { println it }
|
||||||
|
assert proc.waitFor() == 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task make_clean {
|
||||||
|
doLast {
|
||||||
|
def pb = new ProcessBuilder().command(make_cmd.toString(), "-C", buildDir.absolutePath, "clean")
|
||||||
|
def proc = pb.redirectErrorStream(true).start()
|
||||||
|
proc.inputStream.eachLine { println it }
|
||||||
|
assert proc.waitFor() == 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task run_test {
|
||||||
|
doLast {
|
||||||
|
test_run = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.cleanTest.dependsOn tasks.run_test
|
||||||
|
classes.dependsOn.clear()
|
||||||
|
classes.dependsOn tasks.make_images
|
||||||
|
tasks.cleanClasses.dependsOn tasks.make_clean
|
||||||
16
jb/project/tools/common/scripts/build-jbr-api.sh
Normal file
16
jb/project/tools/common/scripts/build-jbr-api.sh
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# $1 - Boot JDK
|
||||||
|
# $2 - JBR part of API version
|
||||||
|
|
||||||
|
cd "`dirname "$0"`/../../../../.."
|
||||||
|
PWD="`pwd`"
|
||||||
|
CONF="$PWD/build/jbr-api.conf"
|
||||||
|
./configure --with-debug-level=release --with-boot-jdk=$1 || exit $?
|
||||||
|
make jbr-api CONF=release MAKEOVERRIDES= "JBR_API_CONF_FILE=$CONF" JBR_API_JBR_VERSION=$2 || exit $?
|
||||||
|
. $CONF || exit $?
|
||||||
|
echo "##teamcity[buildNumber '$VERSION']"
|
||||||
|
cp "$JAR" ./jbr-api-${VERSION}.jar || exit $?
|
||||||
|
cp "$SOURCES_JAR" ./jbr-api-${VERSION}-sources.jar || exit $?
|
||||||
|
echo "##teamcity[publishArtifacts '$PWD/jbr-api-${VERSION}.jar']"
|
||||||
|
echo "##teamcity[publishArtifacts '$PWD/jbr-api-${VERSION}-sources.jar']"
|
||||||
64
jb/project/tools/common/scripts/common.sh
Normal file
64
jb/project/tools/common/scripts/common.sh
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
VENDOR_NAME="JetBrains s.r.o."
|
||||||
|
VENDOR_VERSION_STRING="JBR-${JBSDK_VERSION_WITH_DOTS}.${JDK_BUILD_NUMBER}-${build_number}"
|
||||||
|
[ -z "$bundle_type" ] || VENDOR_VERSION_STRING="${VENDOR_VERSION_STRING}-${bundle_type}"
|
||||||
|
|
||||||
|
do_reset_changes=0
|
||||||
|
do_reset_dcevm=0
|
||||||
|
HEAD_REVISION=0
|
||||||
|
|
||||||
|
function do_exit() {
|
||||||
|
exit_code=$1
|
||||||
|
[ $do_reset_changes -eq 1 ] && git checkout HEAD modules.list src/java.desktop/share/classes/module-info.java
|
||||||
|
if [ $do_reset_dcevm -eq 1 ]; then
|
||||||
|
[ ! -z $HEAD_REVISION ] && git reset --hard $HEAD_REVISION
|
||||||
|
fi
|
||||||
|
exit "$exit_code"
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_jsdk_mods() {
|
||||||
|
__jsdk=$1
|
||||||
|
__jcef_mods=$2
|
||||||
|
__orig_jsdk_mods=$3
|
||||||
|
__updated_jsdk_mods=$4
|
||||||
|
|
||||||
|
# re-create java.desktop.jmod with updated module-info.class
|
||||||
|
tmp=.java.desktop.$$.tmp
|
||||||
|
mkdir "$tmp" || exit $?
|
||||||
|
"$__jsdk"/bin/jmod extract --dir "$tmp" "$__orig_jsdk_mods"/java.desktop.jmod || exit $?
|
||||||
|
"$__jsdk"/bin/javac \
|
||||||
|
--patch-module java.desktop="$__orig_jsdk_mods"/java.desktop.jmod \
|
||||||
|
--module-path "$__jcef_mods" -d "$tmp"/classes src/java.desktop/share/classes/module-info.java || exit $?
|
||||||
|
"$__jsdk"/bin/jmod \
|
||||||
|
create --class-path "$tmp"/classes --config "$tmp"/conf --header-files "$tmp"/include --legal-notice "$tmp"/legal --libs "$tmp"/lib \
|
||||||
|
java.desktop.jmod || exit $?
|
||||||
|
mv java.desktop.jmod "$__updated_jsdk_mods" || exit $?
|
||||||
|
rm -rf "$tmp"
|
||||||
|
|
||||||
|
# re-create java.base.jmod with updated hashes
|
||||||
|
tmp=.java.base.$$.tmp
|
||||||
|
mkdir "$tmp" || exit $?
|
||||||
|
hash_modules=$("$JSDK"/bin/jmod describe "$__orig_jsdk_mods"/java.base.jmod | grep hashes | awk '{print $2}' | tr '\n' '|' | sed s/\|$//) || exit $?
|
||||||
|
"$__jsdk"/bin/jmod extract --dir "$tmp" "$__orig_jsdk_mods"/java.base.jmod || exit $?
|
||||||
|
rm "$__updated_jsdk_mods"/java.base.jmod || exit $? # temp exclude from path
|
||||||
|
"$__jsdk"/bin/jmod \
|
||||||
|
create --module-path "$__updated_jsdk_mods" --hash-modules "$hash_modules" \
|
||||||
|
--class-path "$tmp"/classes --cmds "$tmp"/bin --config "$tmp"/conf --header-files "$tmp"/include --legal-notice "$tmp"/legal --libs "$tmp"/lib \
|
||||||
|
java.base.jmod || exit $?
|
||||||
|
mv java.base.jmod "$__updated_jsdk_mods" || exit $?
|
||||||
|
rm -rf "$tmp"
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_mods_list() {
|
||||||
|
__mods=$1
|
||||||
|
echo $(ls $__mods) | sed s/\.jmod/,/g | sed s/,$//g | sed s/' '//g
|
||||||
|
}
|
||||||
|
|
||||||
|
function copy_jmods() {
|
||||||
|
__mods_list=$1
|
||||||
|
__jmods_from=$2
|
||||||
|
__jmods_to=$3
|
||||||
|
|
||||||
|
mkdir -p $__jmods_to
|
||||||
|
|
||||||
|
echo "${__mods_list}," | while read -d, mod; do cp $__jmods_from/$mod.jmod $__jmods_to/; done
|
||||||
|
}
|
||||||
84
jb/project/tools/linux/scripts/mkimages_aarch64.sh
Executable file
84
jb/project/tools/linux/scripts/mkimages_aarch64.sh
Executable file
@@ -0,0 +1,84 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
|
||||||
|
# The following parameters must be specified:
|
||||||
|
# JBSDK_VERSION - specifies the current version of OpenJDK e.g. 11_0_6
|
||||||
|
# JDK_BUILD_NUMBER - specifies the number of OpenJDK build or the value of --with-version-build argument to configure
|
||||||
|
# build_number - specifies the number of JetBrainsRuntime build
|
||||||
|
#
|
||||||
|
# jbrsdk-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
# jbr-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
#
|
||||||
|
# $ ./java --version
|
||||||
|
# openjdk 11.0.6 2020-01-14
|
||||||
|
# OpenJDK Runtime Environment (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number})
|
||||||
|
# OpenJDK 64-Bit Server VM (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number}, mixed mode)
|
||||||
|
#
|
||||||
|
|
||||||
|
JBSDK_VERSION=$1
|
||||||
|
JDK_BUILD_NUMBER=$2
|
||||||
|
build_number=$3
|
||||||
|
|
||||||
|
JBSDK_VERSION_WITH_DOTS=$(echo $JBSDK_VERSION | sed 's/_/\./g')
|
||||||
|
|
||||||
|
source jb/project/tools/common/scripts/common.sh
|
||||||
|
|
||||||
|
JBRSDK_BASE_NAME=jbrsdk-${JBSDK_VERSION}
|
||||||
|
|
||||||
|
[ -z "$bundle_type" ] && (git apply -p0 < jb/project/tools/patches/exclude_jcef_module.patch || exit $?)
|
||||||
|
|
||||||
|
sh configure \
|
||||||
|
--with-debug-level=release \
|
||||||
|
--with-vendor-name="${VENDOR_NAME}" \
|
||||||
|
--with-vendor-version-string="${VENDOR_VERSION_STRING}" \
|
||||||
|
--with-jvm-features=shenandoahgc \
|
||||||
|
--with-version-pre= \
|
||||||
|
--with-version-build="${JDK_BUILD_NUMBER}" \
|
||||||
|
--with-version-opt=b${build_number} \
|
||||||
|
--with-boot-jdk=${BOOT_JDK} \
|
||||||
|
--enable-cds=yes || exit $?
|
||||||
|
make clean CONF=linux-aarch64-server-release || exit $?
|
||||||
|
make images CONF=linux-aarch64-server-release test-image || exit $?
|
||||||
|
|
||||||
|
JBSDK=${JBRSDK_BASE_NAME}-linux-aarch64-b${build_number}
|
||||||
|
BASE_DIR=build/linux-aarch64-server-release/images
|
||||||
|
JSDK=${BASE_DIR}/jdk
|
||||||
|
JBRSDK_BUNDLE=jbrsdk
|
||||||
|
|
||||||
|
echo Fixing permissions
|
||||||
|
chmod -R a+r $JSDK
|
||||||
|
|
||||||
|
rm -rf $BASE_DIR/$JBRSDK_BUNDLE
|
||||||
|
cp -r $JSDK $BASE_DIR/$JBRSDK_BUNDLE || exit $?
|
||||||
|
|
||||||
|
echo Creating $JBSDK.tar.gz ...
|
||||||
|
sed 's/JBR/JBRSDK/g' ${BASE_DIR}/${JBRSDK_BUNDLE}/release > release
|
||||||
|
mv release ${BASE_DIR}/${JBRSDK_BUNDLE}/release
|
||||||
|
|
||||||
|
tar -pcf $JBSDK.tar \
|
||||||
|
--exclude=*.debuginfo --exclude=demo --exclude=sample --exclude=man \
|
||||||
|
-C $BASE_DIR ${JBRSDK_BUNDLE} || exit $?
|
||||||
|
gzip $JBSDK.tar || exit $?
|
||||||
|
|
||||||
|
JBR_BUNDLE=jbr
|
||||||
|
JBR_BASE_NAME=jbr-$JBSDK_VERSION
|
||||||
|
rm -rf $BASE_DIR/$JBR_BUNDLE
|
||||||
|
|
||||||
|
JBR=$JBR_BASE_NAME-linux-aarch64-b$build_number
|
||||||
|
grep -v javafx modules.list | grep -v "jdk.internal.vm\|jdk.aot\|jcef" > modules.list.aarch64
|
||||||
|
echo Running jlink....
|
||||||
|
${JSDK}/bin/jlink \
|
||||||
|
--module-path ${JSDK}/jmods --no-man-pages --compress=2 \
|
||||||
|
--add-modules $(xargs < modules.list.aarch64 | sed s/" "//g | sed s/',$'//g) \
|
||||||
|
--output ${BASE_DIR}/${JBR_BUNDLE} || exit $?
|
||||||
|
|
||||||
|
echo Modifying release info ...
|
||||||
|
grep -v \"^JAVA_VERSION\" ${JSDK}/release | grep -v \"^MODULES\" >> ${BASE_DIR}/${JBR_BUNDLE}/release
|
||||||
|
|
||||||
|
echo Creating $JBR.tar.gz ...
|
||||||
|
tar -pcf $JBR.tar -C $BASE_DIR ${JBR_BUNDLE} || exit $?
|
||||||
|
gzip $JBR.tar || exit $?
|
||||||
|
|
||||||
|
JBRSDK_TEST=$JBRSDK_BASE_NAME-linux-test-aarch64-b$build_number
|
||||||
|
echo Creating $JBRSDK_TEST.tar.gz ...
|
||||||
|
tar -pcf $JBRSDK_TEST.tar -C $BASE_DIR --exclude='test/jdk/demos' test || exit $?
|
||||||
|
gzip $JBRSDK_TEST.tar || exit $?
|
||||||
153
jb/project/tools/linux/scripts/mkimages_x64.sh
Executable file
153
jb/project/tools/linux/scripts/mkimages_x64.sh
Executable file
@@ -0,0 +1,153 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
|
||||||
|
# The following parameters must be specified:
|
||||||
|
# JBSDK_VERSION - specifies major version of OpenJDK e.g. 11_0_6 (instead of dots '.' underbars "_" are used)
|
||||||
|
# JDK_BUILD_NUMBER - specifies update release of OpenJDK build or the value of --with-version-build argument to configure
|
||||||
|
# build_number - specifies the number of JetBrainsRuntime build
|
||||||
|
# bundle_type - specifies bundle to be built; possible values:
|
||||||
|
# <empty> or nomod - the release bundles without any additional modules (jcef)
|
||||||
|
# jcef - the release bundles with jcef
|
||||||
|
# fd - the fastdebug bundles which also include the jcef module
|
||||||
|
#
|
||||||
|
# jbrsdk-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
# jbr-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
#
|
||||||
|
# $ ./java --version
|
||||||
|
# openjdk 11.0.6 2020-01-14
|
||||||
|
# OpenJDK Runtime Environment (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number})
|
||||||
|
# OpenJDK 64-Bit Server VM (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number}, mixed mode)
|
||||||
|
#
|
||||||
|
# Environment variables:
|
||||||
|
# JCEF_PATH - specifies the path to the directory with JCEF binaries.
|
||||||
|
# By default JCEF binaries should be located in ./jcef_linux_x64
|
||||||
|
|
||||||
|
while getopts ":i?" o; do
|
||||||
|
case "${o}" in
|
||||||
|
i)
|
||||||
|
i="incremental build"
|
||||||
|
INC_BUILD=1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
shift $((OPTIND-1))
|
||||||
|
|
||||||
|
JBSDK_VERSION=$1
|
||||||
|
JDK_BUILD_NUMBER=$2
|
||||||
|
build_number=$3
|
||||||
|
bundle_type=$4
|
||||||
|
JBSDK_VERSION_WITH_DOTS=$(echo $JBSDK_VERSION | sed 's/_/\./g')
|
||||||
|
JCEF_PATH=${JCEF_PATH:=./jcef_linux_x64}
|
||||||
|
|
||||||
|
source jb/project/tools/common/scripts/common.sh
|
||||||
|
|
||||||
|
function do_configure {
|
||||||
|
sh configure \
|
||||||
|
$WITH_DEBUG_LEVEL \
|
||||||
|
--with-vendor-name="$VENDOR_NAME" \
|
||||||
|
--with-vendor-version-string="$VENDOR_VERSION_STRING" \
|
||||||
|
--with-jvm-features=shenandoahgc \
|
||||||
|
--with-version-pre= \
|
||||||
|
--with-version-build="$JDK_BUILD_NUMBER" \
|
||||||
|
--with-version-opt=b"$build_number" \
|
||||||
|
--with-boot-jdk="$BOOT_JDK" \
|
||||||
|
--enable-cds=yes || do_exit $?
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_image_bundle {
|
||||||
|
__bundle_name=$1
|
||||||
|
__arch_name=$2
|
||||||
|
__modules_path=$3
|
||||||
|
__modules=$4
|
||||||
|
|
||||||
|
[ "$bundle_type" == "fd" ] && [ "$__arch_name" == "$JBRSDK_BUNDLE" ] && __bundle_name=$__arch_name && fastdebug_infix="fastdebug-"
|
||||||
|
JBR=${__bundle_name}-${JBSDK_VERSION}-linux-x64-${fastdebug_infix}b${build_number}
|
||||||
|
|
||||||
|
echo Running jlink....
|
||||||
|
[ -d "$IMAGES_DIR"/"$__arch_name" ] && rm -rf "${IMAGES_DIR:?}"/"$__arch_name"
|
||||||
|
$JSDK/bin/jlink \
|
||||||
|
--module-path "$__modules_path" --no-man-pages --compress=2 \
|
||||||
|
--add-modules "$__modules" --output "$IMAGES_DIR"/"$__arch_name"
|
||||||
|
|
||||||
|
grep -v "^JAVA_VERSION" "$JSDK"/release | grep -v "^MODULES" >> "$IMAGES_DIR"/"$__arch_name"/release
|
||||||
|
if [ "$__arch_name" == "$JBRSDK_BUNDLE" ]; then
|
||||||
|
sed 's/JBR/JBRSDK/g' "$IMAGES_DIR"/"$__arch_name"/release > release
|
||||||
|
mv release "$IMAGES_DIR"/"$__arch_name"/release
|
||||||
|
copy_jmods "$__modules" "$__modules_path" "$IMAGES_DIR"/"$__arch_name"/jmods
|
||||||
|
fi
|
||||||
|
|
||||||
|
# jmod does not preserve file permissions (JDK-8173610)
|
||||||
|
[ -f "$IMAGES_DIR"/"$__arch_name"/lib/jcef_helper ] && chmod a+x "$IMAGES_DIR"/"$__arch_name"/lib/jcef_helper
|
||||||
|
|
||||||
|
echo Creating "$JBR".tar.gz ...
|
||||||
|
tar -pcf "$JBR".tar -C "$IMAGES_DIR" "$__arch_name" || do_exit $?
|
||||||
|
[ -f "$JBR".tar.gz ] && rm "$JBR.tar.gz"
|
||||||
|
gzip "$JBR".tar || do_exit $?
|
||||||
|
rm -rf "${IMAGES_DIR:?}"/"$__arch_name"
|
||||||
|
}
|
||||||
|
|
||||||
|
WITH_DEBUG_LEVEL="--with-debug-level=release"
|
||||||
|
RELEASE_NAME=linux-x86_64-server-release
|
||||||
|
|
||||||
|
case "$bundle_type" in
|
||||||
|
"jcef")
|
||||||
|
do_reset_changes=1
|
||||||
|
;;
|
||||||
|
"dcevm")
|
||||||
|
HEAD_REVISION=$(git rev-parse HEAD)
|
||||||
|
git am jb/project/tools/patches/dcevm/*.patch || do_exit $?
|
||||||
|
do_reset_dcevm=1
|
||||||
|
do_reset_changes=1
|
||||||
|
;;
|
||||||
|
"nomod" | "")
|
||||||
|
bundle_type=""
|
||||||
|
;;
|
||||||
|
"fd")
|
||||||
|
do_reset_changes=1
|
||||||
|
WITH_DEBUG_LEVEL="--with-debug-level=fastdebug"
|
||||||
|
RELEASE_NAME=linux-x86_64-server-fastdebug
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -z "$INC_BUILD" ]; then
|
||||||
|
do_configure || do_exit $?
|
||||||
|
make clean CONF=$RELEASE_NAME || do_exit $?
|
||||||
|
fi
|
||||||
|
make images CONF=$RELEASE_NAME || do_exit $?
|
||||||
|
|
||||||
|
IMAGES_DIR=build/$RELEASE_NAME/images
|
||||||
|
JSDK=$IMAGES_DIR/jdk
|
||||||
|
JSDK_MODS_DIR=$IMAGES_DIR/jmods
|
||||||
|
JBRSDK_BUNDLE=jbrsdk
|
||||||
|
|
||||||
|
echo Fixing permissions
|
||||||
|
chmod -R a+r $JSDK
|
||||||
|
|
||||||
|
if [ "$bundle_type" == "jcef" ] || [ "$bundle_type" == "dcevm" ] || [ "$bundle_type" == "fd" ]; then
|
||||||
|
git apply -p0 < jb/project/tools/patches/add_jcef_module.patch || do_exit $?
|
||||||
|
update_jsdk_mods $JSDK $JCEF_PATH/jmods $JSDK/jmods $JSDK_MODS_DIR || do_exit $?
|
||||||
|
cp $JCEF_PATH/jmods/* $JSDK_MODS_DIR # $JSDK/jmods is not changed
|
||||||
|
|
||||||
|
jbr_name_postfix="_${bundle_type}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# create runtime image bundle
|
||||||
|
modules=$(xargs < modules.list | sed s/" "//g) || do_exit $?
|
||||||
|
create_image_bundle "jbr${jbr_name_postfix}" "jbr" $JSDK_MODS_DIR "$modules" || do_exit $?
|
||||||
|
|
||||||
|
# create sdk image bundle
|
||||||
|
modules=$(cat $JSDK/release | grep MODULES | sed s/MODULES=//g | sed s/' '/','/g | sed s/\"//g | sed s/\\n//g) || do_exit $?
|
||||||
|
if [ "$bundle_type" == "jcef" ] || [ "$bundle_type" == "dcevm" ] || [ "$bundle_type" == "fd" ] || [ "$bundle_type" == "$JBRSDK_BUNDLE" ]; then
|
||||||
|
modules=${modules},$(get_mods_list "$JCEF_PATH"/jmods)
|
||||||
|
fi
|
||||||
|
create_image_bundle "$JBRSDK_BUNDLE${jbr_name_postfix}" $JBRSDK_BUNDLE $JSDK_MODS_DIR "$modules" || do_exit $?
|
||||||
|
|
||||||
|
if [ -z "$bundle_type" ]; then
|
||||||
|
JBRSDK_TEST=${JBRSDK_BUNDLE}-${JBSDK_VERSION}-linux-test-x64-b${build_number}
|
||||||
|
echo Creating "$JBRSDK_TEST" ...
|
||||||
|
make test-image CONF=$RELEASE_NAME || do_exit $?
|
||||||
|
tar -pcf "$JBRSDK_TEST".tar -C $IMAGES_DIR --exclude='test/jdk/demos' test || do_exit $?
|
||||||
|
[ -f "$JBRSDK_TEST.tar.gz" ] && rm "$JBRSDK_TEST.tar.gz"
|
||||||
|
gzip "$JBRSDK_TEST".tar || do_exit $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_exit 0
|
||||||
80
jb/project/tools/linux/scripts/mkimages_x86.sh
Executable file
80
jb/project/tools/linux/scripts/mkimages_x86.sh
Executable file
@@ -0,0 +1,80 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
|
||||||
|
# The following parameters must be specified:
|
||||||
|
# JBSDK_VERSION - specifies the current version of OpenJDK e.g. 11_0_6
|
||||||
|
# JDK_BUILD_NUMBER - specifies the number of OpenJDK build or the value of --with-version-build argument to configure
|
||||||
|
# build_number - specifies the number of JetBrainsRuntime build
|
||||||
|
#
|
||||||
|
# jbrsdk-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
# jbr-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
#
|
||||||
|
# $ ./java --version
|
||||||
|
# openjdk 11.0.6 2020-01-14
|
||||||
|
# OpenJDK Runtime Environment (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number})
|
||||||
|
# OpenJDK 64-Bit Server VM (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number}, mixed mode)
|
||||||
|
#
|
||||||
|
|
||||||
|
JBSDK_VERSION=$1
|
||||||
|
JDK_BUILD_NUMBER=$2
|
||||||
|
build_number=$3
|
||||||
|
|
||||||
|
JBSDK_VERSION_WITH_DOTS=$(echo $JBSDK_VERSION | sed 's/_/\./g')
|
||||||
|
|
||||||
|
source jb/project/tools/common/scripts/common.sh
|
||||||
|
|
||||||
|
JBRSDK_BASE_NAME=jbrsdk-${JBSDK_VERSION}
|
||||||
|
|
||||||
|
[ -z "$bundle_type" ] && (git apply -p0 < jb/project/tools/patches/exclude_jcef_module.patch || exit $?)
|
||||||
|
|
||||||
|
linux32 bash configure \
|
||||||
|
--with-debug-level=release \
|
||||||
|
--with-vendor-name="${VENDOR_NAME}" \
|
||||||
|
--with-vendor-version-string="${VENDOR_VERSION_STRING}" \
|
||||||
|
--with-version-pre= \
|
||||||
|
--with-version-build=$JDK_BUILD_NUMBER \
|
||||||
|
--with-version-opt=b${build_number} \
|
||||||
|
--with-boot-jdk=${BOOT_JDK} \
|
||||||
|
--enable-cds=yes || exit $?
|
||||||
|
make clean CONF=linux-x86-server-release || exit $?
|
||||||
|
make images CONF=linux-x86-server-release test-image || exit $?
|
||||||
|
|
||||||
|
JBSDK=${JBRSDK_BASE_NAME}-linux-x86-b${build_number}
|
||||||
|
BASE_DIR=build/linux-x86-server-release/images
|
||||||
|
JSDK=${BASE_DIR}/jdk
|
||||||
|
JBRSDK_BUNDLE=jbrsdk
|
||||||
|
|
||||||
|
echo Fixing permissions
|
||||||
|
chmod -R a+r $JSDK
|
||||||
|
|
||||||
|
rm -rf $BASE_DIR/$JBRSDK_BUNDLE
|
||||||
|
cp -r $JSDK $BASE_DIR/$JBRSDK_BUNDLE || exit $?
|
||||||
|
|
||||||
|
echo Creating $JBSDK.tar.gz ...
|
||||||
|
sed 's/JBR/JBRSDK/g' ${BASE_DIR}/${JBRSDK_BUNDLE}/release > release
|
||||||
|
mv release ${BASE_DIR}/${JBRSDK_BUNDLE}/release
|
||||||
|
|
||||||
|
tar -pcf $JBSDK.tar --exclude=*.debuginfo --exclude=demo --exclude=sample --exclude=man -C $BASE_DIR ${JBRSDK_BUNDLE} || exit $?
|
||||||
|
gzip $JBSDK.tar || exit $?
|
||||||
|
|
||||||
|
JBR_BUNDLE=jbr
|
||||||
|
JBR_BASE_NAME=jbr-$JBSDK_VERSION
|
||||||
|
rm -rf $BASE_DIR/$JBR_BUNDLE
|
||||||
|
|
||||||
|
JBR=$JBR_BASE_NAME-linux-x86-b$build_number
|
||||||
|
grep -v javafx modules.list | grep -v "jdk.internal.vm\|jdk.aot\|jcef" > modules.list.x86
|
||||||
|
echo Running jlink....
|
||||||
|
${JSDK}/bin/jlink \
|
||||||
|
--module-path ${JSDK}/jmods --no-man-pages --compress=2 \
|
||||||
|
--add-modules $(xargs < modules.list.x86 | sed s/" "//g | sed s/,$//g) --output ${BASE_DIR}/${JBR_BUNDLE} || exit $?
|
||||||
|
|
||||||
|
echo Modifying release info ...
|
||||||
|
grep -v \"^JAVA_VERSION\" ${JSDK}/release | grep -v \"^MODULES\" >> ${BASE_DIR}/${JBR_BUNDLE}/release
|
||||||
|
|
||||||
|
echo Creating $JBR.tar.gz ...
|
||||||
|
tar -pcf $JBR.tar -C $BASE_DIR $JBR_BUNDLE || exit $?
|
||||||
|
gzip $JBR.tar || exit $?
|
||||||
|
|
||||||
|
JBRSDK_TEST=$JBRSDK_BASE_NAME-linux-test-x86-b$build_number
|
||||||
|
echo Creating $JBRSDK_TEST.tar.gz ...
|
||||||
|
tar -pcf $JBRSDK_TEST.tar -C $BASE_DIR --exclude='test/jdk/demos' --exclude='test/hotspot/gtest' test || exit $?
|
||||||
|
gzip $JBRSDK_TEST.tar || exit $?
|
||||||
16
jb/project/tools/mac/scripts/entitlements.xml
Normal file
16
jb/project/tools/mac/scripts/entitlements.xml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>com.apple.security.cs.allow-jit</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.cs.disable-library-validation</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.cs.disable-executable-page-protection</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
201
jb/project/tools/mac/scripts/mkimages.sh
Executable file
201
jb/project/tools/mac/scripts/mkimages.sh
Executable file
@@ -0,0 +1,201 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
|
||||||
|
# The following parameters must be specified:
|
||||||
|
# JBSDK_VERSION - specifies major version of OpenJDK e.g. 11_0_6 (instead of dots '.' underbars "_" are used)
|
||||||
|
# JDK_BUILD_NUMBER - specifies update release of OpenJDK build or the value of --with-version-build argument to configure
|
||||||
|
# build_number - specifies the number of JetBrainsRuntime build
|
||||||
|
# bundle_type - specifies bundle to be built; possible values:
|
||||||
|
# <empty> or nomod - the release bundles without any additional modules (jcef)
|
||||||
|
# jcef - the release bundles with jcef
|
||||||
|
# fd - the fastdebug bundles which also include the jcef module
|
||||||
|
#
|
||||||
|
# jbrsdk-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
# jbr-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
#
|
||||||
|
# $ ./java --version
|
||||||
|
# openjdk 11.0.6 2020-01-14
|
||||||
|
# OpenJDK Runtime Environment (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number})
|
||||||
|
# OpenJDK 64-Bit Server VM (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number}, mixed mode)
|
||||||
|
#
|
||||||
|
# Environment variables:
|
||||||
|
# JCEF_PATH - specifies the path to the directory with JCEF binaries.
|
||||||
|
# By default JCEF binaries should be located in ./jcef_mac
|
||||||
|
# MACOSX_VERSION_MAX - specifies value for the --with-macosx-version-max parameter. By default it is 10.12.00 for x64
|
||||||
|
# and 11.00.00 for aarch64
|
||||||
|
|
||||||
|
while getopts ":i?" o; do
|
||||||
|
case "${o}" in
|
||||||
|
i)
|
||||||
|
i="incremental build"
|
||||||
|
INC_BUILD=1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
shift $((OPTIND-1))
|
||||||
|
|
||||||
|
JBSDK_VERSION=$1
|
||||||
|
JDK_BUILD_NUMBER=$2
|
||||||
|
build_number=$3
|
||||||
|
bundle_type=$4
|
||||||
|
architecture=$5 # aarch64 or x64
|
||||||
|
enable_aot=$6 # temporary param for building test jre with aot under aarch64
|
||||||
|
JBSDK_VERSION_WITH_DOTS=$(echo $JBSDK_VERSION | sed 's/_/\./g')
|
||||||
|
WITH_IMPORT_MODULES="--with-import-modules=${MODULAR_SDK_PATH:=./modular-sdk}"
|
||||||
|
JCEF_PATH=${JCEF_PATH:=./jcef_mac}
|
||||||
|
architecture=${architecture:=x64}
|
||||||
|
BOOT_JDK=${BOOT_JDK:=$(/usr/libexec/java_home -v 16)}
|
||||||
|
|
||||||
|
source jb/project/tools/common/scripts/common.sh
|
||||||
|
|
||||||
|
function copyJNF {
|
||||||
|
__contents_dir=$1
|
||||||
|
mkdir -p ${__contents_dir}/Frameworks
|
||||||
|
cp -Rp Frameworks/JavaNativeFoundation.framework ${__contents_dir}/Frameworks
|
||||||
|
}
|
||||||
|
|
||||||
|
function do_configure {
|
||||||
|
if [[ "${architecture}" == *aarch64* ]]; then
|
||||||
|
sh configure \
|
||||||
|
$WITH_DEBUG_LEVEL \
|
||||||
|
--with-vendor-name="${VENDOR_NAME}" \
|
||||||
|
--with-vendor-version-string="${VENDOR_VERSION_STRING}" \
|
||||||
|
--with-jvm-features=shenandoahgc \
|
||||||
|
--with-version-pre= \
|
||||||
|
--with-version-build="${JDK_BUILD_NUMBER}" \
|
||||||
|
--with-version-opt=b"${build_number}" \
|
||||||
|
--with-boot-jdk="$BOOT_JDK" \
|
||||||
|
--with-macosx-version-max="${MACOSX_VERSION_MAX:="11.00.00"}" \
|
||||||
|
--disable-hotspot-gtest --disable-javac-server --disable-full-docs --disable-manpages \
|
||||||
|
--enable-cds=no \
|
||||||
|
--with-extra-cflags="-F$(pwd)/Frameworks" \
|
||||||
|
--with-extra-cxxflags="-F$(pwd)/Frameworks" \
|
||||||
|
--with-extra-ldflags="-F$(pwd)/Frameworks" || do_exit $?
|
||||||
|
else
|
||||||
|
sh configure \
|
||||||
|
$WITH_DEBUG_LEVEL \
|
||||||
|
--with-vendor-name="$VENDOR_NAME" \
|
||||||
|
--with-vendor-version-string="$VENDOR_VERSION_STRING" \
|
||||||
|
--with-jvm-features=shenandoahgc \
|
||||||
|
--with-version-pre= \
|
||||||
|
--with-version-build="$JDK_BUILD_NUMBER" \
|
||||||
|
--with-version-opt=b"$build_number" \
|
||||||
|
--with-boot-jdk="$BOOT_JDK" \
|
||||||
|
--with-macosx-version-max="${MACOSX_VERSION_MAX:="10.12.00"}" \
|
||||||
|
--enable-cds=yes || do_exit $?
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_image_bundle {
|
||||||
|
__bundle_name=$1
|
||||||
|
__arch_name=$2
|
||||||
|
__modules_path=$3
|
||||||
|
__modules=$4
|
||||||
|
|
||||||
|
tmp=.bundle.$$.tmp
|
||||||
|
mkdir "$tmp" || do_exit $?
|
||||||
|
|
||||||
|
[ "$bundle_type" == "fd" ] && [ "$__arch_name" == "$JBRSDK_BUNDLE" ] && __bundle_name=$__arch_name && fastdebug_infix="fastdebug-"
|
||||||
|
JBR=${__bundle_name}-${JBSDK_VERSION}-osx-${architecture}-${fastdebug_infix}b${build_number}
|
||||||
|
|
||||||
|
JRE_CONTENTS=$tmp/$__arch_name/Contents
|
||||||
|
mkdir -p "$JRE_CONTENTS" || do_exit $?
|
||||||
|
|
||||||
|
echo Running jlink...
|
||||||
|
"$JSDK"/bin/jlink \
|
||||||
|
--module-path "$__modules_path" --no-man-pages --compress=2 \
|
||||||
|
--add-modules "$__modules" --output "$JRE_CONTENTS/Home" || do_exit $?
|
||||||
|
|
||||||
|
grep -v "^JAVA_VERSION" "$JSDK"/release | grep -v "^MODULES" >> "$JRE_CONTENTS/Home/release"
|
||||||
|
if [ "$__arch_name" == "$JBRSDK_BUNDLE" ]; then
|
||||||
|
sed 's/JBR/JBRSDK/g' $JRE_CONTENTS/Home/release > release
|
||||||
|
mv release $JRE_CONTENTS/Home/release
|
||||||
|
copy_jmods "$__modules" "$__modules_path" "$JRE_CONTENTS"/Home/jmods
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp -R "$JSDK"/../MacOS "$JRE_CONTENTS"
|
||||||
|
cp "$JSDK"/../Info.plist "$JRE_CONTENTS"
|
||||||
|
|
||||||
|
if [[ "${architecture}" == *aarch64* ]]; then
|
||||||
|
# we can't notarize this library as usual framework (with headers and tbd-file)
|
||||||
|
# but single library notarizes correctly
|
||||||
|
copyJNF $JRE_CONTENTS
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -n "$bundle_type" ] && (cp -a $JCEF_PATH/Frameworks "$JRE_CONTENTS" || do_exit $?)
|
||||||
|
|
||||||
|
echo Creating "$JBR".tar.gz ...
|
||||||
|
COPYFILE_DISABLE=1 tar -pczf "$JBR".tar.gz --exclude='*.dSYM' --exclude='man' -C "$tmp" "$__arch_name" || do_exit $?
|
||||||
|
rm -rf "$tmp"
|
||||||
|
}
|
||||||
|
|
||||||
|
WITH_DEBUG_LEVEL="--with-debug-level=release"
|
||||||
|
CONF_ARCHITECTURE=x86_64
|
||||||
|
if [[ "${architecture}" == *aarch64* ]]; then
|
||||||
|
CONF_ARCHITECTURE=aarch64
|
||||||
|
fi
|
||||||
|
RELEASE_NAME=macosx-${CONF_ARCHITECTURE}-server-release
|
||||||
|
|
||||||
|
case "$bundle_type" in
|
||||||
|
"jcef")
|
||||||
|
do_reset_changes=1
|
||||||
|
;;
|
||||||
|
"dcevm")
|
||||||
|
HEAD_REVISION=$(git rev-parse HEAD)
|
||||||
|
git am jb/project/tools/patches/dcevm/*.patch || do_exit $?
|
||||||
|
do_reset_dcevm=1
|
||||||
|
do_reset_changes=1
|
||||||
|
;;
|
||||||
|
"nomod" | "")
|
||||||
|
bundle_type=""
|
||||||
|
;;
|
||||||
|
"fd")
|
||||||
|
do_reset_changes=1
|
||||||
|
WITH_DEBUG_LEVEL="--with-debug-level=fastdebug"
|
||||||
|
RELEASE_NAME=macosx-${CONF_ARCHITECTURE}-server-fastdebug
|
||||||
|
JBSDK=macosx-${architecture}-server-release
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -z "$INC_BUILD" ]; then
|
||||||
|
do_configure || do_exit $?
|
||||||
|
make clean CONF=$RELEASE_NAME || do_exit $?
|
||||||
|
fi
|
||||||
|
make images CONF=$RELEASE_NAME || do_exit $?
|
||||||
|
|
||||||
|
IMAGES_DIR=build/$RELEASE_NAME/images
|
||||||
|
|
||||||
|
major_version=$(echo "$JBSDK_VERSION_WITH_DOTS" | awk -F "." '{print $1}')
|
||||||
|
minor_version=$(echo "$JBSDK_VERSION_WITH_DOTS" | awk -F "." '{print $3}')
|
||||||
|
[ -z "$minor_version" -o "$minor_version" = "0" ] && version_dir=$major_version || version_dir=$JBSDK_VERSION_WITH_DOTS
|
||||||
|
JSDK=$IMAGES_DIR/jdk-bundle/jdk-$version_dir.jdk/Contents/Home
|
||||||
|
JSDK_MODS_DIR=$IMAGES_DIR/jmods
|
||||||
|
JBRSDK_BUNDLE=jbrsdk
|
||||||
|
|
||||||
|
if [ "$bundle_type" == "jcef" ] || [ "$bundle_type" == "dcevm" ] || [ "$bundle_type" == "fd" ]; then
|
||||||
|
git apply -p0 < jb/project/tools/patches/add_jcef_module.patch || do_exit $?
|
||||||
|
update_jsdk_mods "$JSDK" "$JCEF_PATH"/jmods "$JSDK"/jmods "$JSDK_MODS_DIR" || do_exit $?
|
||||||
|
cp $JCEF_PATH/jmods/* $JSDK_MODS_DIR # $JSDK/jmods is not changed
|
||||||
|
|
||||||
|
jbr_name_postfix="_${bundle_type}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# create runtime image bundle
|
||||||
|
modules=$(xargs < modules.list | sed s/" "//g) || do_exit $?
|
||||||
|
create_image_bundle "jbr${jbr_name_postfix}" "jbr" $JSDK_MODS_DIR "$modules" || do_exit $?
|
||||||
|
|
||||||
|
# create sdk image bundle
|
||||||
|
modules=$(cat "$JSDK"/release | grep MODULES | sed s/MODULES=//g | sed s/' '/','/g | sed s/\"//g | sed s/\\n//g) || do_exit $?
|
||||||
|
if [ "$bundle_type" == "jcef" ] || [ "$bundle_type" == "dcevm" ] || [ "$bundle_type" == "fd" ] || [ "$bundle_type" == "$JBRSDK_BUNDLE" ]; then
|
||||||
|
modules=${modules},$(get_mods_list "$JCEF_PATH"/jmods)
|
||||||
|
fi
|
||||||
|
create_image_bundle "$JBRSDK_BUNDLE${jbr_name_postfix}" "$JBRSDK_BUNDLE" "$JSDK_MODS_DIR" "$modules" || do_exit $?
|
||||||
|
|
||||||
|
if [ -z "$bundle_type" ]; then
|
||||||
|
JBRSDK_TEST=${JBRSDK_BUNDLE}-${JBSDK_VERSION}-osx-test-${architecture}-b${build_number}
|
||||||
|
echo Creating "$JBRSDK_TEST" ...
|
||||||
|
make test-image CONF=$RELEASE_NAME || do_exit $?
|
||||||
|
[ -f "$JBRSDK_TEST.tar.gz" ] && rm "$JBRSDK_TEST.tar.gz"
|
||||||
|
COPYFILE_DISABLE=1 tar -pczf "$JBRSDK_TEST".tar.gz -C $IMAGES_DIR --exclude='test/jdk/demos' test || do_exit $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_exit 0
|
||||||
120
jb/project/tools/mac/scripts/notarize.sh
Executable file
120
jb/project/tools/mac/scripts/notarize.sh
Executable file
@@ -0,0 +1,120 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
APP_DIRECTORY=$1
|
||||||
|
APPL_USER=$2
|
||||||
|
APPL_PASSWORD=$3
|
||||||
|
APP_NAME=$4
|
||||||
|
BUNDLE_ID=$5
|
||||||
|
FAKE_ROOT="${6:-fake-root}"
|
||||||
|
|
||||||
|
if [[ -z "$APP_DIRECTORY" ]] || [[ -z "$APPL_USER" ]] || [[ -z "$APPL_PASSWORD" ]]; then
|
||||||
|
echo "Usage: $0 AppDirectory Username Password"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [[ ! -d "$APP_DIRECTORY" ]]; then
|
||||||
|
echo "AppDirectory '$APP_DIRECTORY' does not exist or not a directory"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
function log() {
|
||||||
|
echo "$(date '+[%H:%M:%S]') $*"
|
||||||
|
}
|
||||||
|
|
||||||
|
function publish-log() {
|
||||||
|
id=$1
|
||||||
|
file=$2
|
||||||
|
curl -T "$file" "$ARTIFACTORY_URL/$id" || true
|
||||||
|
}
|
||||||
|
|
||||||
|
function altool-upload() {
|
||||||
|
# Since altool uses same file for upload token we have to trick it into using different folders for token file location
|
||||||
|
# Also it copies zip into TMPDIR so we override it too, to simplify cleanup
|
||||||
|
OLD_HOME="$HOME"
|
||||||
|
export HOME="$FAKE_ROOT/home"
|
||||||
|
export TMPDIR="$FAKE_ROOT/tmp"
|
||||||
|
mkdir -p "$HOME"
|
||||||
|
mkdir -p "$TMPDIR"
|
||||||
|
export _JAVA_OPTIONS="-Duser.home=$HOME -Djava.io.tmpdir=$TMPDIR"
|
||||||
|
# Reduce amount of downloads, cache transporter libraries
|
||||||
|
shared_itmstransporter="$OLD_HOME/shared-itmstransporter"
|
||||||
|
if [[ -f "$shared_itmstransporter" ]]; then
|
||||||
|
cp -r "$shared_itmstransporter" "$HOME/.itmstransporter"
|
||||||
|
fi
|
||||||
|
# For some reason altool prints everything to stderr, not stdout
|
||||||
|
set +e
|
||||||
|
xcrun altool --notarize-app \
|
||||||
|
--username "$APPL_USER" --password "$APPL_PASSWORD" \
|
||||||
|
--primary-bundle-id "$BUNDLE_ID" \
|
||||||
|
--asc-provider JetBrainssro --file "$1" 2>&1 | tee "altool.init.out"
|
||||||
|
unset TMPDIR
|
||||||
|
export HOME="$OLD_HOME"
|
||||||
|
set -e
|
||||||
|
}
|
||||||
|
|
||||||
|
#immediately exit script with an error if a command fails
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
file="$APP_NAME.zip"
|
||||||
|
|
||||||
|
log "Zipping $file..."
|
||||||
|
rm -rf "$file"
|
||||||
|
ditto -c -k --sequesterRsrc --keepParent "$APP_DIRECTORY" "$file"
|
||||||
|
|
||||||
|
log "Notarizing $file..."
|
||||||
|
rm -rf "altool.init.out" "altool.check.out"
|
||||||
|
altool-upload "$file"
|
||||||
|
|
||||||
|
rm -rf "$file"
|
||||||
|
|
||||||
|
notarization_info="$(grep -e "RequestUUID" "altool.init.out" | grep -oE '([0-9a-f-]{36})')"
|
||||||
|
|
||||||
|
if [ -z "$notarization_info" ]; then
|
||||||
|
log "Faile to read RequestUUID from altool.init.out"
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
|
||||||
|
PATH="$PATH:/usr/local/bin/"
|
||||||
|
|
||||||
|
log "Notarization request sent, awaiting response"
|
||||||
|
spent=0
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
# For some reason altool prints everything to stderr, not stdout
|
||||||
|
xcrun altool --username "$APPL_USER" --notarization-info "$notarization_info" --password "$APPL_PASSWORD" >"altool.check.out" 2>&1 || true
|
||||||
|
status="$(grep -oe 'Status: .*' "altool.check.out" | cut -c 9- || true)"
|
||||||
|
log "Current status: $status"
|
||||||
|
if [ "$status" = "invalid" ]; then
|
||||||
|
log "Notarization failed"
|
||||||
|
ec=1
|
||||||
|
elif [ "$status" = "success" ]; then
|
||||||
|
log "Notarization succeeded"
|
||||||
|
ec=0
|
||||||
|
else
|
||||||
|
if [ "$status" != "in progress" ]; then
|
||||||
|
log "Unknown notarization status, waiting more, altool output:"
|
||||||
|
cat "altool.check.out"
|
||||||
|
fi
|
||||||
|
if [[ $spent -gt 60 ]]; then
|
||||||
|
log "Waiting time out (apx 60 minutes)"
|
||||||
|
ec=2
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 60
|
||||||
|
((spent += 1))
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
developer_log="developer_log.json"
|
||||||
|
log "Fetching $developer_log"
|
||||||
|
# TODO: Replace cut with trim or something better
|
||||||
|
url="$(grep -oe 'LogFileURL: .*' "altool.check.out" | cut -c 13-)"
|
||||||
|
wget "$url" -O "$developer_log" && cat "$developer_log" || true
|
||||||
|
if [ $ec != 0 ]; then
|
||||||
|
log "Publishing $developer_log"
|
||||||
|
publish-log "$notarization_info" "$developer_log"
|
||||||
|
fi
|
||||||
|
break
|
||||||
|
done
|
||||||
|
cat "altool.check.out"
|
||||||
|
|
||||||
|
rm -rf "altool.init.out" "altool.check.out"
|
||||||
|
exit $ec
|
||||||
107
jb/project/tools/mac/scripts/sign.sh
Executable file
107
jb/project/tools/mac/scripts/sign.sh
Executable file
@@ -0,0 +1,107 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
APP_DIRECTORY=$1
|
||||||
|
JB_CERT=$2
|
||||||
|
|
||||||
|
if [[ -z "$APP_DIRECTORY" ]] || [[ -z "$JB_CERT" ]]; then
|
||||||
|
echo "Usage: $0 AppDirectory CertificateID"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [[ ! -d "$APP_DIRECTORY" ]]; then
|
||||||
|
echo "AppDirectory '$APP_DIRECTORY' does not exist or not a directory"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
function log() {
|
||||||
|
echo "$(date '+[%H:%M:%S]') $*"
|
||||||
|
}
|
||||||
|
|
||||||
|
#immediately exit script with an error if a command fails
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Cleanup files left from previous sign attempt (if any)
|
||||||
|
find "$APP_DIRECTORY" -name '*.cstemp' -exec rm '{}' \;
|
||||||
|
|
||||||
|
log "Signing libraries and executables..."
|
||||||
|
# -perm +111 searches for executables
|
||||||
|
for f in \
|
||||||
|
"Contents/Home/bin" \
|
||||||
|
"Contents/Home/lib"; do
|
||||||
|
if [ -d "$APP_DIRECTORY/$f" ]; then
|
||||||
|
find "$APP_DIRECTORY/$f" \
|
||||||
|
-type f \( -name "*.jnilib" -o -name "*.dylib" -o -name "*.so" -o -perm +111 \) \
|
||||||
|
-exec codesign --timestamp --force \
|
||||||
|
-v -s "$JB_CERT" --options=runtime \
|
||||||
|
--entitlements entitlements.xml {} \;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -d "$APP_DIRECTORY/Contents/Frameworks" ]; then
|
||||||
|
log "Signing frameworks..."
|
||||||
|
for f in $APP_DIRECTORY/Contents/Frameworks/*; do
|
||||||
|
find "$f" \
|
||||||
|
-type f \( -name "*.jnilib" -o -name "*.dylib" -o -name "*.so" \) \
|
||||||
|
-exec codesign --timestamp --force \
|
||||||
|
-v -s "$JB_CERT" \
|
||||||
|
--entitlements entitlements.xml {} \;
|
||||||
|
codesign --timestamp --force \
|
||||||
|
-v -s "$JB_CERT" --options=runtime \
|
||||||
|
--entitlements entitlements.xml "$f"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Signing libraries in jars in $PWD"
|
||||||
|
|
||||||
|
# todo: add set -euo pipefail; into the inner sh -c
|
||||||
|
# `-e` prevents `grep -q && printf` loginc
|
||||||
|
# with `-o pipefail` there's no input for 'while' loop
|
||||||
|
find "$APP_DIRECTORY" -name '*.jar' \
|
||||||
|
-exec sh -c "set -u; unzip -l \"\$0\" | grep -q -e '\.dylib\$' -e '\.jnilib\$' -e '\.so\$' -e '^jattach\$' && printf \"\$0\0\" " {} \; |
|
||||||
|
while IFS= read -r -d $'\0' file; do
|
||||||
|
log "Processing libraries in $file"
|
||||||
|
|
||||||
|
rm -rf jarfolder jar.jar
|
||||||
|
mkdir jarfolder
|
||||||
|
filename="${file##*/}"
|
||||||
|
log "Filename: $filename"
|
||||||
|
cp "$file" jarfolder && (cd jarfolder && jar xf "$filename" && rm "$filename")
|
||||||
|
|
||||||
|
find jarfolder \
|
||||||
|
-type f \( -name "*.jnilib" -o -name "*.dylib" -o -name "*.so" -o -name "jattach" \) \
|
||||||
|
-exec codesign --timestamp --force \
|
||||||
|
-v -s "$JB_CERT" --options=runtime \
|
||||||
|
--entitlements entitlements.xml {} \;
|
||||||
|
|
||||||
|
(cd jarfolder; zip -q -r -o ../jar.jar .)
|
||||||
|
mv jar.jar "$file"
|
||||||
|
done
|
||||||
|
|
||||||
|
rm -rf jarfolder jar.jar
|
||||||
|
|
||||||
|
log "Signing other files..."
|
||||||
|
for f in \
|
||||||
|
"Contents/MacOS"; do
|
||||||
|
if [ -d "$APP_DIRECTORY/$f" ]; then
|
||||||
|
find "$APP_DIRECTORY/$f" \
|
||||||
|
-type f \( -name "*.jnilib" -o -name "*.dylib" -o -name "*.so" -o -perm +111 \) \
|
||||||
|
-exec codesign --timestamp --force \
|
||||||
|
-v -s "$JB_CERT" --options=runtime \
|
||||||
|
--entitlements entitlements.xml {} \;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
#log "Signing executable..."
|
||||||
|
#codesign --timestamp \
|
||||||
|
# -v -s "$JB_CERT" --options=runtime \
|
||||||
|
# --force \
|
||||||
|
# --entitlements entitlements.xml "$APP_DIRECTORY/Contents/MacOS/idea"
|
||||||
|
|
||||||
|
log "Signing whole app..."
|
||||||
|
codesign --timestamp \
|
||||||
|
-v -s "$JB_CERT" --options=runtime \
|
||||||
|
--force \
|
||||||
|
--entitlements entitlements.xml "$APP_DIRECTORY"
|
||||||
|
|
||||||
|
log "Verifying java is not broken"
|
||||||
|
find "$APP_DIRECTORY" \
|
||||||
|
-type f -name 'java' -perm +111 -exec {} -version \;
|
||||||
134
jb/project/tools/mac/scripts/signapp.sh
Executable file
134
jb/project/tools/mac/scripts/signapp.sh
Executable file
@@ -0,0 +1,134 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
|
||||||
|
#immediately exit script with an error if a command fails
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
export COPY_EXTENDED_ATTRIBUTES_DISABLE=true
|
||||||
|
export COPYFILE_DISABLE=true
|
||||||
|
|
||||||
|
INPUT_FILE=$1
|
||||||
|
EXPLODED=$2.exploded
|
||||||
|
BACKUP_JMODS=$2.backup
|
||||||
|
USERNAME=$3
|
||||||
|
PASSWORD=$4
|
||||||
|
CODESIGN_STRING=$5
|
||||||
|
NOTARIZE=$6
|
||||||
|
BUNDLE_ID=$7
|
||||||
|
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
function log() {
|
||||||
|
echo "$(date '+[%H:%M:%S]') $*"
|
||||||
|
}
|
||||||
|
|
||||||
|
log "Deleting $EXPLODED ..."
|
||||||
|
if test -d "$EXPLODED"; then
|
||||||
|
find "$EXPLODED" -mindepth 1 -maxdepth 1 -exec chmod -R u+wx '{}' \;
|
||||||
|
fi
|
||||||
|
rm -rf "$EXPLODED"
|
||||||
|
mkdir "$EXPLODED"
|
||||||
|
rm -rf "$BACKUP_JMODS"
|
||||||
|
mkdir "$BACKUP_JMODS"
|
||||||
|
|
||||||
|
log "Unzipping $INPUT_FILE to $EXPLODED ..."
|
||||||
|
tar -xzvf "$INPUT_FILE" --directory $EXPLODED
|
||||||
|
BUILD_NAME="$(ls "$EXPLODED")"
|
||||||
|
sed -i '' s/BNDL/APPL/ $EXPLODED/$BUILD_NAME/Contents/Info.plist
|
||||||
|
rm -f $EXPLODED/$BUILD_NAME/Contents/CodeResources
|
||||||
|
rm "$INPUT_FILE"
|
||||||
|
if test -d $EXPLODED/$BUILD_NAME/Contents/Home/jmods; then
|
||||||
|
mv $EXPLODED/$BUILD_NAME/Contents/Home/jmods $BACKUP_JMODS
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "$INPUT_FILE extracted and removed"
|
||||||
|
|
||||||
|
APPLICATION_PATH="$EXPLODED/$BUILD_NAME"
|
||||||
|
|
||||||
|
find "$APPLICATION_PATH/Contents/Home/bin" \
|
||||||
|
-maxdepth 1 -type f -name '*.jnilib' -print0 |
|
||||||
|
while IFS= read -r -d $'\0' file; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
log "Linking $file"
|
||||||
|
b="$(basename "$file" .jnilib)"
|
||||||
|
ln -sf "$b.jnilib" "$(dirname "$file")/$b.dylib"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
find "$APPLICATION_PATH/Contents/" \
|
||||||
|
-maxdepth 1 -type f -name '*.txt' -print0 |
|
||||||
|
while IFS= read -r -d $'\0' file; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
log "Moving $file"
|
||||||
|
mv "$file" "$APPLICATION_PATH/Contents/Resources"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
non_plist=$(find "$APPLICATION_PATH/Contents/" -maxdepth 1 -type f -and -not -name 'Info.plist' | wc -l)
|
||||||
|
if [[ $non_plist -gt 0 ]]; then
|
||||||
|
log "Only Info.plist file is allowed in Contents directory but found $non_plist file(s):"
|
||||||
|
log "$(find "$APPLICATION_PATH/Contents/" -maxdepth 1 -type f -and -not -name 'Info.plist')"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Unlocking keychain..."
|
||||||
|
# Make sure *.p12 is imported into local KeyChain
|
||||||
|
security unlock-keychain -p "$PASSWORD" "/Users/$USERNAME/Library/Keychains/login.keychain"
|
||||||
|
|
||||||
|
attempt=1
|
||||||
|
limit=3
|
||||||
|
set +e
|
||||||
|
while [[ $attempt -le $limit ]]; do
|
||||||
|
log "Signing (attempt $attempt) $APPLICATION_PATH ..."
|
||||||
|
./sign.sh "$APPLICATION_PATH" "$CODESIGN_STRING"
|
||||||
|
ec=$?
|
||||||
|
if [[ $ec -ne 0 ]]; then
|
||||||
|
((attempt += 1))
|
||||||
|
if [ $attempt -eq $limit ]; then
|
||||||
|
set -e
|
||||||
|
fi
|
||||||
|
log "Signing failed, wait for 30 sec and try to sign again"
|
||||||
|
sleep 30
|
||||||
|
else
|
||||||
|
log "Signing done"
|
||||||
|
codesign -v "$APPLICATION_PATH" -vvvvv
|
||||||
|
log "Check sign done"
|
||||||
|
((attempt += limit))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ "$NOTARIZE" = "yes" ]; then
|
||||||
|
log "Notarizing..."
|
||||||
|
# shellcheck disable=SC1090
|
||||||
|
source "$HOME/.notarize_token"
|
||||||
|
APP_NAME=$(echo ${INPUT_FILE} | awk -F"." '{ print $1 }')
|
||||||
|
# Since notarization tool uses same file for upload token we have to trick it into using different folders, hence fake root
|
||||||
|
# Also it leaves copy of zip file in TMPDIR, so notarize.sh overrides it and uses FAKE_ROOT as location for temp TMPDIR
|
||||||
|
FAKE_ROOT="$(pwd)/fake-root"
|
||||||
|
mkdir -p "$FAKE_ROOT"
|
||||||
|
echo "Notarization will use fake root: $FAKE_ROOT"
|
||||||
|
./notarize.sh "$APPLICATION_PATH" "$APPLE_USERNAME" "$APPLE_PASSWORD" "$APP_NAME" "$BUNDLE_ID" "$FAKE_ROOT"
|
||||||
|
rm -rf "$FAKE_ROOT"
|
||||||
|
|
||||||
|
set +e
|
||||||
|
log "Stapling..."
|
||||||
|
xcrun stapler staple "$APPLICATION_PATH"
|
||||||
|
else
|
||||||
|
log "Notarization disabled"
|
||||||
|
log "Stapling disabled"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Zipping $BUILD_NAME to $INPUT_FILE ..."
|
||||||
|
(
|
||||||
|
#cd "$EXPLODED"
|
||||||
|
#ditto -c -k --sequesterRsrc --keepParent "$BUILD_NAME" "../$INPUT_FILE"
|
||||||
|
if test -d $BACKUP_JMODS/jmods; then
|
||||||
|
mv $BACKUP_JMODS/jmods $EXPLODED/$BUILD_NAME/Contents/Home
|
||||||
|
fi
|
||||||
|
|
||||||
|
tar -pczvf $INPUT_FILE --exclude='*.dSYM' --exclude='man' -C $EXPLODED $BUILD_NAME
|
||||||
|
log "Finished zipping"
|
||||||
|
)
|
||||||
|
rm -rf "$EXPLODED"
|
||||||
|
log "Done"
|
||||||
30
jb/project/tools/patches/add_jcef_module.patch
Normal file
30
jb/project/tools/patches/add_jcef_module.patch
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
diff --git modules.list modules.list
|
||||||
|
index 054f21d1ee0..d9a121f0273 100644
|
||||||
|
--- modules.list
|
||||||
|
+++ modules.list
|
||||||
|
@@ -49,4 +49,7 @@ jdk.unsupported,
|
||||||
|
jdk.xml.dom,
|
||||||
|
jdk.zipfs,
|
||||||
|
jdk.hotspot.agent,
|
||||||
|
-jdk.jcmd
|
||||||
|
+jdk.jcmd,
|
||||||
|
+jcef,
|
||||||
|
+gluegen.rt,
|
||||||
|
+jogl.all
|
||||||
|
diff --git src/java.desktop/share/classes/module-info.java src/java.desktop/share/classes/module-info.java
|
||||||
|
index 897647ee368..781d1809493 100644
|
||||||
|
--- src/java.desktop/share/classes/module-info.java
|
||||||
|
+++ src/java.desktop/share/classes/module-info.java
|
||||||
|
@@ -116,7 +116,11 @@ module java.desktop {
|
||||||
|
// see make/GensrcModuleInfo.gmk
|
||||||
|
exports sun.awt to
|
||||||
|
jdk.accessibility,
|
||||||
|
- jdk.unsupported.desktop;
|
||||||
|
+ jdk.unsupported.desktop,
|
||||||
|
+ jcef,
|
||||||
|
+ jogl.all;
|
||||||
|
+
|
||||||
|
+ exports java.awt.peer to jcef;
|
||||||
|
|
||||||
|
exports java.awt.dnd.peer to jdk.unsupported.desktop;
|
||||||
|
exports sun.awt.dnd to jdk.unsupported.desktop;
|
||||||
8834
jb/project/tools/patches/dcevm/0001-Apply-basic-dcevm11-patch.patch
Normal file
8834
jb/project/tools/patches/dcevm/0001-Apply-basic-dcevm11-patch.patch
Normal file
File diff suppressed because it is too large
Load Diff
5615
jb/project/tools/patches/dcevm/0002-dcevm11-fixes.patch
Normal file
5615
jb/project/tools/patches/dcevm/0002-dcevm11-fixes.patch
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,29 @@
|
|||||||
|
From 9b18096f241be0350245868e8cf26729f6c3d110 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Wed, 11 Mar 2020 14:19:34 +0100
|
||||||
|
Subject: [PATCH 03/45] Fix class cast exception on redefinition of class A,
|
||||||
|
that is superclass of B that has anonymous class C
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/oops/instanceKlass.cpp | 5 ++++-
|
||||||
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
index db5b8da58fc..6d9e5116df1 100644
|
||||||
|
--- a/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
+++ b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
@@ -908,7 +908,10 @@ bool InstanceKlass::link_class_impl(TRAPS) {
|
||||||
|
|
||||||
|
if (!is_linked()) {
|
||||||
|
if (!is_rewritten()) {
|
||||||
|
- {
|
||||||
|
+ // (DCEVM): If class A is being redefined and class B->A (B is extended from A) and B is host class of anonymous class C
|
||||||
|
+ // then second redefinition fails with cannot cast klass exception. So we currently turn off bytecode verification
|
||||||
|
+ // on redefinition.
|
||||||
|
+ if (!AllowEnhancedClassRedefinition || !newest_version()->is_redefining()) {
|
||||||
|
bool verify_ok = verify_code(THREAD);
|
||||||
|
if (!verify_ok) {
|
||||||
|
return false;
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,206 @@
|
|||||||
|
From 784dd5e16922110b0ee802d5bf1063e2b94499bc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sun, 4 Oct 2020 21:12:12 +0200
|
||||||
|
Subject: [PATCH 04/45] Support for Lambda class redefinition
|
||||||
|
|
||||||
|
---
|
||||||
|
.../share/classfile/classLoaderData.cpp | 9 +++
|
||||||
|
.../share/classfile/classLoaderData.hpp | 2 +-
|
||||||
|
.../share/classfile/systemDictionary.cpp | 10 ++-
|
||||||
|
.../prims/jvmtiEnhancedRedefineClasses.cpp | 65 +++++++++++++++++--
|
||||||
|
.../prims/jvmtiEnhancedRedefineClasses.hpp | 1 +
|
||||||
|
.../share/prims/resolvedMethodTable.cpp | 2 +
|
||||||
|
6 files changed, 80 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||||
|
index 340ffadf837..db50b3edee8 100644
|
||||||
|
--- a/src/hotspot/share/classfile/classLoaderData.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||||
|
@@ -599,6 +599,15 @@ Dictionary* ClassLoaderData::create_dictionary() {
|
||||||
|
return new Dictionary(this, size, resizable);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void ClassLoaderData::exchange_holders(ClassLoaderData* cld) {
|
||||||
|
+ oop holder_oop = _holder.peek();
|
||||||
|
+ _holder.replace(cld->_holder.peek());
|
||||||
|
+ cld->_holder.replace(holder_oop);
|
||||||
|
+ WeakHandle<vm_class_loader_data> exchange = _holder;
|
||||||
|
+ _holder = cld->_holder;
|
||||||
|
+ cld->_holder = exchange;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
// Tell the GC to keep this klass alive while iterating ClassLoaderDataGraph
|
||||||
|
oop ClassLoaderData::holder_phantom() const {
|
||||||
|
// A klass that was previously considered dead can be looked up in the
|
||||||
|
diff --git a/src/hotspot/share/classfile/classLoaderData.hpp b/src/hotspot/share/classfile/classLoaderData.hpp
|
||||||
|
index 5a81ab90ca3..bda39f3e353 100644
|
||||||
|
--- a/src/hotspot/share/classfile/classLoaderData.hpp
|
||||||
|
+++ b/src/hotspot/share/classfile/classLoaderData.hpp
|
||||||
|
@@ -175,7 +175,7 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
||||||
|
|
||||||
|
oop holder_no_keepalive() const;
|
||||||
|
oop holder_phantom() const;
|
||||||
|
-
|
||||||
|
+ void exchange_holders(ClassLoaderData* cld);
|
||||||
|
private:
|
||||||
|
void unload();
|
||||||
|
bool keep_alive() const { return _keep_alive > 0; }
|
||||||
|
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
index 2bfd9cb802f..cea614a574f 100644
|
||||||
|
--- a/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
@@ -825,10 +825,14 @@ InstanceKlass* SystemDictionary::resolve_hidden_class_from_stream(
|
||||||
|
Symbol* class_name,
|
||||||
|
Handle class_loader,
|
||||||
|
const ClassLoadInfo& cl_info,
|
||||||
|
+ InstanceKlass* old_klass,
|
||||||
|
TRAPS) {
|
||||||
|
|
||||||
|
EventClassLoad class_load_start_event;
|
||||||
|
ClassLoaderData* loader_data;
|
||||||
|
+
|
||||||
|
+ bool is_redefining = (old_klass != NULL);
|
||||||
|
+
|
||||||
|
|
||||||
|
// - for hidden classes that are not strong: create a new CLD that has a class holder and
|
||||||
|
// whose loader is the Lookup class's loader.
|
||||||
|
@@ -845,9 +849,13 @@ InstanceKlass* SystemDictionary::resolve_hidden_class_from_stream(
|
||||||
|
class_name,
|
||||||
|
loader_data,
|
||||||
|
cl_info,
|
||||||
|
- false, // pick_newest
|
||||||
|
+ is_redefining, // pick_newest
|
||||||
|
CHECK_NULL);
|
||||||
|
assert(k != NULL, "no klass created");
|
||||||
|
+ if (is_redefining && k != NULL) {
|
||||||
|
+ k->set_redefining(true);
|
||||||
|
+ k->set_old_version(old_klass);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
// Hidden classes that are not strong must update ClassLoaderData holder
|
||||||
|
// so that they can be unloaded when the mirror is no longer referenced.
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index 5308b079e67..c1b1b354541 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -492,6 +492,8 @@ void VM_EnhancedRedefineClasses::doit() {
|
||||||
|
ClassLoaderDataGraph::classes_do(&clear_cpool_cache);
|
||||||
|
|
||||||
|
|
||||||
|
+ // SystemDictionary::methods_do(fix_invoke_method);
|
||||||
|
+
|
||||||
|
// JSR-292 support
|
||||||
|
if (_any_class_has_resolved_methods) {
|
||||||
|
bool trace_name_printed = false;
|
||||||
|
@@ -754,12 +756,34 @@ jvmtiError VM_EnhancedRedefineClasses::load_new_class_versions(TRAPS) {
|
||||||
|
// load hook event.
|
||||||
|
state->set_class_being_redefined(the_class, _class_load_kind);
|
||||||
|
|
||||||
|
- InstanceKlass* k = SystemDictionary::resolve_from_stream(the_class_sym,
|
||||||
|
- the_class_loader,
|
||||||
|
- protection_domain,
|
||||||
|
- &st,
|
||||||
|
- the_class,
|
||||||
|
- THREAD);
|
||||||
|
+ InstanceKlass* k;
|
||||||
|
+
|
||||||
|
+ if (InstanceKlass::cast(the_class)->is_anonymous()) {
|
||||||
|
+ const InstanceKlass* host_class = the_class->host_klass();
|
||||||
|
+
|
||||||
|
+ // Make sure it's the real host class, not another anonymous class.
|
||||||
|
+ while (host_class != NULL && host_class->is_anonymous()) {
|
||||||
|
+ host_class = host_class->host_klass();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ k = SystemDictionary::parse_stream(the_class_sym,
|
||||||
|
+ the_class_loader,
|
||||||
|
+ protection_domain,
|
||||||
|
+ &st,
|
||||||
|
+ host_class,
|
||||||
|
+ the_class,
|
||||||
|
+ NULL,
|
||||||
|
+ THREAD);
|
||||||
|
+ k->class_loader_data()->exchange_holders(the_class->class_loader_data());
|
||||||
|
+ the_class->class_loader_data()->inc_keep_alive();
|
||||||
|
+ } else {
|
||||||
|
+ k = SystemDictionary::resolve_from_stream(the_class_sym,
|
||||||
|
+ the_class_loader,
|
||||||
|
+ protection_domain,
|
||||||
|
+ &st,
|
||||||
|
+ the_class,
|
||||||
|
+ THREAD);
|
||||||
|
+ }
|
||||||
|
// Clear class_being_redefined just to be sure.
|
||||||
|
state->clear_class_being_redefined();
|
||||||
|
|
||||||
|
@@ -1440,6 +1464,30 @@ void VM_EnhancedRedefineClasses::MethodDataCleaner::do_klass(Klass* k) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+void VM_EnhancedRedefineClasses::fix_invoke_method(Method* method) {
|
||||||
|
+
|
||||||
|
+ constantPoolHandle other_cp = constantPoolHandle(method->constants());
|
||||||
|
+
|
||||||
|
+ for (int i = 0; i < other_cp->length(); i++) {
|
||||||
|
+ if (other_cp->tag_at(i).is_klass()) {
|
||||||
|
+ Klass* klass = other_cp->resolved_klass_at(i);
|
||||||
|
+ if (klass->new_version() != NULL) {
|
||||||
|
+ // Constant pool entry points to redefined class -- update to the new version
|
||||||
|
+ other_cp->klass_at_put(i, klass->newest_version());
|
||||||
|
+ }
|
||||||
|
+ assert(other_cp->resolved_klass_at(i)->new_version() == NULL, "Must be new klass!");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ConstantPoolCache* cp_cache = other_cp->cache();
|
||||||
|
+ if (cp_cache != NULL) {
|
||||||
|
+ cp_cache->clear_entries();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
void VM_EnhancedRedefineClasses::update_jmethod_ids() {
|
||||||
|
for (int j = 0; j < _matching_methods_length; ++j) {
|
||||||
|
Method* old_method = _matching_old_methods[j];
|
||||||
|
@@ -1977,7 +2025,10 @@ jvmtiError VM_EnhancedRedefineClasses::find_sorted_affected_classes(TRAPS) {
|
||||||
|
// Find classes not directly redefined, but affected by a redefinition (because one of its supertypes is redefined)
|
||||||
|
AffectedKlassClosure closure(_affected_klasses);
|
||||||
|
// Updated in j10, from original SystemDictionary::classes_do
|
||||||
|
- ClassLoaderDataGraph::dictionary_classes_do(&closure);
|
||||||
|
+
|
||||||
|
+ ClassLoaderDataGraph::classes_do(&closure);
|
||||||
|
+ //ClassLoaderDataGraph::dictionary_classes_do(&closure);
|
||||||
|
+
|
||||||
|
log_trace(redefine, class, load)("%d classes affected", _affected_klasses->length());
|
||||||
|
|
||||||
|
// Sort the affected klasses such that a supertype is always on a smaller array index than its subtype.
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
index a48e07e3a6a..3551b06ecde 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
@@ -116,6 +116,7 @@ class VM_EnhancedRedefineClasses: public VM_GC_Operation {
|
||||||
|
void rollback();
|
||||||
|
static void mark_as_scavengable(nmethod* nm);
|
||||||
|
static void unpatch_bytecode(Method* method);
|
||||||
|
+ static void fix_invoke_method(Method* method);
|
||||||
|
|
||||||
|
// Figure out which new methods match old methods in name and signature,
|
||||||
|
// which methods have been added, and which are no longer present
|
||||||
|
diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||||
|
index 6a8128e844f..8644937dbbb 100644
|
||||||
|
--- a/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||||
|
@@ -409,6 +409,8 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
|
||||||
|
InstanceKlass* newer_klass = InstanceKlass::cast(old_method->method_holder()->new_version());
|
||||||
|
Method* newer_method = newer_klass->method_with_idnum(old_method->orig_method_idnum());
|
||||||
|
|
||||||
|
+ log_info(redefine, class, load, exceptions)("Adjusting method: '%s' of new class %s", newer_method->name_and_sig_as_C_string(), newer_klass->name()->as_C_string());
|
||||||
|
+
|
||||||
|
assert(newer_klass == newer_method->method_holder(), "call after swapping redefined guts");
|
||||||
|
assert(newer_method != NULL, "method_with_idnum() should not be NULL");
|
||||||
|
assert(old_method != newer_method, "sanity check");
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
From 97ab12615a56e90993b5df4615c6dbd7eb856ebb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sat, 23 May 2020 10:02:15 +0200
|
||||||
|
Subject: [PATCH 05/45] Fix "no original bytecode found" error if method with
|
||||||
|
bkp is missing
|
||||||
|
|
||||||
|
Sometimes IDE can deploy class with erroneous method, such method has
|
||||||
|
n bytecode, but breakpoint position can still exist.
|
||||||
|
---
|
||||||
|
src/hotspot/share/interpreter/bytecodes.cpp | 2 +-
|
||||||
|
.../share/interpreter/interpreterRuntime.cpp | 2 +-
|
||||||
|
src/hotspot/share/oops/method.cpp | 8 ++++----
|
||||||
|
src/hotspot/share/oops/method.hpp | 4 ++--
|
||||||
|
.../prims/jvmtiEnhancedRedefineClasses.cpp | 18 ++++++++++--------
|
||||||
|
5 files changed, 18 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/interpreter/bytecodes.cpp b/src/hotspot/share/interpreter/bytecodes.cpp
|
||||||
|
index 6711ba735db..4f0b655265a 100644
|
||||||
|
--- a/src/hotspot/share/interpreter/bytecodes.cpp
|
||||||
|
+++ b/src/hotspot/share/interpreter/bytecodes.cpp
|
||||||
|
@@ -84,7 +84,7 @@ Bytecodes::Code Bytecodes::code_at(Method* method, int bci) {
|
||||||
|
Bytecodes::Code Bytecodes::non_breakpoint_code_at(const Method* method, address bcp) {
|
||||||
|
assert(method != NULL, "must have the method for breakpoint conversion");
|
||||||
|
assert(method->contains(bcp), "must be valid bcp in method");
|
||||||
|
- return method->orig_bytecode_at(method->bci_from(bcp));
|
||||||
|
+ return method->orig_bytecode_at(method->bci_from(bcp), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Bytecodes::special_length_at(Bytecodes::Code code, address bcp, address end) {
|
||||||
|
diff --git a/src/hotspot/share/interpreter/interpreterRuntime.cpp b/src/hotspot/share/interpreter/interpreterRuntime.cpp
|
||||||
|
index d66ed24d862..9bfcd9eb479 100644
|
||||||
|
--- a/src/hotspot/share/interpreter/interpreterRuntime.cpp
|
||||||
|
+++ b/src/hotspot/share/interpreter/interpreterRuntime.cpp
|
||||||
|
@@ -788,7 +788,7 @@ JRT_END
|
||||||
|
// Invokes
|
||||||
|
|
||||||
|
JRT_ENTRY(Bytecodes::Code, InterpreterRuntime::get_original_bytecode_at(JavaThread* current, Method* method, address bcp))
|
||||||
|
- return method->orig_bytecode_at(method->bci_from(bcp));
|
||||||
|
+ return method->orig_bytecode_at(method->bci_from(bcp), false);
|
||||||
|
JRT_END
|
||||||
|
|
||||||
|
JRT_ENTRY(void, InterpreterRuntime::set_original_bytecode_at(JavaThread* current, Method* method, address bcp, Bytecodes::Code new_code))
|
||||||
|
diff --git a/src/hotspot/share/oops/method.cpp b/src/hotspot/share/oops/method.cpp
|
||||||
|
index 613c10a9d8c..a5a12599997 100644
|
||||||
|
--- a/src/hotspot/share/oops/method.cpp
|
||||||
|
+++ b/src/hotspot/share/oops/method.cpp
|
||||||
|
@@ -1853,14 +1853,14 @@ bool CompressedLineNumberReadStream::read_pair() {
|
||||||
|
|
||||||
|
#if INCLUDE_JVMTI
|
||||||
|
|
||||||
|
-Bytecodes::Code Method::orig_bytecode_at(int bci) const {
|
||||||
|
+Bytecodes::Code Method::orig_bytecode_at(int bci, bool no_fatal) const {
|
||||||
|
BreakpointInfo* bp = method_holder()->breakpoints();
|
||||||
|
for (; bp != NULL; bp = bp->next()) {
|
||||||
|
if (bp->match(this, bci)) {
|
||||||
|
return bp->orig_bytecode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- {
|
||||||
|
+ if (!no_fatal) {
|
||||||
|
ResourceMark rm;
|
||||||
|
fatal("no original bytecode found in %s at bci %d", name_and_sig_as_C_string(), bci);
|
||||||
|
}
|
||||||
|
@@ -1998,7 +1998,7 @@ BreakpointInfo::BreakpointInfo(Method* m, int bci) {
|
||||||
|
_signature_index = m->signature_index();
|
||||||
|
_orig_bytecode = (Bytecodes::Code) *m->bcp_from(_bci);
|
||||||
|
if (_orig_bytecode == Bytecodes::_breakpoint)
|
||||||
|
- _orig_bytecode = m->orig_bytecode_at(_bci);
|
||||||
|
+ _orig_bytecode = m->orig_bytecode_at(_bci, false);
|
||||||
|
_next = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2007,7 +2007,7 @@ void BreakpointInfo::set(Method* method) {
|
||||||
|
{
|
||||||
|
Bytecodes::Code code = (Bytecodes::Code) *method->bcp_from(_bci);
|
||||||
|
if (code == Bytecodes::_breakpoint)
|
||||||
|
- code = method->orig_bytecode_at(_bci);
|
||||||
|
+ code = method->orig_bytecode_at(_bci, false);
|
||||||
|
assert(orig_bytecode() == code, "original bytecode must be the same");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
diff --git a/src/hotspot/share/oops/method.hpp b/src/hotspot/share/oops/method.hpp
|
||||||
|
index 030ddd1f675..a8d6507ff6c 100644
|
||||||
|
--- a/src/hotspot/share/oops/method.hpp
|
||||||
|
+++ b/src/hotspot/share/oops/method.hpp
|
||||||
|
@@ -226,7 +226,7 @@ class Method : public Metadata {
|
||||||
|
|
||||||
|
// JVMTI breakpoints
|
||||||
|
#if !INCLUDE_JVMTI
|
||||||
|
- Bytecodes::Code orig_bytecode_at(int bci) const {
|
||||||
|
+ Bytecodes::Code orig_bytecode_at(int bci, bool no_fatal) const {
|
||||||
|
ShouldNotReachHere();
|
||||||
|
return Bytecodes::_shouldnotreachhere;
|
||||||
|
}
|
||||||
|
@@ -235,7 +235,7 @@ class Method : public Metadata {
|
||||||
|
};
|
||||||
|
u2 number_of_breakpoints() const {return 0;}
|
||||||
|
#else // !INCLUDE_JVMTI
|
||||||
|
- Bytecodes::Code orig_bytecode_at(int bci) const;
|
||||||
|
+ Bytecodes::Code orig_bytecode_at(int bci, bool no_fatal) const;
|
||||||
|
void set_orig_bytecode_at(int bci, Bytecodes::Code code);
|
||||||
|
void set_breakpoint(int bci);
|
||||||
|
void clear_breakpoint(int bci);
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index c1b1b354541..ad05b4f34cf 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -1360,14 +1360,16 @@ void VM_EnhancedRedefineClasses::unpatch_bytecode(Method* method) {
|
||||||
|
|
||||||
|
if (code == Bytecodes::_breakpoint) {
|
||||||
|
int bci = method->bci_from(bcp);
|
||||||
|
- code = method->orig_bytecode_at(bci);
|
||||||
|
- java_code = Bytecodes::java_code(code);
|
||||||
|
- if (code != java_code &&
|
||||||
|
- (java_code == Bytecodes::_getfield ||
|
||||||
|
- java_code == Bytecodes::_putfield ||
|
||||||
|
- java_code == Bytecodes::_aload_0)) {
|
||||||
|
- // Let breakpoint table handling unpatch bytecode
|
||||||
|
- method->set_orig_bytecode_at(bci, java_code);
|
||||||
|
+ code = method->orig_bytecode_at(bci, true);
|
||||||
|
+ if (code != Bytecodes::_shouldnotreachhere) {
|
||||||
|
+ java_code = Bytecodes::java_code(code);
|
||||||
|
+ if (code != java_code &&
|
||||||
|
+ (java_code == Bytecodes::_getfield ||
|
||||||
|
+ java_code == Bytecodes::_putfield ||
|
||||||
|
+ java_code == Bytecodes::_aload_0)) {
|
||||||
|
+ // Let breakpoint table handling unpatch bytecode
|
||||||
|
+ method->set_orig_bytecode_at(bci, java_code);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
java_code = Bytecodes::java_code(code);
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
From cb8d0e41bed94d0c8b8a4c51f692a4ca66dc3672 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sun, 24 May 2020 12:07:42 +0200
|
||||||
|
Subject: [PATCH 06/45] Replace deleted method with
|
||||||
|
Universe::throw_no_such_method_error
|
||||||
|
|
||||||
|
+ Change log level in advanced redefinition
|
||||||
|
- Change log level for "Comparing different class ver.." to debug
|
||||||
|
- Fix adjust_method_entries_dcevm logging levels and severity
|
||||||
|
---
|
||||||
|
.../prims/jvmtiEnhancedRedefineClasses.cpp | 2 +-
|
||||||
|
.../share/prims/resolvedMethodTable.cpp | 30 +++++++++----------
|
||||||
|
2 files changed, 16 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index ad05b4f34cf..95be32f0070 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -881,7 +881,7 @@ jvmtiError VM_EnhancedRedefineClasses::load_new_class_versions(TRAPS) {
|
||||||
|
// Calculated the difference between new and old class (field change, method change, supertype change, ...).
|
||||||
|
int VM_EnhancedRedefineClasses::calculate_redefinition_flags(InstanceKlass* new_class) {
|
||||||
|
int result = Klass::NoRedefinition;
|
||||||
|
- log_info(redefine, class, load)("Comparing different class versions of class %s",new_class->name()->as_C_string());
|
||||||
|
+ log_debug(redefine, class, load)("Comparing different class versions of class %s",new_class->name()->as_C_string());
|
||||||
|
|
||||||
|
assert(new_class->old_version() != NULL, "must have old version");
|
||||||
|
InstanceKlass* the_class = InstanceKlass::cast(new_class->old_version());
|
||||||
|
diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||||
|
index 8644937dbbb..b8d039adff6 100644
|
||||||
|
--- a/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||||
|
@@ -399,25 +399,25 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
|
||||||
|
|
||||||
|
if (old_method->is_old()) {
|
||||||
|
|
||||||
|
+ InstanceKlass* newer_klass = InstanceKlass::cast(old_method->method_holder()->new_version());
|
||||||
|
+ Method* newer_method;
|
||||||
|
+
|
||||||
|
// Method* new_method;
|
||||||
|
if (old_method->is_deleted()) {
|
||||||
|
- // FIXME:(DCEVM) - check if exception can be thrown
|
||||||
|
- // new_method = Universe::throw_no_such_method_error();
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- InstanceKlass* newer_klass = InstanceKlass::cast(old_method->method_holder()->new_version());
|
||||||
|
- Method* newer_method = newer_klass->method_with_idnum(old_method->orig_method_idnum());
|
||||||
|
+ newer_method = Universe::throw_no_such_method_error();
|
||||||
|
+ } else {
|
||||||
|
+ newer_method = newer_klass->method_with_idnum(old_method->orig_method_idnum());
|
||||||
|
|
||||||
|
- log_info(redefine, class, load, exceptions)("Adjusting method: '%s' of new class %s", newer_method->name_and_sig_as_C_string(), newer_klass->name()->as_C_string());
|
||||||
|
+ log_debug(redefine, class, update)("Adjusting method: '%s' of new class %s", newer_method->name_and_sig_as_C_string(), newer_klass->name()->as_C_string());
|
||||||
|
|
||||||
|
- assert(newer_klass == newer_method->method_holder(), "call after swapping redefined guts");
|
||||||
|
- assert(newer_method != NULL, "method_with_idnum() should not be NULL");
|
||||||
|
- assert(old_method != newer_method, "sanity check");
|
||||||
|
+ assert(newer_klass == newer_method->method_holder(), "call after swapping redefined guts");
|
||||||
|
+ assert(newer_method != NULL, "method_with_idnum() should not be NULL");
|
||||||
|
+ assert(old_method != newer_method, "sanity check");
|
||||||
|
|
||||||
|
- if (_the_table->lookup(newer_method) != NULL) {
|
||||||
|
- // old method was already adjusted if new method exists in _the_table
|
||||||
|
- continue;
|
||||||
|
+ if (_the_table->lookup(newer_method) != NULL) {
|
||||||
|
+ // old method was already adjusted if new method exists in _the_table
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
java_lang_invoke_ResolvedMethodName::set_vmtarget(mem_name, newer_method);
|
||||||
|
@@ -428,7 +428,7 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
|
||||||
|
|
||||||
|
ResourceMark rm;
|
||||||
|
if (!(*trace_name_printed)) {
|
||||||
|
- log_info(redefine, class, update)("adjust: name=%s", old_method->method_holder()->external_name());
|
||||||
|
+ log_debug(redefine, class, update)("adjust: name=%s", old_method->method_holder()->external_name());
|
||||||
|
*trace_name_printed = true;
|
||||||
|
}
|
||||||
|
log_debug(redefine, class, update, constantpool)
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
1315
jb/project/tools/patches/dcevm/0007-Support-for-G1-gc.patch
Normal file
1315
jb/project/tools/patches/dcevm/0007-Support-for-G1-gc.patch
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,26 @@
|
|||||||
|
From 74de59c61db380a0e1c85686714bd9a3f1b29210 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Tue, 6 Oct 2020 22:15:31 +0200
|
||||||
|
Subject: [PATCH 08/45] AllowEnhancedClassRedefinition is false (disabled) by
|
||||||
|
default
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/runtime/globals.hpp | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp
|
||||||
|
index 845a39b0225..fb6d1667156 100644
|
||||||
|
--- a/src/hotspot/share/runtime/globals.hpp
|
||||||
|
+++ b/src/hotspot/share/runtime/globals.hpp
|
||||||
|
@@ -2088,7 +2088,7 @@ const intx ObjectAlignmentInBytes = 8;
|
||||||
|
develop(bool, TraceOptimizedUpcallStubs, false, \
|
||||||
|
"Trace optimized upcall stub generation") \
|
||||||
|
\
|
||||||
|
- product(bool, AllowEnhancedClassRedefinition, true, \
|
||||||
|
+ product(bool, AllowEnhancedClassRedefinition, false, \
|
||||||
|
"Allow enhanced class redefinition beyond swapping method " \
|
||||||
|
"bodies")
|
||||||
|
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
From c00c2a58550ae33ab2c842b521bf3b73163a93a1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Mon, 19 Oct 2020 20:00:04 +0200
|
||||||
|
Subject: [PATCH 09/45] Set HOTSPOT_VM_DISTRO=Dynamic Code Evolution
|
||||||
|
|
||||||
|
---
|
||||||
|
make/autoconf/version-numbers | 55 +++++++++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 55 insertions(+)
|
||||||
|
create mode 100644 make/autoconf/version-numbers
|
||||||
|
|
||||||
|
diff --git a/make/autoconf/version-numbers b/make/autoconf/version-numbers
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..df8025a2e84
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/make/autoconf/version-numbers
|
||||||
|
@@ -0,0 +1,55 @@
|
||||||
|
+#
|
||||||
|
+# Copyright (c) 2011, 2019, 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.
|
||||||
|
+#
|
||||||
|
+
|
||||||
|
+# Default version, product, and vendor information to use,
|
||||||
|
+# unless overridden by configure
|
||||||
|
+
|
||||||
|
+DEFAULT_VERSION_FEATURE=15
|
||||||
|
+DEFAULT_VERSION_INTERIM=0
|
||||||
|
+DEFAULT_VERSION_UPDATE=0
|
||||||
|
+DEFAULT_VERSION_PATCH=0
|
||||||
|
+DEFAULT_VERSION_EXTRA1=0
|
||||||
|
+DEFAULT_VERSION_EXTRA2=0
|
||||||
|
+DEFAULT_VERSION_EXTRA3=0
|
||||||
|
+DEFAULT_VERSION_DATE=2020-09-15
|
||||||
|
+DEFAULT_VERSION_CLASSFILE_MAJOR=59 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
||||||
|
+DEFAULT_VERSION_CLASSFILE_MINOR=0
|
||||||
|
+DEFAULT_ACCEPTABLE_BOOT_VERSIONS="14 15"
|
||||||
|
+DEFAULT_JDK_SOURCE_TARGET_VERSION=15
|
||||||
|
+DEFAULT_PROMOTED_VERSION_PRE=
|
||||||
|
+
|
||||||
|
+LAUNCHER_NAME=openjdk
|
||||||
|
+PRODUCT_NAME=OpenJDK
|
||||||
|
+PRODUCT_SUFFIX="Runtime Environment"
|
||||||
|
+JDK_RC_PLATFORM_NAME=Platform
|
||||||
|
+COMPANY_NAME=N/A
|
||||||
|
+HOTSPOT_VM_DISTRO="Dynamic Code Evolution"
|
||||||
|
+VENDOR_URL=https://openjdk.java.net/
|
||||||
|
+VENDOR_URL_BUG=https://bugreport.java.com/bugreport/
|
||||||
|
+VENDOR_URL_VM_BUG=https://bugreport.java.com/bugreport/crash.jsp
|
||||||
|
+
|
||||||
|
+# Might need better names for these
|
||||||
|
+MACOSX_BUNDLE_NAME_BASE="OpenJDK"
|
||||||
|
+MACOSX_BUNDLE_ID_BASE="net.java.openjdk"
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,206 @@
|
|||||||
|
From c04d57e5278aa5d3cb6ef53fc161d2b6b4f19f3c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Fri, 23 Oct 2020 10:20:26 +0200
|
||||||
|
Subject: [PATCH 10/45] Clear dcevm code separation
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/classfile/systemDictionary.cpp | 3 +--
|
||||||
|
src/hotspot/share/gc/serial/genMarkSweep.cpp | 8 +++++---
|
||||||
|
src/hotspot/share/interpreter/linkResolver.cpp | 14 ++++++++++----
|
||||||
|
.../instrumentation/jfrEventClassTransformer.cpp | 2 +-
|
||||||
|
src/hotspot/share/oops/cpCache.hpp | 8 +++++---
|
||||||
|
src/hotspot/share/oops/instanceKlass.cpp | 6 +++---
|
||||||
|
src/hotspot/share/oops/method.cpp | 2 +-
|
||||||
|
src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp | 2 +-
|
||||||
|
src/hotspot/share/runtime/reflection.cpp | 2 +-
|
||||||
|
9 files changed, 28 insertions(+), 19 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
index cea614a574f..98e2541c79b 100644
|
||||||
|
--- a/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
@@ -830,9 +830,8 @@ InstanceKlass* SystemDictionary::resolve_hidden_class_from_stream(
|
||||||
|
|
||||||
|
EventClassLoad class_load_start_event;
|
||||||
|
ClassLoaderData* loader_data;
|
||||||
|
-
|
||||||
|
+
|
||||||
|
bool is_redefining = (old_klass != NULL);
|
||||||
|
-
|
||||||
|
|
||||||
|
// - for hidden classes that are not strong: create a new CLD that has a class holder and
|
||||||
|
// whose loader is the Lookup class's loader.
|
||||||
|
diff --git a/src/hotspot/share/gc/serial/genMarkSweep.cpp b/src/hotspot/share/gc/serial/genMarkSweep.cpp
|
||||||
|
index bbb2c02f2b2..00b8e44078e 100644
|
||||||
|
--- a/src/hotspot/share/gc/serial/genMarkSweep.cpp
|
||||||
|
+++ b/src/hotspot/share/gc/serial/genMarkSweep.cpp
|
||||||
|
@@ -316,7 +316,9 @@ void GenMarkSweep::mark_sweep_phase4() {
|
||||||
|
|
||||||
|
GenCompactClosure blk;
|
||||||
|
gch->generation_iterate(&blk, true);
|
||||||
|
- DcevmSharedGC::copy_rescued_objects_back(MarkSweep::_rescued_oops, true);
|
||||||
|
- DcevmSharedGC::clear_rescued_objects_resource(MarkSweep::_rescued_oops);
|
||||||
|
- MarkSweep::_rescued_oops = NULL;
|
||||||
|
+ if (AllowEnhancedClassRedefinition) {
|
||||||
|
+ DcevmSharedGC::copy_rescued_objects_back(MarkSweep::_rescued_oops, true);
|
||||||
|
+ DcevmSharedGC::clear_rescued_objects_resource(MarkSweep::_rescued_oops);
|
||||||
|
+ MarkSweep::_rescued_oops = NULL;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
diff --git a/src/hotspot/share/interpreter/linkResolver.cpp b/src/hotspot/share/interpreter/linkResolver.cpp
|
||||||
|
index 8fb336762df..74a6af13ea4 100644
|
||||||
|
--- a/src/hotspot/share/interpreter/linkResolver.cpp
|
||||||
|
+++ b/src/hotspot/share/interpreter/linkResolver.cpp
|
||||||
|
@@ -287,9 +287,14 @@ void LinkResolver::check_klass_accessibility(Klass* ref_klass, Klass* sel_klass,
|
||||||
|
if (!base_klass->is_instance_klass()) {
|
||||||
|
return; // no relevant check to do
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+ Klass* refKlassNewest = ref_klass;
|
||||||
|
+ Klass* baseKlassNewest = base_klass;
|
||||||
|
+ if (AllowEnhancedClassRedefinition) {
|
||||||
|
+ refKlassNewest = ref_klass->newest_version();
|
||||||
|
+ baseKlassNewest = base_klass->newest_version();
|
||||||
|
+ }
|
||||||
|
Reflection::VerifyClassAccessResults vca_result =
|
||||||
|
- Reflection::verify_class_access(ref_klass->newest_version(), InstanceKlass::cast(base_klass->newest_version()), true);
|
||||||
|
+ Reflection::verify_class_access(refKlassNewest, InstanceKlass::cast(baseKlassNewest), true);
|
||||||
|
if (vca_result != Reflection::ACCESS_OK) {
|
||||||
|
ResourceMark rm(THREAD);
|
||||||
|
char* msg = Reflection::verify_class_access_msg(ref_klass,
|
||||||
|
@@ -551,7 +556,8 @@ void LinkResolver::check_method_accessability(Klass* ref_klass,
|
||||||
|
// We'll check for the method name first, as that's most likely
|
||||||
|
// to be false (so we'll short-circuit out of these tests).
|
||||||
|
if (sel_method->name() == vmSymbols::clone_name() &&
|
||||||
|
- sel_klass->newest_version() == vmClasses::Object_klass()->newest_version() &&
|
||||||
|
+ ( !AllowEnhancedClassRedefinition && sel_klass == vmClasses::Object_klass() ||
|
||||||
|
+ AllowEnhancedClassRedefinition && sel_klass->newest_version() == vmClasses::Object_klass()->newest_version()) &&
|
||||||
|
resolved_klass->is_array_klass()) {
|
||||||
|
// We need to change "protected" to "public".
|
||||||
|
assert(flags.is_protected(), "clone not protected?");
|
||||||
|
@@ -997,7 +1003,7 @@ void LinkResolver::resolve_field(fieldDescriptor& fd,
|
||||||
|
// or by the <init> method (in case of an instance field).
|
||||||
|
if (is_put && fd.access_flags().is_final()) {
|
||||||
|
|
||||||
|
- if (sel_klass != current_klass && sel_klass != current_klass->active_version()) {
|
||||||
|
+ if (sel_klass != current_klass && (!AllowEnhancedClassRedefinition || sel_klass != current_klass->active_version())) {
|
||||||
|
ResourceMark rm(THREAD);
|
||||||
|
stringStream ss;
|
||||||
|
ss.print("Update to %s final field %s.%s attempted from a different class (%s) than the field's declaring class",
|
||||||
|
diff --git a/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp b/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp
|
||||||
|
index 88e520ec475..73832251f3f 100644
|
||||||
|
--- a/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp
|
||||||
|
+++ b/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp
|
||||||
|
@@ -1475,7 +1475,7 @@ static InstanceKlass* create_new_instance_klass(InstanceKlass* ik, ClassFileStre
|
||||||
|
cld,
|
||||||
|
&cl_info,
|
||||||
|
ClassFileParser::INTERNAL, // internal visibility
|
||||||
|
- false,
|
||||||
|
+ false,
|
||||||
|
THREAD);
|
||||||
|
if (HAS_PENDING_EXCEPTION) {
|
||||||
|
log_pending_exception(PENDING_EXCEPTION);
|
||||||
|
diff --git a/src/hotspot/share/oops/cpCache.hpp b/src/hotspot/share/oops/cpCache.hpp
|
||||||
|
index b934302f422..d7ae5edc7b3 100644
|
||||||
|
--- a/src/hotspot/share/oops/cpCache.hpp
|
||||||
|
+++ b/src/hotspot/share/oops/cpCache.hpp
|
||||||
|
@@ -148,13 +148,13 @@ class ConstantPoolCacheEntry {
|
||||||
|
void set_bytecode_2(Bytecodes::Code code);
|
||||||
|
void set_f1(Metadata* f1) {
|
||||||
|
Metadata* existing_f1 = _f1; // read once
|
||||||
|
- //assert(existing_f1 == NULL || existing_f1 == f1, "illegal field change");
|
||||||
|
+ assert(AllowEnhancedClassRedefinition || existing_f1 == NULL || existing_f1 == f1, "illegal field change");
|
||||||
|
_f1 = f1;
|
||||||
|
}
|
||||||
|
void release_set_f1(Metadata* f1);
|
||||||
|
void set_f2(intx f2) {
|
||||||
|
intx existing_f2 = _f2; // read once
|
||||||
|
- //assert(existing_f2 == 0 || existing_f2 == f2, "illegal field change");
|
||||||
|
+ assert(AllowEnhancedClassRedefinition || existing_f2 == 0 || existing_f2 == f2, "illegal field change");
|
||||||
|
_f2 = f2;
|
||||||
|
}
|
||||||
|
void set_f2_as_vfinal_method(Method* f2) {
|
||||||
|
@@ -215,7 +215,9 @@ class ConstantPoolCacheEntry {
|
||||||
|
void initialize_resolved_reference_index(int ref_index) {
|
||||||
|
assert(_f2 == 0, "set once"); // note: ref_index might be zero also
|
||||||
|
_f2 = ref_index;
|
||||||
|
- _flags = 1 << is_resolved_ref_shift;
|
||||||
|
+ if (AllowEnhancedClassRedefinition) {
|
||||||
|
+ _flags = 1 << is_resolved_ref_shift;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_field( // sets entry to resolved field state
|
||||||
|
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
index 6d9e5116df1..1e2b40dd1f2 100644
|
||||||
|
--- a/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
+++ b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
@@ -968,7 +968,7 @@ bool InstanceKlass::link_class_impl(TRAPS) {
|
||||||
|
set_init_state(linked);
|
||||||
|
}
|
||||||
|
// (DCEVM) Must check for old version in order to prevent infinite loops.
|
||||||
|
- if (JvmtiExport::should_post_class_prepare() && old_version() == NULL /* JVMTI deadlock otherwise */) {
|
||||||
|
+ if (JvmtiExport::should_post_class_prepare() && (!AllowEnhancedClassRedefinition || old_version() == NULL /* JVMTI deadlock otherwise */) {
|
||||||
|
JvmtiExport::post_class_prepare(THREAD, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1046,7 +1046,7 @@ void InstanceKlass::initialize_impl(TRAPS) {
|
||||||
|
// we might end up throwing IE from link/symbol resolution sites
|
||||||
|
// that aren't expected to throw. This would wreak havoc. See 6320309.
|
||||||
|
while ((is_being_initialized() && !is_reentrant_initialization(jt))
|
||||||
|
- || (old_version() != NULL && InstanceKlass::cast(old_version())->is_being_initialized())) {
|
||||||
|
+ || (AllowEnhancedClassRedefinition && old_version() != NULL && InstanceKlass::cast(old_version())->is_being_initialized())) {
|
||||||
|
wait = true;
|
||||||
|
jt->set_class_to_be_initialized(this);
|
||||||
|
ol.wait_uninterruptibly(jt);
|
||||||
|
@@ -3808,7 +3808,7 @@ void InstanceKlass::verify_on(outputStream* st) {
|
||||||
|
|
||||||
|
guarantee(sib->is_klass(), "should be klass");
|
||||||
|
// TODO: (DCEVM) explain
|
||||||
|
- guarantee(sib->super() == super || super->newest_version() == SystemDictionary::Object_klass(), "siblings should have same superklass");
|
||||||
|
+ guarantee(sib->super() == super || AllowEnhancedClassRedefinition && super->newest_version() == SystemDictionary::Object_klass(), "siblings should have same superklass");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify local interfaces
|
||||||
|
diff --git a/src/hotspot/share/oops/method.cpp b/src/hotspot/share/oops/method.cpp
|
||||||
|
index a5a12599997..4426f03fd40 100644
|
||||||
|
--- a/src/hotspot/share/oops/method.cpp
|
||||||
|
+++ b/src/hotspot/share/oops/method.cpp
|
||||||
|
@@ -2199,7 +2199,7 @@ void Method::ensure_jmethod_ids(ClassLoaderData* loader_data, int capacity) {
|
||||||
|
// Add a method id to the jmethod_ids
|
||||||
|
jmethodID Method::make_jmethod_id(ClassLoaderData* loader_data, Method* m) {
|
||||||
|
// FIXME: (DCEVM) ???
|
||||||
|
- if (m != m->newest_version()) {
|
||||||
|
+ if (AllowEnhancedClassRedefinition && m != m->newest_version()) {
|
||||||
|
m = m->newest_version();
|
||||||
|
}
|
||||||
|
ClassLoaderData* cld = loader_data;
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp b/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp
|
||||||
|
index 42e72c67879..c860ee24f80 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp
|
||||||
|
@@ -76,7 +76,7 @@ public:
|
||||||
|
// the new version (SystemDictionary stores only new versions). But the LoadedClassesClosure's functionality was
|
||||||
|
// changed in java8 where jvmtiLoadedClasses collects all classes from all classloaders, therefore we
|
||||||
|
// must use new versions only.
|
||||||
|
- if (k->new_version()==NULL) {
|
||||||
|
+ if (AllowEnhancedClassRedefinition && k->new_version()==NULL) {
|
||||||
|
_classStack.push((jclass) _env->jni_reference(Handle(_cur_thread, k->java_mirror())));
|
||||||
|
if (_dictionary_walk) {
|
||||||
|
// Collect array classes this way when walking the dictionary (because array classes are
|
||||||
|
diff --git a/src/hotspot/share/runtime/reflection.cpp b/src/hotspot/share/runtime/reflection.cpp
|
||||||
|
index cc58f913ed5..21104c18423 100644
|
||||||
|
--- a/src/hotspot/share/runtime/reflection.cpp
|
||||||
|
+++ b/src/hotspot/share/runtime/reflection.cpp
|
||||||
|
@@ -608,7 +608,7 @@ bool Reflection::verify_member_access(const Klass* current_class,
|
||||||
|
TRAPS) {
|
||||||
|
|
||||||
|
// (DCEVM) Decide accessibility based on active version
|
||||||
|
- if (current_class != NULL) {
|
||||||
|
+ if (AllowEnhancedClassRedefinition && current_class != NULL) {
|
||||||
|
current_class = current_class->active_version();
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
From 3e9df9bdd901f1a7f7af57f2d37a738c059e3bb3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Wed, 11 Nov 2020 18:45:15 +0100
|
||||||
|
Subject: [PATCH 11/45] Fix LoadedClassesClosure - fixes problems with remote
|
||||||
|
debugging
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp b/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp
|
||||||
|
index c860ee24f80..dfe0bb8d96a 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp
|
||||||
|
@@ -76,7 +76,7 @@ public:
|
||||||
|
// the new version (SystemDictionary stores only new versions). But the LoadedClassesClosure's functionality was
|
||||||
|
// changed in java8 where jvmtiLoadedClasses collects all classes from all classloaders, therefore we
|
||||||
|
// must use new versions only.
|
||||||
|
- if (AllowEnhancedClassRedefinition && k->new_version()==NULL) {
|
||||||
|
+ if (!AllowEnhancedClassRedefinition || k->new_version()==NULL) {
|
||||||
|
_classStack.push((jclass) _env->jni_reference(Handle(_cur_thread, k->java_mirror())));
|
||||||
|
if (_dictionary_walk) {
|
||||||
|
// Collect array classes this way when walking the dictionary (because array classes are
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,43 @@
|
|||||||
|
From 2a27d36f5fbb0ebd94da192355f3946138c495bd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sun, 22 Nov 2020 19:51:46 +0100
|
||||||
|
Subject: [PATCH 13/45] dcevm15 - add ClassLoaderDataGraph_lock on
|
||||||
|
ClassLoaderDataGraph::classes_do
|
||||||
|
|
||||||
|
ClassLoaderDataGraph::classes_do and need safepoint or lock,
|
||||||
|
find_sorted_affected_classes is not in safepoint therefore it must be
|
||||||
|
locked
|
||||||
|
ClassLoaderDataGraph::rollback_redefinition need safepoint too
|
||||||
|
---
|
||||||
|
src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp | 7 ++++++-
|
||||||
|
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index a27c2ff87ae..001d2c782d8 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -1380,7 +1380,9 @@ void VM_EnhancedRedefineClasses::calculate_instance_update_information(Klass* ne
|
||||||
|
// Rollback all changes - clear new classes from the system dictionary, return old classes to directory, free memory.
|
||||||
|
void VM_EnhancedRedefineClasses::rollback() {
|
||||||
|
log_info(redefine, class, load)("Rolling back redefinition, result=%d", _res);
|
||||||
|
+ ClassLoaderDataGraph_lock->lock();
|
||||||
|
ClassLoaderDataGraph::rollback_redefinition();
|
||||||
|
+ ClassLoaderDataGraph_lock->unlock();
|
||||||
|
|
||||||
|
for (int i = 0; i < _new_classes->length(); i++) {
|
||||||
|
SystemDictionary::remove_from_hierarchy(_new_classes->at(i));
|
||||||
|
@@ -2063,7 +2065,10 @@ jvmtiError VM_EnhancedRedefineClasses::find_sorted_affected_classes(TRAPS) {
|
||||||
|
AffectedKlassClosure closure(_affected_klasses);
|
||||||
|
// Updated in j10, from original SystemDictionary::classes_do
|
||||||
|
|
||||||
|
- ClassLoaderDataGraph::classes_do(&closure);
|
||||||
|
+ {
|
||||||
|
+ MutexLocker mcld(ClassLoaderDataGraph_lock);
|
||||||
|
+ ClassLoaderDataGraph::classes_do(&closure);
|
||||||
|
+ }
|
||||||
|
//ClassLoaderDataGraph::dictionary_classes_do(&closure);
|
||||||
|
|
||||||
|
log_trace(redefine, class, load)("%d classes affected", _affected_klasses->length());
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
From 09af8da3c8fcb6d97917951673a56696fd7d6a2b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sun, 22 Nov 2020 12:05:50 +0100
|
||||||
|
Subject: [PATCH 14/45] dcevm15 - fix Universe::root_oops_do
|
||||||
|
|
||||||
|
Removed ClassLoaderDataGraph::cld_do was cause of crashes due multiple
|
||||||
|
oop patching. ClassLoaderDataGraph::cld_do replaced in dcevm15
|
||||||
|
previously used and removed SystemDictionary:oops_do
|
||||||
|
---
|
||||||
|
src/hotspot/share/memory/universe.cpp | 45 +++++++++++----------------
|
||||||
|
1 file changed, 19 insertions(+), 26 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/memory/universe.cpp b/src/hotspot/share/memory/universe.cpp
|
||||||
|
index 9fcbb6c41b3..247f2b3e8c0 100644
|
||||||
|
--- a/src/hotspot/share/memory/universe.cpp
|
||||||
|
+++ b/src/hotspot/share/memory/universe.cpp
|
||||||
|
@@ -44,6 +44,8 @@
|
||||||
|
#include "gc/shared/oopStorageSet.hpp"
|
||||||
|
#include "gc/shared/stringdedup/stringDedup.hpp"
|
||||||
|
#include "gc/shared/tlab_globals.hpp"
|
||||||
|
+#include "gc/shared/weakProcessor.hpp"
|
||||||
|
+#include "interpreter/interpreter.hpp"
|
||||||
|
#include "logging/log.hpp"
|
||||||
|
#include "logging/logStream.hpp"
|
||||||
|
#include "memory/metadataFactory.hpp"
|
||||||
|
@@ -71,6 +73,8 @@
|
||||||
|
#include "runtime/jniHandles.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
|
#include "runtime/timerTrace.hpp"
|
||||||
|
+#include "runtime/vmOperations.hpp"
|
||||||
|
+#include "services/management.hpp"
|
||||||
|
#include "services/memoryService.hpp"
|
||||||
|
#include "utilities/align.hpp"
|
||||||
|
#include "utilities/autoRestore.hpp"
|
||||||
|
@@ -209,45 +213,34 @@ void Universe::basic_type_classes_do(KlassClosure *closure) {
|
||||||
|
|
||||||
|
// FIXME: (DCEVM) This method should iterate all pointers that are not within heap objects.
|
||||||
|
void Universe::root_oops_do(OopClosure *oopClosure) {
|
||||||
|
-
|
||||||
|
- class AlwaysTrueClosure: public BoolObjectClosure {
|
||||||
|
- public:
|
||||||
|
- void do_object(oop p) { ShouldNotReachHere(); }
|
||||||
|
- bool do_object_b(oop p) { return true; }
|
||||||
|
- };
|
||||||
|
- AlwaysTrueClosure always_true;
|
||||||
|
-
|
||||||
|
Universe::oops_do(oopClosure);
|
||||||
|
// ReferenceProcessor::oops_do(oopClosure); (tw) check why no longer there
|
||||||
|
JNIHandles::oops_do(oopClosure); // Global (strong) JNI handles
|
||||||
|
Threads::oops_do(oopClosure, NULL);
|
||||||
|
ObjectSynchronizer::oops_do(oopClosure);
|
||||||
|
- // TODO: review, flat profiler was removed in j10
|
||||||
|
- // FlatProfiler::oops_do(oopClosure);
|
||||||
|
- JvmtiExport::oops_do(oopClosure);
|
||||||
|
+ // (DCEVM) TODO: Check if this is correct?
|
||||||
|
+ Management::oops_do(oopClosure);
|
||||||
|
+ OopStorageSet::vm_global()->oops_do(oopClosure);
|
||||||
|
+ // CLDToOopClosure cld_closure(oopClosure, ClassLoaderData::_claim_none);
|
||||||
|
+ // ClassLoaderDataGraph::cld_do(&cld_closure);
|
||||||
|
|
||||||
|
// Now adjust pointers in remaining weak roots. (All of which should
|
||||||
|
// have been cleared if they pointed to non-surviving objects.)
|
||||||
|
// Global (weak) JNI handles
|
||||||
|
- JNIHandles::weak_oops_do(&always_true, oopClosure);
|
||||||
|
+ WeakProcessor::oops_do(oopClosure);
|
||||||
|
+
|
||||||
|
+ JvmtiExport::oops_do(oopClosure);
|
||||||
|
|
||||||
|
CodeBlobToOopClosure blobClosure(oopClosure, CodeBlobToOopClosure::FixRelocations);
|
||||||
|
CodeCache::blobs_do(&blobClosure);
|
||||||
|
- StringTable::oops_do(oopClosure);
|
||||||
|
+
|
||||||
|
+ AOT_ONLY(AOTLoader::oops_do(oopClosure);)
|
||||||
|
+
|
||||||
|
+ // StringTable::oops_do was removed in j15
|
||||||
|
+ // StringTable::oops_do(oopClosure);
|
||||||
|
+
|
||||||
|
+ // OopStorageSet::vm_global()->oops_do(oopClosure);
|
||||||
|
|
||||||
|
- // (DCEVM) TODO: Check if this is correct?
|
||||||
|
- //CodeCache::scavenge_root_nmethods_oops_do(oopClosure);
|
||||||
|
- //Management::oops_do(oopClosure);
|
||||||
|
- //ref_processor()->weak_oops_do(&oopClosure);
|
||||||
|
- //PSScavenge::reference_processor()->weak_oops_do(&oopClosure);
|
||||||
|
-
|
||||||
|
-#if INCLUDE_AOT
|
||||||
|
- if (UseAOT) {
|
||||||
|
- AOTLoader::oops_do(oopClosure);
|
||||||
|
- }
|
||||||
|
-#endif
|
||||||
|
- // SO_AllClasses
|
||||||
|
- SystemDictionary::oops_do(oopClosure);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Universe::oops_do(OopClosure* f) {
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
From fc0d2894212fd2186498d3341dddf2f201965686 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sat, 28 Nov 2020 19:29:42 +0100
|
||||||
|
Subject: [PATCH 15/45] dcevm15 - check if has_nestmate_access_to has newest
|
||||||
|
host class
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/oops/instanceKlass.cpp | 5 +++++
|
||||||
|
1 file changed, 5 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
index c181fe044e2..a8ac12450d7 100644
|
||||||
|
--- a/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
+++ b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
@@ -398,6 +398,11 @@ bool InstanceKlass::has_nestmate_access_to(InstanceKlass* k, TRAPS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (AllowEnhancedClassRedefinition) {
|
||||||
|
+ // TODO: (DCEVM) check if it correct. It fix problems with lambdas (hidden)
|
||||||
|
+ cur_host = InstanceKlass::cast(cur_host->newest_version());
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
Klass* k_nest_host = k->nest_host(CHECK_false);
|
||||||
|
if (k_nest_host == NULL) {
|
||||||
|
return false;
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
From d20a52a5e7a87003da6f3e4bda39ec2976868a75 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sun, 29 Nov 2020 17:18:16 +0100
|
||||||
|
Subject: [PATCH 16/45] dcevm15 - mark_as_scavengable only alive methods
|
||||||
|
|
||||||
|
---
|
||||||
|
.../share/prims/jvmtiEnhancedRedefineClasses.cpp | 14 ++++++++------
|
||||||
|
1 file changed, 8 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index 001d2c782d8..d742679d199 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -223,19 +223,21 @@ class FieldCopier : public FieldClosure {
|
||||||
|
|
||||||
|
// TODO: review...
|
||||||
|
void VM_EnhancedRedefineClasses::mark_as_scavengable(nmethod* nm) {
|
||||||
|
- ScavengableNMethods::register_nmethod(nm);
|
||||||
|
+ if (nm->is_alive()) {
|
||||||
|
+ ScavengableNMethods::register_nmethod(nm);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
void VM_EnhancedRedefineClasses::unregister_nmethod_g1(nmethod* nm) {
|
||||||
|
// It should work not only for G1 but also for another GCs, but this way is safer now
|
||||||
|
- if (!nm->is_zombie() && !nm->is_unloaded()) {
|
||||||
|
+ if (nm->is_alive()) {
|
||||||
|
Universe::heap()->unregister_nmethod(nm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void VM_EnhancedRedefineClasses::register_nmethod_g1(nmethod* nm) {
|
||||||
|
// It should work not only for G1 but also for another GCs, but this way is safer now
|
||||||
|
- if (!nm->is_zombie() && !nm->is_unloaded()) {
|
||||||
|
+ if (nm->is_alive()) {
|
||||||
|
Universe::heap()->register_nmethod(nm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -511,9 +513,9 @@ void VM_EnhancedRedefineClasses::doit() {
|
||||||
|
flush_dependent_code(thread);
|
||||||
|
// }
|
||||||
|
|
||||||
|
- // Adjust constantpool caches for all classes that reference methods of the evolved class.
|
||||||
|
- ClearCpoolCacheAndUnpatch clear_cpool_cache(thread);
|
||||||
|
- ClassLoaderDataGraph::classes_do(&clear_cpool_cache);
|
||||||
|
+ // Adjust constantpool caches for all classes that reference methods of the evolved class.
|
||||||
|
+ ClearCpoolCacheAndUnpatch clear_cpool_cache(thread);
|
||||||
|
+ ClassLoaderDataGraph::classes_do(&clear_cpool_cache);
|
||||||
|
|
||||||
|
// JSR-292 support
|
||||||
|
if (_any_class_has_resolved_methods) {
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
From b315e7cd828e79d63562b0296b97795015b644af Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sun, 29 Nov 2020 20:05:03 +0100
|
||||||
|
Subject: [PATCH 17/45] dcevm15 - fix hidded classes
|
||||||
|
|
||||||
|
---
|
||||||
|
.../prims/jvmtiEnhancedRedefineClasses.cpp | 41 ++++++++++++++-----
|
||||||
|
1 file changed, 30 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index d742679d199..1433e429e30 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -722,7 +722,8 @@ bool VM_EnhancedRedefineClasses::is_modifiable_class(oop klass_mirror) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cannot redefine or retransform an anonymous class.
|
||||||
|
- if (InstanceKlass::cast(k)->is_unsafe_anonymous()) {
|
||||||
|
+ // TODO: check if is correct in j15
|
||||||
|
+ if (InstanceKlass::cast(k)->is_unsafe_anonymous() || InstanceKlass::cast(k)->is_hidden()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
@@ -808,21 +809,27 @@ jvmtiError VM_EnhancedRedefineClasses::load_new_class_versions(TRAPS) {
|
||||||
|
|
||||||
|
InstanceKlass* k;
|
||||||
|
|
||||||
|
- if (InstanceKlass::cast(the_class)->is_unsafe_anonymous()) {
|
||||||
|
- const InstanceKlass* host_class = the_class->unsafe_anonymous_host();
|
||||||
|
+ if (the_class->is_unsafe_anonymous() || the_class->is_hidden()) {
|
||||||
|
+ InstanceKlass* dynamic_host_class = NULL;
|
||||||
|
+ InstanceKlass* unsafe_anonymous_host = NULL;
|
||||||
|
|
||||||
|
- // Make sure it's the real host class, not another anonymous class.
|
||||||
|
- while (host_class != NULL && host_class->is_unsafe_anonymous()) {
|
||||||
|
- host_class = host_class->unsafe_anonymous_host();
|
||||||
|
+ if (the_class->is_hidden()) {
|
||||||
|
+ log_debug(redefine, class, load)("loading hidden class %s", the_class->name()->as_C_string());
|
||||||
|
+ dynamic_host_class = the_class->nest_host(THREAD);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (the_class->is_unsafe_anonymous()) {
|
||||||
|
+ log_debug(redefine, class, load)("loading usafe anonymous %s", the_class->name()->as_C_string());
|
||||||
|
+ unsafe_anonymous_host = the_class->unsafe_anonymous_host();
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassLoadInfo cl_info(protection_domain,
|
||||||
|
- host_class,
|
||||||
|
- NULL, // dynamic_nest_host
|
||||||
|
+ unsafe_anonymous_host,
|
||||||
|
NULL, // cp_patches
|
||||||
|
+ dynamic_host_class, // dynamic_nest_host
|
||||||
|
Handle(), // classData
|
||||||
|
- false, // is_hidden
|
||||||
|
- false, // is_strong_hidden
|
||||||
|
+ the_class->is_hidden(), // is_hidden
|
||||||
|
+ !the_class->is_non_strong_hidden(), // is_strong_hidden
|
||||||
|
true); // FIXME: check if correct. can_access_vm_annotations
|
||||||
|
|
||||||
|
k = SystemDictionary::parse_stream(the_class_sym,
|
||||||
|
@@ -833,7 +840,17 @@ jvmtiError VM_EnhancedRedefineClasses::load_new_class_versions(TRAPS) {
|
||||||
|
THREAD);
|
||||||
|
|
||||||
|
k->class_loader_data()->exchange_holders(the_class->class_loader_data());
|
||||||
|
- the_class->class_loader_data()->inc_keep_alive();
|
||||||
|
+
|
||||||
|
+ if (the_class->is_hidden()) {
|
||||||
|
+ // from jvm_lookup_define_class() (jvm.cpp):
|
||||||
|
+ // The hidden class loader data has been artificially been kept alive to
|
||||||
|
+ // this point. The mirror and any instances of this class have to keep
|
||||||
|
+ // it alive afterwards.
|
||||||
|
+ the_class->class_loader_data()->dec_keep_alive();
|
||||||
|
+ } else {
|
||||||
|
+ the_class->class_loader_data()->inc_keep_alive();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
} else {
|
||||||
|
k = SystemDictionary::resolve_from_stream(the_class_sym,
|
||||||
|
the_class_loader,
|
||||||
|
@@ -1475,6 +1492,8 @@ void VM_EnhancedRedefineClasses::ClearCpoolCacheAndUnpatch::do_klass(Klass* k) {
|
||||||
|
ik->set_unsafe_anonymous_host(InstanceKlass::cast(ik->unsafe_anonymous_host()->newest_version()));
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // FIXME: check new nest_host for hidden
|
||||||
|
+
|
||||||
|
// Update implementor if there is only one, in this case implementor() can reference old class
|
||||||
|
if (ik->is_interface()) {
|
||||||
|
Klass* implKlass = ik->implementor();
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
From 25d78e62a702ad754c1a3a0136db1453089f008e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sun, 29 Nov 2020 20:08:57 +0100
|
||||||
|
Subject: [PATCH 18/45] dcevm15 - DON'T clear F2 in CP cache after indy
|
||||||
|
unevolving
|
||||||
|
|
||||||
|
It's not clear why it was cleared in dcevm7-11
|
||||||
|
---
|
||||||
|
src/hotspot/share/oops/cpCache.cpp | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/oops/cpCache.cpp b/src/hotspot/share/oops/cpCache.cpp
|
||||||
|
index 167cb274661..7e72641ec5a 100644
|
||||||
|
--- a/src/hotspot/share/oops/cpCache.cpp
|
||||||
|
+++ b/src/hotspot/share/oops/cpCache.cpp
|
||||||
|
@@ -654,7 +654,7 @@ void ConstantPoolCacheEntry::clear_entry() {
|
||||||
|
|
||||||
|
if (clearData) {
|
||||||
|
if (!is_resolved_reference()) {
|
||||||
|
- _f2 = 0;
|
||||||
|
+ // _f2 = 0;
|
||||||
|
}
|
||||||
|
// FIXME: (DCEVM) we want to clear flags, but parameter size is actually used
|
||||||
|
// after we return from the method, before entry is re-initialized. So let's
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
From b84814b31883b0f5441fca6d77b18c7426d26c36 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sun, 22 Nov 2020 12:03:32 +0100
|
||||||
|
Subject: [PATCH 19/45] Cleanup and review comments
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/classfile/classLoaderDataGraph.hpp | 2 +-
|
||||||
|
src/hotspot/share/gc/shared/gcConfig.cpp | 2 +-
|
||||||
|
src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp | 1 +
|
||||||
|
src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp | 2 +-
|
||||||
|
4 files changed, 4 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.hpp b/src/hotspot/share/classfile/classLoaderDataGraph.hpp
|
||||||
|
index 5f8913001b0..c3bcc7271e6 100644
|
||||||
|
--- a/src/hotspot/share/classfile/classLoaderDataGraph.hpp
|
||||||
|
+++ b/src/hotspot/share/classfile/classLoaderDataGraph.hpp
|
||||||
|
@@ -105,7 +105,7 @@ class ClassLoaderDataGraph : public AllStatic {
|
||||||
|
|
||||||
|
static void dictionary_classes_do(KlassClosure* klass_closure);
|
||||||
|
|
||||||
|
- // Enhanced class redefinition
|
||||||
|
+ // (DCEVM) Enhanced class redefinition
|
||||||
|
static void rollback_redefinition();
|
||||||
|
|
||||||
|
// VM_CounterDecay iteration support
|
||||||
|
diff --git a/src/hotspot/share/gc/shared/gcConfig.cpp b/src/hotspot/share/gc/shared/gcConfig.cpp
|
||||||
|
index 26a2b67b8e9..8e78696bef5 100644
|
||||||
|
--- a/src/hotspot/share/gc/shared/gcConfig.cpp
|
||||||
|
+++ b/src/hotspot/share/gc/shared/gcConfig.cpp
|
||||||
|
@@ -97,7 +97,7 @@ void GCConfig::fail_if_non_included_gc_is_selected() {
|
||||||
|
|
||||||
|
void GCConfig::select_gc_ergonomically() {
|
||||||
|
if (AllowEnhancedClassRedefinition && !UseG1GC) {
|
||||||
|
- // Enhanced class redefinition only supports serial GC at the moment
|
||||||
|
+ // (DCEVM) Enhanced class redefinition only supports serial GC at the moment
|
||||||
|
FLAG_SET_ERGO(UseSerialGC, true);
|
||||||
|
} else if (os::is_server_class_machine()) {
|
||||||
|
#if INCLUDE_G1GC
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index 1433e429e30..af34d751bdb 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -842,6 +842,7 @@ jvmtiError VM_EnhancedRedefineClasses::load_new_class_versions(TRAPS) {
|
||||||
|
k->class_loader_data()->exchange_holders(the_class->class_loader_data());
|
||||||
|
|
||||||
|
if (the_class->is_hidden()) {
|
||||||
|
+ // TODO: (DCEVM) review if is correct
|
||||||
|
// from jvm_lookup_define_class() (jvm.cpp):
|
||||||
|
// The hidden class loader data has been artificially been kept alive to
|
||||||
|
// this point. The mirror and any instances of this class have to keep
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
index 61f62e7f831..43f1aff8e91 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
@@ -78,7 +78,7 @@ class VM_EnhancedRedefineClasses: public VM_GC_Operation {
|
||||||
|
// have any entries.
|
||||||
|
bool _any_class_has_resolved_methods;
|
||||||
|
|
||||||
|
- // Enhanced class redefinition, affected klasses contain all classes which should be redefined
|
||||||
|
+ // (DCEVM) Enhanced class redefinition, affected klasses contain all classes which should be redefined
|
||||||
|
// either because of redefine, class hierarchy or interface change
|
||||||
|
GrowableArray<Klass*>* _affected_klasses;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
From 9da70fec073a442e9c0aee19a5ec643c1f84cea5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Fri, 12 Feb 2021 10:11:10 +0100
|
||||||
|
Subject: [PATCH 20/45] Disable AllowEnhancedClassRedefinition in flight
|
||||||
|
recorder
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/runtime/arguments.cpp | 7 +++++++
|
||||||
|
1 file changed, 7 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp
|
||||||
|
index 9661f2b62b9..252ebbc4e57 100644
|
||||||
|
--- a/src/hotspot/share/runtime/arguments.cpp
|
||||||
|
+++ b/src/hotspot/share/runtime/arguments.cpp
|
||||||
|
@@ -4027,6 +4027,13 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) {
|
||||||
|
// Set object alignment values.
|
||||||
|
set_object_alignment();
|
||||||
|
|
||||||
|
+ if (FlightRecorder) {
|
||||||
|
+ if (AllowEnhancedClassRedefinition) {
|
||||||
|
+ warning("EnhancedClassRedefinition was disabled, it is not allowed in FlightRecorder.");
|
||||||
|
+ AllowEnhancedClassRedefinition = false;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
#if !INCLUDE_CDS
|
||||||
|
if (DumpSharedSpaces || RequireSharedSpaces) {
|
||||||
|
jio_fprintf(defaultStream::error_stream(),
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,695 @@
|
|||||||
|
From 5d065e823c431a80251696c2543f6c98e68f00a6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Fri, 12 Feb 2021 09:44:28 +0100
|
||||||
|
Subject: [PATCH 21/45] dcevm17 - fix compilation issues
|
||||||
|
|
||||||
|
---
|
||||||
|
.../share/classfile/classLoaderData.cpp | 2 +-
|
||||||
|
src/hotspot/share/classfile/javaClasses.cpp | 4 +-
|
||||||
|
src/hotspot/share/classfile/javaClasses.hpp | 4 +-
|
||||||
|
.../share/classfile/lambdaFormInvokers.cpp | 152 ++++++++++++++++++
|
||||||
|
.../share/classfile/systemDictionary.cpp | 5 +-
|
||||||
|
.../share/classfile/systemDictionary.hpp | 6 +
|
||||||
|
src/hotspot/share/classfile/vmClassMacros.hpp | 2 +
|
||||||
|
.../share/gc/g1/g1FullGCCompactTask.cpp | 9 +-
|
||||||
|
.../share/gc/g1/g1FullGCCompactionPoint.cpp | 12 +-
|
||||||
|
src/hotspot/share/gc/shared/dcevmSharedGC.cpp | 2 +-
|
||||||
|
src/hotspot/share/gc/shared/space.inline.hpp | 2 +-
|
||||||
|
src/hotspot/share/memory/universe.cpp | 71 --------
|
||||||
|
src/hotspot/share/memory/universe.hpp | 7 -
|
||||||
|
src/hotspot/share/oops/instanceKlass.cpp | 4 +-
|
||||||
|
.../prims/jvmtiEnhancedRedefineClasses.cpp | 47 ++++--
|
||||||
|
.../prims/jvmtiEnhancedRedefineClasses.hpp | 2 +
|
||||||
|
.../share/prims/resolvedMethodTable.cpp | 5 +-
|
||||||
|
src/hotspot/share/runtime/arguments.hpp | 2 +
|
||||||
|
18 files changed, 221 insertions(+), 117 deletions(-)
|
||||||
|
create mode 100644 src/hotspot/share/classfile/lambdaFormInvokers.cpp
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||||
|
index 2a826ff50a7..65ce4c4af8c 100644
|
||||||
|
--- a/src/hotspot/share/classfile/classLoaderData.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||||
|
@@ -603,7 +603,7 @@ void ClassLoaderData::exchange_holders(ClassLoaderData* cld) {
|
||||||
|
oop holder_oop = _holder.peek();
|
||||||
|
_holder.replace(cld->_holder.peek());
|
||||||
|
cld->_holder.replace(holder_oop);
|
||||||
|
- WeakHandle<vm_weak_data> exchange = _holder;
|
||||||
|
+ WeakHandle exchange = _holder;
|
||||||
|
_holder = cld->_holder;
|
||||||
|
cld->_holder = exchange;
|
||||||
|
}
|
||||||
|
diff --git a/src/hotspot/share/classfile/javaClasses.cpp b/src/hotspot/share/classfile/javaClasses.cpp
|
||||||
|
index dc800debea4..66ff72b2f02 100644
|
||||||
|
--- a/src/hotspot/share/classfile/javaClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/javaClasses.cpp
|
||||||
|
@@ -3827,7 +3827,7 @@ void java_lang_invoke_DirectMethodHandle_StaticAccessor::set_static_offset(oop d
|
||||||
|
macro(_static_offset_offset, k, vmSymbols::static_offset_name(), long_signature, false)
|
||||||
|
|
||||||
|
void java_lang_invoke_DirectMethodHandle_StaticAccessor::compute_offsets() {
|
||||||
|
- InstanceKlass* k = SystemDictionary::DirectMethodHandle_StaticAccessor_klass();
|
||||||
|
+ InstanceKlass* k = vmClasses::DirectMethodHandle_StaticAccessor_klass();
|
||||||
|
DIRECTMETHODHANDLE_STATIC_ACCESSOR_FIELDS_DO(FIELD_COMPUTE_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -3855,7 +3855,7 @@ void java_lang_invoke_DirectMethodHandle_Accessor::set_field_offset(oop dmh, int
|
||||||
|
macro(_field_offset_offset, k, vmSymbols::field_offset_name(), int_signature, false)
|
||||||
|
|
||||||
|
void java_lang_invoke_DirectMethodHandle_Accessor::compute_offsets() {
|
||||||
|
- InstanceKlass* k = SystemDictionary::DirectMethodHandle_Accessor_klass();
|
||||||
|
+ InstanceKlass* k = vmClasses::DirectMethodHandle_Accessor_klass();
|
||||||
|
DIRECTMETHODHANDLE_ACCESSOR_FIELDS_DO(FIELD_COMPUTE_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/javaClasses.hpp b/src/hotspot/share/classfile/javaClasses.hpp
|
||||||
|
index 32348c90ef9..f7dc5ccbd8c 100644
|
||||||
|
--- a/src/hotspot/share/classfile/javaClasses.hpp
|
||||||
|
+++ b/src/hotspot/share/classfile/javaClasses.hpp
|
||||||
|
@@ -1029,7 +1029,7 @@ class java_lang_invoke_DirectMethodHandle_StaticAccessor: AllStatic {
|
||||||
|
|
||||||
|
// Testers
|
||||||
|
static bool is_subclass(Klass* klass) {
|
||||||
|
- return klass->is_subclass_of(SystemDictionary::DirectMethodHandle_StaticAccessor_klass());
|
||||||
|
+ return klass->is_subclass_of(vmClasses::DirectMethodHandle_StaticAccessor_klass());
|
||||||
|
}
|
||||||
|
static bool is_instance(oop obj);
|
||||||
|
|
||||||
|
@@ -1053,7 +1053,7 @@ class java_lang_invoke_DirectMethodHandle_Accessor: AllStatic {
|
||||||
|
|
||||||
|
// Testers
|
||||||
|
static bool is_subclass(Klass* klass) {
|
||||||
|
- return klass->is_subclass_of(SystemDictionary::DirectMethodHandle_Accessor_klass());
|
||||||
|
+ return klass->is_subclass_of(vmClasses::DirectMethodHandle_Accessor_klass());
|
||||||
|
}
|
||||||
|
static bool is_instance(oop obj);
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/lambdaFormInvokers.cpp b/src/hotspot/share/classfile/lambdaFormInvokers.cpp
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..281de58b482
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/src/hotspot/share/classfile/lambdaFormInvokers.cpp
|
||||||
|
@@ -0,0 +1,152 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright (c) 2020, 2021, 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.
|
||||||
|
+ *
|
||||||
|
+ * 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.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include "precompiled.hpp"
|
||||||
|
+#include "classfile/classLoadInfo.hpp"
|
||||||
|
+#include "classfile/classFileStream.hpp"
|
||||||
|
+#include "classfile/javaClasses.inline.hpp"
|
||||||
|
+#include "classfile/klassFactory.hpp"
|
||||||
|
+#include "classfile/lambdaFormInvokers.hpp"
|
||||||
|
+#include "classfile/symbolTable.hpp"
|
||||||
|
+#include "classfile/systemDictionary.hpp"
|
||||||
|
+#include "classfile/systemDictionaryShared.hpp"
|
||||||
|
+#include "classfile/vmClasses.hpp"
|
||||||
|
+#include "classfile/vmSymbols.hpp"
|
||||||
|
+#include "logging/log.hpp"
|
||||||
|
+#include "memory/oopFactory.hpp"
|
||||||
|
+#include "memory/metaspaceShared.hpp"
|
||||||
|
+#include "memory/resourceArea.hpp"
|
||||||
|
+#include "oops/instanceKlass.hpp"
|
||||||
|
+#include "oops/klass.hpp"
|
||||||
|
+#include "oops/objArrayKlass.hpp"
|
||||||
|
+#include "oops/objArrayOop.hpp"
|
||||||
|
+#include "oops/oop.inline.hpp"
|
||||||
|
+#include "oops/typeArrayOop.inline.hpp"
|
||||||
|
+#include "runtime/handles.inline.hpp"
|
||||||
|
+#include "runtime/javaCalls.hpp"
|
||||||
|
+
|
||||||
|
+GrowableArray<char*>* LambdaFormInvokers::_lambdaform_lines = NULL;
|
||||||
|
+
|
||||||
|
+void LambdaFormInvokers::append(char* line) {
|
||||||
|
+ if (_lambdaform_lines == NULL) {
|
||||||
|
+ _lambdaform_lines = new GrowableArray<char*>(100);
|
||||||
|
+ }
|
||||||
|
+ _lambdaform_lines->append(line);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void LambdaFormInvokers::regenerate_holder_classes(TRAPS) {
|
||||||
|
+ assert(_lambdaform_lines != NULL, "Bad List");
|
||||||
|
+ ResourceMark rm(THREAD);
|
||||||
|
+
|
||||||
|
+ Symbol* cds_name = vmSymbols::jdk_internal_misc_CDS();
|
||||||
|
+ Klass* cds_klass = SystemDictionary::resolve_or_null(cds_name, THREAD);
|
||||||
|
+ guarantee(cds_klass != NULL, "jdk/internal/misc/CDS must exist!");
|
||||||
|
+
|
||||||
|
+ int len = _lambdaform_lines->length();
|
||||||
|
+ objArrayHandle list_lines = oopFactory::new_objArray_handle(vmClasses::String_klass(), len, CHECK);
|
||||||
|
+ for (int i = 0; i < len; i++) {
|
||||||
|
+ Handle h_line = java_lang_String::create_from_str(_lambdaform_lines->at(i), CHECK);
|
||||||
|
+ list_lines->obj_at_put(i, h_line());
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ //
|
||||||
|
+ // Object[] CDS.generateLambdaFormHolderClasses(String[] lines)
|
||||||
|
+ // the returned Object[] layout:
|
||||||
|
+ // name, byte[], name, byte[] ....
|
||||||
|
+ Symbol* method = vmSymbols::generateLambdaFormHolderClasses();
|
||||||
|
+ Symbol* signrs = vmSymbols::generateLambdaFormHolderClasses_signature();
|
||||||
|
+
|
||||||
|
+ JavaValue result(T_OBJECT);
|
||||||
|
+ JavaCalls::call_static(&result, cds_klass, method, signrs, list_lines, THREAD);
|
||||||
|
+
|
||||||
|
+ if (HAS_PENDING_EXCEPTION) {
|
||||||
|
+ log_info(cds)("%s: %s", THREAD->pending_exception()->klass()->external_name(),
|
||||||
|
+ java_lang_String::as_utf8_string(java_lang_Throwable::message(THREAD->pending_exception())));
|
||||||
|
+ CLEAR_PENDING_EXCEPTION;
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ objArrayHandle h_array(THREAD, (objArrayOop)result.get_oop());
|
||||||
|
+ int sz = h_array->length();
|
||||||
|
+ assert(sz % 2 == 0 && sz >= 2, "Must be even size of length");
|
||||||
|
+ for (int i = 0; i < sz; i+= 2) {
|
||||||
|
+ Handle h_name(THREAD, h_array->obj_at(i));
|
||||||
|
+ typeArrayHandle h_bytes(THREAD, (typeArrayOop)h_array->obj_at(i+1));
|
||||||
|
+ assert(h_name != NULL, "Class name is NULL");
|
||||||
|
+ assert(h_bytes != NULL, "Class bytes is NULL");
|
||||||
|
+
|
||||||
|
+ char *class_name = java_lang_String::as_utf8_string(h_name());
|
||||||
|
+ int len = h_bytes->length();
|
||||||
|
+ // make a copy of class bytes so GC will not affect us.
|
||||||
|
+ char *buf = resource_allocate_bytes(THREAD, len);
|
||||||
|
+ memcpy(buf, (char*)h_bytes->byte_at_addr(0), len);
|
||||||
|
+ ClassFileStream st((u1*)buf, len, NULL, ClassFileStream::verify);
|
||||||
|
+
|
||||||
|
+ reload_class(class_name, st, THREAD);
|
||||||
|
+ // free buf
|
||||||
|
+ resource_free_bytes(buf, len);
|
||||||
|
+
|
||||||
|
+ if (HAS_PENDING_EXCEPTION) {
|
||||||
|
+ log_info(cds)("Exception happened: %s", PENDING_EXCEPTION->klass()->name()->as_C_string());
|
||||||
|
+ log_info(cds)("Could not create InstanceKlass for class %s", class_name);
|
||||||
|
+ CLEAR_PENDING_EXCEPTION;
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+// class_handle - the class name, bytes_handle - the class bytes
|
||||||
|
+void LambdaFormInvokers::reload_class(char* name, ClassFileStream& st, TRAPS) {
|
||||||
|
+ Symbol* class_name = SymbolTable::new_symbol((const char*)name);
|
||||||
|
+ // the class must exist
|
||||||
|
+ Klass* klass = SystemDictionary::resolve_or_null(class_name, THREAD);
|
||||||
|
+ if (klass == NULL) {
|
||||||
|
+ log_info(cds)("Class %s not present, skip", name);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ assert(klass->is_instance_klass(), "Should be");
|
||||||
|
+
|
||||||
|
+ ClassLoaderData* cld = ClassLoaderData::the_null_class_loader_data();
|
||||||
|
+ Handle protection_domain;
|
||||||
|
+ ClassLoadInfo cl_info(protection_domain);
|
||||||
|
+
|
||||||
|
+ InstanceKlass* result = KlassFactory::create_from_stream(&st,
|
||||||
|
+ class_name,
|
||||||
|
+ cld,
|
||||||
|
+ cl_info,
|
||||||
|
+ false,
|
||||||
|
+ CHECK);
|
||||||
|
+
|
||||||
|
+ {
|
||||||
|
+ MutexLocker mu_r(THREAD, Compile_lock); // add_to_hierarchy asserts this.
|
||||||
|
+ SystemDictionary::add_to_hierarchy(result);
|
||||||
|
+ }
|
||||||
|
+ // new class not linked yet.
|
||||||
|
+ MetaspaceShared::try_link_class(THREAD, result);
|
||||||
|
+ assert(!HAS_PENDING_EXCEPTION, "Invariant");
|
||||||
|
+
|
||||||
|
+ // exclude the existing class from dump
|
||||||
|
+ SystemDictionaryShared::set_excluded(InstanceKlass::cast(klass));
|
||||||
|
+ log_info(cds, lambda)("Replaced class %s, old: %p new: %p", name, klass, result);
|
||||||
|
+}
|
||||||
|
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
index 98e2541c79b..63de2e2f099 100644
|
||||||
|
--- a/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
@@ -963,11 +963,12 @@ InstanceKlass* SystemDictionary::resolve_from_stream(ClassFileStream* st,
|
||||||
|
Symbol* class_name,
|
||||||
|
Handle class_loader,
|
||||||
|
const ClassLoadInfo& cl_info,
|
||||||
|
+ InstanceKlass* old_klass,
|
||||||
|
TRAPS) {
|
||||||
|
if (cl_info.is_hidden()) {
|
||||||
|
- return resolve_hidden_class_from_stream(st, class_name, class_loader, cl_info, CHECK_NULL);
|
||||||
|
+ return resolve_hidden_class_from_stream(st, class_name, class_loader, cl_info, old_klass, CHECK_NULL);
|
||||||
|
} else {
|
||||||
|
- return resolve_class_from_stream(st, class_name, class_loader, cl_info, CHECK_NULL);
|
||||||
|
+ return resolve_class_from_stream(st, class_name, class_loader, cl_info, old_klass, CHECK_NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/systemDictionary.hpp b/src/hotspot/share/classfile/systemDictionary.hpp
|
||||||
|
index 0c774dfeb51..65185a29b10 100644
|
||||||
|
--- a/src/hotspot/share/classfile/systemDictionary.hpp
|
||||||
|
+++ b/src/hotspot/share/classfile/systemDictionary.hpp
|
||||||
|
@@ -124,6 +124,7 @@ class SystemDictionary : AllStatic {
|
||||||
|
Symbol* class_name,
|
||||||
|
Handle class_loader,
|
||||||
|
const ClassLoadInfo& cl_info,
|
||||||
|
+ InstanceKlass* old_klass,
|
||||||
|
TRAPS);
|
||||||
|
|
||||||
|
// Resolve a class from stream (called by jni_DefineClass and JVM_DefineClass)
|
||||||
|
@@ -132,6 +133,7 @@ class SystemDictionary : AllStatic {
|
||||||
|
Symbol* class_name,
|
||||||
|
Handle class_loader,
|
||||||
|
const ClassLoadInfo& cl_info,
|
||||||
|
+ InstanceKlass* old_klass,
|
||||||
|
TRAPS);
|
||||||
|
|
||||||
|
public:
|
||||||
|
@@ -203,6 +205,10 @@ class SystemDictionary : AllStatic {
|
||||||
|
// Initialization
|
||||||
|
static void initialize(TRAPS);
|
||||||
|
|
||||||
|
+ // (DCEVM) Enhanced class redefinition
|
||||||
|
+ static void remove_from_hierarchy(InstanceKlass* k);
|
||||||
|
+ static void update_constraints_after_redefinition();
|
||||||
|
+
|
||||||
|
protected:
|
||||||
|
// Returns the class loader data to be used when looking up/updating the
|
||||||
|
// system dictionary.
|
||||||
|
diff --git a/src/hotspot/share/classfile/vmClassMacros.hpp b/src/hotspot/share/classfile/vmClassMacros.hpp
|
||||||
|
index a4f55641b51..fb205721a39 100644
|
||||||
|
--- a/src/hotspot/share/classfile/vmClassMacros.hpp
|
||||||
|
+++ b/src/hotspot/share/classfile/vmClassMacros.hpp
|
||||||
|
@@ -109,6 +109,8 @@
|
||||||
|
\
|
||||||
|
/* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
|
||||||
|
do_klass(DirectMethodHandle_klass, java_lang_invoke_DirectMethodHandle ) \
|
||||||
|
+ do_klass(DirectMethodHandle_StaticAccessor_klass, java_lang_invoke_DirectMethodHandle_StaticAccessor ) \
|
||||||
|
+ do_klass(DirectMethodHandle_Accessor_klass, java_lang_invoke_DirectMethodHandle_Accessor ) \
|
||||||
|
do_klass(MethodHandle_klass, java_lang_invoke_MethodHandle ) \
|
||||||
|
do_klass(VarHandle_klass, java_lang_invoke_VarHandle ) \
|
||||||
|
do_klass(MemberName_klass, java_lang_invoke_MemberName ) \
|
||||||
|
diff --git a/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp b/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp
|
||||||
|
index 54edc9dffb5..058dea90828 100644
|
||||||
|
--- a/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp
|
||||||
|
+++ b/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp
|
||||||
|
@@ -141,7 +141,10 @@ void G1FullGCCompactTask::compact_region_dcevm(HeapRegion* hr, GrowableArray<Hea
|
||||||
|
// Once all objects have been moved the liveness information
|
||||||
|
// needs be cleared.
|
||||||
|
collector()->mark_bitmap()->clear_region(hr);
|
||||||
|
- hr->complete_compaction();
|
||||||
|
+ if (G1VerifyBitmaps) {
|
||||||
|
+ collector()->mark_bitmap()->clear_region(hr);
|
||||||
|
+ }
|
||||||
|
+ hr->reset_compacted_after_full_gc();
|
||||||
|
}
|
||||||
|
|
||||||
|
void G1FullGCCompactTask::serial_compaction_dcevm() {
|
||||||
|
@@ -184,13 +187,13 @@ size_t G1FullGCCompactTask::G1CompactRegionClosureDcevm::apply(oop obj) {
|
||||||
|
} else {
|
||||||
|
DcevmSharedGC::update_fields(obj, oop(destination));
|
||||||
|
}
|
||||||
|
- oop(destination)->init_mark_raw();
|
||||||
|
+ oop(destination)->init_mark();
|
||||||
|
assert(oop(destination)->klass() != NULL, "should have a class");
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
Copy::aligned_conjoint_words(obj_addr, destination, size);
|
||||||
|
- oop(destination)->init_mark_raw();
|
||||||
|
+ oop(destination)->init_mark();
|
||||||
|
assert(oop(destination)->klass() != NULL, "should have a class");
|
||||||
|
|
||||||
|
return size;
|
||||||
|
diff --git a/src/hotspot/share/gc/g1/g1FullGCCompactionPoint.cpp b/src/hotspot/share/gc/g1/g1FullGCCompactionPoint.cpp
|
||||||
|
index 71a46b88f9e..87b1977128a 100644
|
||||||
|
--- a/src/hotspot/share/gc/g1/g1FullGCCompactionPoint.cpp
|
||||||
|
+++ b/src/hotspot/share/gc/g1/g1FullGCCompactionPoint.cpp
|
||||||
|
@@ -36,8 +36,8 @@ G1FullGCCompactionPoint::G1FullGCCompactionPoint() :
|
||||||
|
{
|
||||||
|
_compaction_regions = new (ResourceObj::C_HEAP, mtGC) GrowableArray<HeapRegion*>(32, mtGC);
|
||||||
|
_compaction_region_iterator = _compaction_regions->begin();
|
||||||
|
- _rescued_oops = new (ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(128, true, mtGC);
|
||||||
|
- _rescued_oops_values = new (ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(128, true, mtGC);
|
||||||
|
+ _rescued_oops = new (ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(128, mtGC);
|
||||||
|
+ _rescued_oops_values = new (ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(128, mtGC);
|
||||||
|
}
|
||||||
|
|
||||||
|
G1FullGCCompactionPoint::~G1FullGCCompactionPoint() {
|
||||||
|
@@ -180,15 +180,15 @@ void G1FullGCCompactionPoint::forward_dcevm(oop object, size_t size, bool force_
|
||||||
|
// with BiasedLocking, in this case forwardee() will return NULL
|
||||||
|
// even if the mark-word is used. This is no problem since
|
||||||
|
// forwardee() will return NULL in the compaction phase as well.
|
||||||
|
- object->init_mark_raw();
|
||||||
|
+ object->init_mark();
|
||||||
|
} else {
|
||||||
|
// Make sure object has the correct mark-word set or that it will be
|
||||||
|
// fixed when restoring the preserved marks.
|
||||||
|
- assert(object->mark_raw() == markWord::prototype_for_klass(object->klass()) || // Correct mark
|
||||||
|
+ assert(object->mark() == markWord::prototype_for_klass(object->klass()) || // Correct mark
|
||||||
|
object->mark_must_be_preserved() || // Will be restored by PreservedMarksSet
|
||||||
|
- (UseBiasedLocking && object->has_bias_pattern_raw()), // Will be restored by BiasedLocking
|
||||||
|
+ (UseBiasedLocking && object->has_bias_pattern()), // Will be restored by BiasedLocking
|
||||||
|
"should have correct prototype obj: " PTR_FORMAT " mark: " PTR_FORMAT " prototype: " PTR_FORMAT,
|
||||||
|
- p2i(object), object->mark_raw().value(), markWord::prototype_for_klass(object->klass()).value());
|
||||||
|
+ p2i(object), object->mark().value(), markWord::prototype_for_klass(object->klass()).value());
|
||||||
|
}
|
||||||
|
assert(object->forwardee() == NULL, "should be forwarded to NULL");
|
||||||
|
}
|
||||||
|
diff --git a/src/hotspot/share/gc/shared/dcevmSharedGC.cpp b/src/hotspot/share/gc/shared/dcevmSharedGC.cpp
|
||||||
|
index 3dee097f1d3..edc19a3077d 100644
|
||||||
|
--- a/src/hotspot/share/gc/shared/dcevmSharedGC.cpp
|
||||||
|
+++ b/src/hotspot/share/gc/shared/dcevmSharedGC.cpp
|
||||||
|
@@ -64,7 +64,7 @@ void DcevmSharedGC::copy_rescued_objects_back(GrowableArray<HeapWord*>* rescued_
|
||||||
|
Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(rescued_obj), cast_from_oop<HeapWord*>(new_obj), size);
|
||||||
|
}
|
||||||
|
|
||||||
|
- new_obj->init_mark_raw();
|
||||||
|
+ new_obj->init_mark();
|
||||||
|
assert(oopDesc::is_oop(new_obj), "must be a valid oop");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/src/hotspot/share/gc/shared/space.inline.hpp b/src/hotspot/share/gc/shared/space.inline.hpp
|
||||||
|
index e3a37280268..cafa2503ef4 100644
|
||||||
|
--- a/src/hotspot/share/gc/shared/space.inline.hpp
|
||||||
|
+++ b/src/hotspot/share/gc/shared/space.inline.hpp
|
||||||
|
@@ -371,7 +371,7 @@ inline void CompactibleSpace::scan_and_compact(SpaceType* space, bool redefiniti
|
||||||
|
} else {
|
||||||
|
DcevmSharedGC::update_fields(oop(cur_obj), oop(compaction_top));
|
||||||
|
}
|
||||||
|
- oop(compaction_top)->init_mark_raw();
|
||||||
|
+ oop(compaction_top)->init_mark();
|
||||||
|
assert(oop(compaction_top)->klass() != NULL, "should have a class");
|
||||||
|
|
||||||
|
debug_only(prev_obj = cur_obj);
|
||||||
|
diff --git a/src/hotspot/share/memory/universe.cpp b/src/hotspot/share/memory/universe.cpp
|
||||||
|
index 247f2b3e8c0..4ae3b382b67 100644
|
||||||
|
--- a/src/hotspot/share/memory/universe.cpp
|
||||||
|
+++ b/src/hotspot/share/memory/universe.cpp
|
||||||
|
@@ -44,8 +44,6 @@
|
||||||
|
#include "gc/shared/oopStorageSet.hpp"
|
||||||
|
#include "gc/shared/stringdedup/stringDedup.hpp"
|
||||||
|
#include "gc/shared/tlab_globals.hpp"
|
||||||
|
-#include "gc/shared/weakProcessor.hpp"
|
||||||
|
-#include "interpreter/interpreter.hpp"
|
||||||
|
#include "logging/log.hpp"
|
||||||
|
#include "logging/logStream.hpp"
|
||||||
|
#include "memory/metadataFactory.hpp"
|
||||||
|
@@ -73,8 +71,6 @@
|
||||||
|
#include "runtime/jniHandles.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
|
#include "runtime/timerTrace.hpp"
|
||||||
|
-#include "runtime/vmOperations.hpp"
|
||||||
|
-#include "services/management.hpp"
|
||||||
|
#include "services/memoryService.hpp"
|
||||||
|
#include "utilities/align.hpp"
|
||||||
|
#include "utilities/autoRestore.hpp"
|
||||||
|
@@ -208,73 +204,6 @@ void Universe::basic_type_classes_do(KlassClosure *closure) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-#define DO_PRIMITIVE_MIRROR(m) \
|
||||||
|
- f->do_oop((oop*) &m);
|
||||||
|
-
|
||||||
|
-// FIXME: (DCEVM) This method should iterate all pointers that are not within heap objects.
|
||||||
|
-void Universe::root_oops_do(OopClosure *oopClosure) {
|
||||||
|
- Universe::oops_do(oopClosure);
|
||||||
|
-// ReferenceProcessor::oops_do(oopClosure); (tw) check why no longer there
|
||||||
|
- JNIHandles::oops_do(oopClosure); // Global (strong) JNI handles
|
||||||
|
- Threads::oops_do(oopClosure, NULL);
|
||||||
|
- ObjectSynchronizer::oops_do(oopClosure);
|
||||||
|
- // (DCEVM) TODO: Check if this is correct?
|
||||||
|
- Management::oops_do(oopClosure);
|
||||||
|
- OopStorageSet::vm_global()->oops_do(oopClosure);
|
||||||
|
- // CLDToOopClosure cld_closure(oopClosure, ClassLoaderData::_claim_none);
|
||||||
|
- // ClassLoaderDataGraph::cld_do(&cld_closure);
|
||||||
|
-
|
||||||
|
- // Now adjust pointers in remaining weak roots. (All of which should
|
||||||
|
- // have been cleared if they pointed to non-surviving objects.)
|
||||||
|
- // Global (weak) JNI handles
|
||||||
|
- WeakProcessor::oops_do(oopClosure);
|
||||||
|
-
|
||||||
|
- JvmtiExport::oops_do(oopClosure);
|
||||||
|
-
|
||||||
|
- CodeBlobToOopClosure blobClosure(oopClosure, CodeBlobToOopClosure::FixRelocations);
|
||||||
|
- CodeCache::blobs_do(&blobClosure);
|
||||||
|
-
|
||||||
|
- AOT_ONLY(AOTLoader::oops_do(oopClosure);)
|
||||||
|
-
|
||||||
|
- // StringTable::oops_do was removed in j15
|
||||||
|
- // StringTable::oops_do(oopClosure);
|
||||||
|
-
|
||||||
|
- // OopStorageSet::vm_global()->oops_do(oopClosure);
|
||||||
|
-
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-void Universe::oops_do(OopClosure* f) {
|
||||||
|
- PRIMITIVE_MIRRORS_DO(DO_PRIMITIVE_MIRROR);
|
||||||
|
-
|
||||||
|
- for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
|
||||||
|
- f->do_oop((oop*) &_mirrors[i]);
|
||||||
|
- }
|
||||||
|
- assert(_mirrors[0] == NULL && _mirrors[T_BOOLEAN - 1] == NULL, "checking");
|
||||||
|
-
|
||||||
|
- f->do_oop((oop*)&_the_empty_class_array);
|
||||||
|
- f->do_oop((oop*)&_the_null_sentinel);
|
||||||
|
- f->do_oop((oop*)&_the_null_string);
|
||||||
|
- f->do_oop((oop*)&_the_min_jint_string);
|
||||||
|
- f->do_oop((oop*)&out_of_memory_errors()->obj_at(_oom_java_heap));
|
||||||
|
- f->do_oop((oop*)&out_of_memory_errors()->obj_at(_oom_c_heap));
|
||||||
|
- f->do_oop((oop*)&out_of_memory_errors()->obj_at(_oom_metaspace));
|
||||||
|
- f->do_oop((oop*)&out_of_memory_errors()->obj_at(_oom_class_metaspace));
|
||||||
|
- f->do_oop((oop*)&out_of_memory_errors()->obj_at(_oom_array_size));
|
||||||
|
- f->do_oop((oop*)&out_of_memory_errors()->obj_at(_oom_gc_overhead_limit));
|
||||||
|
- f->do_oop((oop*)&out_of_memory_errors()->obj_at(_oom_realloc_objects));
|
||||||
|
- f->do_oop((oop*)&out_of_memory_errors()->obj_at(_oom_retry));
|
||||||
|
- f->do_oop((oop*)&_delayed_stack_overflow_error_message);
|
||||||
|
- f->do_oop((oop*)&_preallocated_out_of_memory_error_array);
|
||||||
|
- f->do_oop((oop*)&_null_ptr_exception_instance);
|
||||||
|
- f->do_oop((oop*)&_arithmetic_exception_instance);
|
||||||
|
- f->do_oop((oop*)&_virtual_machine_error_instance);
|
||||||
|
- f->do_oop((oop*)&_main_thread_group);
|
||||||
|
- f->do_oop((oop*)&_system_thread_group);
|
||||||
|
- f->do_oop((oop*)&_reference_pending_list);
|
||||||
|
- debug_only(f->do_oop((oop*)&_fullgc_alot_dummy_array);)
|
||||||
|
- ThreadsSMRSupport::exiting_threads_oops_do(f);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
void LatestMethodCache::metaspace_pointers_do(MetaspaceClosure* it) {
|
||||||
|
it->push(&_klass);
|
||||||
|
}
|
||||||
|
diff --git a/src/hotspot/share/memory/universe.hpp b/src/hotspot/share/memory/universe.hpp
|
||||||
|
index cb320076a55..4b2211c415e 100644
|
||||||
|
--- a/src/hotspot/share/memory/universe.hpp
|
||||||
|
+++ b/src/hotspot/share/memory/universe.hpp
|
||||||
|
@@ -326,13 +326,6 @@ class Universe: AllStatic {
|
||||||
|
static bool should_fill_in_stack_trace(Handle throwable);
|
||||||
|
static void check_alignment(uintx size, uintx alignment, const char* name);
|
||||||
|
|
||||||
|
- // Iteration
|
||||||
|
-
|
||||||
|
- static void root_oops_do(OopClosure *oopClosure); // FIXME: kill...
|
||||||
|
- // Apply "f" to the addresses of all the direct heap pointers maintained
|
||||||
|
- // as static fields of "Universe".
|
||||||
|
- static void oops_do(OopClosure* f);
|
||||||
|
-
|
||||||
|
// CDS support
|
||||||
|
static void serialize(SerializeClosure* f);
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
index a8ac12450d7..ab2d7f10f9c 100644
|
||||||
|
--- a/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
+++ b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
@@ -1286,7 +1286,7 @@ void InstanceKlass::init_implementor() {
|
||||||
|
// (DCEVM) - init_implementor() for dcevm
|
||||||
|
void InstanceKlass::init_implementor_from_redefine() {
|
||||||
|
assert(is_interface(), "not interface");
|
||||||
|
- Klass* volatile* addr = adr_implementor();
|
||||||
|
+ InstanceKlass* volatile* addr = adr_implementor();
|
||||||
|
assert(addr != NULL, "null addr");
|
||||||
|
if (addr != NULL) {
|
||||||
|
*addr = NULL;
|
||||||
|
@@ -3828,7 +3828,7 @@ void InstanceKlass::verify_on(outputStream* st) {
|
||||||
|
|
||||||
|
guarantee(sib->is_klass(), "should be klass");
|
||||||
|
// TODO: (DCEVM) explain
|
||||||
|
- guarantee(sib->super() == super || AllowEnhancedClassRedefinition && super->newest_version() == SystemDictionary::Object_klass(), "siblings should have same superklass");
|
||||||
|
+ guarantee(sib->super() == super || AllowEnhancedClassRedefinition && super->newest_version() == vmClasses::Object_klass(), "siblings should have same superklass");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify local interfaces
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index af34d751bdb..0b1db1581d1 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -26,8 +26,10 @@
|
||||||
|
#include "aot/aotLoader.hpp"
|
||||||
|
#include "classfile/classFileParser.hpp"
|
||||||
|
#include "classfile/classFileStream.hpp"
|
||||||
|
+#include "classfile/classLoadInfo.hpp"
|
||||||
|
#include "classfile/metadataOnStackMark.hpp"
|
||||||
|
#include "classfile/systemDictionary.hpp"
|
||||||
|
+#include "classfile/symbolTable.hpp"
|
||||||
|
#include "classfile/verifier.hpp"
|
||||||
|
#include "classfile/dictionary.hpp"
|
||||||
|
#include "classfile/classLoaderDataGraph.hpp"
|
||||||
|
@@ -198,8 +200,8 @@ class FieldCopier : public FieldClosure {
|
||||||
|
if (found && result.is_static()) {
|
||||||
|
log_trace(redefine, class, obsolete, metadata)("Copying static field value for field %s old_offset=%d new_offset=%d",
|
||||||
|
fd->name()->as_C_string(), result.offset(), fd->offset());
|
||||||
|
- memcpy(cur_oop->obj_field_addr_raw<HeapWord>(fd->offset()),
|
||||||
|
- old_oop->obj_field_addr_raw<HeapWord>(result.offset()),
|
||||||
|
+ memcpy(cur_oop->obj_field_addr<HeapWord>(fd->offset()),
|
||||||
|
+ old_oop->obj_field_addr<HeapWord>(result.offset()),
|
||||||
|
type2aelembytes(fd->field_type()));
|
||||||
|
|
||||||
|
// Static fields may have references to java.lang.Class
|
||||||
|
@@ -242,6 +244,17 @@ void VM_EnhancedRedefineClasses::register_nmethod_g1(nmethod* nm) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+void VM_EnhancedRedefineClasses::root_oops_do(OopClosure *oopClosure) {
|
||||||
|
+ Universe::vm_global()->oops_do(oopClosure);
|
||||||
|
+
|
||||||
|
+ Threads::oops_do(oopClosure, NULL);
|
||||||
|
+ AOT_ONLY(AOTLoader::oops_do(oopClosure);)
|
||||||
|
+ OopStorageSet::strong_oops_do(oopClosure);
|
||||||
|
+
|
||||||
|
+ CodeBlobToOopClosure blobClosure(oopClosure, CodeBlobToOopClosure::FixRelocations);
|
||||||
|
+ CodeCache::blobs_do(&blobClosure);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
// TODO comment
|
||||||
|
struct StoreBarrier {
|
||||||
|
// TODO: j10 review change ::oop_store -> HeapAccess<>::oop_store
|
||||||
|
@@ -558,7 +571,7 @@ void VM_EnhancedRedefineClasses::doit() {
|
||||||
|
_timer_heap_iterate.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
- Universe::root_oops_do(&oopClosureNoBarrier);
|
||||||
|
+ root_oops_do(&oopClosureNoBarrier);
|
||||||
|
|
||||||
|
if (UseG1GC) {
|
||||||
|
// this should work also for other GCs
|
||||||
|
@@ -737,8 +750,8 @@ bool VM_EnhancedRedefineClasses::is_modifiable_class(oop klass_mirror) {
|
||||||
|
// - link new classes
|
||||||
|
jvmtiError VM_EnhancedRedefineClasses::load_new_class_versions(TRAPS) {
|
||||||
|
|
||||||
|
- _affected_klasses = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<Klass*>(_class_count, true);
|
||||||
|
- _new_classes = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<InstanceKlass*>(_class_count, true);
|
||||||
|
+ _affected_klasses = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<Klass*>(_class_count);
|
||||||
|
+ _new_classes = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<InstanceKlass*>(_class_count);
|
||||||
|
|
||||||
|
ResourceMark rm(THREAD);
|
||||||
|
|
||||||
|
@@ -832,12 +845,12 @@ jvmtiError VM_EnhancedRedefineClasses::load_new_class_versions(TRAPS) {
|
||||||
|
!the_class->is_non_strong_hidden(), // is_strong_hidden
|
||||||
|
true); // FIXME: check if correct. can_access_vm_annotations
|
||||||
|
|
||||||
|
- k = SystemDictionary::parse_stream(the_class_sym,
|
||||||
|
- the_class_loader,
|
||||||
|
- &st,
|
||||||
|
- cl_info,
|
||||||
|
- the_class,
|
||||||
|
- THREAD);
|
||||||
|
+ k = SystemDictionary::resolve_from_stream(&st,
|
||||||
|
+ the_class_sym,
|
||||||
|
+ the_class_loader,
|
||||||
|
+ cl_info,
|
||||||
|
+ the_class,
|
||||||
|
+ THREAD);
|
||||||
|
|
||||||
|
k->class_loader_data()->exchange_holders(the_class->class_loader_data());
|
||||||
|
|
||||||
|
@@ -853,12 +866,12 @@ jvmtiError VM_EnhancedRedefineClasses::load_new_class_versions(TRAPS) {
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
- k = SystemDictionary::resolve_from_stream(the_class_sym,
|
||||||
|
- the_class_loader,
|
||||||
|
- protection_domain,
|
||||||
|
- &st,
|
||||||
|
- the_class,
|
||||||
|
- THREAD);
|
||||||
|
+ k = SystemDictionary::resolve_from_stream(&st,
|
||||||
|
+ the_class_sym,
|
||||||
|
+ the_class_loader,
|
||||||
|
+ protection_domain,
|
||||||
|
+ the_class,
|
||||||
|
+ THREAD);
|
||||||
|
}
|
||||||
|
// Clear class_being_redefined just to be sure.
|
||||||
|
state->clear_class_being_redefined();
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
index 43f1aff8e91..ae0a15281f3 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
@@ -124,6 +124,8 @@ class VM_EnhancedRedefineClasses: public VM_GC_Operation {
|
||||||
|
static void register_nmethod_g1(nmethod* nm);
|
||||||
|
static void unpatch_bytecode(Method* method, TRAPS);
|
||||||
|
|
||||||
|
+ void root_oops_do(OopClosure *oopClosure);
|
||||||
|
+
|
||||||
|
// Figure out which new methods match old methods in name and signature,
|
||||||
|
// which methods have been added, and which are no longer present
|
||||||
|
void compute_added_deleted_matching_methods();
|
||||||
|
diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||||
|
index 3c29eda4da0..a1eadc2958a 100644
|
||||||
|
--- a/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||||
|
@@ -34,6 +34,7 @@
|
||||||
|
#include "oops/access.inline.hpp"
|
||||||
|
#include "oops/method.hpp"
|
||||||
|
#include "oops/oop.inline.hpp"
|
||||||
|
+#include "oops/klass.inline.hpp"
|
||||||
|
#include "oops/weakHandle.inline.hpp"
|
||||||
|
#include "prims/resolvedMethodTable.hpp"
|
||||||
|
#include "runtime/atomic.hpp"
|
||||||
|
@@ -375,7 +376,7 @@ class AdjustMethodEntriesDcevm : public StackObj {
|
||||||
|
GrowableArray<oop>* _oops_to_add;
|
||||||
|
public:
|
||||||
|
AdjustMethodEntriesDcevm(GrowableArray<oop>* oops_to_add, bool* trace_name_printed) : _trace_name_printed(trace_name_printed), _oops_to_add(oops_to_add) {};
|
||||||
|
- bool operator()(WeakHandle<vm_resolved_method_table_data>* entry) {
|
||||||
|
+ bool operator()(WeakHandle* entry) {
|
||||||
|
oop mem_name = entry->peek();
|
||||||
|
if (mem_name == NULL) {
|
||||||
|
// Removed
|
||||||
|
@@ -460,7 +461,7 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
|
||||||
|
if (_local_table->get(thread, lookup, rmg)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
- WeakHandle<vm_resolved_method_table_data> wh = WeakHandle<vm_resolved_method_table_data>::create(Handle(thread, mem_name));
|
||||||
|
+ WeakHandle wh(_oop_storage, mem_name);
|
||||||
|
// The hash table takes ownership of the WeakHandle, even if it's not inserted.
|
||||||
|
if (_local_table->insert(thread, lookup, wh)) {
|
||||||
|
log_insert(method);
|
||||||
|
diff --git a/src/hotspot/share/runtime/arguments.hpp b/src/hotspot/share/runtime/arguments.hpp
|
||||||
|
index 3adc03a6583..b8eb4d0ab24 100644
|
||||||
|
--- a/src/hotspot/share/runtime/arguments.hpp
|
||||||
|
+++ b/src/hotspot/share/runtime/arguments.hpp
|
||||||
|
@@ -487,6 +487,8 @@ class Arguments : AllStatic {
|
||||||
|
// Adjusts the arguments after the OS have adjusted the arguments
|
||||||
|
static jint adjust_after_os();
|
||||||
|
|
||||||
|
+ // Check for consistency in the selection of the garbage collector.
|
||||||
|
+ static bool check_gc_consistency(); // Check user-selected gc
|
||||||
|
// Check consistency or otherwise of VM argument settings
|
||||||
|
static bool check_vm_args_consistency();
|
||||||
|
// Used by os_solaris
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
From 09f5f22d61675a9f8909e903fa6e6f51507b656c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Fri, 12 Feb 2021 11:38:48 +0100
|
||||||
|
Subject: [PATCH 22/45] Fix crash on GrowableArray allocation in C_HEAP
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index 0b1db1581d1..b88c071be13 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -750,8 +750,8 @@ bool VM_EnhancedRedefineClasses::is_modifiable_class(oop klass_mirror) {
|
||||||
|
// - link new classes
|
||||||
|
jvmtiError VM_EnhancedRedefineClasses::load_new_class_versions(TRAPS) {
|
||||||
|
|
||||||
|
- _affected_klasses = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<Klass*>(_class_count);
|
||||||
|
- _new_classes = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<InstanceKlass*>(_class_count);
|
||||||
|
+ _affected_klasses = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<Klass*>(_class_count, mtInternal);
|
||||||
|
+ _new_classes = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<InstanceKlass*>(_class_count, mtInternal);
|
||||||
|
|
||||||
|
ResourceMark rm(THREAD);
|
||||||
|
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
From 90b8572ff42dd5f64a6d2063aab6842bceddcf55 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Fri, 12 Feb 2021 11:39:05 +0100
|
||||||
|
Subject: [PATCH 23/45] Rename confusing method name old_if_redefined to
|
||||||
|
old_if_redefining
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/classfile/dictionary.cpp | 4 ++--
|
||||||
|
src/hotspot/share/classfile/dictionary.hpp | 2 +-
|
||||||
|
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/dictionary.cpp b/src/hotspot/share/classfile/dictionary.cpp
|
||||||
|
index 223b9e1e7a9..2b236a7724e 100644
|
||||||
|
--- a/src/hotspot/share/classfile/dictionary.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/dictionary.cpp
|
||||||
|
@@ -359,7 +359,7 @@ InstanceKlass* Dictionary::find(unsigned int hash, Symbol* name,
|
||||||
|
int index = hash_to_index(hash);
|
||||||
|
DictionaryEntry* entry = get_entry(index, hash, name);
|
||||||
|
if (entry != NULL && entry->is_valid_protection_domain(protection_domain)) {
|
||||||
|
- return old_if_redefined(entry->instance_klass());
|
||||||
|
+ return old_if_redefining(entry->instance_klass());
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
@@ -373,7 +373,7 @@ InstanceKlass* Dictionary::find_class(unsigned int hash,
|
||||||
|
assert (index == index_for(name), "incorrect index?");
|
||||||
|
|
||||||
|
DictionaryEntry* entry = get_entry(index, hash, name);
|
||||||
|
- return old_if_redefined((entry != NULL) ? entry->instance_klass() : NULL);
|
||||||
|
+ return old_if_redefining((entry != NULL) ? entry->instance_klass() : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dictionary::add_protection_domain(int index, unsigned int hash,
|
||||||
|
diff --git a/src/hotspot/share/classfile/dictionary.hpp b/src/hotspot/share/classfile/dictionary.hpp
|
||||||
|
index bdfef5c8663..e997cfdcabd 100644
|
||||||
|
--- a/src/hotspot/share/classfile/dictionary.hpp
|
||||||
|
+++ b/src/hotspot/share/classfile/dictionary.hpp
|
||||||
|
@@ -109,7 +109,7 @@ public:
|
||||||
|
Handle protection_domain);
|
||||||
|
|
||||||
|
// (DCEVM) return old class if redefining in AllowEnhancedClassRedefinition, otherwise return "k"
|
||||||
|
- static InstanceKlass* old_if_redefined(InstanceKlass* k) {
|
||||||
|
+ static InstanceKlass* old_if_redefining(InstanceKlass* k) {
|
||||||
|
return (k != NULL && k->is_redefining()) ? ((InstanceKlass* )k->old_version()) : k;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
From 86f7318e889fcb0d883501b4a70105d087b39482 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Fri, 12 Feb 2021 12:33:47 +0100
|
||||||
|
Subject: [PATCH 24/45] Check InstanceKlass::has_nestmate_access_to with active
|
||||||
|
classes
|
||||||
|
|
||||||
|
Dcevm can leave old host in nested class if nested class is not
|
||||||
|
redefined together with host class
|
||||||
|
---
|
||||||
|
src/hotspot/share/oops/instanceKlass.cpp | 9 +++++++--
|
||||||
|
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
index ab2d7f10f9c..bcb0da6301f 100644
|
||||||
|
--- a/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
+++ b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
@@ -398,9 +398,9 @@ bool InstanceKlass::has_nestmate_access_to(InstanceKlass* k, TRAPS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // (DCEVM) cur_host can be old, decide accessibility based on active version
|
||||||
|
if (AllowEnhancedClassRedefinition) {
|
||||||
|
- // TODO: (DCEVM) check if it correct. It fix problems with lambdas (hidden)
|
||||||
|
- cur_host = InstanceKlass::cast(cur_host->newest_version());
|
||||||
|
+ cur_host = InstanceKlass::cast(cur_host->active_version());
|
||||||
|
}
|
||||||
|
|
||||||
|
Klass* k_nest_host = k->nest_host(CHECK_false);
|
||||||
|
@@ -408,6 +408,11 @@ bool InstanceKlass::has_nestmate_access_to(InstanceKlass* k, TRAPS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // (DCEVM) k_nest_host can be old, decide accessibility based on active version
|
||||||
|
+ if (AllowEnhancedClassRedefinition) {
|
||||||
|
+ k_nest_host = InstanceKlass::cast(k_nest_host->active_version());
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
bool access = (cur_host == k_nest_host);
|
||||||
|
|
||||||
|
ResourceMark rm(THREAD);
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
From 79ea607bf68161cfcee3a681d14540cffe5589a3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sat, 13 Feb 2021 20:47:52 +0100
|
||||||
|
Subject: [PATCH 25/45] JBR-3111 Update class in all dictionaries where it was
|
||||||
|
already defined
|
||||||
|
|
||||||
|
This patch keeps compatibility with std redefinition, that does not
|
||||||
|
create a new Klass, but modifies it, then it is modified in all
|
||||||
|
dictionaries containing this class.
|
||||||
|
---
|
||||||
|
src/hotspot/share/classfile/classLoaderDataGraph.cpp | 9 +++++++++
|
||||||
|
src/hotspot/share/classfile/classLoaderDataGraph.hpp | 3 +++
|
||||||
|
src/hotspot/share/classfile/dictionary.cpp | 2 +-
|
||||||
|
src/hotspot/share/classfile/dictionary.hpp | 2 +-
|
||||||
|
src/hotspot/share/classfile/systemDictionary.cpp | 4 +++-
|
||||||
|
5 files changed, 17 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.cpp b/src/hotspot/share/classfile/classLoaderDataGraph.cpp
|
||||||
|
index fda5d2eb1ba..67ade5709f6 100644
|
||||||
|
--- a/src/hotspot/share/classfile/classLoaderDataGraph.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/classLoaderDataGraph.cpp
|
||||||
|
@@ -455,6 +455,15 @@ void ClassLoaderDataGraph::rollback_redefinition() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+// (DCEVM) - iterate over all classes in all dictionaries
|
||||||
|
+bool ClassLoaderDataGraph::dictionary_classes_do_update_klass(Symbol* name, InstanceKlass* k, InstanceKlass* old_klass) {
|
||||||
|
+ bool ok = false;
|
||||||
|
+ FOR_ALL_DICTIONARY(cld) {
|
||||||
|
+ ok = cld->dictionary()->update_klass(name, k, old_klass) || ok;
|
||||||
|
+ }
|
||||||
|
+ return ok;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void ClassLoaderDataGraph::verify_dictionary() {
|
||||||
|
FOR_ALL_DICTIONARY(cld) {
|
||||||
|
cld->dictionary()->verify();
|
||||||
|
diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.hpp b/src/hotspot/share/classfile/classLoaderDataGraph.hpp
|
||||||
|
index c3bcc7271e6..ebdb0bc2c8c 100644
|
||||||
|
--- a/src/hotspot/share/classfile/classLoaderDataGraph.hpp
|
||||||
|
+++ b/src/hotspot/share/classfile/classLoaderDataGraph.hpp
|
||||||
|
@@ -108,6 +108,9 @@ class ClassLoaderDataGraph : public AllStatic {
|
||||||
|
// (DCEVM) Enhanced class redefinition
|
||||||
|
static void rollback_redefinition();
|
||||||
|
|
||||||
|
+ // Enhanced class redefinition
|
||||||
|
+ static bool dictionary_classes_do_update_klass(Symbol* name, InstanceKlass* k, InstanceKlass* old_klass);
|
||||||
|
+
|
||||||
|
// VM_CounterDecay iteration support
|
||||||
|
static InstanceKlass* try_get_next_class();
|
||||||
|
static void adjust_saved_class(ClassLoaderData* cld);
|
||||||
|
diff --git a/src/hotspot/share/classfile/dictionary.cpp b/src/hotspot/share/classfile/dictionary.cpp
|
||||||
|
index 2b236a7724e..bb1d09fa7a2 100644
|
||||||
|
--- a/src/hotspot/share/classfile/dictionary.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/dictionary.cpp
|
||||||
|
@@ -322,7 +322,7 @@ DictionaryEntry* Dictionary::get_entry(int index, unsigned int hash,
|
||||||
|
}
|
||||||
|
|
||||||
|
// (DCEVM) replace old_class by new class in dictionary
|
||||||
|
-bool Dictionary::update_klass(unsigned int hash, Symbol* name, ClassLoaderData* loader_data, InstanceKlass* k, InstanceKlass* old_klass) {
|
||||||
|
+bool Dictionary::update_klass(Symbol* name, InstanceKlass* k, InstanceKlass* old_klass) {
|
||||||
|
// There are several entries for the same class in the dictionary: One extra entry for each parent classloader of the classloader of the class.
|
||||||
|
bool found = false;
|
||||||
|
for (int index = 0; index < table_size(); index++) {
|
||||||
|
diff --git a/src/hotspot/share/classfile/dictionary.hpp b/src/hotspot/share/classfile/dictionary.hpp
|
||||||
|
index e997cfdcabd..7f8d8e35fc3 100644
|
||||||
|
--- a/src/hotspot/share/classfile/dictionary.hpp
|
||||||
|
+++ b/src/hotspot/share/classfile/dictionary.hpp
|
||||||
|
@@ -83,7 +83,7 @@ public:
|
||||||
|
void verify();
|
||||||
|
|
||||||
|
// (DCEVM) Enhanced class redefinition
|
||||||
|
- bool update_klass(unsigned int hash, Symbol* name, ClassLoaderData* loader_data, InstanceKlass* k, InstanceKlass* old_klass);
|
||||||
|
+ bool update_klass(Symbol* name, InstanceKlass* k, InstanceKlass* old_klass);
|
||||||
|
|
||||||
|
void rollback_redefinition();
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
index 63de2e2f099..35e2f376870 100644
|
||||||
|
--- a/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
@@ -1441,7 +1441,9 @@ void SystemDictionary::define_instance_class(InstanceKlass* k, InstanceKlass* ol
|
||||||
|
|
||||||
|
unsigned int name_hash = dictionary->compute_hash(name_h);
|
||||||
|
if (is_redefining) {
|
||||||
|
- bool ok = dictionary->update_klass(name_hash, name_h, loader_data, k, old_klass);
|
||||||
|
+ // Update all dictionaries containing old_class to new_class
|
||||||
|
+ // outcome must be same as result of standard redefinition, that does not create a new Klass
|
||||||
|
+ bool ok = ClassLoaderDataGraph::dictionary_classes_do_update_klass(name_h, k, old_klass);
|
||||||
|
assert (ok, "must have found old class and updated!");
|
||||||
|
}
|
||||||
|
check_constraints(name_hash, k, class_loader, !is_redefining, CHECK);
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
From 99c65ab84080d35c1ba1df6efd5641ad3ab9e1e8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sat, 20 Feb 2021 15:47:47 +0100
|
||||||
|
Subject: [PATCH 26/45] Add ClassLoaderDataGraph_lock to define new class in
|
||||||
|
enhanced redefiniton
|
||||||
|
|
||||||
|
ClassLoaderDataGraph locking for introduced in redefinition in
|
||||||
|
java.version>11
|
||||||
|
---
|
||||||
|
src/hotspot/share/classfile/systemDictionary.cpp | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
index 35e2f376870..c628cb9da83 100644
|
||||||
|
--- a/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||||
|
@@ -1443,7 +1443,9 @@ void SystemDictionary::define_instance_class(InstanceKlass* k, InstanceKlass* ol
|
||||||
|
if (is_redefining) {
|
||||||
|
// Update all dictionaries containing old_class to new_class
|
||||||
|
// outcome must be same as result of standard redefinition, that does not create a new Klass
|
||||||
|
+ ClassLoaderDataGraph_lock->lock();
|
||||||
|
bool ok = ClassLoaderDataGraph::dictionary_classes_do_update_klass(name_h, k, old_klass);
|
||||||
|
+ ClassLoaderDataGraph_lock->unlock();
|
||||||
|
assert (ok, "must have found old class and updated!");
|
||||||
|
}
|
||||||
|
check_constraints(name_hash, k, class_loader, !is_redefining, CHECK);
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,180 @@
|
|||||||
|
From e7e7920986355d6fd5ad0c333ec780c93583d030 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Thu, 18 Jun 2020 18:40:11 +0200
|
||||||
|
Subject: [PATCH 27/45] JBR-3140 - support for modularized HotswapAgent
|
||||||
|
|
||||||
|
Add -XX:HotswapAgent=[disabled,fatjar.core]
|
||||||
|
---
|
||||||
|
src/hotspot/share/runtime/arguments.cpp | 77 +++++++++++++++++++
|
||||||
|
src/hotspot/share/runtime/arguments.hpp | 4 +
|
||||||
|
.../flags/jvmFlagConstraintsRuntime.cpp | 9 +++
|
||||||
|
.../flags/jvmFlagConstraintsRuntime.hpp | 3 +-
|
||||||
|
src/hotspot/share/runtime/globals.hpp | 11 ++-
|
||||||
|
5 files changed, 102 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp
|
||||||
|
index 252ebbc4e57..9c6fab8ae4b 100644
|
||||||
|
--- a/src/hotspot/share/runtime/arguments.cpp
|
||||||
|
+++ b/src/hotspot/share/runtime/arguments.cpp
|
||||||
|
@@ -4034,6 +4034,8 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ setup_hotswap_agent();
|
||||||
|
+
|
||||||
|
#if !INCLUDE_CDS
|
||||||
|
if (DumpSharedSpaces || RequireSharedSpaces) {
|
||||||
|
jio_fprintf(defaultStream::error_stream(),
|
||||||
|
@@ -4390,3 +4392,78 @@ bool Arguments::copy_expand_pid(const char* src, size_t srclen,
|
||||||
|
*b = '\0';
|
||||||
|
return (p == src_end); // return false if not all of the source was copied
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+void Arguments::setup_hotswap_agent() {
|
||||||
|
+
|
||||||
|
+ if (DumpSharedSpaces)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (HotswapAgent == NULL || strcmp(HotswapAgent, "disabled") == 0)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ // Force AllowEnhancedClassRedefinition if HA is enabled
|
||||||
|
+ AllowEnhancedClassRedefinition = true;
|
||||||
|
+
|
||||||
|
+ bool ha_fatjar = strcmp(HotswapAgent, "fatjar") == 0;
|
||||||
|
+ bool ha_core = strcmp(HotswapAgent, "core") == 0;
|
||||||
|
+
|
||||||
|
+ // Set HotswapAgent
|
||||||
|
+ if (ha_fatjar || ha_core) {
|
||||||
|
+
|
||||||
|
+ char ext_path_str[JVM_MAXPATHLEN];
|
||||||
|
+
|
||||||
|
+ os::jvm_path(ext_path_str, sizeof(ext_path_str));
|
||||||
|
+ for (int i = 0; i < 3; i++) {
|
||||||
|
+ char *end = strrchr(ext_path_str, *os::file_separator());
|
||||||
|
+ if (end != NULL) *end = '\0';
|
||||||
|
+ }
|
||||||
|
+ size_t ext_path_length = strlen(ext_path_str);
|
||||||
|
+ if (ext_path_length >= 3) {
|
||||||
|
+ if (strcmp(ext_path_str + ext_path_length - 3, "lib") != 0) {
|
||||||
|
+ if (ext_path_length < JVM_MAXPATHLEN - 4) {
|
||||||
|
+ jio_snprintf(ext_path_str + ext_path_length, sizeof(ext_path_str) - ext_path_length, "%slib", os::file_separator());
|
||||||
|
+ ext_path_length += 4;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ if (ext_path_length < JVM_MAXPATHLEN - 10) {
|
||||||
|
+ if (ha_fatjar) {
|
||||||
|
+ jio_snprintf(ext_path_str + ext_path_length, sizeof(ext_path_str) - ext_path_length,
|
||||||
|
+ "%shotswap%shotswap-agent.jar", os::file_separator(), os::file_separator());
|
||||||
|
+ } else {
|
||||||
|
+ jio_snprintf(ext_path_str + ext_path_length, sizeof(ext_path_str) - ext_path_length,
|
||||||
|
+ "%shotswap%shotswap-agent-core.jar", os::file_separator(), os::file_separator());
|
||||||
|
+ }
|
||||||
|
+ int fd = ::open(ext_path_str, O_RDONLY);
|
||||||
|
+ if (fd >= 0) {
|
||||||
|
+ os::close(fd);
|
||||||
|
+ size_t length = strlen(ext_path_str) + 1;
|
||||||
|
+ char *options = NEW_C_HEAP_ARRAY(char, length, mtArguments);
|
||||||
|
+ jio_snprintf(options, length, "%s", ext_path_str);
|
||||||
|
+ add_init_agent("instrument", ext_path_str, false);
|
||||||
|
+ jio_fprintf(defaultStream::output_stream(), "Starting HotswapAgent '%s'\n", ext_path_str);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ jio_fprintf(defaultStream::error_stream(), "HotswapAgent not found on path:'%s'!\n", ext_path_str);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // TODO: open it only for org.hotswap.agent module
|
||||||
|
+ // Use to access java.lang.reflect.Proxy/proxyCache
|
||||||
|
+ create_numbered_module_property("jdk.module.addopens", "java.base/java.lang=ALL-UNNAMED", addopens_count++);
|
||||||
|
+ // Class of field java.lang.reflect.Proxy/proxyCache
|
||||||
|
+ create_numbered_module_property("jdk.module.addopens", "java.base/jdk.internal.loader=ALL-UNNAMED", addopens_count++);
|
||||||
|
+ // Use to access java.io.Reader, java.io.InputStream, java.io.FileInputStream
|
||||||
|
+ create_numbered_module_property("jdk.module.addopens", "java.base/java.io=ALL-UNNAMED", addopens_count++);
|
||||||
|
+ // java.beans.Introspector access
|
||||||
|
+ create_numbered_module_property("jdk.module.addopens", "java.desktop/java.beans=ALL-UNNAMED", addopens_count++);
|
||||||
|
+ // java.beans.Introspector access
|
||||||
|
+ create_numbered_module_property("jdk.module.addopens", "java.desktop/com.sun.beans=ALL-UNNAMED", addopens_count++);
|
||||||
|
+ // com.sun.beans.introspect.ClassInfo access
|
||||||
|
+ create_numbered_module_property("jdk.module.addopens", "java.desktop/com.sun.beans.introspect=ALL-UNNAMED", addopens_count++);
|
||||||
|
+ // com.sun.beans.introspect.util.Cache access
|
||||||
|
+ create_numbered_module_property("jdk.module.addopens", "java.desktop/com.sun.beans.util=ALL-UNNAMED", addopens_count++);
|
||||||
|
+
|
||||||
|
+}
|
||||||
|
diff --git a/src/hotspot/share/runtime/arguments.hpp b/src/hotspot/share/runtime/arguments.hpp
|
||||||
|
index b8eb4d0ab24..a14e11b48ef 100644
|
||||||
|
--- a/src/hotspot/share/runtime/arguments.hpp
|
||||||
|
+++ b/src/hotspot/share/runtime/arguments.hpp
|
||||||
|
@@ -496,6 +496,10 @@ class Arguments : AllStatic {
|
||||||
|
|
||||||
|
static size_t conservative_max_heap_alignment() { return _conservative_max_heap_alignment; }
|
||||||
|
|
||||||
|
+
|
||||||
|
+ // Initialize HotswapAgent
|
||||||
|
+ static void setup_hotswap_agent();
|
||||||
|
+
|
||||||
|
// Return the maximum size a heap with compressed oops can take
|
||||||
|
static size_t max_heap_for_compressed_oops();
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.cpp b/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.cpp
|
||||||
|
index 5b09758e089..e55b68e63a6 100644
|
||||||
|
--- a/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.cpp
|
||||||
|
+++ b/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.cpp
|
||||||
|
@@ -158,6 +158,15 @@ JVMFlag::Error NUMAInterleaveGranularityConstraintFunc(size_t value, bool verbos
|
||||||
|
" ... " UINTX_FORMAT " ]\n", value, min, max);
|
||||||
|
return JVMFlag::VIOLATES_CONSTRAINT;
|
||||||
|
}
|
||||||
|
+ return JVMFlag::SUCCESS;
|
||||||
|
+}
|
||||||
|
|
||||||
|
+JVMFlag::Error HotswapAgentConstraintFunc(ccstr value, bool verbose) {
|
||||||
|
+ if (value != NULL) {
|
||||||
|
+ if (strcmp("disabled", value) != 0 && strcmp("fatjar", value) != 0 && strcmp("core", value) != 0 && strcmp("external", value) != 0) {
|
||||||
|
+ JVMFlag::printError(verbose, "HotswapAgent(%s) must be one of disabled,fatjar,core or external.\n", value);
|
||||||
|
+ return JVMFlag::VIOLATES_CONSTRAINT;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
return JVMFlag::SUCCESS;
|
||||||
|
}
|
||||||
|
diff --git a/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.hpp b/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.hpp
|
||||||
|
index 8bc3a9a1548..c5f58fd16ee 100644
|
||||||
|
--- a/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.hpp
|
||||||
|
+++ b/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.hpp
|
||||||
|
@@ -42,7 +42,8 @@
|
||||||
|
f(intx, BiasedLockingDecayTimeFunc) \
|
||||||
|
f(intx, PerfDataSamplingIntervalFunc) \
|
||||||
|
f(uintx, VMPageSizeConstraintFunc) \
|
||||||
|
- f(size_t, NUMAInterleaveGranularityConstraintFunc)
|
||||||
|
+ f(size_t, NUMAInterleaveGranularityConstraintFunc) \
|
||||||
|
+ f(ccstr, HotswapAgentConstraintFunc)
|
||||||
|
|
||||||
|
RUNTIME_CONSTRAINTS(DECLARE_CONSTRAINT)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp
|
||||||
|
index fb6d1667156..20838a878ce 100644
|
||||||
|
--- a/src/hotspot/share/runtime/globals.hpp
|
||||||
|
+++ b/src/hotspot/share/runtime/globals.hpp
|
||||||
|
@@ -2090,7 +2090,16 @@ const intx ObjectAlignmentInBytes = 8;
|
||||||
|
\
|
||||||
|
product(bool, AllowEnhancedClassRedefinition, false, \
|
||||||
|
"Allow enhanced class redefinition beyond swapping method " \
|
||||||
|
- "bodies")
|
||||||
|
+ "bodies") \
|
||||||
|
+ \
|
||||||
|
+ product(ccstr, HotswapAgent, "disabled", \
|
||||||
|
+ "Specify HotswapAgent image to be used." \
|
||||||
|
+ "disabled: hotswap agent is disabled (default)" \
|
||||||
|
+ "fatjar: full HA. Use integrated hotswap-agent.jar" \
|
||||||
|
+ "core: core HA. Use integrated hotswap-agent-core.jar" \
|
||||||
|
+ "external: external HA. use external HA, open required JDK " \
|
||||||
|
+ "modules.") \
|
||||||
|
+ constraint(HotswapAgentConstraintFunc, AfterErgo)
|
||||||
|
|
||||||
|
|
||||||
|
// end of RUNTIME_FLAGS
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,347 @@
|
|||||||
|
From 854df9651b358f3a8d89cd8a7d60fed26ca3d1d5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sun, 7 Mar 2021 20:22:54 +0100
|
||||||
|
Subject: [PATCH 28/45] Support for redefinition of Well Known classses
|
||||||
|
(java.*,jdk.*, sun.*)
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/ci/ciKlass.hpp | 1 +
|
||||||
|
src/hotspot/share/ci/ciObjectFactory.cpp | 34 ++++++++++
|
||||||
|
src/hotspot/share/ci/ciObjectFactory.hpp | 6 ++
|
||||||
|
src/hotspot/share/classfile/vmClasses.cpp | 10 +++
|
||||||
|
src/hotspot/share/classfile/vmClasses.hpp | 4 ++
|
||||||
|
src/hotspot/share/classfile/vmSymbols.hpp | 2 +
|
||||||
|
src/hotspot/share/compiler/compileBroker.cpp | 11 ++++
|
||||||
|
src/hotspot/share/memory/universe.cpp | 8 +++
|
||||||
|
src/hotspot/share/memory/universe.hpp | 2 +
|
||||||
|
.../prims/jvmtiEnhancedRedefineClasses.cpp | 63 ++++++++++++++++++-
|
||||||
|
.../prims/jvmtiEnhancedRedefineClasses.hpp | 2 +
|
||||||
|
11 files changed, 142 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/ci/ciKlass.hpp b/src/hotspot/share/ci/ciKlass.hpp
|
||||||
|
index 467284b7cde..644993a7513 100644
|
||||||
|
--- a/src/hotspot/share/ci/ciKlass.hpp
|
||||||
|
+++ b/src/hotspot/share/ci/ciKlass.hpp
|
||||||
|
@@ -129,6 +129,7 @@ public:
|
||||||
|
void print_name_on(outputStream* st);
|
||||||
|
|
||||||
|
const char* external_name() const;
|
||||||
|
+ Klass* new_version() { return get_Klass()->new_version(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SHARE_CI_CIKLASS_HPP
|
||||||
|
diff --git a/src/hotspot/share/ci/ciObjectFactory.cpp b/src/hotspot/share/ci/ciObjectFactory.cpp
|
||||||
|
index 664062a0f74..e9cb49be3ff 100644
|
||||||
|
--- a/src/hotspot/share/ci/ciObjectFactory.cpp
|
||||||
|
+++ b/src/hotspot/share/ci/ciObjectFactory.cpp
|
||||||
|
@@ -74,7 +74,10 @@ GrowableArray<ciMetadata*>* ciObjectFactory::_shared_ci_metadata = NULL;
|
||||||
|
ciSymbol* ciObjectFactory::_shared_ci_symbols[vmSymbols::number_of_symbols()];
|
||||||
|
int ciObjectFactory::_shared_ident_limit = 0;
|
||||||
|
volatile bool ciObjectFactory::_initialized = false;
|
||||||
|
+volatile bool ciObjectFactory::_reinitialize_vm_klasses = false;
|
||||||
|
|
||||||
|
+// TODO: review...
|
||||||
|
+Arena* ciObjectFactory::_initial_arena = NULL;
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// ciObjectFactory::ciObjectFactory
|
||||||
|
@@ -110,6 +113,7 @@ void ciObjectFactory::initialize() {
|
||||||
|
// compiler thread that initializes the initial ciObjectFactory which
|
||||||
|
// creates the shared ciObjects that all later ciObjectFactories use.
|
||||||
|
Arena* arena = new (mtCompiler) Arena(mtCompiler);
|
||||||
|
+ ciObjectFactory::_initial_arena = arena;
|
||||||
|
ciEnv initial(arena);
|
||||||
|
ciEnv* env = ciEnv::current();
|
||||||
|
env->_factory->init_shared_objects();
|
||||||
|
@@ -118,6 +122,36 @@ void ciObjectFactory::initialize() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
+// (DCEVM) vm classes could be modified
|
||||||
|
+void ciObjectFactory::reinitialize_vm_classes() {
|
||||||
|
+ ASSERT_IN_VM;
|
||||||
|
+ JavaThread* thread = JavaThread::current();
|
||||||
|
+ HandleMark handle_mark(thread);
|
||||||
|
+
|
||||||
|
+ // This Arena is long lived and exists in the resource mark of the
|
||||||
|
+ // compiler thread that initializes the initial ciObjectFactory which
|
||||||
|
+ // creates the shared ciObjects that all later ciObjectFactories use.
|
||||||
|
+ // Arena* arena = new (mtCompiler) Arena(mtCompiler);
|
||||||
|
+ ciEnv initial(ciObjectFactory::_initial_arena);
|
||||||
|
+ ciEnv* env = ciEnv::current();
|
||||||
|
+ env->_factory->do_reinitialize_vm_classes();
|
||||||
|
+ _reinitialize_vm_klasses = false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+// (DCEVM) vm classes could be modified
|
||||||
|
+void ciObjectFactory::do_reinitialize_vm_classes() {
|
||||||
|
+#define VM_CLASS_DEFN(name, ignore_s) \
|
||||||
|
+ if (ciEnv::_##name != NULL && ciEnv::_##name->new_version() != NULL) { \
|
||||||
|
+ int old_ident = ciEnv::_##name->ident(); \
|
||||||
|
+ ciEnv::_##name = get_metadata(vmClasses::name())->as_instance_klass(); \
|
||||||
|
+ ciEnv::_##name->compute_nonstatic_fields(); \
|
||||||
|
+ ciEnv::_##name->set_ident(old_ident); \
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ VM_CLASSES_DO(VM_CLASS_DEFN)
|
||||||
|
+#undef VM_CLASS_DEFN
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void ciObjectFactory::init_shared_objects() {
|
||||||
|
|
||||||
|
_next_ident = 1; // start numbering CI objects at 1
|
||||||
|
diff --git a/src/hotspot/share/ci/ciObjectFactory.hpp b/src/hotspot/share/ci/ciObjectFactory.hpp
|
||||||
|
index fdefc8e3b92..1ed8732cb40 100644
|
||||||
|
--- a/src/hotspot/share/ci/ciObjectFactory.hpp
|
||||||
|
+++ b/src/hotspot/share/ci/ciObjectFactory.hpp
|
||||||
|
@@ -42,9 +42,11 @@ class ciObjectFactory : public ResourceObj {
|
||||||
|
|
||||||
|
private:
|
||||||
|
static volatile bool _initialized;
|
||||||
|
+ static volatile bool _reinitialize_vm_klasses;
|
||||||
|
static GrowableArray<ciMetadata*>* _shared_ci_metadata;
|
||||||
|
static ciSymbol* _shared_ci_symbols[];
|
||||||
|
static int _shared_ident_limit;
|
||||||
|
+ static Arena* _initial_arena;
|
||||||
|
|
||||||
|
Arena* _arena;
|
||||||
|
GrowableArray<ciMetadata*> _ci_metadata;
|
||||||
|
@@ -90,10 +92,14 @@ private:
|
||||||
|
ciInstance* get_unloaded_instance(ciInstanceKlass* klass);
|
||||||
|
|
||||||
|
static int compare_cimetadata(ciMetadata** a, ciMetadata** b);
|
||||||
|
+ void do_reinitialize_vm_classes();
|
||||||
|
public:
|
||||||
|
static bool is_initialized() { return _initialized; }
|
||||||
|
+ static bool is_reinitialize_vm_klasses() { return _reinitialize_vm_klasses; }
|
||||||
|
+ static void set_reinitialize_vm_klasses() { _reinitialize_vm_klasses = true; }
|
||||||
|
|
||||||
|
static void initialize();
|
||||||
|
+ static void reinitialize_vm_classes();
|
||||||
|
void init_shared_objects();
|
||||||
|
void remove_symbols();
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/vmClasses.cpp b/src/hotspot/share/classfile/vmClasses.cpp
|
||||||
|
index 2bd1ca65cc0..3ec13d952d8 100644
|
||||||
|
--- a/src/hotspot/share/classfile/vmClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/vmClasses.cpp
|
||||||
|
@@ -259,3 +259,13 @@ BasicType vmClasses::box_klass_type(Klass* k) {
|
||||||
|
}
|
||||||
|
return T_OBJECT;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+bool vmClasses::update_vm_klass(InstanceKlass* old_klass, InstanceKlass* new_klass) {
|
||||||
|
+ for (int id = static_cast<int>(vmClassID::FIRST); id < static_cast<int>(vmClassID::LIMIT); id++) {
|
||||||
|
+ if (_klasses[id] == old_klass) {
|
||||||
|
+ _klasses[id] = new_klass;
|
||||||
|
+ return true;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
diff --git a/src/hotspot/share/classfile/vmClasses.hpp b/src/hotspot/share/classfile/vmClasses.hpp
|
||||||
|
index 364014a2514..b637ff0ae3d 100644
|
||||||
|
--- a/src/hotspot/share/classfile/vmClasses.hpp
|
||||||
|
+++ b/src/hotspot/share/classfile/vmClasses.hpp
|
||||||
|
@@ -110,6 +110,10 @@ public:
|
||||||
|
static bool Cloneable_klass_loaded() { return is_loaded(VM_CLASS_AT(Cloneable_klass)); }
|
||||||
|
static bool Parameter_klass_loaded() { return is_loaded(VM_CLASS_AT(reflect_Parameter_klass)); }
|
||||||
|
static bool ClassLoader_klass_loaded() { return is_loaded(VM_CLASS_AT(ClassLoader_klass)); }
|
||||||
|
+
|
||||||
|
+ // (DCEVM) vmClasses could be modified
|
||||||
|
+ static bool update_vm_klass(InstanceKlass* new_klass, InstanceKlass* old_klass);
|
||||||
|
+
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SHARE_CLASSFILE_VMCLASSES_HPP
|
||||||
|
diff --git a/src/hotspot/share/classfile/vmSymbols.hpp b/src/hotspot/share/classfile/vmSymbols.hpp
|
||||||
|
index dad94005f5c..82fd593224a 100644
|
||||||
|
--- a/src/hotspot/share/classfile/vmSymbols.hpp
|
||||||
|
+++ b/src/hotspot/share/classfile/vmSymbols.hpp
|
||||||
|
@@ -380,6 +380,8 @@
|
||||||
|
template(exit_method_name, "exit") \
|
||||||
|
template(add_method_name, "add") \
|
||||||
|
template(remove_method_name, "remove") \
|
||||||
|
+ template(registerNatives_method_name, "registerNatives") \
|
||||||
|
+ template(initIDs_method_name, "initIDs") \
|
||||||
|
template(parent_name, "parent") \
|
||||||
|
template(threads_name, "threads") \
|
||||||
|
template(groups_name, "groups") \
|
||||||
|
diff --git a/src/hotspot/share/compiler/compileBroker.cpp b/src/hotspot/share/compiler/compileBroker.cpp
|
||||||
|
index cc1dff089e8..aaf8e4b1f1e 100644
|
||||||
|
--- a/src/hotspot/share/compiler/compileBroker.cpp
|
||||||
|
+++ b/src/hotspot/share/compiler/compileBroker.cpp
|
||||||
|
@@ -1982,6 +1982,17 @@ void CompileBroker::compiler_thread_loop() {
|
||||||
|
if (method()->number_of_breakpoints() == 0) {
|
||||||
|
// Compile the method.
|
||||||
|
if ((UseCompiler || AlwaysCompileLoopMethods) && CompileBroker::should_compile_new_jobs()) {
|
||||||
|
+
|
||||||
|
+ // TODO: review usage of CompileThread_lock (DCEVM)
|
||||||
|
+ if (ciObjectFactory::is_reinitialize_vm_klasses())
|
||||||
|
+ {
|
||||||
|
+ ASSERT_IN_VM;
|
||||||
|
+ MutexLocker only_one(CompileThread_lock);
|
||||||
|
+ if (ciObjectFactory::is_reinitialize_vm_klasses()) {
|
||||||
|
+ ciObjectFactory::reinitialize_vm_classes();
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
invoke_compiler_on_method(task);
|
||||||
|
thread->start_idle_timer();
|
||||||
|
} else {
|
||||||
|
diff --git a/src/hotspot/share/memory/universe.cpp b/src/hotspot/share/memory/universe.cpp
|
||||||
|
index 4ae3b382b67..92da9bbe5f9 100644
|
||||||
|
--- a/src/hotspot/share/memory/universe.cpp
|
||||||
|
+++ b/src/hotspot/share/memory/universe.cpp
|
||||||
|
@@ -924,6 +924,14 @@ void Universe::initialize_known_methods(TRAPS) {
|
||||||
|
vmSymbols::doStackWalk_signature(), false, CHECK);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void Universe::reinitialize_loader_addClass_method(TRAPS) {
|
||||||
|
+ // Set up method for registering loaded classes in class loader vector
|
||||||
|
+ initialize_known_method(_loader_addClass_cache,
|
||||||
|
+ vmClasses::ClassLoader_klass(),
|
||||||
|
+ "addClass",
|
||||||
|
+ vmSymbols::class_void_signature(), false, CHECK);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void universe2_init() {
|
||||||
|
EXCEPTION_MARK;
|
||||||
|
Universe::genesis(CATCH);
|
||||||
|
diff --git a/src/hotspot/share/memory/universe.hpp b/src/hotspot/share/memory/universe.hpp
|
||||||
|
index 4b2211c415e..4d4c444220e 100644
|
||||||
|
--- a/src/hotspot/share/memory/universe.hpp
|
||||||
|
+++ b/src/hotspot/share/memory/universe.hpp
|
||||||
|
@@ -268,6 +268,8 @@ class Universe: AllStatic {
|
||||||
|
// Function to initialize these
|
||||||
|
static void initialize_known_methods(TRAPS);
|
||||||
|
|
||||||
|
+ static void reinitialize_loader_addClass_method(TRAPS);
|
||||||
|
+
|
||||||
|
static void create_preallocated_out_of_memory_errors(TRAPS);
|
||||||
|
|
||||||
|
// Reference pending list manipulation. Access is protected by
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index b88c071be13..fb9da134e97 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -55,6 +55,7 @@
|
||||||
|
#include "prims/resolvedMethodTable.hpp"
|
||||||
|
#include "prims/methodHandles.hpp"
|
||||||
|
#include "runtime/deoptimization.hpp"
|
||||||
|
+#include "runtime/javaCalls.hpp"
|
||||||
|
#include "runtime/jniHandles.inline.hpp"
|
||||||
|
#include "runtime/relocator.hpp"
|
||||||
|
#include "runtime/fieldDescriptor.hpp"
|
||||||
|
@@ -66,6 +67,7 @@
|
||||||
|
#include "gc/g1/g1CollectedHeap.hpp"
|
||||||
|
#include "gc/shared/dcevmSharedGC.hpp"
|
||||||
|
#include "gc/shared/scavengableNMethods.hpp"
|
||||||
|
+#include "gc/shared/oopStorageSet.inline.hpp"
|
||||||
|
#include "ci/ciObjectFactory.hpp"
|
||||||
|
|
||||||
|
Array<Method*>* VM_EnhancedRedefineClasses::_old_methods = NULL;
|
||||||
|
@@ -521,6 +523,16 @@ void VM_EnhancedRedefineClasses::doit() {
|
||||||
|
redefine_single_class(_new_classes->at(i), thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Update possible redefinition of vm classes (like ClassLoader)
|
||||||
|
+ for (int i = 0; i < _new_classes->length(); i++) {
|
||||||
|
+ InstanceKlass* cur = _new_classes->at(i);
|
||||||
|
+ if (cur->old_version() != NULL && vmClasses::update_vm_klass(InstanceKlass::cast(cur->old_version()), cur))
|
||||||
|
+ {
|
||||||
|
+ log_trace(redefine, class, obsolete, metadata)("Well known class updated %s", cur->external_name());
|
||||||
|
+ ciObjectFactory::set_reinitialize_vm_klasses();
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
// Deoptimize all compiled code that depends on this class (do only once, because it clears whole cache)
|
||||||
|
// if (_max_redefinition_flags > Klass::ModifyClass) {
|
||||||
|
flush_dependent_code(thread);
|
||||||
|
@@ -688,12 +700,56 @@ void VM_EnhancedRedefineClasses::doit() {
|
||||||
|
_timer_vm_op_doit.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
+void VM_EnhancedRedefineClasses::reinitializeJDKClasses() {
|
||||||
|
+ if (!_new_classes->is_empty()) {
|
||||||
|
+ ResourceMark rm(Thread::current());
|
||||||
|
+
|
||||||
|
+ for (int i = 0; i < _new_classes->length(); i++) {
|
||||||
|
+ InstanceKlass* cur = _new_classes->at(i);
|
||||||
|
+
|
||||||
|
+ if (cur->name()->starts_with("java/") || cur->name()->starts_with("jdk/") || cur->name()->starts_with("sun/")) {
|
||||||
|
+
|
||||||
|
+ if (cur == vmClasses::ClassLoader_klass()) {
|
||||||
|
+ // ClassLoader.addClass method is cached in Universe, we must redefine
|
||||||
|
+ Universe::reinitialize_loader_addClass_method(Thread::current());
|
||||||
|
+ log_trace(redefine, class, obsolete, metadata)("Reinitialize ClassLoade addClass method cache.");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // naive assumptions that only JDK classes has native static "registerNative" and "initIDs" methods
|
||||||
|
+ int end;
|
||||||
|
+ Symbol* signature = vmSymbols::registerNatives_method_name();
|
||||||
|
+ int midx = cur->find_method_by_name(signature, &end);
|
||||||
|
+ if (midx == -1) {
|
||||||
|
+ signature = vmSymbols::initIDs_method_name();
|
||||||
|
+ midx = cur->find_method_by_name(signature, &end);
|
||||||
|
+ }
|
||||||
|
+ Method* m = NULL;
|
||||||
|
+ if (midx != -1) {
|
||||||
|
+ m = cur->methods()->at(midx);
|
||||||
|
+ }
|
||||||
|
+ if (m != NULL && m->is_static() && m->is_native()) {
|
||||||
|
+ // call static registerNative if present
|
||||||
|
+ JavaValue result(T_VOID);
|
||||||
|
+ JavaCalls::call_static(&result,
|
||||||
|
+ cur,
|
||||||
|
+ signature,
|
||||||
|
+ vmSymbols::void_method_signature(),
|
||||||
|
+ Thread::current());
|
||||||
|
+ log_trace(redefine, class, obsolete, metadata)("Reregister natives of JDK class %s", cur->external_name());
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
// Cleanup - runs in JVM thread
|
||||||
|
// - free used memory
|
||||||
|
// - end GC
|
||||||
|
void VM_EnhancedRedefineClasses::doit_epilogue() {
|
||||||
|
VM_GC_Operation::doit_epilogue();
|
||||||
|
|
||||||
|
+ reinitializeJDKClasses();
|
||||||
|
+
|
||||||
|
if (_new_classes != NULL) {
|
||||||
|
delete _new_classes;
|
||||||
|
}
|
||||||
|
@@ -1623,7 +1679,12 @@ void VM_EnhancedRedefineClasses::check_methods_and_mark_as_obsolete() {
|
||||||
|
|
||||||
|
// obsolete methods need a unique idnum so they become new entries in
|
||||||
|
// the jmethodID cache in InstanceKlass
|
||||||
|
- assert(old_method->method_idnum() == new_method->method_idnum(), "must match");
|
||||||
|
+ if (old_method->method_idnum() != new_method->method_idnum()) {
|
||||||
|
+ log_error(redefine, class, normalize)
|
||||||
|
+ ("Method not matched: %d != %d old: %s = new: %s", old_method->method_idnum(), new_method->method_idnum(),
|
||||||
|
+ old_method->name_and_sig_as_C_string(), new_method->name_and_sig_as_C_string());
|
||||||
|
+ // assert(old_method->method_idnum() == new_method->method_idnum(), "must match");
|
||||||
|
+ }
|
||||||
|
// u2 num = InstanceKlass::cast(_the_class_oop)->next_method_idnum();
|
||||||
|
// if (num != ConstMethod::UNSET_IDNUM) {
|
||||||
|
// old_method->set_method_idnum(num);
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
index ae0a15281f3..d0d2f78aa62 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
@@ -150,6 +150,8 @@ class VM_EnhancedRedefineClasses: public VM_GC_Operation {
|
||||||
|
|
||||||
|
u8 next_id();
|
||||||
|
|
||||||
|
+ void reinitializeJDKClasses();
|
||||||
|
+
|
||||||
|
static void check_class(InstanceKlass* k_oop, TRAPS);
|
||||||
|
|
||||||
|
static void dump_methods();
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,260 @@
|
|||||||
|
From 01f4cb9929cad1512d02e20cc7538a29ff0d3ef1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sat, 15 May 2021 10:31:28 +0200
|
||||||
|
Subject: [PATCH 29/45] Fix fastdebug compilation issues - cast_to_oop
|
||||||
|
|
||||||
|
---
|
||||||
|
.../share/gc/g1/g1FullGCCompactTask.cpp | 12 +++++-----
|
||||||
|
.../share/gc/g1/g1FullGCCompactionPoint.cpp | 10 ++++-----
|
||||||
|
.../share/gc/g1/g1FullGCPrepareTask.cpp | 4 ++--
|
||||||
|
src/hotspot/share/gc/shared/dcevmSharedGC.cpp | 6 ++---
|
||||||
|
src/hotspot/share/gc/shared/space.cpp | 22 +++++++++----------
|
||||||
|
src/hotspot/share/gc/shared/space.inline.hpp | 14 ++++++------
|
||||||
|
.../prims/jvmtiEnhancedRedefineClasses.cpp | 2 +-
|
||||||
|
7 files changed, 35 insertions(+), 35 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp b/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp
|
||||||
|
index 058dea90828..765630a9826 100644
|
||||||
|
--- a/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp
|
||||||
|
+++ b/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp
|
||||||
|
@@ -183,18 +183,18 @@ size_t G1FullGCCompactTask::G1CompactRegionClosureDcevm::apply(oop obj) {
|
||||||
|
Klass* new_version = obj->klass()->new_version();
|
||||||
|
if (new_version->update_information() == NULL) {
|
||||||
|
Copy::aligned_conjoint_words(obj_addr, destination, size);
|
||||||
|
- oop(destination)->set_klass(new_version);
|
||||||
|
+ cast_to_oop(destination)->set_klass(new_version);
|
||||||
|
} else {
|
||||||
|
- DcevmSharedGC::update_fields(obj, oop(destination));
|
||||||
|
+ DcevmSharedGC::update_fields(obj, cast_to_oop(destination));
|
||||||
|
}
|
||||||
|
- oop(destination)->init_mark();
|
||||||
|
- assert(oop(destination)->klass() != NULL, "should have a class");
|
||||||
|
+ cast_to_oop(destination)->init_mark();
|
||||||
|
+ assert(cast_to_oop(destination)->klass() != NULL, "should have a class");
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
Copy::aligned_conjoint_words(obj_addr, destination, size);
|
||||||
|
- oop(destination)->init_mark();
|
||||||
|
- assert(oop(destination)->klass() != NULL, "should have a class");
|
||||||
|
+ cast_to_oop(destination)->init_mark();
|
||||||
|
+ assert(cast_to_oop(destination)->klass() != NULL, "should have a class");
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
diff --git a/src/hotspot/share/gc/g1/g1FullGCCompactionPoint.cpp b/src/hotspot/share/gc/g1/g1FullGCCompactionPoint.cpp
|
||||||
|
index 87b1977128a..028c182e68f 100644
|
||||||
|
--- a/src/hotspot/share/gc/g1/g1FullGCCompactionPoint.cpp
|
||||||
|
+++ b/src/hotspot/share/gc/g1/g1FullGCCompactionPoint.cpp
|
||||||
|
@@ -171,7 +171,7 @@ void G1FullGCCompactionPoint::forward_dcevm(oop object, size_t size, bool force_
|
||||||
|
|
||||||
|
// Store a forwarding pointer if the object should be moved.
|
||||||
|
if (cast_from_oop<HeapWord*>(object) != _compaction_top || force_forward) {
|
||||||
|
- object->forward_to(oop(_compaction_top));
|
||||||
|
+ object->forward_to(cast_to_oop(_compaction_top));
|
||||||
|
} else {
|
||||||
|
if (object->forwardee() != NULL) {
|
||||||
|
// Object should not move but mark-word is used so it looks like the
|
||||||
|
@@ -208,17 +208,17 @@ void G1FullGCCompactionPoint::forward_rescued() {
|
||||||
|
for (;i<rescued_oops()->length(); i++) {
|
||||||
|
HeapWord* q = rescued_oops()->at(i);
|
||||||
|
|
||||||
|
- size_t size = oop(q)->size();
|
||||||
|
+ size_t size = cast_to_oop(q)->size();
|
||||||
|
|
||||||
|
// (DCEVM) There is a new version of the class of q => different size
|
||||||
|
- if (oop(q)->klass()->new_version() != NULL) {
|
||||||
|
+ if (cast_to_oop(q)->klass()->new_version() != NULL) {
|
||||||
|
// assert(size != new_size, "instances without changed size have to be updated prior to GC run");
|
||||||
|
- size = oop(q)->size_given_klass(oop(q)->klass()->new_version());
|
||||||
|
+ size = cast_to_oop(q)->size_given_klass(cast_to_oop(q)->klass()->new_version());
|
||||||
|
}
|
||||||
|
if (forward_compact_top(size) == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
- forward_dcevm(oop(q), size, true);
|
||||||
|
+ forward_dcevm(cast_to_oop(q), size, true);
|
||||||
|
}
|
||||||
|
_last_rescued_oop = i;
|
||||||
|
}
|
||||||
|
diff --git a/src/hotspot/share/gc/g1/g1FullGCPrepareTask.cpp b/src/hotspot/share/gc/g1/g1FullGCPrepareTask.cpp
|
||||||
|
index 05f0444cc7a..93c066383a1 100644
|
||||||
|
--- a/src/hotspot/share/gc/g1/g1FullGCPrepareTask.cpp
|
||||||
|
+++ b/src/hotspot/share/gc/g1/g1FullGCPrepareTask.cpp
|
||||||
|
@@ -297,7 +297,7 @@ size_t G1FullGCPrepareTask::G1PrepareCompactLiveClosureDcevm::apply(oop object)
|
||||||
|
|
||||||
|
HeapWord* compact_top = _cp->forward_compact_top(forward_size);
|
||||||
|
|
||||||
|
- if (compact_top == NULL || must_rescue(object, oop(compact_top))) {
|
||||||
|
+ if (compact_top == NULL || must_rescue(object, cast_to_oop(compact_top))) {
|
||||||
|
_cp->rescued_oops()->append(cast_from_oop<HeapWord*>(object));
|
||||||
|
} else {
|
||||||
|
_cp->forward_dcevm(object, forward_size, (size != forward_size));
|
||||||
|
@@ -308,7 +308,7 @@ size_t G1FullGCPrepareTask::G1PrepareCompactLiveClosureDcevm::apply(oop object)
|
||||||
|
|
||||||
|
bool G1FullGCPrepareTask::G1PrepareCompactLiveClosureDcevm::must_rescue(oop old_obj, oop new_obj) {
|
||||||
|
// Only redefined objects can have the need to be rescued.
|
||||||
|
- if (oop(old_obj)->klass()->new_version() == NULL) {
|
||||||
|
+ if (old_obj->klass()->new_version() == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/gc/shared/dcevmSharedGC.cpp b/src/hotspot/share/gc/shared/dcevmSharedGC.cpp
|
||||||
|
index edc19a3077d..de3d518b696 100644
|
||||||
|
--- a/src/hotspot/share/gc/shared/dcevmSharedGC.cpp
|
||||||
|
+++ b/src/hotspot/share/gc/shared/dcevmSharedGC.cpp
|
||||||
|
@@ -46,7 +46,7 @@ void DcevmSharedGC::copy_rescued_objects_back(GrowableArray<HeapWord*>* rescued_
|
||||||
|
if (rescued_oops != NULL) {
|
||||||
|
for (int i=from; i < to; i++) {
|
||||||
|
HeapWord* rescued_ptr = rescued_oops->at(i);
|
||||||
|
- oop rescued_obj = (oop) rescued_ptr;
|
||||||
|
+ oop rescued_obj = cast_to_oop(rescued_ptr);
|
||||||
|
|
||||||
|
int size = rescued_obj->size();
|
||||||
|
oop new_obj = rescued_obj->forwardee();
|
||||||
|
@@ -75,7 +75,7 @@ void DcevmSharedGC::clear_rescued_objects_resource(GrowableArray<HeapWord*>* res
|
||||||
|
if (rescued_oops != NULL) {
|
||||||
|
for (int i=0; i < rescued_oops->length(); i++) {
|
||||||
|
HeapWord* rescued_ptr = rescued_oops->at(i);
|
||||||
|
- int size = ((oop) rescued_ptr)->size();
|
||||||
|
+ int size = cast_to_oop(rescued_ptr)->size();
|
||||||
|
FREE_RESOURCE_ARRAY(HeapWord, rescued_ptr, size);
|
||||||
|
}
|
||||||
|
rescued_oops->clear();
|
||||||
|
@@ -114,7 +114,7 @@ void DcevmSharedGC::update_fields(oop q, oop new_location) {
|
||||||
|
if ((cast_from_oop<HeapWord*>(q) >= cast_from_oop<HeapWord*>(new_location) && cast_from_oop<HeapWord*>(q) < cast_from_oop<HeapWord*>(new_location) + new_size) ||
|
||||||
|
(cast_from_oop<HeapWord*>(new_location) >= cast_from_oop<HeapWord*>(q) && cast_from_oop<HeapWord*>(new_location) < cast_from_oop<HeapWord*>(q) + size)) {
|
||||||
|
tmp = NEW_RESOURCE_ARRAY(HeapWord, size);
|
||||||
|
- q = (oop) tmp;
|
||||||
|
+ q = cast_to_oop(tmp);
|
||||||
|
Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(tmp_obj), cast_from_oop<HeapWord*>(q), size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/src/hotspot/share/gc/shared/space.cpp b/src/hotspot/share/gc/shared/space.cpp
|
||||||
|
index 29a81348d2d..000760744f7 100644
|
||||||
|
--- a/src/hotspot/share/gc/shared/space.cpp
|
||||||
|
+++ b/src/hotspot/share/gc/shared/space.cpp
|
||||||
|
@@ -475,7 +475,7 @@ bool CompactibleSpace::must_rescue(oop old_obj, oop new_obj) {
|
||||||
|
|
||||||
|
int new_size = old_obj->size_given_klass(oop(old_obj)->klass()->new_version());
|
||||||
|
int original_size = old_obj->size();
|
||||||
|
-
|
||||||
|
+
|
||||||
|
Generation* tenured_gen = GenCollectedHeap::heap()->old_gen();
|
||||||
|
bool old_in_tenured = tenured_gen->is_in_reserved(old_obj);
|
||||||
|
bool new_in_tenured = tenured_gen->is_in_reserved(new_obj);
|
||||||
|
@@ -513,9 +513,9 @@ bool CompactibleSpace::must_rescue(oop old_obj, oop new_obj) {
|
||||||
|
}
|
||||||
|
|
||||||
|
HeapWord* CompactibleSpace::rescue(HeapWord* old_obj) {
|
||||||
|
- assert(must_rescue(oop(old_obj), oop(old_obj)->forwardee()), "do not call otherwise");
|
||||||
|
+ assert(must_rescue(cast_to_oop(old_obj), cast_to_oop(old_obj)->forwardee()), "do not call otherwise");
|
||||||
|
|
||||||
|
- int size = oop(old_obj)->size();
|
||||||
|
+ int size = cast_to_oop(old_obj)->size();
|
||||||
|
HeapWord* rescued_obj = NEW_RESOURCE_ARRAY(HeapWord, size);
|
||||||
|
Copy::aligned_disjoint_words(old_obj, rescued_obj, size);
|
||||||
|
|
||||||
|
@@ -803,16 +803,16 @@ HeapWord* CompactibleSpace::forward_with_rescue(HeapWord* q, size_t size,
|
||||||
|
size_t forward_size = size;
|
||||||
|
|
||||||
|
// (DCEVM) There is a new version of the class of q => different size
|
||||||
|
- if (oop(q)->klass()->new_version() != NULL) {
|
||||||
|
+ if (cast_to_oop(q)->klass()->new_version() != NULL) {
|
||||||
|
|
||||||
|
- size_t new_size = oop(q)->size_given_klass(oop(q)->klass()->new_version());
|
||||||
|
+ size_t new_size = cast_to_oop(q)->size_given_klass(cast_to_oop(q)->klass()->new_version());
|
||||||
|
// assert(size != new_size, "instances without changed size have to be updated prior to GC run");
|
||||||
|
forward_size = new_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
compact_top = forward_compact_top(forward_size, cp, compact_top);
|
||||||
|
|
||||||
|
- if (must_rescue(oop(q), oop(compact_top))) {
|
||||||
|
+ if (must_rescue(cast_to_oop(q), cast_to_oop(compact_top))) {
|
||||||
|
if (MarkSweep::_rescued_oops == NULL) {
|
||||||
|
MarkSweep::_rescued_oops = new GrowableArray<HeapWord*>(128);
|
||||||
|
}
|
||||||
|
@@ -820,7 +820,7 @@ HeapWord* CompactibleSpace::forward_with_rescue(HeapWord* q, size_t size,
|
||||||
|
return compact_top;
|
||||||
|
}
|
||||||
|
|
||||||
|
- return forward(oop(q), forward_size, cp, compact_top, force_forward);
|
||||||
|
+ return forward(cast_to_oop(q), forward_size, cp, compact_top, force_forward);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute the forwarding addresses for the objects that need to be rescued.
|
||||||
|
@@ -830,17 +830,17 @@ HeapWord* CompactibleSpace::forward_rescued(CompactPoint* cp, HeapWord* compact_
|
||||||
|
for (int i=0; i<MarkSweep::_rescued_oops->length(); i++) {
|
||||||
|
HeapWord* q = MarkSweep::_rescued_oops->at(i);
|
||||||
|
|
||||||
|
- /* size_t size = oop(q)->size(); changing this for cms for perm gen */
|
||||||
|
+ /* size_t size = cast_to_oop(q)->size(); changing this for cms for perm gen */
|
||||||
|
size_t size = block_size(q);
|
||||||
|
|
||||||
|
// (DCEVM) There is a new version of the class of q => different size
|
||||||
|
- if (oop(q)->klass()->new_version() != NULL) {
|
||||||
|
- size_t new_size = oop(q)->size_given_klass(oop(q)->klass()->new_version());
|
||||||
|
+ if (cast_to_oop(q)->klass()->new_version() != NULL) {
|
||||||
|
+ size_t new_size = cast_to_oop(q)->size_given_klass(cast_to_oop(q)->klass()->new_version());
|
||||||
|
// assert(size != new_size, "instances without changed size have to be updated prior to GC run");
|
||||||
|
size = new_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
- compact_top = cp->space->forward(oop(q), size, cp, compact_top, true);
|
||||||
|
+ compact_top = cp->space->forward(cast_to_oop(q), size, cp, compact_top, true);
|
||||||
|
assert(compact_top <= end(), "must not write over end of space!");
|
||||||
|
}
|
||||||
|
MarkSweep::_rescued_oops->clear();
|
||||||
|
diff --git a/src/hotspot/share/gc/shared/space.inline.hpp b/src/hotspot/share/gc/shared/space.inline.hpp
|
||||||
|
index cafa2503ef4..076ce6b0cce 100644
|
||||||
|
--- a/src/hotspot/share/gc/shared/space.inline.hpp
|
||||||
|
+++ b/src/hotspot/share/gc/shared/space.inline.hpp
|
||||||
|
@@ -351,7 +351,7 @@ inline void CompactibleSpace::scan_and_compact(SpaceType* space, bool redefiniti
|
||||||
|
size_t size = space->obj_size(cur_obj);
|
||||||
|
HeapWord* compaction_top = cast_from_oop<HeapWord*>(cast_to_oop(cur_obj)->forwardee());
|
||||||
|
|
||||||
|
- if (redefinition_run && space->must_rescue(oop(cur_obj), oop(cur_obj)->forwardee())) {
|
||||||
|
+ if (redefinition_run && space->must_rescue(cast_to_oop(cur_obj), cast_to_oop(cur_obj)->forwardee())) {
|
||||||
|
space->rescue(cur_obj);
|
||||||
|
debug_only(Copy::fill_to_words(cur_obj, size, 0));
|
||||||
|
cur_obj += size;
|
||||||
|
@@ -363,16 +363,16 @@ inline void CompactibleSpace::scan_and_compact(SpaceType* space, bool redefiniti
|
||||||
|
|
||||||
|
// copy object and reinit its mark
|
||||||
|
assert(redefinition_run || cur_obj != compaction_top, "everything in this pass should be moving");
|
||||||
|
- if (redefinition_run && oop(cur_obj)->klass()->new_version() != NULL) {
|
||||||
|
- Klass* new_version = oop(cur_obj)->klass()->new_version();
|
||||||
|
+ if (redefinition_run && cast_to_oop(cur_obj)->klass()->new_version() != NULL) {
|
||||||
|
+ Klass* new_version = cast_to_oop(cur_obj)->klass()->new_version();
|
||||||
|
if (new_version->update_information() == NULL) {
|
||||||
|
Copy::aligned_conjoint_words(cur_obj, compaction_top, size);
|
||||||
|
- oop(compaction_top)->set_klass(new_version);
|
||||||
|
+ cast_to_oop(compaction_top)->set_klass(new_version);
|
||||||
|
} else {
|
||||||
|
- DcevmSharedGC::update_fields(oop(cur_obj), oop(compaction_top));
|
||||||
|
+ DcevmSharedGC::update_fields(cast_to_oop(cur_obj), cast_to_oop(compaction_top));
|
||||||
|
}
|
||||||
|
- oop(compaction_top)->init_mark();
|
||||||
|
- assert(oop(compaction_top)->klass() != NULL, "should have a class");
|
||||||
|
+ cast_to_oop(compaction_top)->init_mark();
|
||||||
|
+ assert(cast_to_oop(compaction_top)->klass() != NULL, "should have a class");
|
||||||
|
|
||||||
|
debug_only(prev_obj = cur_obj);
|
||||||
|
cur_obj += size;
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index fb9da134e97..890382e2029 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -439,7 +439,7 @@ public:
|
||||||
|
int size = o->size();
|
||||||
|
if (_tmp_obj_size < size) {
|
||||||
|
_tmp_obj_size = size;
|
||||||
|
- _tmp_obj = (oop)resource_allocate_bytes(size * HeapWordSize);
|
||||||
|
+ _tmp_obj = cast_to_oop(resource_allocate_bytes(size * HeapWordSize));
|
||||||
|
}
|
||||||
|
Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(o), cast_from_oop<HeapWord*>(_tmp_obj), size);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
From cac2eac1986ae05e264b2213d0d2658e2f57f07f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||||
|
Date: Fri, 19 Mar 2021 19:13:38 +0100
|
||||||
|
Subject: [PATCH 30/45] JBR-3458: Skip dynamic proxy classes based on
|
||||||
|
com.sun.proxy
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index 890382e2029..90dfc1ae545 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -707,7 +707,8 @@ void VM_EnhancedRedefineClasses::reinitializeJDKClasses() {
|
||||||
|
for (int i = 0; i < _new_classes->length(); i++) {
|
||||||
|
InstanceKlass* cur = _new_classes->at(i);
|
||||||
|
|
||||||
|
- if (cur->name()->starts_with("java/") || cur->name()->starts_with("jdk/") || cur->name()->starts_with("sun/")) {
|
||||||
|
+ if ((cur->name()->starts_with("java/") || cur->name()->starts_with("jdk/") || cur->name()->starts_with("sun/"))
|
||||||
|
+ && cur->name()->index_of_at(0, "$$") == -1) { // skip dynamic proxies
|
||||||
|
|
||||||
|
if (cur == vmClasses::ClassLoader_klass()) {
|
||||||
|
// ClassLoader.addClass method is cached in Universe, we must redefine
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
From 4c87af809d20a12553f155110592a9f230ec0ea5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||||
|
Date: Sat, 20 Mar 2021 20:51:08 +0100
|
||||||
|
Subject: [PATCH 31/45] JBR-3459: Fix race condition in
|
||||||
|
ClassLoaderDataGraph::classes_do
|
||||||
|
|
||||||
|
InstanceKlass in ClassLoaderData can be uninitialized when
|
||||||
|
ClassLoaderDataGraph::classes_do is called. Using
|
||||||
|
ClassLoaderDataGraph::dictionary_classes_do is safe but problem is still
|
||||||
|
persisting with anonymous classes.
|
||||||
|
---
|
||||||
|
.../share/classfile/classLoaderDataGraph.cpp | 10 ++++++++++
|
||||||
|
.../share/classfile/classLoaderDataGraph.hpp | 4 ++++
|
||||||
|
.../share/prims/jvmtiEnhancedRedefineClasses.cpp | 14 ++++++++++++--
|
||||||
|
3 files changed, 26 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.cpp b/src/hotspot/share/classfile/classLoaderDataGraph.cpp
|
||||||
|
index 67ade5709f6..aa2a6bcec6b 100644
|
||||||
|
--- a/src/hotspot/share/classfile/classLoaderDataGraph.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/classLoaderDataGraph.cpp
|
||||||
|
@@ -361,6 +361,16 @@ void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+void ClassLoaderDataGraph::anonymous_or_hidden_classes_do(KlassClosure* klass_closure) {
|
||||||
|
+ Thread* thread = Thread::current();
|
||||||
|
+ for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
|
||||||
|
+ if (cld->has_class_mirror_holder()) {
|
||||||
|
+ Handle holder(thread, cld->holder_phantom());
|
||||||
|
+ cld->classes_do(klass_closure);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void ClassLoaderDataGraph::classes_do(void f(Klass* const)) {
|
||||||
|
ClassLoaderDataGraphIterator iter;
|
||||||
|
while (ClassLoaderData* cld = iter.get_next()) {
|
||||||
|
diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.hpp b/src/hotspot/share/classfile/classLoaderDataGraph.hpp
|
||||||
|
index ebdb0bc2c8c..da712eaf55f 100644
|
||||||
|
--- a/src/hotspot/share/classfile/classLoaderDataGraph.hpp
|
||||||
|
+++ b/src/hotspot/share/classfile/classLoaderDataGraph.hpp
|
||||||
|
@@ -78,6 +78,10 @@ class ClassLoaderDataGraph : public AllStatic {
|
||||||
|
// for redefinition. These classes are removed during the next class unloading.
|
||||||
|
// Walking the ClassLoaderDataGraph also includes hidden classes.
|
||||||
|
static void classes_do(KlassClosure* klass_closure);
|
||||||
|
+
|
||||||
|
+ // Enhanced class redefinition
|
||||||
|
+ static void anonymous_or_hidden_classes_do(KlassClosure* klass_closure);
|
||||||
|
+
|
||||||
|
static void classes_do(void f(Klass* const));
|
||||||
|
static void methods_do(void f(Method*));
|
||||||
|
static void modules_do(void f(ModuleEntry*));
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index 90dfc1ae545..10407755457 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -2164,9 +2164,19 @@ jvmtiError VM_EnhancedRedefineClasses::find_sorted_affected_classes(TRAPS) {
|
||||||
|
|
||||||
|
{
|
||||||
|
MutexLocker mcld(ClassLoaderDataGraph_lock);
|
||||||
|
- ClassLoaderDataGraph::classes_do(&closure);
|
||||||
|
+
|
||||||
|
+ // 0. we can't use ClassLoaderDataGraph::classes_do since classes can be uninitialized in cld,
|
||||||
|
+ // fully initialized class is in system dictionary
|
||||||
|
+ // ClassLoaderDataGraph::classes_do(&closure);
|
||||||
|
+
|
||||||
|
+ // 1. Scan over dictionaries
|
||||||
|
+ ClassLoaderDataGraph::dictionary_classes_do(&closure);
|
||||||
|
+
|
||||||
|
+ // 2. Anonymous or hidden class is not in dictionary, we have to iterate anonymous cld directly, but there is race cond...
|
||||||
|
+ // TODO: review ... anonymous class is added to cld before InstanceKlass initialization,
|
||||||
|
+ // find out how to check if the InstanceKlass is initialized
|
||||||
|
+ ClassLoaderDataGraph::anonymous_or_hidden_classes_do(&closure);
|
||||||
|
}
|
||||||
|
- //ClassLoaderDataGraph::dictionary_classes_do(&closure);
|
||||||
|
|
||||||
|
log_trace(redefine, class, load)("%d classes affected", _affected_klasses->length());
|
||||||
|
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
From c4941350aa7d3c5df3a20652f640fe446ff00c5c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sat, 15 May 2021 13:01:25 +0200
|
||||||
|
Subject: [PATCH 32/45] Fix compilation problems
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/oops/instanceKlass.cpp | 2 +-
|
||||||
|
src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
index bcb0da6301f..c5f37d42a9a 100644
|
||||||
|
--- a/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
+++ b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
@@ -978,7 +978,7 @@ bool InstanceKlass::link_class_impl(TRAPS) {
|
||||||
|
set_init_state(linked);
|
||||||
|
}
|
||||||
|
// (DCEVM) Must check for old version in order to prevent infinite loops.
|
||||||
|
- if (JvmtiExport::should_post_class_prepare() && (!AllowEnhancedClassRedefinition || old_version() == NULL /* JVMTI deadlock otherwise */) {
|
||||||
|
+ if (JvmtiExport::should_post_class_prepare() && (!AllowEnhancedClassRedefinition || old_version() == NULL /* JVMTI deadlock otherwise */)) {
|
||||||
|
JvmtiExport::post_class_prepare(THREAD, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index 10407755457..e87d4452d31 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -708,7 +708,7 @@ void VM_EnhancedRedefineClasses::reinitializeJDKClasses() {
|
||||||
|
InstanceKlass* cur = _new_classes->at(i);
|
||||||
|
|
||||||
|
if ((cur->name()->starts_with("java/") || cur->name()->starts_with("jdk/") || cur->name()->starts_with("sun/"))
|
||||||
|
- && cur->name()->index_of_at(0, "$$") == -1) { // skip dynamic proxies
|
||||||
|
+ && cur->name()->index_of_at(0, "$$", (int) strlen("$$")) == -1) { // skip dynamic proxies
|
||||||
|
|
||||||
|
if (cur == vmClasses::ClassLoader_klass()) {
|
||||||
|
// ClassLoader.addClass method is cached in Universe, we must redefine
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,350 @@
|
|||||||
|
From dad40d31ec8a1633189e70eff57ae5fd21544b20 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sun, 20 Jun 2021 19:11:16 +0200
|
||||||
|
Subject: [PATCH 33/45] Fix dcevm issues related to refactorization of Thread
|
||||||
|
to JavaThread
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/cds/lambdaFormInvokers.cpp | 1 +
|
||||||
|
.../prims/jvmtiEnhancedRedefineClasses.cpp | 72 +++++++++----------
|
||||||
|
.../prims/jvmtiEnhancedRedefineClasses.hpp | 12 ++--
|
||||||
|
3 files changed, 39 insertions(+), 46 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/cds/lambdaFormInvokers.cpp b/src/hotspot/share/cds/lambdaFormInvokers.cpp
|
||||||
|
index 5c058dc43ac..9de28f740ac 100644
|
||||||
|
--- a/src/hotspot/share/cds/lambdaFormInvokers.cpp
|
||||||
|
+++ b/src/hotspot/share/cds/lambdaFormInvokers.cpp
|
||||||
|
@@ -178,6 +178,7 @@ void LambdaFormInvokers::reload_class(char* name, ClassFileStream& st, TRAPS) {
|
||||||
|
class_name,
|
||||||
|
cld,
|
||||||
|
cl_info,
|
||||||
|
+ false, // pick_newest
|
||||||
|
CHECK);
|
||||||
|
|
||||||
|
{
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index e87d4452d31..0aeeea4e7a4 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -23,7 +23,6 @@
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "precompiled.hpp"
|
||||||
|
-#include "aot/aotLoader.hpp"
|
||||||
|
#include "classfile/classFileParser.hpp"
|
||||||
|
#include "classfile/classFileStream.hpp"
|
||||||
|
#include "classfile/classLoadInfo.hpp"
|
||||||
|
@@ -38,7 +37,7 @@
|
||||||
|
#include "interpreter/rewriter.hpp"
|
||||||
|
#include "logging/logStream.hpp"
|
||||||
|
#include "memory/metadataFactory.hpp"
|
||||||
|
-#include "memory/metaspaceShared.hpp"
|
||||||
|
+#include "cds/metaspaceShared.hpp"
|
||||||
|
#include "memory/resourceArea.hpp"
|
||||||
|
#include "memory/iterator.inline.hpp"
|
||||||
|
#include "oops/fieldStreams.hpp"
|
||||||
|
@@ -156,7 +155,7 @@ bool VM_EnhancedRedefineClasses::doit_prologue() {
|
||||||
|
|
||||||
|
// We first load new class versions in the prologue, because somewhere down the
|
||||||
|
// call chain it is required that the current thread is a Java thread.
|
||||||
|
- _res = load_new_class_versions(Thread::current());
|
||||||
|
+ _res = load_new_class_versions(JavaThread::current());
|
||||||
|
|
||||||
|
// prepare GC, lock heap
|
||||||
|
if (_res == JVMTI_ERROR_NONE && !VM_GC_Operation::doit_prologue()) {
|
||||||
|
@@ -250,7 +249,6 @@ void VM_EnhancedRedefineClasses::root_oops_do(OopClosure *oopClosure) {
|
||||||
|
Universe::vm_global()->oops_do(oopClosure);
|
||||||
|
|
||||||
|
Threads::oops_do(oopClosure, NULL);
|
||||||
|
- AOT_ONLY(AOTLoader::oops_do(oopClosure);)
|
||||||
|
OopStorageSet::strong_oops_do(oopClosure);
|
||||||
|
|
||||||
|
CodeBlobToOopClosure blobClosure(oopClosure, CodeBlobToOopClosure::FixRelocations);
|
||||||
|
@@ -520,7 +518,7 @@ void VM_EnhancedRedefineClasses::doit() {
|
||||||
|
// before the stack walk again.
|
||||||
|
|
||||||
|
for (int i = 0; i < _new_classes->length(); i++) {
|
||||||
|
- redefine_single_class(_new_classes->at(i), thread);
|
||||||
|
+ redefine_single_class(thread, _new_classes->at(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update possible redefinition of vm classes (like ClassLoader)
|
||||||
|
@@ -535,7 +533,7 @@ void VM_EnhancedRedefineClasses::doit() {
|
||||||
|
|
||||||
|
// Deoptimize all compiled code that depends on this class (do only once, because it clears whole cache)
|
||||||
|
// if (_max_redefinition_flags > Klass::ModifyClass) {
|
||||||
|
- flush_dependent_code(thread);
|
||||||
|
+ flush_dependent_code();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Adjust constantpool caches for all classes that reference methods of the evolved class.
|
||||||
|
@@ -692,7 +690,7 @@ void VM_EnhancedRedefineClasses::doit() {
|
||||||
|
assert(new_version->super() == NULL || new_version->super()->new_version() == NULL, "Super class must be newest version");
|
||||||
|
}
|
||||||
|
log_trace(redefine, class, obsolete, metadata)("calling check_class");
|
||||||
|
- ClassLoaderData::the_null_class_loader_data()->dictionary()->classes_do(check_class, thread);
|
||||||
|
+ ClassLoaderData::the_null_class_loader_data()->dictionary()->classes_do(check_class);
|
||||||
|
#ifdef PRODUCT
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@@ -702,7 +700,7 @@ void VM_EnhancedRedefineClasses::doit() {
|
||||||
|
|
||||||
|
void VM_EnhancedRedefineClasses::reinitializeJDKClasses() {
|
||||||
|
if (!_new_classes->is_empty()) {
|
||||||
|
- ResourceMark rm(Thread::current());
|
||||||
|
+ ResourceMark rm(JavaThread::current());
|
||||||
|
|
||||||
|
for (int i = 0; i < _new_classes->length(); i++) {
|
||||||
|
InstanceKlass* cur = _new_classes->at(i);
|
||||||
|
@@ -712,7 +710,7 @@ void VM_EnhancedRedefineClasses::reinitializeJDKClasses() {
|
||||||
|
|
||||||
|
if (cur == vmClasses::ClassLoader_klass()) {
|
||||||
|
// ClassLoader.addClass method is cached in Universe, we must redefine
|
||||||
|
- Universe::reinitialize_loader_addClass_method(Thread::current());
|
||||||
|
+ Universe::reinitialize_loader_addClass_method(JavaThread::current());
|
||||||
|
log_trace(redefine, class, obsolete, metadata)("Reinitialize ClassLoade addClass method cache.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -735,7 +733,7 @@ void VM_EnhancedRedefineClasses::reinitializeJDKClasses() {
|
||||||
|
cur,
|
||||||
|
signature,
|
||||||
|
vmSymbols::void_method_signature(),
|
||||||
|
- Thread::current());
|
||||||
|
+ JavaThread::current());
|
||||||
|
log_trace(redefine, class, obsolete, metadata)("Reregister natives of JDK class %s", cur->external_name());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -793,7 +791,7 @@ bool VM_EnhancedRedefineClasses::is_modifiable_class(oop klass_mirror) {
|
||||||
|
|
||||||
|
// Cannot redefine or retransform an anonymous class.
|
||||||
|
// TODO: check if is correct in j15
|
||||||
|
- if (InstanceKlass::cast(k)->is_unsafe_anonymous() || InstanceKlass::cast(k)->is_hidden()) {
|
||||||
|
+ if (InstanceKlass::cast(k)->is_hidden()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
@@ -879,23 +877,15 @@ jvmtiError VM_EnhancedRedefineClasses::load_new_class_versions(TRAPS) {
|
||||||
|
|
||||||
|
InstanceKlass* k;
|
||||||
|
|
||||||
|
- if (the_class->is_unsafe_anonymous() || the_class->is_hidden()) {
|
||||||
|
+ if (the_class->is_hidden()) {
|
||||||
|
InstanceKlass* dynamic_host_class = NULL;
|
||||||
|
- InstanceKlass* unsafe_anonymous_host = NULL;
|
||||||
|
|
||||||
|
if (the_class->is_hidden()) {
|
||||||
|
log_debug(redefine, class, load)("loading hidden class %s", the_class->name()->as_C_string());
|
||||||
|
dynamic_host_class = the_class->nest_host(THREAD);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (the_class->is_unsafe_anonymous()) {
|
||||||
|
- log_debug(redefine, class, load)("loading usafe anonymous %s", the_class->name()->as_C_string());
|
||||||
|
- unsafe_anonymous_host = the_class->unsafe_anonymous_host();
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
ClassLoadInfo cl_info(protection_domain,
|
||||||
|
- unsafe_anonymous_host,
|
||||||
|
- NULL, // cp_patches
|
||||||
|
dynamic_host_class, // dynamic_nest_host
|
||||||
|
Handle(), // classData
|
||||||
|
the_class->is_hidden(), // is_hidden
|
||||||
|
@@ -1143,7 +1133,7 @@ int VM_EnhancedRedefineClasses::calculate_redefinition_flags(InstanceKlass* new_
|
||||||
|
Array<Method*>* k_new_methods(new_class->methods());
|
||||||
|
int n_old_methods = k_old_methods->length();
|
||||||
|
int n_new_methods = k_new_methods->length();
|
||||||
|
- Thread* thread = Thread::current();
|
||||||
|
+ JavaThread* thread = JavaThread::current();
|
||||||
|
|
||||||
|
int ni = 0;
|
||||||
|
int oi = 0;
|
||||||
|
@@ -1491,8 +1481,8 @@ void VM_EnhancedRedefineClasses::rollback() {
|
||||||
|
// Rewrite faster byte-codes back to their slower equivalent. Undoes rewriting happening in templateTable_xxx.cpp
|
||||||
|
// The reason is that once we zero cpool caches, we need to re-resolve all entries again. Faster bytecodes do not
|
||||||
|
// do that, they assume that cache entry is resolved already.
|
||||||
|
-void VM_EnhancedRedefineClasses::unpatch_bytecode(Method* method, TRAPS) {
|
||||||
|
- RawBytecodeStream bcs(methodHandle(THREAD, method));
|
||||||
|
+void VM_EnhancedRedefineClasses::unpatch_bytecode(Method* method) {
|
||||||
|
+ RawBytecodeStream bcs(methodHandle(Thread::current(), method));
|
||||||
|
Bytecodes::Code code;
|
||||||
|
Bytecodes::Code java_code;
|
||||||
|
while (!bcs.is_last_bytecode()) {
|
||||||
|
@@ -1535,10 +1525,10 @@ void VM_EnhancedRedefineClasses::unpatch_bytecode(Method* method, TRAPS) {
|
||||||
|
assert(code2 == Bytecodes::_fast_igetfield ||
|
||||||
|
code2 == Bytecodes::_fast_agetfield ||
|
||||||
|
code2 == Bytecodes::_fast_fgetfield, "");
|
||||||
|
- *(bcp + 1) = Bytecodes::java_code(code2);
|
||||||
|
- }
|
||||||
|
+ *(bcp + 1) = Bytecodes::java_code(code2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+}
|
||||||
|
|
||||||
|
// Unevolving classes may point to old methods directly
|
||||||
|
// from their constant pool caches, itables, and/or vtables. We
|
||||||
|
@@ -1559,9 +1549,11 @@ void VM_EnhancedRedefineClasses::ClearCpoolCacheAndUnpatch::do_klass(Klass* k) {
|
||||||
|
constantPoolHandle other_cp = constantPoolHandle(_thread, ik->constants());
|
||||||
|
|
||||||
|
// Update host klass of anonymous classes (for example, produced by lambdas) to newest version.
|
||||||
|
+ /*
|
||||||
|
if (ik->is_unsafe_anonymous() && ik->unsafe_anonymous_host()->new_version() != NULL) {
|
||||||
|
ik->set_unsafe_anonymous_host(InstanceKlass::cast(ik->unsafe_anonymous_host()->newest_version()));
|
||||||
|
}
|
||||||
|
+ */
|
||||||
|
|
||||||
|
// FIXME: check new nest_host for hidden
|
||||||
|
|
||||||
|
@@ -1596,7 +1588,7 @@ void VM_EnhancedRedefineClasses::ClearCpoolCacheAndUnpatch::do_klass(Klass* k) {
|
||||||
|
|
||||||
|
// If bytecode rewriting is enabled, we also need to unpatch bytecode to force resolution of zeroed entries
|
||||||
|
if (RewriteBytecodes) {
|
||||||
|
- ik->methods_do(unpatch_bytecode, _thread);
|
||||||
|
+ ik->methods_do(unpatch_bytecode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1628,7 +1620,7 @@ void VM_EnhancedRedefineClasses::MethodDataCleaner::do_klass(Klass* k) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-void VM_EnhancedRedefineClasses::update_jmethod_ids(TRAPS) {
|
||||||
|
+void VM_EnhancedRedefineClasses::update_jmethod_ids(Thread* current) {
|
||||||
|
for (int j = 0; j < _matching_methods_length; ++j) {
|
||||||
|
Method* old_method = _matching_old_methods[j];
|
||||||
|
jmethodID jmid = old_method->find_jmethod_id_or_null();
|
||||||
|
@@ -1639,10 +1631,10 @@ void VM_EnhancedRedefineClasses::update_jmethod_ids(TRAPS) {
|
||||||
|
|
||||||
|
if (jmid != NULL) {
|
||||||
|
// There is a jmethodID, change it to point to the new method
|
||||||
|
- methodHandle new_method_h(THREAD, _matching_new_methods[j]);
|
||||||
|
+ methodHandle new_method_h(current, _matching_new_methods[j]);
|
||||||
|
|
||||||
|
if (old_method->new_version() == NULL) {
|
||||||
|
- methodHandle old_method_h(THREAD, _matching_old_methods[j]);
|
||||||
|
+ methodHandle old_method_h(current, _matching_old_methods[j]);
|
||||||
|
jmethodID new_jmethod_id = Method::make_jmethod_id(old_method_h->method_holder()->class_loader_data(), old_method_h());
|
||||||
|
bool result = InstanceKlass::cast(old_method_h->method_holder())->update_jmethod_id(old_method_h(), new_jmethod_id);
|
||||||
|
} else {
|
||||||
|
@@ -1864,7 +1856,7 @@ void VM_EnhancedRedefineClasses::mark_dependent_code(InstanceKlass* ik) {
|
||||||
|
// subsequent calls to RedefineClasses need only throw away code
|
||||||
|
// that depends on the class.
|
||||||
|
//
|
||||||
|
-void VM_EnhancedRedefineClasses::flush_dependent_code(TRAPS) {
|
||||||
|
+void VM_EnhancedRedefineClasses::flush_dependent_code() {
|
||||||
|
assert_locked_or_safepoint(Compile_lock);
|
||||||
|
|
||||||
|
// All dependencies have been recorded from startup or this is a second or
|
||||||
|
@@ -1959,9 +1951,9 @@ void VM_EnhancedRedefineClasses::compute_added_deleted_matching_methods() {
|
||||||
|
// a helper method to be specified. The interesting parameters
|
||||||
|
// that we would like to pass to the helper method are saved in
|
||||||
|
// static global fields in the VM operation.
|
||||||
|
-void VM_EnhancedRedefineClasses::redefine_single_class(InstanceKlass* new_class_oop, TRAPS) {
|
||||||
|
+void VM_EnhancedRedefineClasses::redefine_single_class(Thread* current, InstanceKlass* new_class_oop) {
|
||||||
|
|
||||||
|
- HandleMark hm(THREAD); // make sure handles from this call are freed
|
||||||
|
+ HandleMark hm(current); // make sure handles from this call are freed
|
||||||
|
|
||||||
|
InstanceKlass* new_class = new_class_oop;
|
||||||
|
InstanceKlass* the_class = InstanceKlass::cast(new_class_oop->old_version());
|
||||||
|
@@ -1980,7 +1972,7 @@ void VM_EnhancedRedefineClasses::redefine_single_class(InstanceKlass* new_class_
|
||||||
|
|
||||||
|
// track number of methods that are EMCP for add_previous_version() call below
|
||||||
|
check_methods_and_mark_as_obsolete();
|
||||||
|
- update_jmethod_ids(THREAD);
|
||||||
|
+ update_jmethod_ids(current);
|
||||||
|
|
||||||
|
_any_class_has_resolved_methods = the_class->has_resolved_methods() || _any_class_has_resolved_methods;
|
||||||
|
|
||||||
|
@@ -2002,14 +1994,14 @@ void VM_EnhancedRedefineClasses::redefine_single_class(InstanceKlass* new_class_
|
||||||
|
*/
|
||||||
|
|
||||||
|
{
|
||||||
|
- ResourceMark rm(THREAD);
|
||||||
|
+ ResourceMark rm(current);
|
||||||
|
// increment the classRedefinedCount field in the_class and in any
|
||||||
|
// direct and indirect subclasses of the_class
|
||||||
|
- increment_class_counter(new_class, THREAD);
|
||||||
|
+ increment_class_counter(current, new_class);
|
||||||
|
log_info(redefine, class, load)
|
||||||
|
("redefined name=%s, count=%d (avail_mem=" UINT64_FORMAT "K)",
|
||||||
|
new_class->external_name(), java_lang_Class::classRedefinedCount(new_class->java_mirror()), os::available_memory() >> 10);
|
||||||
|
- Events::log_redefinition(THREAD, "redefined class name=%s, count=%d",
|
||||||
|
+ Events::log_redefinition(current, "redefined class name=%s, count=%d",
|
||||||
|
new_class->external_name(),
|
||||||
|
java_lang_Class::classRedefinedCount(new_class->java_mirror()));
|
||||||
|
}
|
||||||
|
@@ -2018,21 +2010,21 @@ void VM_EnhancedRedefineClasses::redefine_single_class(InstanceKlass* new_class_
|
||||||
|
|
||||||
|
// Increment the classRedefinedCount field in the specific InstanceKlass
|
||||||
|
// and in all direct and indirect subclasses.
|
||||||
|
-void VM_EnhancedRedefineClasses::increment_class_counter(InstanceKlass *ik, TRAPS) {
|
||||||
|
+void VM_EnhancedRedefineClasses::increment_class_counter(Thread* current, InstanceKlass *ik) {
|
||||||
|
oop class_mirror = ik->old_version()->java_mirror();
|
||||||
|
Klass* class_oop = java_lang_Class::as_Klass(class_mirror);
|
||||||
|
int new_count = java_lang_Class::classRedefinedCount(class_mirror) + 1;
|
||||||
|
java_lang_Class::set_classRedefinedCount(ik->java_mirror(), new_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
-void VM_EnhancedRedefineClasses::check_class(InstanceKlass* ik, TRAPS) {
|
||||||
|
+void VM_EnhancedRedefineClasses::check_class(InstanceKlass* ik) {
|
||||||
|
if (ik->is_instance_klass() && ik->old_version() != NULL) {
|
||||||
|
- HandleMark hm(THREAD);
|
||||||
|
+ HandleMark hm(Thread::current());
|
||||||
|
|
||||||
|
assert(ik->new_version() == NULL, "must be latest version in system dictionary");
|
||||||
|
|
||||||
|
if (ik->vtable_length() > 0) {
|
||||||
|
- ResourceMark rm(THREAD);
|
||||||
|
+ ResourceMark rm(Thread::current());
|
||||||
|
assert(ik->vtable().check_no_old_or_obsolete_entries(), "old method found");
|
||||||
|
ik->vtable().verify(tty, true);
|
||||||
|
}
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
index d0d2f78aa62..252287a3697 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||||
|
@@ -122,7 +122,7 @@ class VM_EnhancedRedefineClasses: public VM_GC_Operation {
|
||||||
|
static void mark_as_scavengable(nmethod* nm);
|
||||||
|
static void unregister_nmethod_g1(nmethod* nm);
|
||||||
|
static void register_nmethod_g1(nmethod* nm);
|
||||||
|
- static void unpatch_bytecode(Method* method, TRAPS);
|
||||||
|
+ static void unpatch_bytecode(Method* method);
|
||||||
|
|
||||||
|
void root_oops_do(OopClosure *oopClosure);
|
||||||
|
|
||||||
|
@@ -131,28 +131,28 @@ class VM_EnhancedRedefineClasses: public VM_GC_Operation {
|
||||||
|
void compute_added_deleted_matching_methods();
|
||||||
|
|
||||||
|
// Change jmethodIDs to point to the new methods
|
||||||
|
- void update_jmethod_ids(TRAPS);
|
||||||
|
+ void update_jmethod_ids(Thread* current);
|
||||||
|
|
||||||
|
// marking methods as old and/or obsolete
|
||||||
|
void check_methods_and_mark_as_obsolete();
|
||||||
|
void transfer_old_native_function_registrations(InstanceKlass* the_class);
|
||||||
|
|
||||||
|
// Install the redefinition of a class
|
||||||
|
- void redefine_single_class(InstanceKlass* new_class_oop, TRAPS);
|
||||||
|
+ void redefine_single_class(Thread* current, InstanceKlass* new_class_oop);
|
||||||
|
|
||||||
|
// Increment the classRedefinedCount field in the specific InstanceKlass
|
||||||
|
// and in all direct and indirect subclasses.
|
||||||
|
- void increment_class_counter(InstanceKlass *ik, TRAPS);
|
||||||
|
+ void increment_class_counter(Thread* current, InstanceKlass *ik);
|
||||||
|
|
||||||
|
void mark_dependent_code(InstanceKlass* ik);
|
||||||
|
|
||||||
|
- void flush_dependent_code(TRAPS);
|
||||||
|
+ void flush_dependent_code();
|
||||||
|
|
||||||
|
u8 next_id();
|
||||||
|
|
||||||
|
void reinitializeJDKClasses();
|
||||||
|
|
||||||
|
- static void check_class(InstanceKlass* k_oop, TRAPS);
|
||||||
|
+ static void check_class(InstanceKlass* k_oop);
|
||||||
|
|
||||||
|
static void dump_methods();
|
||||||
|
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
From 7fcef1a84c37c568c0afafb8cb22303efda68f0d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sun, 20 Jun 2021 19:42:51 +0200
|
||||||
|
Subject: [PATCH 34/45] Fix init_method_MemberName after Thread to JavaThread
|
||||||
|
refactorization
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/interpreter/linkResolver.cpp | 14 ++++++++++----
|
||||||
|
src/hotspot/share/interpreter/linkResolver.hpp | 3 ++-
|
||||||
|
src/hotspot/share/oops/instanceKlass.cpp | 15 ---------------
|
||||||
|
src/hotspot/share/oops/instanceKlass.hpp | 1 -
|
||||||
|
.../share/prims/jvmtiEnhancedRedefineClasses.cpp | 11 +++++++++--
|
||||||
|
5 files changed, 21 insertions(+), 23 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/interpreter/linkResolver.cpp b/src/hotspot/share/interpreter/linkResolver.cpp
|
||||||
|
index 74a6af13ea4..78c9624a18b 100644
|
||||||
|
--- a/src/hotspot/share/interpreter/linkResolver.cpp
|
||||||
|
+++ b/src/hotspot/share/interpreter/linkResolver.cpp
|
||||||
|
@@ -131,14 +131,14 @@ void CallInfo::set_common(Klass* resolved_klass,
|
||||||
|
}
|
||||||
|
|
||||||
|
// utility query for unreflecting a method
|
||||||
|
-CallInfo::CallInfo(Method* resolved_method, Klass* resolved_klass, TRAPS) {
|
||||||
|
+CallInfo::CallInfo(Method* resolved_method, Klass* resolved_klass, Thread* thread) {
|
||||||
|
Klass* resolved_method_holder = resolved_method->method_holder();
|
||||||
|
if (resolved_klass == NULL) { // 2nd argument defaults to holder of 1st
|
||||||
|
resolved_klass = resolved_method_holder;
|
||||||
|
}
|
||||||
|
_resolved_klass = resolved_klass;
|
||||||
|
- _resolved_method = methodHandle(THREAD, resolved_method);
|
||||||
|
- _selected_method = methodHandle(THREAD, resolved_method);
|
||||||
|
+ _resolved_method = methodHandle(thread, resolved_method);
|
||||||
|
+ _selected_method = methodHandle(thread, resolved_method);
|
||||||
|
// classify:
|
||||||
|
CallKind kind = CallInfo::unknown_kind;
|
||||||
|
int index = resolved_method->vtable_index();
|
||||||
|
@@ -179,7 +179,9 @@ CallInfo::CallInfo(Method* resolved_method, Klass* resolved_klass, TRAPS) {
|
||||||
|
_call_index = index;
|
||||||
|
_resolved_appendix = Handle();
|
||||||
|
// Find or create a ResolvedMethod instance for this Method*
|
||||||
|
- set_resolved_method_name(CHECK);
|
||||||
|
+ if (thread->is_Java_thread()) { // exclude DCEVM VM thread
|
||||||
|
+ set_resolved_method_name(thread->as_Java_thread());
|
||||||
|
+ }
|
||||||
|
|
||||||
|
DEBUG_ONLY(verify());
|
||||||
|
}
|
||||||
|
@@ -190,6 +192,10 @@ void CallInfo::set_resolved_method_name(TRAPS) {
|
||||||
|
_resolved_method_name = Handle(THREAD, rmethod_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void CallInfo::set_resolved_method_name_dcevm(oop rmethod_name, Thread* thread) {
|
||||||
|
+ _resolved_method_name = Handle(thread, rmethod_name);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#ifdef ASSERT
|
||||||
|
void CallInfo::verify() {
|
||||||
|
switch (call_kind()) { // the meaning and allowed value of index depends on kind
|
||||||
|
diff --git a/src/hotspot/share/interpreter/linkResolver.hpp b/src/hotspot/share/interpreter/linkResolver.hpp
|
||||||
|
index 9eeb10cc6fd..871eaab7464 100644
|
||||||
|
--- a/src/hotspot/share/interpreter/linkResolver.hpp
|
||||||
|
+++ b/src/hotspot/share/interpreter/linkResolver.hpp
|
||||||
|
@@ -91,7 +91,7 @@ class CallInfo : public StackObj {
|
||||||
|
// utility to extract an effective CallInfo from a method and an optional receiver limit
|
||||||
|
// does not queue the method for compilation. This also creates a ResolvedMethodName
|
||||||
|
// object for the resolved_method.
|
||||||
|
- CallInfo(Method* resolved_method, Klass* resolved_klass, TRAPS);
|
||||||
|
+ CallInfo(Method* resolved_method, Klass* resolved_klass, Thread* thread);
|
||||||
|
|
||||||
|
Klass* resolved_klass() const { return _resolved_klass; }
|
||||||
|
Method* resolved_method() const { return _resolved_method(); }
|
||||||
|
@@ -100,6 +100,7 @@ class CallInfo : public StackObj {
|
||||||
|
Handle resolved_method_name() const { return _resolved_method_name; }
|
||||||
|
// Materialize a java.lang.invoke.ResolvedMethodName for this resolved_method
|
||||||
|
void set_resolved_method_name(TRAPS);
|
||||||
|
+ void set_resolved_method_name_dcevm(oop rmethod_name, Thread* thread);
|
||||||
|
|
||||||
|
BasicType result_type() const { return selected_method()->result_type(); }
|
||||||
|
CallKind call_kind() const { return _call_kind; }
|
||||||
|
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
index c5f37d42a9a..9920e7fb25d 100644
|
||||||
|
--- a/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
+++ b/src/hotspot/share/oops/instanceKlass.cpp
|
||||||
|
@@ -1643,21 +1643,6 @@ void InstanceKlass::methods_do(void f(Method* method)) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-void InstanceKlass::methods_do(void f(Method* method, TRAPS), TRAPS) {
|
||||||
|
- // Methods aren't stable until they are loaded. This can be read outside
|
||||||
|
- // a lock through the ClassLoaderData for profiling
|
||||||
|
- if (!is_loaded()) {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- int len = methods()->length();
|
||||||
|
- for (int index = 0; index < len; index++) {
|
||||||
|
- Method* m = methods()->at(index);
|
||||||
|
- assert(m->is_method(), "must be method");
|
||||||
|
- f(m, CHECK);
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
// (DCEVM) Update information contains mapping of fields from old class to the new class.
|
||||||
|
// Info is stored on HEAP, you need to call clear_update_information to free the space.
|
||||||
|
void InstanceKlass::store_update_information(GrowableArray<int> &values) {
|
||||||
|
diff --git a/src/hotspot/share/oops/instanceKlass.hpp b/src/hotspot/share/oops/instanceKlass.hpp
|
||||||
|
index 317a006a4ec..36587031fec 100644
|
||||||
|
--- a/src/hotspot/share/oops/instanceKlass.hpp
|
||||||
|
+++ b/src/hotspot/share/oops/instanceKlass.hpp
|
||||||
|
@@ -1017,7 +1017,6 @@ public:
|
||||||
|
void clear_update_information();
|
||||||
|
|
||||||
|
void methods_do(void f(Method* method));
|
||||||
|
- void methods_do(void f(Method* method, TRAPS), TRAPS);
|
||||||
|
void array_klasses_do(void f(Klass* k));
|
||||||
|
void array_klasses_do(void f(Klass* k, TRAPS), TRAPS);
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index 0aeeea4e7a4..e7f26b7d08e 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -292,8 +292,15 @@ class ChangePointersOopClosure : public BasicOopIterateClosure {
|
||||||
|
// Note: we might set NULL at this point, which should force AbstractMethodError at runtime
|
||||||
|
Thread *thread = Thread::current();
|
||||||
|
CallInfo info(new_method, newest, thread);
|
||||||
|
- Handle objHandle(thread, obj);
|
||||||
|
- MethodHandles::init_method_MemberName(objHandle, info);
|
||||||
|
+ oop resolved_method = ResolvedMethodTable::find_method(info.resolved_method());
|
||||||
|
+ if (resolved_method != NULL) {
|
||||||
|
+ info.set_resolved_method_name_dcevm(resolved_method, thread);
|
||||||
|
+ Handle objHandle(thread, obj);
|
||||||
|
+ MethodHandles::init_method_MemberName(objHandle, info);
|
||||||
|
+ } else {
|
||||||
|
+ assert(0, "Must be resolved");
|
||||||
|
+ java_lang_invoke_MemberName::set_method(obj, NULL);
|
||||||
|
+ }
|
||||||
|
} else {
|
||||||
|
java_lang_invoke_MemberName::set_method(obj, NULL);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
From e16371268f8ba1c752dc61635a09c94e978f5117 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Mon, 21 Jun 2021 20:44:17 +0200
|
||||||
|
Subject: [PATCH 35/45] Fix "implicit conversion of NULL constant to 'bool'"
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/prims/jvmtiRedefineClasses.cpp | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiRedefineClasses.cpp
|
||||||
|
index 87b3b5f47ce..6915a09cf85 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiRedefineClasses.cpp
|
||||||
|
@@ -1390,7 +1390,7 @@ jvmtiError VM_RedefineClasses::load_new_class_versions() {
|
||||||
|
the_class->name(),
|
||||||
|
the_class->class_loader_data(),
|
||||||
|
cl_info,
|
||||||
|
- NULL,
|
||||||
|
+ false,
|
||||||
|
THREAD);
|
||||||
|
|
||||||
|
// Clear class_being_redefined just to be sure.
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
From 4d7390cedc3d06281f6a89f12b469108f11aab42 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Wed, 30 Jun 2021 18:30:00 +0200
|
||||||
|
Subject: [PATCH 36/45] Fix, pass SystemDictionary::resolve_from_stream cl_info
|
||||||
|
param
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp | 8 +++++++-
|
||||||
|
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index e7f26b7d08e..4d145f30100 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -920,10 +920,16 @@ jvmtiError VM_EnhancedRedefineClasses::load_new_class_versions(TRAPS) {
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
+ ClassLoadInfo cl_info(protection_domain,
|
||||||
|
+ NULL, // dynamic_nest_host
|
||||||
|
+ Handle(), // classData
|
||||||
|
+ false, // is_hidden
|
||||||
|
+ !the_class->is_non_strong_hidden(), // is_strong_hidden
|
||||||
|
+ true); // FIXME: check if correct. can_access_vm_annotations
|
||||||
|
k = SystemDictionary::resolve_from_stream(&st,
|
||||||
|
the_class_sym,
|
||||||
|
the_class_loader,
|
||||||
|
- protection_domain,
|
||||||
|
+ cl_info,
|
||||||
|
the_class,
|
||||||
|
THREAD);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
From 24fe3ebd655068b819a437af62d40c2ee9ed7171 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Wed, 30 Jun 2021 18:50:38 +0200
|
||||||
|
Subject: [PATCH 37/45] Search for affected classes in all initialized classes
|
||||||
|
in cld
|
||||||
|
|
||||||
|
Fix also case when lambda interface is redefined. Lambda class is
|
||||||
|
missing in cld dictionary since it is hidden since j17
|
||||||
|
---
|
||||||
|
src/hotspot/share/classfile/classLoaderData.cpp | 10 ++++++++++
|
||||||
|
src/hotspot/share/classfile/classLoaderData.hpp | 1 +
|
||||||
|
.../share/classfile/classLoaderDataGraph.cpp | 11 ++++-------
|
||||||
|
.../share/classfile/classLoaderDataGraph.hpp | 2 +-
|
||||||
|
.../share/prims/jvmtiEnhancedRedefineClasses.cpp | 13 ++++---------
|
||||||
|
5 files changed, 20 insertions(+), 17 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||||
|
index 65ce4c4af8c..1c51e83e86e 100644
|
||||||
|
--- a/src/hotspot/share/classfile/classLoaderData.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||||
|
@@ -337,6 +337,16 @@ void ClassLoaderData::classes_do(KlassClosure* klass_closure) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+void ClassLoaderData::initialized_classes_do(KlassClosure* klass_closure) {
|
||||||
|
+ // Lock-free access requires load_acquire
|
||||||
|
+ for (Klass* k = Atomic::load_acquire(&_klasses); k != NULL; k = k->next_link()) {
|
||||||
|
+ if (k->is_instance_klass() && InstanceKlass::cast(k)->is_initialized()) {
|
||||||
|
+ klass_closure->do_klass(k);
|
||||||
|
+ }
|
||||||
|
+ assert(k != k->next_link(), "no loops!");
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void ClassLoaderData::classes_do(void f(Klass * const)) {
|
||||||
|
// Lock-free access requires load_acquire
|
||||||
|
for (Klass* k = Atomic::load_acquire(&_klasses); k != NULL; k = k->next_link()) {
|
||||||
|
diff --git a/src/hotspot/share/classfile/classLoaderData.hpp b/src/hotspot/share/classfile/classLoaderData.hpp
|
||||||
|
index bda39f3e353..28fc9060e03 100644
|
||||||
|
--- a/src/hotspot/share/classfile/classLoaderData.hpp
|
||||||
|
+++ b/src/hotspot/share/classfile/classLoaderData.hpp
|
||||||
|
@@ -272,6 +272,7 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
||||||
|
void oops_do(OopClosure* f, int claim_value, bool clear_modified_oops = false);
|
||||||
|
|
||||||
|
void classes_do(KlassClosure* klass_closure);
|
||||||
|
+ void initialized_classes_do(KlassClosure* klass_closure);
|
||||||
|
Klass* klasses() { return _klasses; }
|
||||||
|
|
||||||
|
JNIMethodBlock* jmethod_ids() const { return _jmethod_ids; }
|
||||||
|
diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.cpp b/src/hotspot/share/classfile/classLoaderDataGraph.cpp
|
||||||
|
index aa2a6bcec6b..f2394f72dbd 100644
|
||||||
|
--- a/src/hotspot/share/classfile/classLoaderDataGraph.cpp
|
||||||
|
+++ b/src/hotspot/share/classfile/classLoaderDataGraph.cpp
|
||||||
|
@@ -361,13 +361,10 @@ void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-void ClassLoaderDataGraph::anonymous_or_hidden_classes_do(KlassClosure* klass_closure) {
|
||||||
|
- Thread* thread = Thread::current();
|
||||||
|
- for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
|
||||||
|
- if (cld->has_class_mirror_holder()) {
|
||||||
|
- Handle holder(thread, cld->holder_phantom());
|
||||||
|
- cld->classes_do(klass_closure);
|
||||||
|
- }
|
||||||
|
+void ClassLoaderDataGraph::initialized_classes_do(KlassClosure* klass_closure) {
|
||||||
|
+ ClassLoaderDataGraphIterator iter;
|
||||||
|
+ while (ClassLoaderData* cld = iter.get_next()) {
|
||||||
|
+ cld->initialized_classes_do(klass_closure);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.hpp b/src/hotspot/share/classfile/classLoaderDataGraph.hpp
|
||||||
|
index da712eaf55f..ff391ec74fc 100644
|
||||||
|
--- a/src/hotspot/share/classfile/classLoaderDataGraph.hpp
|
||||||
|
+++ b/src/hotspot/share/classfile/classLoaderDataGraph.hpp
|
||||||
|
@@ -80,7 +80,7 @@ class ClassLoaderDataGraph : public AllStatic {
|
||||||
|
static void classes_do(KlassClosure* klass_closure);
|
||||||
|
|
||||||
|
// Enhanced class redefinition
|
||||||
|
- static void anonymous_or_hidden_classes_do(KlassClosure* klass_closure);
|
||||||
|
+ static void initialized_classes_do(KlassClosure* klass_closure);
|
||||||
|
|
||||||
|
static void classes_do(void f(Klass* const));
|
||||||
|
static void methods_do(void f(Method*));
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index 4d145f30100..8615806ac98 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -2170,17 +2170,12 @@ jvmtiError VM_EnhancedRedefineClasses::find_sorted_affected_classes(TRAPS) {
|
||||||
|
{
|
||||||
|
MutexLocker mcld(ClassLoaderDataGraph_lock);
|
||||||
|
|
||||||
|
- // 0. we can't use ClassLoaderDataGraph::classes_do since classes can be uninitialized in cld,
|
||||||
|
- // fully initialized class is in system dictionary
|
||||||
|
+ // We can't use ClassLoaderDataGraph::classes_do since classes can be uninitialized in cld,
|
||||||
|
+ // fully initialized class is in system dictionary, but hidden classes are excluded. Therefore
|
||||||
|
+ // we use special method iterating over initialized classes only
|
||||||
|
// ClassLoaderDataGraph::classes_do(&closure);
|
||||||
|
|
||||||
|
- // 1. Scan over dictionaries
|
||||||
|
- ClassLoaderDataGraph::dictionary_classes_do(&closure);
|
||||||
|
-
|
||||||
|
- // 2. Anonymous or hidden class is not in dictionary, we have to iterate anonymous cld directly, but there is race cond...
|
||||||
|
- // TODO: review ... anonymous class is added to cld before InstanceKlass initialization,
|
||||||
|
- // find out how to check if the InstanceKlass is initialized
|
||||||
|
- ClassLoaderDataGraph::anonymous_or_hidden_classes_do(&closure);
|
||||||
|
+ ClassLoaderDataGraph::initialized_classes_do(&closure);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_trace(redefine, class, load)("%d classes affected", _affected_klasses->length());
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
From 3e62ad1914f202d2d3fe907036924e181cd60fcb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Wed, 30 Jun 2021 18:58:47 +0200
|
||||||
|
Subject: [PATCH 38/45] Fix compilation issue
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/interpreter/linkResolver.cpp | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/interpreter/linkResolver.cpp b/src/hotspot/share/interpreter/linkResolver.cpp
|
||||||
|
index 78c9624a18b..28dccd0face 100644
|
||||||
|
--- a/src/hotspot/share/interpreter/linkResolver.cpp
|
||||||
|
+++ b/src/hotspot/share/interpreter/linkResolver.cpp
|
||||||
|
@@ -562,8 +562,8 @@ void LinkResolver::check_method_accessability(Klass* ref_klass,
|
||||||
|
// We'll check for the method name first, as that's most likely
|
||||||
|
// to be false (so we'll short-circuit out of these tests).
|
||||||
|
if (sel_method->name() == vmSymbols::clone_name() &&
|
||||||
|
- ( !AllowEnhancedClassRedefinition && sel_klass == vmClasses::Object_klass() ||
|
||||||
|
- AllowEnhancedClassRedefinition && sel_klass->newest_version() == vmClasses::Object_klass()->newest_version()) &&
|
||||||
|
+ ( (!AllowEnhancedClassRedefinition && sel_klass == vmClasses::Object_klass()) ||
|
||||||
|
+ (AllowEnhancedClassRedefinition && sel_klass->newest_version() == vmClasses::Object_klass()->newest_version()) ) &&
|
||||||
|
resolved_klass->is_array_klass()) {
|
||||||
|
// We need to change "protected" to "public".
|
||||||
|
assert(flags.is_protected(), "clone not protected?");
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,171 @@
|
|||||||
|
From 4cfb8eb8caa9b13f54f21cdd34b4d761b2b488cc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Tue, 27 Jul 2021 21:32:51 +0200
|
||||||
|
Subject: [PATCH 39/45] Remove duplicated lambdaFormInvokers.cpp
|
||||||
|
|
||||||
|
---
|
||||||
|
.../share/classfile/lambdaFormInvokers.cpp | 152 ------------------
|
||||||
|
1 file changed, 152 deletions(-)
|
||||||
|
delete mode 100644 src/hotspot/share/classfile/lambdaFormInvokers.cpp
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/classfile/lambdaFormInvokers.cpp b/src/hotspot/share/classfile/lambdaFormInvokers.cpp
|
||||||
|
deleted file mode 100644
|
||||||
|
index 281de58b482..00000000000
|
||||||
|
--- a/src/hotspot/share/classfile/lambdaFormInvokers.cpp
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,152 +0,0 @@
|
||||||
|
-/*
|
||||||
|
- * Copyright (c) 2020, 2021, 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.
|
||||||
|
- *
|
||||||
|
- * 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.
|
||||||
|
- *
|
||||||
|
- */
|
||||||
|
-
|
||||||
|
-#include "precompiled.hpp"
|
||||||
|
-#include "classfile/classLoadInfo.hpp"
|
||||||
|
-#include "classfile/classFileStream.hpp"
|
||||||
|
-#include "classfile/javaClasses.inline.hpp"
|
||||||
|
-#include "classfile/klassFactory.hpp"
|
||||||
|
-#include "classfile/lambdaFormInvokers.hpp"
|
||||||
|
-#include "classfile/symbolTable.hpp"
|
||||||
|
-#include "classfile/systemDictionary.hpp"
|
||||||
|
-#include "classfile/systemDictionaryShared.hpp"
|
||||||
|
-#include "classfile/vmClasses.hpp"
|
||||||
|
-#include "classfile/vmSymbols.hpp"
|
||||||
|
-#include "logging/log.hpp"
|
||||||
|
-#include "memory/oopFactory.hpp"
|
||||||
|
-#include "memory/metaspaceShared.hpp"
|
||||||
|
-#include "memory/resourceArea.hpp"
|
||||||
|
-#include "oops/instanceKlass.hpp"
|
||||||
|
-#include "oops/klass.hpp"
|
||||||
|
-#include "oops/objArrayKlass.hpp"
|
||||||
|
-#include "oops/objArrayOop.hpp"
|
||||||
|
-#include "oops/oop.inline.hpp"
|
||||||
|
-#include "oops/typeArrayOop.inline.hpp"
|
||||||
|
-#include "runtime/handles.inline.hpp"
|
||||||
|
-#include "runtime/javaCalls.hpp"
|
||||||
|
-
|
||||||
|
-GrowableArray<char*>* LambdaFormInvokers::_lambdaform_lines = NULL;
|
||||||
|
-
|
||||||
|
-void LambdaFormInvokers::append(char* line) {
|
||||||
|
- if (_lambdaform_lines == NULL) {
|
||||||
|
- _lambdaform_lines = new GrowableArray<char*>(100);
|
||||||
|
- }
|
||||||
|
- _lambdaform_lines->append(line);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-void LambdaFormInvokers::regenerate_holder_classes(TRAPS) {
|
||||||
|
- assert(_lambdaform_lines != NULL, "Bad List");
|
||||||
|
- ResourceMark rm(THREAD);
|
||||||
|
-
|
||||||
|
- Symbol* cds_name = vmSymbols::jdk_internal_misc_CDS();
|
||||||
|
- Klass* cds_klass = SystemDictionary::resolve_or_null(cds_name, THREAD);
|
||||||
|
- guarantee(cds_klass != NULL, "jdk/internal/misc/CDS must exist!");
|
||||||
|
-
|
||||||
|
- int len = _lambdaform_lines->length();
|
||||||
|
- objArrayHandle list_lines = oopFactory::new_objArray_handle(vmClasses::String_klass(), len, CHECK);
|
||||||
|
- for (int i = 0; i < len; i++) {
|
||||||
|
- Handle h_line = java_lang_String::create_from_str(_lambdaform_lines->at(i), CHECK);
|
||||||
|
- list_lines->obj_at_put(i, h_line());
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- //
|
||||||
|
- // Object[] CDS.generateLambdaFormHolderClasses(String[] lines)
|
||||||
|
- // the returned Object[] layout:
|
||||||
|
- // name, byte[], name, byte[] ....
|
||||||
|
- Symbol* method = vmSymbols::generateLambdaFormHolderClasses();
|
||||||
|
- Symbol* signrs = vmSymbols::generateLambdaFormHolderClasses_signature();
|
||||||
|
-
|
||||||
|
- JavaValue result(T_OBJECT);
|
||||||
|
- JavaCalls::call_static(&result, cds_klass, method, signrs, list_lines, THREAD);
|
||||||
|
-
|
||||||
|
- if (HAS_PENDING_EXCEPTION) {
|
||||||
|
- log_info(cds)("%s: %s", THREAD->pending_exception()->klass()->external_name(),
|
||||||
|
- java_lang_String::as_utf8_string(java_lang_Throwable::message(THREAD->pending_exception())));
|
||||||
|
- CLEAR_PENDING_EXCEPTION;
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- objArrayHandle h_array(THREAD, (objArrayOop)result.get_oop());
|
||||||
|
- int sz = h_array->length();
|
||||||
|
- assert(sz % 2 == 0 && sz >= 2, "Must be even size of length");
|
||||||
|
- for (int i = 0; i < sz; i+= 2) {
|
||||||
|
- Handle h_name(THREAD, h_array->obj_at(i));
|
||||||
|
- typeArrayHandle h_bytes(THREAD, (typeArrayOop)h_array->obj_at(i+1));
|
||||||
|
- assert(h_name != NULL, "Class name is NULL");
|
||||||
|
- assert(h_bytes != NULL, "Class bytes is NULL");
|
||||||
|
-
|
||||||
|
- char *class_name = java_lang_String::as_utf8_string(h_name());
|
||||||
|
- int len = h_bytes->length();
|
||||||
|
- // make a copy of class bytes so GC will not affect us.
|
||||||
|
- char *buf = resource_allocate_bytes(THREAD, len);
|
||||||
|
- memcpy(buf, (char*)h_bytes->byte_at_addr(0), len);
|
||||||
|
- ClassFileStream st((u1*)buf, len, NULL, ClassFileStream::verify);
|
||||||
|
-
|
||||||
|
- reload_class(class_name, st, THREAD);
|
||||||
|
- // free buf
|
||||||
|
- resource_free_bytes(buf, len);
|
||||||
|
-
|
||||||
|
- if (HAS_PENDING_EXCEPTION) {
|
||||||
|
- log_info(cds)("Exception happened: %s", PENDING_EXCEPTION->klass()->name()->as_C_string());
|
||||||
|
- log_info(cds)("Could not create InstanceKlass for class %s", class_name);
|
||||||
|
- CLEAR_PENDING_EXCEPTION;
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-// class_handle - the class name, bytes_handle - the class bytes
|
||||||
|
-void LambdaFormInvokers::reload_class(char* name, ClassFileStream& st, TRAPS) {
|
||||||
|
- Symbol* class_name = SymbolTable::new_symbol((const char*)name);
|
||||||
|
- // the class must exist
|
||||||
|
- Klass* klass = SystemDictionary::resolve_or_null(class_name, THREAD);
|
||||||
|
- if (klass == NULL) {
|
||||||
|
- log_info(cds)("Class %s not present, skip", name);
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
- assert(klass->is_instance_klass(), "Should be");
|
||||||
|
-
|
||||||
|
- ClassLoaderData* cld = ClassLoaderData::the_null_class_loader_data();
|
||||||
|
- Handle protection_domain;
|
||||||
|
- ClassLoadInfo cl_info(protection_domain);
|
||||||
|
-
|
||||||
|
- InstanceKlass* result = KlassFactory::create_from_stream(&st,
|
||||||
|
- class_name,
|
||||||
|
- cld,
|
||||||
|
- cl_info,
|
||||||
|
- false,
|
||||||
|
- CHECK);
|
||||||
|
-
|
||||||
|
- {
|
||||||
|
- MutexLocker mu_r(THREAD, Compile_lock); // add_to_hierarchy asserts this.
|
||||||
|
- SystemDictionary::add_to_hierarchy(result);
|
||||||
|
- }
|
||||||
|
- // new class not linked yet.
|
||||||
|
- MetaspaceShared::try_link_class(THREAD, result);
|
||||||
|
- assert(!HAS_PENDING_EXCEPTION, "Invariant");
|
||||||
|
-
|
||||||
|
- // exclude the existing class from dump
|
||||||
|
- SystemDictionaryShared::set_excluded(InstanceKlass::cast(klass));
|
||||||
|
- log_info(cds, lambda)("Replaced class %s, old: %p new: %p", name, klass, result);
|
||||||
|
-}
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,222 @@
|
|||||||
|
From 92651c5d109896613e14792aa96ed5226a797f9b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sun, 10 Oct 2021 20:25:30 +0200
|
||||||
|
Subject: [PATCH 40/45] JBR-3867 - update keys of jvmti TAG map after
|
||||||
|
redefinition
|
||||||
|
|
||||||
|
jdwp keeps relation class_ptr->class_ref in jvmti tag. class_ptr is used
|
||||||
|
as a tag key, tag value is refnode. There are new class_ptrs after
|
||||||
|
redefinition, therefore jdwp redefinition method update all affected
|
||||||
|
keys in the tag map.
|
||||||
|
---
|
||||||
|
src/hotspot/share/prims/jvmtiExtensions.cpp | 24 ++++++++++++++
|
||||||
|
.../share/native/libjdwp/VirtualMachineImpl.c | 20 +++++++++++
|
||||||
|
.../share/native/libjdwp/commonRef.c | 29 ++++++++++++++++
|
||||||
|
.../share/native/libjdwp/commonRef.h | 2 ++
|
||||||
|
.../share/native/libjdwp/util.c | 33 +++++++++++++++++++
|
||||||
|
.../share/native/libjdwp/util.h | 3 ++
|
||||||
|
6 files changed, 111 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiExtensions.cpp b/src/hotspot/share/prims/jvmtiExtensions.cpp
|
||||||
|
index a3fc430e1d1..ab2e663b95d 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiExtensions.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiExtensions.cpp
|
||||||
|
@@ -49,6 +49,15 @@ static jvmtiError JNICALL IsClassUnloadingEnabled(const jvmtiEnv* env, ...) {
|
||||||
|
return JVMTI_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+// extension function
|
||||||
|
+static jvmtiError JNICALL IsEnhancedClassRedefinitionEnabled(const jvmtiEnv* env, jboolean* enabled, ...) {
|
||||||
|
+ if (enabled == NULL) {
|
||||||
|
+ return JVMTI_ERROR_NULL_POINTER;
|
||||||
|
+ }
|
||||||
|
+ *enabled = (jboolean)AllowEnhancedClassRedefinition;
|
||||||
|
+ return JVMTI_ERROR_NONE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
// register extension functions and events. In this implementation we
|
||||||
|
// have a single extension function (to prove the API) that tests if class
|
||||||
|
// unloading is enabled or disabled. We also have a single extension event
|
||||||
|
@@ -88,6 +97,21 @@ void JvmtiExtensions::register_extensions() {
|
||||||
|
event_params
|
||||||
|
};
|
||||||
|
_ext_events->append(&ext_event);
|
||||||
|
+
|
||||||
|
+ static jvmtiParamInfo func_params_enh_redef[] = {
|
||||||
|
+ { (char*)"IsEnhancedClassRedefinitionEnabled", JVMTI_KIND_OUT, JVMTI_TYPE_JBOOLEAN, JNI_FALSE }
|
||||||
|
+
|
||||||
|
+ };
|
||||||
|
+ static jvmtiExtensionFunctionInfo ext_func_enh_redef = {
|
||||||
|
+ (jvmtiExtensionFunction)IsEnhancedClassRedefinitionEnabled,
|
||||||
|
+ (char*)"com.sun.hotspot.functions.IsEnhancedClassRedefinitionEnabled",
|
||||||
|
+ (char*)"Tell if enhanced class redefinition is enabled (-noclassgc)",
|
||||||
|
+ sizeof(func_params_enh_redef)/sizeof(func_params_enh_redef[0]),
|
||||||
|
+ func_params_enh_redef,
|
||||||
|
+ 0, // no non-universal errors
|
||||||
|
+ NULL
|
||||||
|
+ };
|
||||||
|
+ _ext_functions->append(&ext_func_enh_redef);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c b/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c
|
||||||
|
index c07bdac2922..7e3070d7d1d 100644
|
||||||
|
--- a/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c
|
||||||
|
+++ b/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c
|
||||||
|
@@ -477,6 +477,14 @@ redefineClasses(PacketInputStream *in, PacketOutputStream *out)
|
||||||
|
if (ok == JNI_TRUE) {
|
||||||
|
jvmtiError error;
|
||||||
|
|
||||||
|
+ jlong classIds[classCount];
|
||||||
|
+
|
||||||
|
+ if (gdata->isEnhancedClassRedefinitionEnabled) {
|
||||||
|
+ for (i = 0; i < classCount; ++i) {
|
||||||
|
+ classIds[i] = commonRef_refToID(env, classDefs[i].klass);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
error = JVMTI_FUNC_PTR(gdata->jvmti,RedefineClasses)
|
||||||
|
(gdata->jvmti, classCount, classDefs);
|
||||||
|
if (error != JVMTI_ERROR_NONE) {
|
||||||
|
@@ -486,6 +494,18 @@ redefineClasses(PacketInputStream *in, PacketOutputStream *out)
|
||||||
|
for ( i = 0 ; i < classCount; i++ ) {
|
||||||
|
eventHandler_freeClassBreakpoints(classDefs[i].klass);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if (gdata->isEnhancedClassRedefinitionEnabled) {
|
||||||
|
+ /* Update tags in jvmti to use new classes */
|
||||||
|
+ for ( i = 0 ; i < classCount; i++ ) {
|
||||||
|
+ /* pointer in classIds[i] is updated by advanced redefinition to a new class */
|
||||||
|
+ error = commonRef_updateTags(env, classIds[i]);
|
||||||
|
+ if (error != JVMTI_ERROR_NONE) {
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.c b/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.c
|
||||||
|
index bc7ddb660bf..f8cb8e36f17 100644
|
||||||
|
--- a/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.c
|
||||||
|
+++ b/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.c
|
||||||
|
@@ -712,3 +712,32 @@ commonRef_unlock(void)
|
||||||
|
{
|
||||||
|
debugMonitorExit(gdata->refLock);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Update JVMTI tags, used from enhanced redefinition
|
||||||
|
+ */
|
||||||
|
+jvmtiError
|
||||||
|
+commonRef_updateTags(JNIEnv *env, jlong id)
|
||||||
|
+{
|
||||||
|
+ jvmtiError error;
|
||||||
|
+
|
||||||
|
+ error = JVMTI_ERROR_NONE;
|
||||||
|
+
|
||||||
|
+ if (id == NULL_OBJECT_ID) {
|
||||||
|
+ return error;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ debugMonitorEnter(gdata->refLock); {
|
||||||
|
+ RefNode *node;
|
||||||
|
+
|
||||||
|
+ node = findNodeByID(env, id);
|
||||||
|
+ if (node != NULL) {
|
||||||
|
+ error = JVMTI_FUNC_PTR(gdata->jvmti, SetTag)
|
||||||
|
+ (gdata->jvmti, node->ref, ptr_to_jlong(node));
|
||||||
|
+ } else {
|
||||||
|
+ printf("Node not found\n");
|
||||||
|
+ }
|
||||||
|
+ } debugMonitorExit(gdata->refLock);
|
||||||
|
+
|
||||||
|
+ return error;
|
||||||
|
+}
|
||||||
|
diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.h b/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.h
|
||||||
|
index c3700f8c743..35c77e4adbf 100644
|
||||||
|
--- a/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.h
|
||||||
|
+++ b/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.h
|
||||||
|
@@ -43,4 +43,6 @@ void commonRef_compact(void);
|
||||||
|
void commonRef_lock(void);
|
||||||
|
void commonRef_unlock(void);
|
||||||
|
|
||||||
|
+jvmtiError commonRef_updateTags(JNIEnv *env, jlong id);
|
||||||
|
+
|
||||||
|
#endif
|
||||||
|
diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/util.c b/src/jdk.jdwp.agent/share/native/libjdwp/util.c
|
||||||
|
index 2403c5273ba..b4a5ad183e0 100644
|
||||||
|
--- a/src/jdk.jdwp.agent/share/native/libjdwp/util.c
|
||||||
|
+++ b/src/jdk.jdwp.agent/share/native/libjdwp/util.c
|
||||||
|
@@ -43,6 +43,7 @@ BackendGlobalData *gdata = NULL;
|
||||||
|
static jboolean isInterface(jclass clazz);
|
||||||
|
static jboolean isArrayClass(jclass clazz);
|
||||||
|
static char * getPropertyUTF8(JNIEnv *env, char *propertyName);
|
||||||
|
+static jboolean isEnhancedClassRedefinitionEnabled(JNIEnv *env);
|
||||||
|
|
||||||
|
/* Save an object reference for use later (create a NewGlobalRef) */
|
||||||
|
void
|
||||||
|
@@ -285,6 +286,8 @@ util_initialize(JNIEnv *env)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ gdata->isEnhancedClassRedefinitionEnabled = isEnhancedClassRedefinitionEnabled(env);
|
||||||
|
+
|
||||||
|
} END_WITH_LOCAL_REFS(env);
|
||||||
|
|
||||||
|
}
|
||||||
|
@@ -1701,6 +1704,36 @@ getPropertyUTF8(JNIEnv *env, char *propertyName)
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static jboolean
|
||||||
|
+isEnhancedClassRedefinitionEnabled(JNIEnv *env)
|
||||||
|
+{
|
||||||
|
+ jvmtiError error;
|
||||||
|
+ jint count, i;
|
||||||
|
+ jvmtiExtensionFunctionInfo* ext_funcs;
|
||||||
|
+
|
||||||
|
+ error = JVMTI_FUNC_PTR(gdata->jvmti,GetExtensionFunctions)
|
||||||
|
+ (gdata->jvmti, &count, &ext_funcs);
|
||||||
|
+ if (error != JVMTI_ERROR_NONE) {
|
||||||
|
+ return JNI_FALSE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (i=0; i<count; i++) {
|
||||||
|
+ if (strcmp(ext_funcs[i].id, (char*)"com.sun.hotspot.functions.IsEnhancedClassRedefinitionEnabled") == 0) {
|
||||||
|
+ jboolean enabled;
|
||||||
|
+ error = (*ext_funcs[i].func)(gdata->jvmti, &enabled);
|
||||||
|
+
|
||||||
|
+ if (error != JVMTI_ERROR_NONE) {
|
||||||
|
+ return JNI_FALSE;
|
||||||
|
+ } else {
|
||||||
|
+ return enabled;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return JNI_FALSE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
jboolean
|
||||||
|
isMethodObsolete(jmethodID method)
|
||||||
|
{
|
||||||
|
diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/util.h b/src/jdk.jdwp.agent/share/native/libjdwp/util.h
|
||||||
|
index f62b5c409f0..6de8f17bb23 100644
|
||||||
|
--- a/src/jdk.jdwp.agent/share/native/libjdwp/util.h
|
||||||
|
+++ b/src/jdk.jdwp.agent/share/native/libjdwp/util.h
|
||||||
|
@@ -133,6 +133,9 @@ typedef struct {
|
||||||
|
int objectsByIDsize;
|
||||||
|
int objectsByIDcount;
|
||||||
|
|
||||||
|
+ /* true if enhanced class redefinition is enabled */
|
||||||
|
+ jboolean isEnhancedClassRedefinitionEnabled;
|
||||||
|
+
|
||||||
|
/* Indication that the agent has been loaded */
|
||||||
|
jboolean isLoaded;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
From 7cfd70e1e43bca677b9827a5a7643bb604e6ae38 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Mon, 11 Oct 2021 20:22:26 +0200
|
||||||
|
Subject: [PATCH 41/45] JBR-3867 - fix msvc compilation issue with non const
|
||||||
|
array on stack
|
||||||
|
|
||||||
|
---
|
||||||
|
.../share/native/libjdwp/VirtualMachineImpl.c | 14 ++++++++++----
|
||||||
|
1 file changed, 10 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c b/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c
|
||||||
|
index 7e3070d7d1d..669fac7cb5b 100644
|
||||||
|
--- a/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c
|
||||||
|
+++ b/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c
|
||||||
|
@@ -477,11 +477,16 @@ redefineClasses(PacketInputStream *in, PacketOutputStream *out)
|
||||||
|
if (ok == JNI_TRUE) {
|
||||||
|
jvmtiError error;
|
||||||
|
|
||||||
|
- jlong classIds[classCount];
|
||||||
|
+ jlong* classIds = NULL;
|
||||||
|
|
||||||
|
if (gdata->isEnhancedClassRedefinitionEnabled) {
|
||||||
|
- for (i = 0; i < classCount; ++i) {
|
||||||
|
- classIds[i] = commonRef_refToID(env, classDefs[i].klass);
|
||||||
|
+ classIds = jvmtiAllocate(classCount*(int)sizeof(jlong));
|
||||||
|
+ if (classIds == NULL) {
|
||||||
|
+ outStream_setError(out, JDWP_ERROR(OUT_OF_MEMORY));
|
||||||
|
+ return JNI_TRUE;
|
||||||
|
+ }
|
||||||
|
+ for (i = 0; i < classCount; i++) {
|
||||||
|
+ classIds[i] = commonRef_refToID(env, classDefs[i].klass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -495,7 +500,7 @@ redefineClasses(PacketInputStream *in, PacketOutputStream *out)
|
||||||
|
eventHandler_freeClassBreakpoints(classDefs[i].klass);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (gdata->isEnhancedClassRedefinitionEnabled) {
|
||||||
|
+ if (gdata->isEnhancedClassRedefinitionEnabled && classIds != NULL) {
|
||||||
|
/* Update tags in jvmti to use new classes */
|
||||||
|
for ( i = 0 ; i < classCount; i++ ) {
|
||||||
|
/* pointer in classIds[i] is updated by advanced redefinition to a new class */
|
||||||
|
@@ -504,6 +509,7 @@ redefineClasses(PacketInputStream *in, PacketOutputStream *out)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ jvmtiDeallocate((void*) classIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
From d41ca807dcf4f192bc730c577acb5d2bff0aa3f7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Tue, 19 Oct 2021 17:02:35 +0200
|
||||||
|
Subject: [PATCH 42/45] Attempt to fix JBR-3887
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/prims/jvmtiExtensions.cpp | 8 +++++++-
|
||||||
|
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiExtensions.cpp b/src/hotspot/share/prims/jvmtiExtensions.cpp
|
||||||
|
index ab2e663b95d..698d32a7228 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiExtensions.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiExtensions.cpp
|
||||||
|
@@ -50,7 +50,13 @@ static jvmtiError JNICALL IsClassUnloadingEnabled(const jvmtiEnv* env, ...) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// extension function
|
||||||
|
-static jvmtiError JNICALL IsEnhancedClassRedefinitionEnabled(const jvmtiEnv* env, jboolean* enabled, ...) {
|
||||||
|
+static jvmtiError JNICALL IsEnhancedClassRedefinitionEnabled(const jvmtiEnv* env, ...) {
|
||||||
|
+ jboolean* enabled = NULL;
|
||||||
|
+ va_list ap;
|
||||||
|
+
|
||||||
|
+ va_start(ap, env);
|
||||||
|
+ enabled = va_arg(ap, jboolean *);
|
||||||
|
+ va_end(ap);
|
||||||
|
if (enabled == NULL) {
|
||||||
|
return JVMTI_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,180 @@
|
|||||||
|
From 91534f381bf08471b7e6e5064d561fb75e2890c6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Mon, 1 Nov 2021 19:00:41 +0100
|
||||||
|
Subject: [PATCH 43/45] JBR-3937 Fix crashes in C1/C2 compilers
|
||||||
|
|
||||||
|
There is a race condition in enhanced redefinition with C1/C2. Therefore
|
||||||
|
the patch stops C1/C2 compilation before redefinition and release after
|
||||||
|
redefinition finishing. There is no performance impact since dcevm
|
||||||
|
flushes all code cache.
|
||||||
|
---
|
||||||
|
src/hotspot/share/compiler/compileBroker.cpp | 38 ++++++++++++++++++--
|
||||||
|
src/hotspot/share/compiler/compileBroker.hpp | 6 ++++
|
||||||
|
src/hotspot/share/prims/jvmtiEnv.cpp | 7 ++++
|
||||||
|
src/hotspot/share/runtime/mutexLocker.cpp | 3 ++
|
||||||
|
src/hotspot/share/runtime/mutexLocker.hpp | 1 +
|
||||||
|
5 files changed, 53 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/compiler/compileBroker.cpp b/src/hotspot/share/compiler/compileBroker.cpp
|
||||||
|
index aaf8e4b1f1e..878bc265d2f 100644
|
||||||
|
--- a/src/hotspot/share/compiler/compileBroker.cpp
|
||||||
|
+++ b/src/hotspot/share/compiler/compileBroker.cpp
|
||||||
|
@@ -140,6 +140,8 @@ CompileLog** CompileBroker::_compiler2_logs = NULL;
|
||||||
|
// These counters are used to assign an unique ID to each compilation.
|
||||||
|
volatile jint CompileBroker::_compilation_id = 0;
|
||||||
|
volatile jint CompileBroker::_osr_compilation_id = 0;
|
||||||
|
+volatile bool CompileBroker::_compilation_stopped = false;
|
||||||
|
+volatile int CompileBroker::_active_compilations = 0;
|
||||||
|
|
||||||
|
// Performance counters
|
||||||
|
PerfCounter* CompileBroker::_perf_total_compilation = NULL;
|
||||||
|
@@ -2320,8 +2322,19 @@ void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
|
||||||
|
locker.wait();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- comp->compile_method(&ci_env, target, osr_bci, true, directive);
|
||||||
|
-
|
||||||
|
+ if (AllowEnhancedClassRedefinition) {
|
||||||
|
+ {
|
||||||
|
+ MonitorLocker locker(DcevmCompilation_lock, Mutex::_no_safepoint_check_flag);
|
||||||
|
+ while (_compilation_stopped) {
|
||||||
|
+ locker.wait();
|
||||||
|
+ }
|
||||||
|
+ Atomic::add(&_active_compilations, 1);
|
||||||
|
+ }
|
||||||
|
+ comp->compile_method(&ci_env, target, osr_bci, true, directive);
|
||||||
|
+ Atomic::sub(&_active_compilations, 1);
|
||||||
|
+ } else {
|
||||||
|
+ comp->compile_method(&ci_env, target, osr_bci, true, directive);
|
||||||
|
+ }
|
||||||
|
/* Repeat compilation without installing code for profiling purposes */
|
||||||
|
int repeat_compilation_count = directive->RepeatCompilationOption;
|
||||||
|
while (repeat_compilation_count > 0) {
|
||||||
|
@@ -2329,6 +2342,7 @@ void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
|
||||||
|
comp->compile_method(&ci_env, target, osr_bci, false , directive);
|
||||||
|
repeat_compilation_count--;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ci_env.failing() && task->code() == NULL) {
|
||||||
|
@@ -2942,3 +2956,23 @@ void CompileBroker::print_heapinfo(outputStream* out, const char* function, size
|
||||||
|
}
|
||||||
|
out->print_cr("\n__ CodeHeapStateAnalytics total duration %10.3f seconds _________\n", ts_total.seconds());
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+void CompileBroker::stopCompilationBeforeEnhancedRedefinition() {
|
||||||
|
+ if (AllowEnhancedClassRedefinition) {
|
||||||
|
+ MonitorLocker locker(DcevmCompilation_lock, Mutex::_no_safepoint_check_flag);
|
||||||
|
+ _compilation_stopped = true;
|
||||||
|
+ while (_active_compilations > 0) {
|
||||||
|
+ VM_ThreadsSuspendJVMTI tsj; // force safepoint to run C1/C2 VM op
|
||||||
|
+ VMThread::execute(&tsj);
|
||||||
|
+ locker.wait(10);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void CompileBroker::releaseCompilationAfterEnhancedRedefinition() {
|
||||||
|
+ if (AllowEnhancedClassRedefinition) {
|
||||||
|
+ MonitorLocker locker(DcevmCompilation_lock, Mutex::_no_safepoint_check_flag);
|
||||||
|
+ _compilation_stopped = false;
|
||||||
|
+ locker.notify_all();
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
diff --git a/src/hotspot/share/compiler/compileBroker.hpp b/src/hotspot/share/compiler/compileBroker.hpp
|
||||||
|
index 0b721f83121..f146ff5c93d 100644
|
||||||
|
--- a/src/hotspot/share/compiler/compileBroker.hpp
|
||||||
|
+++ b/src/hotspot/share/compiler/compileBroker.hpp
|
||||||
|
@@ -175,6 +175,9 @@ class CompileBroker: AllStatic {
|
||||||
|
static volatile jint _compilation_id;
|
||||||
|
static volatile jint _osr_compilation_id;
|
||||||
|
|
||||||
|
+ static volatile bool _compilation_stopped;
|
||||||
|
+ static volatile int _active_compilations;
|
||||||
|
+
|
||||||
|
static CompileQueue* _c2_compile_queue;
|
||||||
|
static CompileQueue* _c1_compile_queue;
|
||||||
|
|
||||||
|
@@ -423,6 +426,9 @@ public:
|
||||||
|
// CodeHeap State Analytics.
|
||||||
|
static void print_info(outputStream *out);
|
||||||
|
static void print_heapinfo(outputStream *out, const char* function, size_t granularity);
|
||||||
|
+
|
||||||
|
+ static void stopCompilationBeforeEnhancedRedefinition();
|
||||||
|
+ static void releaseCompilationAfterEnhancedRedefinition();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SHARE_COMPILER_COMPILEBROKER_HPP
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnv.cpp b/src/hotspot/share/prims/jvmtiEnv.cpp
|
||||||
|
index 8970d7991b7..9ca8e660197 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnv.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnv.cpp
|
||||||
|
@@ -31,6 +31,7 @@
|
||||||
|
#include "classfile/vmClasses.hpp"
|
||||||
|
#include "classfile/vmSymbols.hpp"
|
||||||
|
#include "gc/shared/collectedHeap.hpp"
|
||||||
|
+#include "compiler/compileBroker.hpp"
|
||||||
|
#include "interpreter/bytecodeStream.hpp"
|
||||||
|
#include "interpreter/interpreter.hpp"
|
||||||
|
#include "jfr/jfrEvents.hpp"
|
||||||
|
@@ -458,8 +459,11 @@ JvmtiEnv::RetransformClasses(jint class_count, const jclass* classes) {
|
||||||
|
|
||||||
|
if (AllowEnhancedClassRedefinition) {
|
||||||
|
MutexLocker sd_mutex(EnhancedRedefineClasses_lock);
|
||||||
|
+ // Stop compilation to avoid compilator race condition (crashes) with advanced redefinition
|
||||||
|
+ CompileBroker::stopCompilationBeforeEnhancedRedefinition();
|
||||||
|
VM_EnhancedRedefineClasses op(class_count, class_definitions, jvmti_class_load_kind_retransform);
|
||||||
|
VMThread::execute(&op);
|
||||||
|
+ CompileBroker::releaseCompilationAfterEnhancedRedefinition();
|
||||||
|
op_id = op.id();
|
||||||
|
error = (op.check_error());
|
||||||
|
} else {
|
||||||
|
@@ -489,8 +493,11 @@ JvmtiEnv::RedefineClasses(jint class_count, const jvmtiClassDefinition* class_de
|
||||||
|
|
||||||
|
if (AllowEnhancedClassRedefinition) {
|
||||||
|
MutexLocker sd_mutex(EnhancedRedefineClasses_lock);
|
||||||
|
+ // Stop compilation to avoid compilator race condition (crashes) with advanced redefinition
|
||||||
|
+ CompileBroker::stopCompilationBeforeEnhancedRedefinition();
|
||||||
|
VM_EnhancedRedefineClasses op(class_count, class_definitions, jvmti_class_load_kind_redefine);
|
||||||
|
VMThread::execute(&op);
|
||||||
|
+ CompileBroker::releaseCompilationAfterEnhancedRedefinition();
|
||||||
|
op_id = op.id();
|
||||||
|
error = (op.check_error());
|
||||||
|
} else {
|
||||||
|
diff --git a/src/hotspot/share/runtime/mutexLocker.cpp b/src/hotspot/share/runtime/mutexLocker.cpp
|
||||||
|
index 83982382e6f..beb36ebc177 100644
|
||||||
|
--- a/src/hotspot/share/runtime/mutexLocker.cpp
|
||||||
|
+++ b/src/hotspot/share/runtime/mutexLocker.cpp
|
||||||
|
@@ -84,6 +84,7 @@ Mutex* Compile_lock = NULL;
|
||||||
|
Monitor* MethodCompileQueue_lock = NULL;
|
||||||
|
Monitor* CompileThread_lock = NULL;
|
||||||
|
Monitor* Compilation_lock = NULL;
|
||||||
|
+Monitor* DcevmCompilation_lock = NULL;
|
||||||
|
Mutex* CompileTaskAlloc_lock = NULL;
|
||||||
|
Mutex* CompileStatistics_lock = NULL;
|
||||||
|
Mutex* DirectivesStack_lock = NULL;
|
||||||
|
@@ -318,6 +319,8 @@ void mutex_init() {
|
||||||
|
def(Compilation_lock , PaddedMonitor, leaf, false, _safepoint_check_never);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ def(DcevmCompilation_lock , PaddedMonitor, nonleaf+1, false, _safepoint_check_never);
|
||||||
|
+
|
||||||
|
#if INCLUDE_JFR
|
||||||
|
def(JfrMsg_lock , PaddedMonitor, leaf, true, _safepoint_check_always);
|
||||||
|
def(JfrBuffer_lock , PaddedMutex , leaf, true, _safepoint_check_never);
|
||||||
|
diff --git a/src/hotspot/share/runtime/mutexLocker.hpp b/src/hotspot/share/runtime/mutexLocker.hpp
|
||||||
|
index 65a6366bbfb..4333bd51464 100644
|
||||||
|
--- a/src/hotspot/share/runtime/mutexLocker.hpp
|
||||||
|
+++ b/src/hotspot/share/runtime/mutexLocker.hpp
|
||||||
|
@@ -80,6 +80,7 @@ extern Mutex* Compile_lock; // a lock held when Compilation
|
||||||
|
extern Monitor* MethodCompileQueue_lock; // a lock held when method compilations are enqueued, dequeued
|
||||||
|
extern Monitor* CompileThread_lock; // a lock held by compile threads during compilation system initialization
|
||||||
|
extern Monitor* Compilation_lock; // a lock used to pause compilation
|
||||||
|
+extern Monitor* DcevmCompilation_lock; // a lock used to pause compilation from dcevm
|
||||||
|
extern Mutex* CompileTaskAlloc_lock; // a lock held when CompileTasks are allocated
|
||||||
|
extern Mutex* CompileStatistics_lock; // a lock held when updating compilation statistics
|
||||||
|
extern Mutex* DirectivesStack_lock; // a lock held when mutating the dirstack and ref counting directives
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
111
jb/project/tools/patches/dcevm/0044-G1-fixes-code-cleanup.patch
Normal file
111
jb/project/tools/patches/dcevm/0044-G1-fixes-code-cleanup.patch
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
From c45eb681e77d16b7e873c8e4dbd19f98879a102a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Sat, 6 Nov 2021 19:47:08 +0100
|
||||||
|
Subject: [PATCH 44/45] G1 fixes, code cleanup
|
||||||
|
|
||||||
|
---
|
||||||
|
src/hotspot/share/compiler/compileBroker.cpp | 2 ++
|
||||||
|
src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp | 4 +---
|
||||||
|
src/hotspot/share/gc/g1/g1FullGCPrepareTask.cpp | 4 ++++
|
||||||
|
src/hotspot/share/gc/shared/gcConfig.cpp | 6 +++---
|
||||||
|
src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp | 3 ++-
|
||||||
|
5 files changed, 12 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/compiler/compileBroker.cpp b/src/hotspot/share/compiler/compileBroker.cpp
|
||||||
|
index 878bc265d2f..d8275508f9b 100644
|
||||||
|
--- a/src/hotspot/share/compiler/compileBroker.cpp
|
||||||
|
+++ b/src/hotspot/share/compiler/compileBroker.cpp
|
||||||
|
@@ -2958,6 +2958,8 @@ void CompileBroker::print_heapinfo(outputStream* out, const char* function, size
|
||||||
|
}
|
||||||
|
|
||||||
|
void CompileBroker::stopCompilationBeforeEnhancedRedefinition() {
|
||||||
|
+ // There are hard to fix C1/C2 race conditions with dcevm. The easiest solution
|
||||||
|
+ // is to stop compilation.
|
||||||
|
if (AllowEnhancedClassRedefinition) {
|
||||||
|
MonitorLocker locker(DcevmCompilation_lock, Mutex::_no_safepoint_check_flag);
|
||||||
|
_compilation_stopped = true;
|
||||||
|
diff --git a/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp b/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp
|
||||||
|
index 765630a9826..c5bffc9bc49 100644
|
||||||
|
--- a/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp
|
||||||
|
+++ b/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp
|
||||||
|
@@ -140,7 +140,6 @@ void G1FullGCCompactTask::compact_region_dcevm(HeapRegion* hr, GrowableArray<Hea
|
||||||
|
hr->apply_to_marked_objects(collector()->mark_bitmap(), &compact);
|
||||||
|
// Once all objects have been moved the liveness information
|
||||||
|
// needs be cleared.
|
||||||
|
- collector()->mark_bitmap()->clear_region(hr);
|
||||||
|
if (G1VerifyBitmaps) {
|
||||||
|
collector()->mark_bitmap()->clear_region(hr);
|
||||||
|
}
|
||||||
|
@@ -150,8 +149,7 @@ void G1FullGCCompactTask::compact_region_dcevm(HeapRegion* hr, GrowableArray<Hea
|
||||||
|
void G1FullGCCompactTask::serial_compaction_dcevm() {
|
||||||
|
GCTraceTime(Debug, gc, phases) tm("Phase 4: Serial Compaction", collector()->scope()->timer());
|
||||||
|
|
||||||
|
- // compact remaining, not parallel compacted rescued oops using serial compact point
|
||||||
|
-
|
||||||
|
+ // Clear allocated resources at compact points now, since all rescued oops are copied to destination.
|
||||||
|
for (uint i = 0; i < collector()->workers(); i++) {
|
||||||
|
G1FullGCCompactionPoint* cp = collector()->compaction_point(i);
|
||||||
|
DcevmSharedGC::clear_rescued_objects_heap(cp->rescued_oops_values());
|
||||||
|
diff --git a/src/hotspot/share/gc/g1/g1FullGCPrepareTask.cpp b/src/hotspot/share/gc/g1/g1FullGCPrepareTask.cpp
|
||||||
|
index 93c066383a1..aa199f57dd7 100644
|
||||||
|
--- a/src/hotspot/share/gc/g1/g1FullGCPrepareTask.cpp
|
||||||
|
+++ b/src/hotspot/share/gc/g1/g1FullGCPrepareTask.cpp
|
||||||
|
@@ -146,6 +146,9 @@ bool G1FullGCPrepareTask::G1CalculatePointersClosure::should_compact(HeapRegion*
|
||||||
|
if (hr->is_pinned()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
+ if (Universe::is_redefining_gc_run()) {
|
||||||
|
+ return true;
|
||||||
|
+ }
|
||||||
|
size_t live_words = _collector->live_words(hr->hrm_index());
|
||||||
|
size_t live_words_threshold = _collector->scope()->region_compaction_threshold();
|
||||||
|
// High live ratio region will not be compacted.
|
||||||
|
@@ -324,6 +327,7 @@ bool G1FullGCPrepareTask::G1PrepareCompactLiveClosureDcevm::must_rescue(oop old_
|
||||||
|
int new_size = old_obj->size_given_klass(oop(old_obj)->klass()->new_version());
|
||||||
|
int original_size = old_obj->size();
|
||||||
|
|
||||||
|
+ // what if old_obj > new_obj ?
|
||||||
|
bool overlap = (cast_from_oop<HeapWord*>(old_obj) + original_size < cast_from_oop<HeapWord*>(new_obj) + new_size);
|
||||||
|
|
||||||
|
return overlap;
|
||||||
|
diff --git a/src/hotspot/share/gc/shared/gcConfig.cpp b/src/hotspot/share/gc/shared/gcConfig.cpp
|
||||||
|
index 8e78696bef5..f8365f94214 100644
|
||||||
|
--- a/src/hotspot/share/gc/shared/gcConfig.cpp
|
||||||
|
+++ b/src/hotspot/share/gc/shared/gcConfig.cpp
|
||||||
|
@@ -96,9 +96,9 @@ void GCConfig::fail_if_non_included_gc_is_selected() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void GCConfig::select_gc_ergonomically() {
|
||||||
|
- if (AllowEnhancedClassRedefinition && !UseG1GC) {
|
||||||
|
- // (DCEVM) Enhanced class redefinition only supports serial GC at the moment
|
||||||
|
- FLAG_SET_ERGO(UseSerialGC, true);
|
||||||
|
+ if (AllowEnhancedClassRedefinition && !UseSerialGC) {
|
||||||
|
+ // (DCEVM) use G1 as default GC in Enhanced class redefinition
|
||||||
|
+ FLAG_SET_ERGO(UseG1GC, true);
|
||||||
|
} else if (os::is_server_class_machine()) {
|
||||||
|
#if INCLUDE_G1GC
|
||||||
|
FLAG_SET_ERGO_IF_DEFAULT(UseG1GC, true);
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index 8615806ac98..32e0fcbe62b 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -385,7 +385,7 @@ class ChangePointersOopClosure : public BasicOopIterateClosure {
|
||||||
|
bool oop_updated = false;
|
||||||
|
if (obj->is_instance() && InstanceKlass::cast(obj->klass())->is_mirror_instance_klass()) {
|
||||||
|
Klass* klass = java_lang_Class::as_Klass(obj);
|
||||||
|
- if (klass != NULL && klass->is_instance_klass()) {
|
||||||
|
+ if (klass != NULL && klass->is_instance_klass() && klass->new_version() != NULL) {
|
||||||
|
assert(obj == InstanceKlass::cast(klass)->java_mirror(), "just checking");
|
||||||
|
if (klass->new_version() != NULL) {
|
||||||
|
obj = InstanceKlass::cast(klass->new_version())->java_mirror();
|
||||||
|
@@ -578,6 +578,7 @@ void VM_EnhancedRedefineClasses::doit() {
|
||||||
|
if (log_is_enabled(Info, redefine, class, timer)) {
|
||||||
|
_timer_heap_iterate.start();
|
||||||
|
}
|
||||||
|
+ // returns after the iteration is finished
|
||||||
|
G1CollectedHeap::heap()->object_par_iterate(&objectClosure);
|
||||||
|
_timer_heap_iterate.stop();
|
||||||
|
} else {
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
From bb7c41e91326eaa90e25e02e13a2559adf41ae9e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||||
|
Date: Mon, 8 Nov 2021 19:51:41 +0100
|
||||||
|
Subject: [PATCH 45/45] JBR-3867 - fix dcevm redefinition stops due the not
|
||||||
|
updated weak oops
|
||||||
|
|
||||||
|
Dcevm must update also oops in weak storage using WeakProcessor. Oops
|
||||||
|
storage is new concept in java17.
|
||||||
|
---
|
||||||
|
src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
index 32e0fcbe62b..35dfc1a66d1 100644
|
||||||
|
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||||
|
@@ -67,6 +67,7 @@
|
||||||
|
#include "gc/shared/dcevmSharedGC.hpp"
|
||||||
|
#include "gc/shared/scavengableNMethods.hpp"
|
||||||
|
#include "gc/shared/oopStorageSet.inline.hpp"
|
||||||
|
+#include "gc/shared/weakProcessor.hpp"
|
||||||
|
#include "ci/ciObjectFactory.hpp"
|
||||||
|
|
||||||
|
Array<Method*>* VM_EnhancedRedefineClasses::_old_methods = NULL;
|
||||||
|
@@ -250,6 +251,7 @@ void VM_EnhancedRedefineClasses::root_oops_do(OopClosure *oopClosure) {
|
||||||
|
|
||||||
|
Threads::oops_do(oopClosure, NULL);
|
||||||
|
OopStorageSet::strong_oops_do(oopClosure);
|
||||||
|
+ WeakProcessor::oops_do(oopClosure);
|
||||||
|
|
||||||
|
CodeBlobToOopClosure blobClosure(oopClosure, CodeBlobToOopClosure::FixRelocations);
|
||||||
|
CodeCache::blobs_do(&blobClosure);
|
||||||
|
--
|
||||||
|
2.23.0
|
||||||
|
|
||||||
83
jb/project/tools/test/perfcmp.sh
Normal file
83
jb/project/tools/test/perfcmp.sh
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
|
||||||
|
usage ()
|
||||||
|
{
|
||||||
|
echo "Usage: perfcmp.sh [options] <test_results_cur> <test_results_ref> <results> <test_prefix> <noHeaders>"
|
||||||
|
echo "Options:"
|
||||||
|
echo -e " -h, --help\tdisplay this help"
|
||||||
|
echo -e " -tc\tprint teacmity statistic"
|
||||||
|
echo -e "test_results_cur - the file with metrics values for the current measuring"
|
||||||
|
echo -e "test_results_ref - the file with metrics values for the reference measuring"
|
||||||
|
echo -e "results - results of comaprison"
|
||||||
|
echo -e "test_prefix - specifys measuring type, makes sense for enabled -tc, by default no prefixes"
|
||||||
|
echo -e "noHeaders - by default 1-st line contains headers"
|
||||||
|
echo -e ""
|
||||||
|
echo -e "test_results_* files content should be in csv format with header and tab separator:"
|
||||||
|
echo -e "The 1-st column is the test name"
|
||||||
|
echo -e "The 2-st column is the test value"
|
||||||
|
echo -e ""
|
||||||
|
echo -e "Example:"
|
||||||
|
echo -e "Test Value"
|
||||||
|
echo -e "Testname 51.54"
|
||||||
|
}
|
||||||
|
|
||||||
|
while [ -n "$1" ]
|
||||||
|
do
|
||||||
|
case "$1" in
|
||||||
|
-h | --help) usage
|
||||||
|
exit 1 ;;
|
||||||
|
-tc) tc=1
|
||||||
|
shift
|
||||||
|
break ;;
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "$#" < "3" ]]; then
|
||||||
|
echo "Error: Invalid arguments"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
curFile=$1
|
||||||
|
refFile=$2
|
||||||
|
resFile=$3
|
||||||
|
testNamePrefix=$4
|
||||||
|
noHeaders=$5
|
||||||
|
echo $curFile
|
||||||
|
echo $refFile
|
||||||
|
echo $resFile
|
||||||
|
|
||||||
|
curValues=`cat "$curFile" | cut -f 2 | tr -d '\t'`
|
||||||
|
if [ -z noHeaders ]; then
|
||||||
|
curValuesHeader=`echo "$curValues" | head -n +1`_cur
|
||||||
|
header=`cat "$refFile" | head -n +1 | awk -F'\t' -v x=$curValuesHeader '{print " "$1"\t"$2"_ref\t"x"\tratio"}'`
|
||||||
|
testContent=`paste -d '\t' $refFile <(echo "$curValues") | tail -n +2`
|
||||||
|
else
|
||||||
|
testContent=`paste -d '\t' $refFile <(echo "$curValues") | tail -n +1`
|
||||||
|
fi
|
||||||
|
|
||||||
|
testContent=`echo "$testContent" | awk -F'\t' '{ if ($3>$2+$2*0.1) {print "* "$1"\t"$2"\t"$3"\t"(($2==0)?"-":$3/$2)} else {print " "$1"\t"$2"\t"$3"\t"(($2==0)?"-":$3/$2)} }'`
|
||||||
|
if [ -z noHeaders ]; then
|
||||||
|
echo "$header" > $resFile
|
||||||
|
fi
|
||||||
|
echo "$testContent" >> $resFile
|
||||||
|
cat "$resFile" | tr '\t' ';' | column -t -s ';' | tee $resFile
|
||||||
|
|
||||||
|
if [ -z $tc ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$testContent" 2>&1 | (
|
||||||
|
while read -r s; do
|
||||||
|
testname=`echo "$s" | cut -f 1 | tr -d "[:space:]" | tr -d "*"`
|
||||||
|
duration=`echo "$s" | cut -f 3`
|
||||||
|
failed=`echo "$s" | cut -c1 | grep -c "*"`
|
||||||
|
echo \#\#teamcity[testStarted name=\'$testNamePrefix$testname\']
|
||||||
|
echo "===>$s"
|
||||||
|
echo \#\#teamcity[buildStatisticValue key=\'$testNamePrefix$testname\' value=\'$duration\']
|
||||||
|
[ $failed -eq 1 ] && echo \#\#teamcity[testFailed name=\'$testNamePrefix$testname\' message=\'$s\']
|
||||||
|
echo \#\#teamcity[testFinished name=\'$testNamePrefix$testname\' duration=\'$duration\']
|
||||||
|
failed=0
|
||||||
|
done
|
||||||
|
)
|
||||||
142
jb/project/tools/windows/scripts/mkimages_x64.sh
Executable file
142
jb/project/tools/windows/scripts/mkimages_x64.sh
Executable file
@@ -0,0 +1,142 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
|
||||||
|
# The following parameters must be specified:
|
||||||
|
# JBSDK_VERSION - specifies major version of OpenJDK e.g. 11_0_6 (instead of dots '.' underbars "_" are used)
|
||||||
|
# JDK_BUILD_NUMBER - specifies update release of OpenJDK build or the value of --with-version-build argument to configure
|
||||||
|
# build_number - specifies the number of JetBrainsRuntime build
|
||||||
|
# bundle_type - specifies bundle to be built; possible values:
|
||||||
|
# <empty> or nomod - the release bundles without any additional modules (jcef)
|
||||||
|
# jcef - the release bundles with jcef
|
||||||
|
# fd - the fastdebug bundles which also include the jcef module
|
||||||
|
#
|
||||||
|
# jbrsdk-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
# jbr-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
#
|
||||||
|
# $ ./java --version
|
||||||
|
# openjdk 11.0.6 2020-01-14
|
||||||
|
# OpenJDK Runtime Environment (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number})
|
||||||
|
# OpenJDK 64-Bit Server VM (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number}, mixed mode)
|
||||||
|
#
|
||||||
|
# Environment variables:
|
||||||
|
# JCEF_PATH - specifies the path to the directory with JCEF binaries.
|
||||||
|
# By default JCEF binaries should be located in ./jcef_win_x64
|
||||||
|
|
||||||
|
while getopts ":i?" o; do
|
||||||
|
case "${o}" in
|
||||||
|
i)
|
||||||
|
i="incremental build"
|
||||||
|
INC_BUILD=1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
shift $((OPTIND-1))
|
||||||
|
|
||||||
|
JBSDK_VERSION=$1
|
||||||
|
JDK_BUILD_NUMBER=$2
|
||||||
|
build_number=$3
|
||||||
|
bundle_type=$4
|
||||||
|
JBSDK_VERSION_WITH_DOTS=$(echo $JBSDK_VERSION | sed 's/_/\./g')
|
||||||
|
WORK_DIR=$(pwd)
|
||||||
|
JCEF_PATH=${JCEF_PATH:=$WORK_DIR/jcef_win_x64}
|
||||||
|
|
||||||
|
source jb/project/tools/common/scripts/common.sh
|
||||||
|
|
||||||
|
function do_configure {
|
||||||
|
sh ./configure \
|
||||||
|
$WITH_DEBUG_LEVEL \
|
||||||
|
--with-vendor-name="$VENDOR_NAME" \
|
||||||
|
--with-vendor-version-string="$VENDOR_VERSION_STRING" \
|
||||||
|
--with-jvm-features=shenandoahgc \
|
||||||
|
--with-version-pre= \
|
||||||
|
--with-version-build=$JDK_BUILD_NUMBER \
|
||||||
|
--with-version-opt=b${build_number} \
|
||||||
|
--with-toolchain-version=$TOOLCHAIN_VERSION \
|
||||||
|
--with-boot-jdk=$BOOT_JDK \
|
||||||
|
--disable-ccache \
|
||||||
|
--enable-cds=yes || do_exit $?
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_image_bundle {
|
||||||
|
__bundle_name=$1
|
||||||
|
__arch_name=$2
|
||||||
|
__modules_path=$3
|
||||||
|
__modules=$4
|
||||||
|
|
||||||
|
[ "$bundle_type" == "fd" ] && [ "$__arch_name" == "$JBRSDK_BUNDLE" ] && __bundle_name=$__arch_name && fastdebug_infix="fastdebug-"
|
||||||
|
|
||||||
|
echo Running jlink ...
|
||||||
|
${JSDK}/bin/jlink \
|
||||||
|
--module-path $__modules_path --no-man-pages --compress=2 \
|
||||||
|
--add-modules $__modules --output $__arch_name || do_exit $?
|
||||||
|
|
||||||
|
grep -v "^JAVA_VERSION" "$JSDK"/release | grep -v "^MODULES" >> $__arch_name/release
|
||||||
|
if [ "$__arch_name" == "$JBRSDK_BUNDLE" ]; then
|
||||||
|
sed 's/JBR/JBRSDK/g' $__arch_name/release > release
|
||||||
|
mv release $__arch_name/release
|
||||||
|
copy_jmods "$__modules" "$__modules_path" "$__arch_name"/jmods
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
WITH_DEBUG_LEVEL="--with-debug-level=release"
|
||||||
|
RELEASE_NAME=windows-x86_64-server-release
|
||||||
|
|
||||||
|
case "$bundle_type" in
|
||||||
|
"jcef")
|
||||||
|
do_reset_changes=0
|
||||||
|
;;
|
||||||
|
"dcevm")
|
||||||
|
HEAD_REVISION=$(git rev-parse HEAD)
|
||||||
|
git am jb/project/tools/patches/dcevm/*.patch || do_exit $?
|
||||||
|
do_reset_dcevm=0
|
||||||
|
do_reset_changes=0
|
||||||
|
;;
|
||||||
|
"nomod" | "")
|
||||||
|
bundle_type=""
|
||||||
|
;;
|
||||||
|
"fd")
|
||||||
|
do_reset_changes=0
|
||||||
|
WITH_DEBUG_LEVEL="--with-debug-level=fastdebug"
|
||||||
|
RELEASE_NAME=windows-x86_64-server-fastdebug
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -z "$INC_BUILD" ]; then
|
||||||
|
do_configure || do_exit $?
|
||||||
|
if [ -z "$bundle_type" ]; then
|
||||||
|
make LOG=info CONF=$RELEASE_NAME clean images test-image || do_exit $?
|
||||||
|
else
|
||||||
|
make LOG=info CONF=$RELEASE_NAME clean images || do_exit $?
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ -z "$bundle_type" ]; then
|
||||||
|
make LOG=info CONF=$RELEASE_NAME images test-image || do_exit $?
|
||||||
|
else
|
||||||
|
make LOG=info CONF=$RELEASE_NAME images || do_exit $?
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
IMAGES_DIR=build/$RELEASE_NAME/images
|
||||||
|
JSDK=$IMAGES_DIR/jdk
|
||||||
|
JSDK_MODS_DIR=$IMAGES_DIR/jmods
|
||||||
|
JBRSDK_BUNDLE=jbrsdk
|
||||||
|
|
||||||
|
if [ "$bundle_type" == "jcef" ] || [ "$bundle_type" == "dcevm" ] || [ "$bundle_type" == "fd" ]; then
|
||||||
|
git apply -p0 < jb/project/tools/patches/add_jcef_module.patch || do_exit $?
|
||||||
|
update_jsdk_mods "$JSDK" "$JCEF_PATH"/jmods "$JSDK"/jmods "$JSDK_MODS_DIR" || do_exit $?
|
||||||
|
cp $JCEF_PATH/jmods/* ${JSDK_MODS_DIR} # $JSDK/jmods is not unchanged
|
||||||
|
|
||||||
|
jbr_name_postfix="_${bundle_type}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# create runtime image bundle
|
||||||
|
modules=$(xargs < modules.list | sed s/" "//g) || do_exit $?
|
||||||
|
create_image_bundle "jbr${jbr_name_postfix}" "jbr" $JSDK_MODS_DIR "$modules" || do_exit $?
|
||||||
|
|
||||||
|
# create sdk image bundle
|
||||||
|
modules=$(cat ${JSDK}/release | grep MODULES | sed s/MODULES=//g | sed s/' '/','/g | sed s/\"//g | sed s/\\r//g | sed s/\\n//g)
|
||||||
|
if [ "$bundle_type" == "jcef" ] || [ "$bundle_type" == "dcevm" ] || [ "$bundle_type" == "fd" ] || [ "$bundle_type" == "$JBRSDK_BUNDLE" ]; then
|
||||||
|
modules=${modules},$(get_mods_list "$JCEF_PATH"/jmods)
|
||||||
|
fi
|
||||||
|
create_image_bundle "$JBRSDK_BUNDLE${jbr_name_postfix}" "$JBRSDK_BUNDLE" "$JSDK_MODS_DIR" "$modules" || do_exit $?
|
||||||
|
|
||||||
|
do_exit 0
|
||||||
62
jb/project/tools/windows/scripts/mkimages_x86.sh
Executable file
62
jb/project/tools/windows/scripts/mkimages_x86.sh
Executable file
@@ -0,0 +1,62 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
|
||||||
|
# The following parameters must be specified:
|
||||||
|
# JBSDK_VERSION - specifies the current version of OpenJDK e.g. 11_0_6
|
||||||
|
# JDK_BUILD_NUMBER - specifies the number of OpenJDK build or the value of --with-version-build argument to configure
|
||||||
|
# build_number - specifies the number of JetBrainsRuntime build
|
||||||
|
#
|
||||||
|
# jbrsdk-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
# jbr-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
#
|
||||||
|
# $ ./java --version
|
||||||
|
# openjdk 11.0.6 2020-01-14
|
||||||
|
# OpenJDK Runtime Environment (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number})
|
||||||
|
# OpenJDK 64-Bit Server VM (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number}, mixed mode)
|
||||||
|
#
|
||||||
|
|
||||||
|
JBSDK_VERSION=$1
|
||||||
|
JDK_BUILD_NUMBER=$2
|
||||||
|
build_number=$3
|
||||||
|
|
||||||
|
JBSDK_VERSION_WITH_DOTS=$(echo $JBSDK_VERSION | sed 's/_/\./g')
|
||||||
|
|
||||||
|
source jb/project/tools/common/scripts/common.sh
|
||||||
|
|
||||||
|
JBRSDK_BASE_NAME=jbrsdk-${JBSDK_VERSION}
|
||||||
|
WORK_DIR=$(pwd)
|
||||||
|
|
||||||
|
[ -z "$bundle_type" ] && (git apply -p0 < jb/project/tools/patches/exclude_jcef_module.patch || exit $?)
|
||||||
|
|
||||||
|
PATH="/usr/local/bin:/usr/bin:${PATH}"
|
||||||
|
./configure \
|
||||||
|
--with-target-bits=32 \
|
||||||
|
--with-vendor-name="${VENDOR_NAME}" \
|
||||||
|
--with-vendor-version-string="${VENDOR_VERSION_STRING}" \
|
||||||
|
--with-version-pre= \
|
||||||
|
--with-version-build=${JDK_BUILD_NUMBER} \
|
||||||
|
--with-version-opt=b${build_number} \
|
||||||
|
--with-toolchain-version=${TOOLCHAIN_VERSION} \
|
||||||
|
--with-boot-jdk=${BOOT_JDK} \
|
||||||
|
--disable-ccache \
|
||||||
|
--enable-cds=yes || exit 1
|
||||||
|
make clean CONF=windows-x86-server-release || exit 1
|
||||||
|
make LOG=info images CONF=windows-x86-server-release test-image || exit 1
|
||||||
|
|
||||||
|
JBSDK=${JBRSDK_BASE_NAME}-windows-x86-b${build_number}
|
||||||
|
BASE_DIR=build/windows-x86-server-release/images
|
||||||
|
JSDK=${BASE_DIR}/jdk
|
||||||
|
JBRSDK_BUNDLE=jbrsdk
|
||||||
|
|
||||||
|
rm -rf ${BASE_DIR}/${JBRSDK_BUNDLE} && rsync -a --exclude demo --exclude sample ${JSDK}/ ${JBRSDK_BUNDLE} || exit 1
|
||||||
|
sed 's/JBR/JBRSDK/g' ${JSDK}/release > release
|
||||||
|
mv release ${JBRSDK_BUNDLE}/release
|
||||||
|
|
||||||
|
JBR_BUNDLE=jbr
|
||||||
|
rm -rf ${JBR_BUNDLE}
|
||||||
|
grep -v javafx modules.list | grep -v "jdk.internal.vm\|jdk.aot\|jcef" > modules.list.x86
|
||||||
|
${JSDK}/bin/jlink \
|
||||||
|
--module-path ${JSDK}/jmods --no-man-pages --compress=2 \
|
||||||
|
--add-modules $(xargs < modules.list.x86 | sed s/" "//g) --output ${JBR_BUNDLE} || exit $?
|
||||||
|
|
||||||
|
echo Modifying release info ...
|
||||||
|
#grep -v \"^JAVA_VERSION\" ${JSDK}/release | grep -v \"^MODULES\" >> ${JBR_BUNDLE}/release
|
||||||
58
jb/project/tools/windows/scripts/pack_x64.sh
Executable file
58
jb/project/tools/windows/scripts/pack_x64.sh
Executable file
@@ -0,0 +1,58 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
|
||||||
|
# The following parameters must be specified:
|
||||||
|
# JBSDK_VERSION - specifies major version of OpenJDK e.g. 11_0_6 (instead of dots '.' underbars "_" are used)
|
||||||
|
# JDK_BUILD_NUMBER - specifies udate release of OpenJDK build or the value of --with-version-build argument to configure
|
||||||
|
# build_number - specifies the number of JetBrainsRuntime build
|
||||||
|
# bundle_type - specifies bundle to be built; possible values:
|
||||||
|
# <empty> or nomod - the bundles without any additional modules (jcef)
|
||||||
|
# jcef - the bundles with jcef
|
||||||
|
# fd - the fastdebug bundles which also include the jcef module
|
||||||
|
#
|
||||||
|
# jbrsdk-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
# jbr-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
#
|
||||||
|
# $ ./java --version
|
||||||
|
# openjdk 11.0.6 2020-01-14
|
||||||
|
# OpenJDK Runtime Environment (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number})
|
||||||
|
# OpenJDK 64-Bit Server VM (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number}, mixed mode)
|
||||||
|
#
|
||||||
|
|
||||||
|
source jb/project/tools/common/scripts/common.sh
|
||||||
|
|
||||||
|
JBSDK_VERSION=$1
|
||||||
|
JDK_BUILD_NUMBER=$2
|
||||||
|
build_number=$3
|
||||||
|
bundle_type=$4
|
||||||
|
|
||||||
|
function pack_jbr {
|
||||||
|
__bundle_name=$1
|
||||||
|
__arch_name=$2
|
||||||
|
|
||||||
|
[ "$bundle_type" == "fd" ] && [ "$__arch_name" == "$JBRSDK_BUNDLE" ] && __bundle_name=$__arch_name && fastdebug_infix="fastdebug-"
|
||||||
|
JBR=${__bundle_name}-${JBSDK_VERSION}-windows-x64-${fastdebug_infix}b${build_number}
|
||||||
|
|
||||||
|
echo Creating $JBR.tar.gz ...
|
||||||
|
|
||||||
|
/usr/bin/tar -czf $JBR.tar.gz -C $BASE_DIR $__arch_name || do_exit $?
|
||||||
|
}
|
||||||
|
|
||||||
|
[ "$bundle_type" == "nomod" ] && bundle_type=""
|
||||||
|
|
||||||
|
JBRSDK_BUNDLE=jbrsdk
|
||||||
|
RELEASE_NAME=windows-x86_64-server-release
|
||||||
|
IMAGES_DIR=build/$RELEASE_NAME/images
|
||||||
|
BASE_DIR=.
|
||||||
|
|
||||||
|
if [ "$bundle_type" == "jcef" ] || [ "$bundle_type" == "dcevm" ] || [ "$bundle_type" == "fd" ]; then
|
||||||
|
jbr_name_postfix="_${bundle_type}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
pack_jbr jbr${jbr_name_postfix} jbr
|
||||||
|
pack_jbr jbrsdk${jbr_name_postfix} jbrsdk
|
||||||
|
|
||||||
|
if [ -z "$bundle_type" ]; then
|
||||||
|
JBRSDK_TEST=$JBRSDK_BUNDLE-$JBSDK_VERSION-windows-test-x64-b$build_number
|
||||||
|
echo Creating $JBRSDK_TEST.tar.gz ...
|
||||||
|
/usr/bin/tar -czf $JBRSDK_TEST.tar.gz -C $IMAGES_DIR --exclude='test/jdk/demos' test || do_exit $?
|
||||||
|
fi
|
||||||
42
jb/project/tools/windows/scripts/pack_x86.sh
Executable file
42
jb/project/tools/windows/scripts/pack_x86.sh
Executable file
@@ -0,0 +1,42 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
|
||||||
|
# The following parameters must be specified:
|
||||||
|
# JBSDK_VERSION - specifies the current version of OpenJDK e.g. 11_0_6
|
||||||
|
# JDK_BUILD_NUMBER - specifies the number of OpenJDK build or the value of --with-version-build argument to configure
|
||||||
|
# build_number - specifies the number of JetBrainsRuntime build
|
||||||
|
#
|
||||||
|
# jbrsdk-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
# jbr-${JBSDK_VERSION}-osx-x64-b${build_number}.tar.gz
|
||||||
|
#
|
||||||
|
# $ ./java --version
|
||||||
|
# openjdk 11.0.6 2020-01-14
|
||||||
|
# OpenJDK Runtime Environment (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number})
|
||||||
|
# OpenJDK 64-Bit Server VM (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number}, mixed mode)
|
||||||
|
#
|
||||||
|
|
||||||
|
JBSDK_VERSION=$1
|
||||||
|
JDK_BUILD_NUMBER=$2
|
||||||
|
build_number=$3
|
||||||
|
|
||||||
|
JBRSDK_BASE_NAME=jbrsdk-$JBSDK_VERSION
|
||||||
|
JBR_BASE_NAME=jbr-$JBSDK_VERSION
|
||||||
|
|
||||||
|
IMAGES_DIR=build/windows-x86-server-release/images
|
||||||
|
JSDK=$IMAGES_DIR/jdk
|
||||||
|
JBSDK=$JBRSDK_BASE_NAME-windows-x86-b$build_number
|
||||||
|
BASE_DIR=.
|
||||||
|
|
||||||
|
JBRSDK_BUNDLE=jbrsdk
|
||||||
|
echo Creating $JBSDK.tar.gz ...
|
||||||
|
/usr/bin/tar -czf $JBSDK.tar.gz $JBRSDK_BUNDLE || exit 1
|
||||||
|
|
||||||
|
JBR_BUNDLE=jbr
|
||||||
|
JBR_BASE_NAME=jbr-${JBSDK_VERSION}
|
||||||
|
|
||||||
|
JBR=$JBR_BASE_NAME-windows-x86-b$build_number
|
||||||
|
echo Creating $JBR.tar.gz ...
|
||||||
|
/usr/bin/tar -czf $JBR.tar.gz -C $BASE_DIR ${JBR_BUNDLE} || exit 1
|
||||||
|
|
||||||
|
JBRSDK_TEST=$JBRSDK_BASE_NAME-windows-test-x86-b$build_number
|
||||||
|
echo Creating $JBRSDK_TEST.tar.gz ...
|
||||||
|
/usr/bin/tar -czf $JBRSDK_TEST.tar.gz -C $IMAGES_DIR --exclude='test/jdk/demos' test || exit 1
|
||||||
@@ -213,12 +213,12 @@ endif
|
|||||||
|
|
||||||
ifeq ($(call isTargetOs, windows), true)
|
ifeq ($(call isTargetOs, windows), true)
|
||||||
ifeq ($(SHIP_DEBUG_SYMBOLS), )
|
ifeq ($(SHIP_DEBUG_SYMBOLS), )
|
||||||
JMOD_FLAGS += --exclude '**{_the.*,_*.marker,*.diz,*.pdb,*.map}'
|
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.diz,*.pdb,*.map}'
|
||||||
else
|
else
|
||||||
JMOD_FLAGS += --exclude '**{_the.*,_*.marker,*.diz,*.map}'
|
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.diz,*.map}'
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
JMOD_FLAGS += --exclude '**{_the.*,_*.marker,*.diz,*.debuginfo,*.dSYM/**,*.dSYM}'
|
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.diz,*.debuginfo,*.dSYM/**,*.dSYM}'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Create jmods in the support dir and then move them into place to keep the
|
# Create jmods in the support dir and then move them into place to keep the
|
||||||
|
|||||||
80
make/JBRApi.gmk
Normal file
80
make/JBRApi.gmk
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
#
|
||||||
|
# Copyright 2000-2021 JetBrains s.r.o.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
include $(SPEC)
|
||||||
|
include MakeBase.gmk
|
||||||
|
include JavaCompilation.gmk
|
||||||
|
|
||||||
|
JBR_API_ROOT_DIR := $(TOPDIR)/src/jetbrains.api
|
||||||
|
JBR_API_GENSRC_TEMPLATES := $(JBR_API_ROOT_DIR)/templates
|
||||||
|
JBR_API_SRC_DIR := $(JBR_API_ROOT_DIR)/src
|
||||||
|
JBR_API_OUTPUT_DIR := $(OUTPUTDIR)/jbr-api
|
||||||
|
JBR_API_GENSRC_DIR := $(JBR_API_OUTPUT_DIR)/gensrc
|
||||||
|
JBR_API_BIN_DIR := $(JBR_API_OUTPUT_DIR)/bin
|
||||||
|
JBR_API_VERSION_PROPERTIES := $(JBR_API_ROOT_DIR)/version.properties
|
||||||
|
|
||||||
|
JBR_API_GENSRC_SOURCES := $(call FindFiles, $(JBR_API_GENSRC_TEMPLATES))
|
||||||
|
JBR_API_GENSRC_FILES := $(foreach f, $(call FindFiles, $(JBR_API_GENSRC_TEMPLATES)/com), \
|
||||||
|
$(JBR_API_GENSRC_DIR)/$(call RelativePath, $f, $(JBR_API_GENSRC_TEMPLATES)))
|
||||||
|
JBR_API_SRC_FILES := $(call FindFiles, $(JBR_API_SRC_DIR))
|
||||||
|
|
||||||
|
ifeq ($(JBR_API_JBR_VERSION),)
|
||||||
|
JBR_API_JBR_VERSION := <DEVELOPMENT>
|
||||||
|
JBR_API_FAIL_ON_HASH_MISMATCH := false
|
||||||
|
else
|
||||||
|
.PHONY: $(JBR_API_VERSION_PROPERTIES)
|
||||||
|
JBR_API_FAIL_ON_HASH_MISMATCH := true
|
||||||
|
endif
|
||||||
|
|
||||||
|
ARCHIVE_BUILD_JBR_API_BIN := $(JBR_API_BIN_DIR)
|
||||||
|
$(eval $(call SetupJavaCompilation, BUILD_JBR_API, \
|
||||||
|
SMALL_JAVA := true, \
|
||||||
|
COMPILER := bootjdk, \
|
||||||
|
SRC := $(JBR_API_GENSRC_DIR) $(JBR_API_SRC_DIR), \
|
||||||
|
EXTRA_FILES := $(JBR_API_GENSRC_FILES), \
|
||||||
|
BIN := $(JBR_API_BIN_DIR), \
|
||||||
|
JAR := $(JBR_API_OUTPUT_DIR)/jbr-api.jar, \
|
||||||
|
))
|
||||||
|
|
||||||
|
$(eval $(call SetupJarArchive, BUILD_JBR_API_SOURCES_JAR, \
|
||||||
|
DEPENDENCIES := $(JBR_API_GENSRC_FILES) $(JBR_API_SRC_FILES), \
|
||||||
|
SRCS := $(JBR_API_GENSRC_DIR) $(JBR_API_SRC_DIR), \
|
||||||
|
JAR := $(JBR_API_OUTPUT_DIR)/jbr-api-sources.jar, \
|
||||||
|
SUFFIXES := .java, \
|
||||||
|
BIN := $(JBR_API_BIN_DIR), \
|
||||||
|
))
|
||||||
|
|
||||||
|
$(JBR_API_GENSRC_FILES): $(JBR_API_GENSRC_SOURCES) $(JBR_API_SRC_FILES) $(JBR_API_VERSION_PROPERTIES)
|
||||||
|
$(ECHO) Generating sources for JBR API
|
||||||
|
$(JAVA_CMD) $(JAVA_FLAGS_SMALL) "$(JBR_API_GENSRC_TEMPLATES)/Gensrc.java" \
|
||||||
|
"$(TOPDIR)/src" "$(JBR_API_OUTPUT_DIR)" "$(JBR_API_JBR_VERSION)"
|
||||||
|
|
||||||
|
jbr-api-check-version: $(JBR_API_GENSRC_FILES) $(JBR_API_SRC_FILES) $(JBR_API_VERSION_PROPERTIES)
|
||||||
|
$(JAVA_CMD) $(JAVA_FLAGS_SMALL) "$(JBR_API_GENSRC_TEMPLATES)/CheckVersion.java" \
|
||||||
|
"$(JBR_API_ROOT_DIR)" "$(JBR_API_GENSRC_DIR)" "$(JBR_API_FAIL_ON_HASH_MISMATCH)"
|
||||||
|
|
||||||
|
jbr-api: $(BUILD_JBR_API) $(BUILD_JBR_API_SOURCES_JAR) jbr-api-check-version
|
||||||
|
|
||||||
|
.PHONY: jbr-api jbr-api-check-version
|
||||||
|
|
||||||
|
ifneq ($(JBR_API_CONF_FILE),)
|
||||||
|
$(JBR_API_CONF_FILE): $(JBR_API_GENSRC_FILES)
|
||||||
|
$(ECHO) "VERSION=`$(CAT) $(JBR_API_OUTPUT_DIR)/jbr-api.version`" > $(JBR_API_CONF_FILE)
|
||||||
|
$(ECHO) "JAR=$(JBR_API_OUTPUT_DIR)/jbr-api.jar" >> $(JBR_API_CONF_FILE)
|
||||||
|
$(ECHO) "SOURCES_JAR=$(JBR_API_OUTPUT_DIR)/jbr-api-sources.jar" >> $(JBR_API_CONF_FILE)
|
||||||
|
jbr-api: $(JBR_API_CONF_FILE)
|
||||||
|
.PHONY: $(JBR_API_CONF_FILE)
|
||||||
|
endif
|
||||||
@@ -857,6 +857,9 @@ else
|
|||||||
# virtual target.
|
# virtual target.
|
||||||
jdk.jdwp.agent-libs: jdk.jdwp.agent-gensrc
|
jdk.jdwp.agent-libs: jdk.jdwp.agent-gensrc
|
||||||
|
|
||||||
|
# jdk.jfr-gendata uses TOOL_JFR_GEN from buildtools-hotspot
|
||||||
|
jdk.jfr-gendata: buildtools-hotspot
|
||||||
|
|
||||||
# The swing beans need to have java base properly generated to avoid errors
|
# The swing beans need to have java base properly generated to avoid errors
|
||||||
# in javadoc. The X11 wrappers need the java.base include files to have been
|
# in javadoc. The X11 wrappers need the java.base include files to have been
|
||||||
# copied and processed.
|
# copied and processed.
|
||||||
@@ -1322,6 +1325,14 @@ create-main-targets-include:
|
|||||||
@$(ECHO) ALL_MAIN_TARGETS := $(sort $(ALL_TARGETS)) > \
|
@$(ECHO) ALL_MAIN_TARGETS := $(sort $(ALL_TARGETS)) > \
|
||||||
$(MAKESUPPORT_OUTPUTDIR)/main-targets.gmk
|
$(MAKESUPPORT_OUTPUTDIR)/main-targets.gmk
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# JBR API
|
||||||
|
|
||||||
|
$(eval $(call SetupTarget, jbr-api, \
|
||||||
|
MAKEFILE := JBRApi, \
|
||||||
|
TARGET := jbr-api \
|
||||||
|
))
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Hook to include the corresponding custom file, if present.
|
# Hook to include the corresponding custom file, if present.
|
||||||
$(eval $(call IncludeCustomExtension, Main-post.gmk))
|
$(eval $(call IncludeCustomExtension, Main-post.gmk))
|
||||||
|
|||||||
@@ -789,6 +789,15 @@ define SetupRunJtregTestBody
|
|||||||
$1_JTREG_BASIC_OPTIONS += -ea -esa
|
$1_JTREG_BASIC_OPTIONS += -ea -esa
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($$(ASAN_ENABLED), yes)
|
||||||
|
$1_JTREG_BASIC_OPTIONS += -e:ASAN_OPTIONS=handle_segv=0:handle_sigfpe=0:detect_leaks=false
|
||||||
|
$1_JTREG_BASIC_OPTIONS += -e:LD_PRELOAD=libasan.so.5
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($$(USAN_ENABLED), yes)
|
||||||
|
$1_JTREG_BASIC_OPTIONS += -e:LD_PRELOAD=libubsan.so.1
|
||||||
|
endif
|
||||||
|
|
||||||
ifneq ($$($1_JTREG_NATIVEPATH), )
|
ifneq ($$($1_JTREG_NATIVEPATH), )
|
||||||
$1_JTREG_BASIC_OPTIONS += -nativepath:$$($1_JTREG_NATIVEPATH)
|
$1_JTREG_BASIC_OPTIONS += -nativepath:$$($1_JTREG_NATIVEPATH)
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -217,6 +217,9 @@ JDKOPT_SETUP_CODE_COVERAGE
|
|||||||
# AddressSanitizer
|
# AddressSanitizer
|
||||||
JDKOPT_SETUP_ADDRESS_SANITIZER
|
JDKOPT_SETUP_ADDRESS_SANITIZER
|
||||||
|
|
||||||
|
# UndefinedBehaviorSanitizer
|
||||||
|
JDKOPT_SETUP_UNDEFINED_BEHAVIOR_SANITIZER
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Check dependencies for external and internal libraries.
|
# Check dependencies for external and internal libraries.
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ AC_DEFUN([FLAGS_SETUP_OPTIMIZATION],
|
|||||||
DISABLE_FORTIFY_CFLAGS="-U_FORTIFY_SOURCE"
|
DISABLE_FORTIFY_CFLAGS="-U_FORTIFY_SOURCE"
|
||||||
# ASan doesn't work well with _FORTIFY_SOURCE
|
# ASan doesn't work well with _FORTIFY_SOURCE
|
||||||
# See https://github.com/google/sanitizers/wiki/AddressSanitizer#faq
|
# See https://github.com/google/sanitizers/wiki/AddressSanitizer#faq
|
||||||
if test "x$ASAN_ENABLED" = xyes; then
|
if test "x$ASAN_ENABLED" = xyes || test "x$USAN_ENABLED" = xyes; then
|
||||||
ENABLE_FORTIFY_CFLAGS="${DISABLE_FORTIFY_CFLAGS}"
|
ENABLE_FORTIFY_CFLAGS="${DISABLE_FORTIFY_CFLAGS}"
|
||||||
else
|
else
|
||||||
ENABLE_FORTIFY_CFLAGS="-D_FORTIFY_SOURCE=2"
|
ENABLE_FORTIFY_CFLAGS="-D_FORTIFY_SOURCE=2"
|
||||||
|
|||||||
@@ -89,11 +89,11 @@ AC_DEFUN([FLAGS_SETUP_ASFLAGS],
|
|||||||
|
|
||||||
# Fix linker warning.
|
# Fix linker warning.
|
||||||
# Code taken from make/autoconf/flags-cflags.m4 and adapted.
|
# Code taken from make/autoconf/flags-cflags.m4 and adapted.
|
||||||
JVM_BASIC_ASFLAGS+="-DMAC_OS_X_VERSION_MIN_REQUIRED=$MACOSX_VERSION_MIN_NODOTS \
|
JVM_BASIC_ASFLAGS+=" -DMAC_OS_X_VERSION_MIN_REQUIRED=$MACOSX_VERSION_MIN_NODOTS \
|
||||||
-mmacosx-version-min=$MACOSX_VERSION_MIN"
|
-mmacosx-version-min=$MACOSX_VERSION_MIN"
|
||||||
|
|
||||||
if test -n "$MACOSX_VERSION_MAX"; then
|
if test -n "$MACOSX_VERSION_MAX"; then
|
||||||
JVM_BASIC_ASFLAGS+="$OS_CFLAGS \
|
JVM_BASIC_ASFLAGS+=" $OS_CFLAGS \
|
||||||
-DMAC_OS_X_VERSION_MAX_ALLOWED=$MACOSX_VERSION_MAX_NODOTS"
|
-DMAC_OS_X_VERSION_MAX_ALLOWED=$MACOSX_VERSION_MAX_NODOTS"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -436,6 +436,45 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_ADDRESS_SANITIZER],
|
|||||||
AC_SUBST(ASAN_ENABLED)
|
AC_SUBST(ASAN_ENABLED)
|
||||||
])
|
])
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# UndefinedBehaviorSanitizer
|
||||||
|
#
|
||||||
|
AC_DEFUN_ONCE([JDKOPT_SETUP_UNDEFINED_BEHAVIOR_SANITIZER],
|
||||||
|
[
|
||||||
|
UTIL_ARG_ENABLE(NAME: usan, DEFAULT: false,
|
||||||
|
DESC: [enable UndefinedBehaviorSanitizer],
|
||||||
|
CHECK_AVAILABLE: [
|
||||||
|
AC_MSG_CHECKING([if UndefinedBehaviorSanitizer (usan) is available])
|
||||||
|
if test "x$TOOLCHAIN_TYPE" = "xgcc" ||
|
||||||
|
test "x$TOOLCHAIN_TYPE" = "xclang"; then
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
AVAILABLE=false
|
||||||
|
fi
|
||||||
|
],
|
||||||
|
IF_ENABLED: [
|
||||||
|
USAN_FLAGS="-fsanitize=undefined"
|
||||||
|
USAN_CFLAGS="$USAN_FLAGS -fno-omit-frame-pointer"
|
||||||
|
USAN_LDFLAGS="$USAN_FLAGS"
|
||||||
|
JVM_CFLAGS="$JVM_CFLAGS $USAN_CFLAGS"
|
||||||
|
JVM_LDFLAGS="$JVM_LDFLAGS $USAN_LDFLAGS"
|
||||||
|
CFLAGS_JDKLIB="$CFLAGS_JDKLIB $USAN_CFLAGS"
|
||||||
|
CFLAGS_JDKEXE="$CFLAGS_JDKEXE $USAN_CFLAGS"
|
||||||
|
CXXFLAGS_JDKLIB="$CXXFLAGS_JDKLIB $USAN_CFLAGS"
|
||||||
|
CXXFLAGS_JDKEXE="$CXXFLAGS_JDKEXE $USAN_CFLAGS"
|
||||||
|
LDFLAGS_JDKLIB="$LDFLAGS_JDKLIB $USAN_LDFLAGS"
|
||||||
|
LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE $USAN_LDFLAGS"
|
||||||
|
USAN_ENABLED="yes"
|
||||||
|
],
|
||||||
|
IF_DISABLED: [
|
||||||
|
USAN_ENABLED="no"
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_SUBST(USAN_ENABLED)
|
||||||
|
])
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
#
|
#
|
||||||
# Static build support. When enabled will generate static
|
# Static build support. When enabled will generate static
|
||||||
|
|||||||
@@ -423,7 +423,16 @@ JCOV_FILTERS=@JCOV_FILTERS@
|
|||||||
export ASAN_ENABLED:=@ASAN_ENABLED@
|
export ASAN_ENABLED:=@ASAN_ENABLED@
|
||||||
export DEVKIT_LIB_DIR:=@DEVKIT_LIB_DIR@
|
export DEVKIT_LIB_DIR:=@DEVKIT_LIB_DIR@
|
||||||
ifeq ($(ASAN_ENABLED), yes)
|
ifeq ($(ASAN_ENABLED), yes)
|
||||||
export ASAN_OPTIONS=handle_segv=0 detect_leaks=0
|
export ASAN_OPTIONS=handle_segv=0:handle_sigfpe=0:detect_leaks=false
|
||||||
|
ifneq ($(DEVKIT_LIB_DIR),)
|
||||||
|
export LD_LIBRARY_PATH:=$(LD_LIBRARY_PATH):$(DEVKIT_LIB_DIR)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# UndefinedBehaviorSanitizer
|
||||||
|
export USAN_ENABLED:=@USAN_ENABLED@
|
||||||
|
export DEVKIT_LIB_DIR:=@DEVKIT_LIB_DIR@
|
||||||
|
ifeq ($(USAN_ENABLED), yes)
|
||||||
ifneq ($(DEVKIT_LIB_DIR),)
|
ifneq ($(DEVKIT_LIB_DIR),)
|
||||||
export LD_LIBRARY_PATH:=$(LD_LIBRARY_PATH):$(DEVKIT_LIB_DIR)
|
export LD_LIBRARY_PATH:=$(LD_LIBRARY_PATH):$(DEVKIT_LIB_DIR)
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -28,15 +28,15 @@
|
|||||||
|
|
||||||
DEFAULT_VERSION_FEATURE=17
|
DEFAULT_VERSION_FEATURE=17
|
||||||
DEFAULT_VERSION_INTERIM=0
|
DEFAULT_VERSION_INTERIM=0
|
||||||
DEFAULT_VERSION_UPDATE=0
|
DEFAULT_VERSION_UPDATE=1
|
||||||
DEFAULT_VERSION_PATCH=0
|
DEFAULT_VERSION_PATCH=0
|
||||||
DEFAULT_VERSION_EXTRA1=0
|
DEFAULT_VERSION_EXTRA1=0
|
||||||
DEFAULT_VERSION_EXTRA2=0
|
DEFAULT_VERSION_EXTRA2=0
|
||||||
DEFAULT_VERSION_EXTRA3=0
|
DEFAULT_VERSION_EXTRA3=0
|
||||||
DEFAULT_VERSION_DATE=2021-09-14
|
DEFAULT_VERSION_DATE=2021-10-19
|
||||||
DEFAULT_VERSION_CLASSFILE_MAJOR=61 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
DEFAULT_VERSION_CLASSFILE_MAJOR=61 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
||||||
DEFAULT_VERSION_CLASSFILE_MINOR=0
|
DEFAULT_VERSION_CLASSFILE_MINOR=0
|
||||||
DEFAULT_VERSION_DOCS_API_SINCE=11
|
DEFAULT_VERSION_DOCS_API_SINCE=11
|
||||||
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="16 17"
|
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="16 17"
|
||||||
DEFAULT_JDK_SOURCE_TARGET_VERSION=17
|
DEFAULT_JDK_SOURCE_TARGET_VERSION=17
|
||||||
DEFAULT_PROMOTED_VERSION_PRE=ea
|
DEFAULT_PROMOTED_VERSION_PRE=
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
Owner: CN=DST Root CA X3, O=Digital Signature Trust Co.
|
|
||||||
Issuer: CN=DST Root CA X3, O=Digital Signature Trust Co.
|
|
||||||
Serial number: 44afb080d6a327ba893039862ef8406b
|
|
||||||
Valid from: Sat Sep 30 21:12:19 GMT 2000 until: Thu Sep 30 14:01:15 GMT 2021
|
|
||||||
Signature algorithm name: SHA1withRSA
|
|
||||||
Subject Public Key Algorithm: 2048-bit RSA key
|
|
||||||
Version: 3
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
|
|
||||||
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
|
|
||||||
DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
|
|
||||||
PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
|
|
||||||
Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
|
||||||
AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
|
|
||||||
rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
|
|
||||||
OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
|
|
||||||
xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
|
|
||||||
7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
|
|
||||||
aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
|
|
||||||
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
|
|
||||||
SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
|
|
||||||
ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
|
|
||||||
AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
|
|
||||||
R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
|
|
||||||
JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
|
|
||||||
Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
@@ -52,7 +52,7 @@ allfonts.myanmar=Myanmar Text
|
|||||||
allfonts.dingbats=Wingdings
|
allfonts.dingbats=Wingdings
|
||||||
allfonts.symbol=Symbol
|
allfonts.symbol=Symbol
|
||||||
allfonts.symbols=Segoe UI Symbol
|
allfonts.symbols=Segoe UI Symbol
|
||||||
allfonts.thai=DokChampa
|
allfonts.thai=Tahoma
|
||||||
allfonts.georgian=Sylfaen
|
allfonts.georgian=Sylfaen
|
||||||
|
|
||||||
serif.plain.alphabetic=Times New Roman
|
serif.plain.alphabetic=Times New Roman
|
||||||
@@ -60,140 +60,140 @@ serif.plain.chinese-ms950=MingLiU
|
|||||||
serif.plain.chinese-ms950-extb=MingLiU-ExtB
|
serif.plain.chinese-ms950-extb=MingLiU-ExtB
|
||||||
serif.plain.hebrew=David
|
serif.plain.hebrew=David
|
||||||
serif.plain.japanese=MS Mincho
|
serif.plain.japanese=MS Mincho
|
||||||
serif.plain.korean=Batang
|
serif.plain.korean=Malgun Gothic
|
||||||
|
|
||||||
serif.bold.alphabetic=Times New Roman Bold
|
serif.bold.alphabetic=Times New Roman Bold
|
||||||
serif.bold.chinese-ms950=PMingLiU
|
serif.bold.chinese-ms950=PMingLiU
|
||||||
serif.bold.chinese-ms950-extb=PMingLiU-ExtB
|
serif.bold.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
serif.bold.hebrew=David Bold
|
serif.bold.hebrew=David Bold
|
||||||
serif.bold.japanese=MS Mincho
|
serif.bold.japanese=MS Mincho
|
||||||
serif.bold.korean=Batang
|
serif.bold.korean=Malgun Gothic
|
||||||
|
|
||||||
serif.italic.alphabetic=Times New Roman Italic
|
serif.italic.alphabetic=Times New Roman Italic
|
||||||
serif.italic.chinese-ms950=PMingLiU
|
serif.italic.chinese-ms950=PMingLiU
|
||||||
serif.italic.chinese-ms950-extb=PMingLiU-ExtB
|
serif.italic.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
serif.italic.hebrew=David
|
serif.italic.hebrew=David
|
||||||
serif.italic.japanese=MS Mincho
|
serif.italic.japanese=MS Mincho
|
||||||
serif.italic.korean=Batang
|
serif.italic.korean=Malgun Gothic
|
||||||
|
|
||||||
serif.bolditalic.alphabetic=Times New Roman Bold Italic
|
serif.bolditalic.alphabetic=Times New Roman Bold Italic
|
||||||
serif.bolditalic.chinese-ms950=PMingLiU
|
serif.bolditalic.chinese-ms950=PMingLiU
|
||||||
serif.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
|
serif.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
serif.bolditalic.hebrew=David Bold
|
serif.bolditalic.hebrew=David Bold
|
||||||
serif.bolditalic.japanese=MS Mincho
|
serif.bolditalic.japanese=MS Mincho
|
||||||
serif.bolditalic.korean=Batang
|
serif.bolditalic.korean=Malgun Gothic
|
||||||
|
|
||||||
sansserif.plain.alphabetic=Arial
|
sansserif.plain.alphabetic=Arial
|
||||||
sansserif.plain.chinese-ms950=MingLiU
|
sansserif.plain.chinese-ms950=MingLiU
|
||||||
sansserif.plain.chinese-ms950-extb=MingLiU-ExtB
|
sansserif.plain.chinese-ms950-extb=MingLiU-ExtB
|
||||||
sansserif.plain.hebrew=David
|
sansserif.plain.hebrew=David
|
||||||
sansserif.plain.japanese=MS Gothic
|
sansserif.plain.japanese=MS Gothic
|
||||||
sansserif.plain.korean=Gulim
|
sansserif.plain.korean=Malgun Gothic
|
||||||
|
|
||||||
sansserif.bold.alphabetic=Arial Bold
|
sansserif.bold.alphabetic=Arial Bold
|
||||||
sansserif.bold.chinese-ms950=PMingLiU
|
sansserif.bold.chinese-ms950=PMingLiU
|
||||||
sansserif.bold.chinese-ms950-extb=PMingLiU-ExtB
|
sansserif.bold.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
sansserif.bold.hebrew=David Bold
|
sansserif.bold.hebrew=David Bold
|
||||||
sansserif.bold.japanese=MS Gothic
|
sansserif.bold.japanese=MS Gothic
|
||||||
sansserif.bold.korean=Gulim
|
sansserif.bold.korean=Malgun Gothic
|
||||||
|
|
||||||
sansserif.italic.alphabetic=Arial Italic
|
sansserif.italic.alphabetic=Arial Italic
|
||||||
sansserif.italic.chinese-ms950=PMingLiU
|
sansserif.italic.chinese-ms950=PMingLiU
|
||||||
sansserif.italic.chinese-ms950-extb=PMingLiU-ExtB
|
sansserif.italic.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
sansserif.italic.hebrew=David
|
sansserif.italic.hebrew=David
|
||||||
sansserif.italic.japanese=MS Gothic
|
sansserif.italic.japanese=MS Gothic
|
||||||
sansserif.italic.korean=Gulim
|
sansserif.italic.korean=Malgun Gothic
|
||||||
|
|
||||||
sansserif.bolditalic.alphabetic=Arial Bold Italic
|
sansserif.bolditalic.alphabetic=Arial Bold Italic
|
||||||
sansserif.bolditalic.chinese-ms950=PMingLiU
|
sansserif.bolditalic.chinese-ms950=PMingLiU
|
||||||
sansserif.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
|
sansserif.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
sansserif.bolditalic.hebrew=David Bold
|
sansserif.bolditalic.hebrew=David Bold
|
||||||
sansserif.bolditalic.japanese=MS Gothic
|
sansserif.bolditalic.japanese=MS Gothic
|
||||||
sansserif.bolditalic.korean=Gulim
|
sansserif.bolditalic.korean=Malgun Gothic
|
||||||
|
|
||||||
monospaced.plain.alphabetic=Courier New
|
monospaced.plain.alphabetic=Courier New
|
||||||
monospaced.plain.chinese-ms950=MingLiU
|
monospaced.plain.chinese-ms950=MingLiU
|
||||||
monospaced.plain.chinese-ms950-extb=MingLiU-ExtB
|
monospaced.plain.chinese-ms950-extb=MingLiU-ExtB
|
||||||
monospaced.plain.hebrew=Courier New
|
monospaced.plain.hebrew=Courier New
|
||||||
monospaced.plain.japanese=MS Gothic
|
monospaced.plain.japanese=MS Gothic
|
||||||
monospaced.plain.korean=GulimChe
|
monospaced.plain.korean=Malgun Gothic
|
||||||
|
|
||||||
monospaced.bold.alphabetic=Courier New Bold
|
monospaced.bold.alphabetic=Courier New Bold
|
||||||
monospaced.bold.chinese-ms950=PMingLiU
|
monospaced.bold.chinese-ms950=PMingLiU
|
||||||
monospaced.bold.chinese-ms950-extb=PMingLiU-ExtB
|
monospaced.bold.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
monospaced.bold.hebrew=Courier New Bold
|
monospaced.bold.hebrew=Courier New Bold
|
||||||
monospaced.bold.japanese=MS Gothic
|
monospaced.bold.japanese=MS Gothic
|
||||||
monospaced.bold.korean=GulimChe
|
monospaced.bold.korean=Malgun Gothic
|
||||||
|
|
||||||
monospaced.italic.alphabetic=Courier New Italic
|
monospaced.italic.alphabetic=Courier New Italic
|
||||||
monospaced.italic.chinese-ms950=PMingLiU
|
monospaced.italic.chinese-ms950=PMingLiU
|
||||||
monospaced.italic.chinese-ms950-extb=PMingLiU-ExtB
|
monospaced.italic.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
monospaced.italic.hebrew=Courier New
|
monospaced.italic.hebrew=Courier New
|
||||||
monospaced.italic.japanese=MS Gothic
|
monospaced.italic.japanese=MS Gothic
|
||||||
monospaced.italic.korean=GulimChe
|
monospaced.italic.korean=Malgun Gothic
|
||||||
|
|
||||||
monospaced.bolditalic.alphabetic=Courier New Bold Italic
|
monospaced.bolditalic.alphabetic=Courier New Bold Italic
|
||||||
monospaced.bolditalic.chinese-ms950=PMingLiU
|
monospaced.bolditalic.chinese-ms950=PMingLiU
|
||||||
monospaced.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
|
monospaced.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
monospaced.bolditalic.hebrew=Courier New Bold
|
monospaced.bolditalic.hebrew=Courier New Bold
|
||||||
monospaced.bolditalic.japanese=MS Gothic
|
monospaced.bolditalic.japanese=MS Gothic
|
||||||
monospaced.bolditalic.korean=GulimChe
|
monospaced.bolditalic.korean=Malgun Gothic
|
||||||
|
|
||||||
dialog.plain.alphabetic=Arial
|
dialog.plain.alphabetic=Arial
|
||||||
dialog.plain.chinese-ms950=MingLiU
|
dialog.plain.chinese-ms950=MingLiU
|
||||||
dialog.plain.chinese-ms950-extb=MingLiU-ExtB
|
dialog.plain.chinese-ms950-extb=MingLiU-ExtB
|
||||||
dialog.plain.hebrew=David
|
dialog.plain.hebrew=David
|
||||||
dialog.plain.japanese=MS Gothic
|
dialog.plain.japanese=MS Gothic
|
||||||
dialog.plain.korean=Gulim
|
dialog.plain.korean=Malgun Gothic
|
||||||
|
|
||||||
dialog.bold.alphabetic=Arial Bold
|
dialog.bold.alphabetic=Arial Bold
|
||||||
dialog.bold.chinese-ms950=PMingLiU
|
dialog.bold.chinese-ms950=PMingLiU
|
||||||
dialog.bold.chinese-ms950-extb=PMingLiU-ExtB
|
dialog.bold.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
dialog.bold.hebrew=David Bold
|
dialog.bold.hebrew=David Bold
|
||||||
dialog.bold.japanese=MS Gothic
|
dialog.bold.japanese=MS Gothic
|
||||||
dialog.bold.korean=Gulim
|
dialog.bold.korean=Malgun Gothic
|
||||||
|
|
||||||
dialog.italic.alphabetic=Arial Italic
|
dialog.italic.alphabetic=Arial Italic
|
||||||
dialog.italic.chinese-ms950=PMingLiU
|
dialog.italic.chinese-ms950=PMingLiU
|
||||||
dialog.italic.chinese-ms950-extb=PMingLiU-ExtB
|
dialog.italic.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
dialog.italic.hebrew=David
|
dialog.italic.hebrew=David
|
||||||
dialog.italic.japanese=MS Gothic
|
dialog.italic.japanese=MS Gothic
|
||||||
dialog.italic.korean=Gulim
|
dialog.italic.korean=Malgun Gothic
|
||||||
|
|
||||||
dialog.bolditalic.alphabetic=Arial Bold Italic
|
dialog.bolditalic.alphabetic=Arial Bold Italic
|
||||||
dialog.bolditalic.chinese-ms950=PMingLiU
|
dialog.bolditalic.chinese-ms950=PMingLiU
|
||||||
dialog.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
|
dialog.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
dialog.bolditalic.hebrew=David Bold
|
dialog.bolditalic.hebrew=David Bold
|
||||||
dialog.bolditalic.japanese=MS Gothic
|
dialog.bolditalic.japanese=MS Gothic
|
||||||
dialog.bolditalic.korean=Gulim
|
dialog.bolditalic.korean=Malgun Gothic
|
||||||
|
|
||||||
dialoginput.plain.alphabetic=Courier New
|
dialoginput.plain.alphabetic=Courier New
|
||||||
dialoginput.plain.chinese-ms950=MingLiU
|
dialoginput.plain.chinese-ms950=MingLiU
|
||||||
dialoginput.plain.chinese-ms950-extb=MingLiU-ExtB
|
dialoginput.plain.chinese-ms950-extb=MingLiU-ExtB
|
||||||
dialoginput.plain.hebrew=David
|
dialoginput.plain.hebrew=David
|
||||||
dialoginput.plain.japanese=MS Gothic
|
dialoginput.plain.japanese=MS Gothic
|
||||||
dialoginput.plain.korean=Gulim
|
dialoginput.plain.korean=Malgun Gothic
|
||||||
|
|
||||||
dialoginput.bold.alphabetic=Courier New Bold
|
dialoginput.bold.alphabetic=Courier New Bold
|
||||||
dialoginput.bold.chinese-ms950=PMingLiU
|
dialoginput.bold.chinese-ms950=PMingLiU
|
||||||
dialoginput.bold.chinese-ms950-extb=PMingLiU-ExtB
|
dialoginput.bold.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
dialoginput.bold.hebrew=David Bold
|
dialoginput.bold.hebrew=David Bold
|
||||||
dialoginput.bold.japanese=MS Gothic
|
dialoginput.bold.japanese=MS Gothic
|
||||||
dialoginput.bold.korean=Gulim
|
dialoginput.bold.korean=Malgun Gothic
|
||||||
|
|
||||||
dialoginput.italic.alphabetic=Courier New Italic
|
dialoginput.italic.alphabetic=Courier New Italic
|
||||||
dialoginput.italic.chinese-ms950=PMingLiU
|
dialoginput.italic.chinese-ms950=PMingLiU
|
||||||
dialoginput.italic.chinese-ms950-extb=PMingLiU-ExtB
|
dialoginput.italic.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
dialoginput.italic.hebrew=David
|
dialoginput.italic.hebrew=David
|
||||||
dialoginput.italic.japanese=MS Gothic
|
dialoginput.italic.japanese=MS Gothic
|
||||||
dialoginput.italic.korean=Gulim
|
dialoginput.italic.korean=Malgun Gothic
|
||||||
|
|
||||||
dialoginput.bolditalic.alphabetic=Courier New Bold Italic
|
dialoginput.bolditalic.alphabetic=Courier New Bold Italic
|
||||||
dialoginput.bolditalic.chinese-ms950=PMingLiU
|
dialoginput.bolditalic.chinese-ms950=PMingLiU
|
||||||
dialoginput.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
|
dialoginput.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
|
||||||
dialoginput.bolditalic.hebrew=David Bold
|
dialoginput.bolditalic.hebrew=David Bold
|
||||||
dialoginput.bolditalic.japanese=MS Gothic
|
dialoginput.bolditalic.japanese=MS Gothic
|
||||||
dialoginput.bolditalic.korean=Gulim
|
dialoginput.bolditalic.korean=Malgun Gothic
|
||||||
|
|
||||||
# Search Sequences
|
# Search Sequences
|
||||||
|
|
||||||
@@ -230,7 +230,7 @@ sequence.dialog.x-MS950-HKSCS-XP=alphabetic,chinese-ms950,chinese-hkscs,dingbats
|
|||||||
sequence.dialoginput.x-MS950-HKSCS-XP=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
|
sequence.dialoginput.x-MS950-HKSCS-XP=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
|
||||||
|
|
||||||
sequence.allfonts.UTF-8.hi=alphabetic/1252,devanagari,dingbats,symbol
|
sequence.allfonts.UTF-8.hi=alphabetic/1252,devanagari,dingbats,symbol
|
||||||
sequence.allfonts.UTF-8.ja=alphabetic,japanese,dingbats,symbol
|
sequence.allfonts.UTF-8.ja=alphabetic,japanese,devanagari,dingbats,symbol
|
||||||
|
|
||||||
sequence.allfonts.windows-1255=hebrew,alphabetic/1252,dingbats,symbol
|
sequence.allfonts.windows-1255=hebrew,alphabetic/1252,dingbats,symbol
|
||||||
|
|
||||||
@@ -257,7 +257,7 @@ sequence.fallback=symbols,\
|
|||||||
|
|
||||||
# Exclusion Ranges
|
# Exclusion Ranges
|
||||||
|
|
||||||
exclusion.alphabetic=0700-1cff,1d80-1e9f,1f00-2017,2020-20ab,20ad-20b8,20bb-20bc,20be-f8ff
|
exclusion.alphabetic=0700-1cff,1d80-1e9f,1f00-2017,2020-20ab,20ad-20b8,20bb-20bc,20be-24ff,2501-2501,2503-250b,250d-250f,2511-2513,2515-2517,2519-251b,251d-2523,2525-252b,252d-2533,2535-253b,253d-254f,256d-f8ff
|
||||||
exclusion.chinese-gb18030=0390-03d6,2200-22ef,2701-27be
|
exclusion.chinese-gb18030=0390-03d6,2200-22ef,2701-27be
|
||||||
exclusion.hebrew=0041-005a,0060-007a,007f-00ff,20ac-20ac
|
exclusion.hebrew=0041-005a,0060-007a,007f-00ff,20ac-20ac
|
||||||
|
|
||||||
@@ -303,21 +303,18 @@ filename.MS_PMincho=MSMINCHO.TTC
|
|||||||
filename.MS_Gothic=MSGOTHIC.TTC
|
filename.MS_Gothic=MSGOTHIC.TTC
|
||||||
filename.MS_PGothic=MSGOTHIC.TTC
|
filename.MS_PGothic=MSGOTHIC.TTC
|
||||||
|
|
||||||
filename.Gulim=gulim.TTC
|
|
||||||
filename.Batang=batang.TTC
|
|
||||||
filename.GulimChe=gulim.TTC
|
|
||||||
|
|
||||||
filename.Gautami=gautami.ttf
|
filename.Gautami=gautami.ttf
|
||||||
filename.Iskoola_Pota=iskpota.ttf
|
filename.Iskoola_Pota=iskpota.ttf
|
||||||
filename.Kalinga=kalinga.ttf
|
filename.Kalinga=kalinga.ttf
|
||||||
filename.Kartika=kartika.ttf
|
filename.Kartika=kartika.ttf
|
||||||
filename.Latha=latha.ttf
|
filename.Latha=latha.ttf
|
||||||
|
filename.Malgun_Gothic=malgun.ttf
|
||||||
filename.Mangal=MANGAL.TTF
|
filename.Mangal=MANGAL.TTF
|
||||||
filename.Raavi=raavi.ttf
|
filename.Raavi=raavi.ttf
|
||||||
filename.Shruti=shruti.ttf
|
filename.Shruti=shruti.ttf
|
||||||
|
filename.Tahoma=tahoma.ttf
|
||||||
filename.Tunga=TUNGA.TTF
|
filename.Tunga=TUNGA.TTF
|
||||||
filename.Vrinda=vrinda.ttf
|
filename.Vrinda=vrinda.ttf
|
||||||
filename.DokChampa=dokchamp.ttf
|
|
||||||
filename.Khmer_UI=KhmerUI.ttf
|
filename.Khmer_UI=KhmerUI.ttf
|
||||||
filename.Mongolian_Baiti=monbaiti.ttf
|
filename.Mongolian_Baiti=monbaiti.ttf
|
||||||
filename.Myanmar_Text=mmrtext.ttf
|
filename.Myanmar_Text=mmrtext.ttf
|
||||||
|
|||||||
@@ -272,12 +272,14 @@ XEvent.xclient 0
|
|||||||
XEvent.xcolormap 0
|
XEvent.xcolormap 0
|
||||||
XEvent.xconfigure 0
|
XEvent.xconfigure 0
|
||||||
XEvent.xconfigurerequest 0
|
XEvent.xconfigurerequest 0
|
||||||
|
XEvent.xcookie 0
|
||||||
XEvent.xcreatewindow 0
|
XEvent.xcreatewindow 0
|
||||||
XEvent.xcrossing 0
|
XEvent.xcrossing 0
|
||||||
XEvent.xdestroywindow 0
|
XEvent.xdestroywindow 0
|
||||||
XEvent.xerror 0
|
XEvent.xerror 0
|
||||||
XEvent.xexpose 0
|
XEvent.xexpose 0
|
||||||
XEvent.xfocus 0
|
XEvent.xfocus 0
|
||||||
|
XEvent.xgeneric 0
|
||||||
XEvent.xgraphicsexpose 0
|
XEvent.xgraphicsexpose 0
|
||||||
XEvent.xgravity 0
|
XEvent.xgravity 0
|
||||||
XEvent.xkey 0
|
XEvent.xkey 0
|
||||||
@@ -370,6 +372,22 @@ XGCValues.subwindow_mode 64
|
|||||||
XGCValues.tile 44
|
XGCValues.tile 44
|
||||||
XGCValues.ts_x_origin 52
|
XGCValues.ts_x_origin 52
|
||||||
XGCValues.ts_y_origin 56
|
XGCValues.ts_y_origin 56
|
||||||
|
XGenericEvent 24
|
||||||
|
XGenericEventCookie 32
|
||||||
|
XGenericEventCookie.cookie 24
|
||||||
|
XGenericEventCookie.data 28
|
||||||
|
XGenericEventCookie.display 12
|
||||||
|
XGenericEventCookie.evtype 20
|
||||||
|
XGenericEventCookie.extension 16
|
||||||
|
XGenericEventCookie.send_event 8
|
||||||
|
XGenericEventCookie.serial 4
|
||||||
|
XGenericEventCookie.type 0
|
||||||
|
XGenericEvent.display 12
|
||||||
|
XGenericEvent.evtype 20
|
||||||
|
XGenericEvent.extension 16
|
||||||
|
XGenericEvent.send_event 8
|
||||||
|
XGenericEvent.serial 4
|
||||||
|
XGenericEvent.type 0
|
||||||
XGraphicsExposeEvent 48
|
XGraphicsExposeEvent 48
|
||||||
XGraphicsExposeEvent.count 36
|
XGraphicsExposeEvent.count 36
|
||||||
XGraphicsExposeEvent.display 12
|
XGraphicsExposeEvent.display 12
|
||||||
@@ -396,6 +414,9 @@ XHostAddress 12
|
|||||||
XHostAddress.address 8
|
XHostAddress.address 8
|
||||||
XHostAddress.family 0
|
XHostAddress.family 0
|
||||||
XHostAddress.length 4
|
XHostAddress.length 4
|
||||||
|
XIButtonState 8
|
||||||
|
XIButtonState.mask 4
|
||||||
|
XIButtonState.mask_len 0
|
||||||
XIconSize 24
|
XIconSize 24
|
||||||
XIconSize.height_inc 20
|
XIconSize.height_inc 20
|
||||||
XIconSize.max_height 12
|
XIconSize.max_height 12
|
||||||
@@ -403,6 +424,29 @@ XIconSize.max_width 8
|
|||||||
XIconSize.min_height 4
|
XIconSize.min_height 4
|
||||||
XIconSize.min_width 0
|
XIconSize.min_width 0
|
||||||
XIconSize.width_inc 16
|
XIconSize.width_inc 16
|
||||||
|
XIDeviceEvent 140
|
||||||
|
XIDeviceEvent.buttons 88
|
||||||
|
XIDeviceEvent.child 48
|
||||||
|
XIDeviceEvent.detail 36
|
||||||
|
XIDeviceEvent.deviceid 28
|
||||||
|
XIDeviceEvent.display 12
|
||||||
|
XIDeviceEvent.event 44
|
||||||
|
XIDeviceEvent.event_x 68
|
||||||
|
XIDeviceEvent.event_y 76
|
||||||
|
XIDeviceEvent.evtype 20
|
||||||
|
XIDeviceEvent.extension 16
|
||||||
|
XIDeviceEvent.flags 84
|
||||||
|
XIDeviceEvent.group 124
|
||||||
|
XIDeviceEvent.mods 108
|
||||||
|
XIDeviceEvent.root 40
|
||||||
|
XIDeviceEvent.root_x 52
|
||||||
|
XIDeviceEvent.root_y 60
|
||||||
|
XIDeviceEvent.send_event 8
|
||||||
|
XIDeviceEvent.serial 4
|
||||||
|
XIDeviceEvent.sourceid 32
|
||||||
|
XIDeviceEvent.time 24
|
||||||
|
XIDeviceEvent.type 0
|
||||||
|
XIDeviceEvent.valuators 96
|
||||||
XImage 88
|
XImage 88
|
||||||
XImage.bitmap_bit_order 28
|
XImage.bitmap_bit_order 28
|
||||||
XImage.bitmap_pad 32
|
XImage.bitmap_pad 32
|
||||||
@@ -436,6 +480,11 @@ XIMHotKeyTrigger.modifier_mask 8
|
|||||||
XIMHotKeyTriggers 8
|
XIMHotKeyTriggers 8
|
||||||
XIMHotKeyTriggers.key 4
|
XIMHotKeyTriggers.key 4
|
||||||
XIMHotKeyTriggers.num_hot_key 0
|
XIMHotKeyTriggers.num_hot_key 0
|
||||||
|
XIModifierState 16
|
||||||
|
XIModifierState.base 0
|
||||||
|
XIModifierState.effective 12
|
||||||
|
XIModifierState.latched 4
|
||||||
|
XIModifierState.locked 8
|
||||||
XIMPreeditCaretCallbackStruct 12
|
XIMPreeditCaretCallbackStruct 12
|
||||||
XIMPreeditCaretCallbackStruct.direction 4
|
XIMPreeditCaretCallbackStruct.direction 4
|
||||||
XIMPreeditCaretCallbackStruct.position 0
|
XIMPreeditCaretCallbackStruct.position 0
|
||||||
@@ -472,6 +521,10 @@ XIMText.string 12
|
|||||||
XIMValuesList 8
|
XIMValuesList 8
|
||||||
XIMValuesList.count_values 0
|
XIMValuesList.count_values 0
|
||||||
XIMValuesList.supported_values 4
|
XIMValuesList.supported_values 4
|
||||||
|
XIValuatorState 12
|
||||||
|
XIValuatorState.mask 4
|
||||||
|
XIValuatorState.mask_len 0
|
||||||
|
XIValuatorState.values 8
|
||||||
XkbAccessXNotifyEvent 44
|
XkbAccessXNotifyEvent 44
|
||||||
XkbAccessXNotifyEvent.debounce_delay 40
|
XkbAccessXNotifyEvent.debounce_delay 40
|
||||||
XkbAccessXNotifyEvent.detail 28
|
XkbAccessXNotifyEvent.detail 28
|
||||||
|
|||||||
@@ -272,12 +272,14 @@ XEvent.xclient 0
|
|||||||
XEvent.xcolormap 0
|
XEvent.xcolormap 0
|
||||||
XEvent.xconfigure 0
|
XEvent.xconfigure 0
|
||||||
XEvent.xconfigurerequest 0
|
XEvent.xconfigurerequest 0
|
||||||
|
XEvent.xcookie 0
|
||||||
XEvent.xcreatewindow 0
|
XEvent.xcreatewindow 0
|
||||||
XEvent.xcrossing 0
|
XEvent.xcrossing 0
|
||||||
XEvent.xdestroywindow 0
|
XEvent.xdestroywindow 0
|
||||||
XEvent.xerror 0
|
XEvent.xerror 0
|
||||||
XEvent.xexpose 0
|
XEvent.xexpose 0
|
||||||
XEvent.xfocus 0
|
XEvent.xfocus 0
|
||||||
|
XEvent.xgeneric 0
|
||||||
XEvent.xgraphicsexpose 0
|
XEvent.xgraphicsexpose 0
|
||||||
XEvent.xgravity 0
|
XEvent.xgravity 0
|
||||||
XEvent.xkey 0
|
XEvent.xkey 0
|
||||||
@@ -370,6 +372,22 @@ XGCValues.subwindow_mode 96
|
|||||||
XGCValues.tile 64
|
XGCValues.tile 64
|
||||||
XGCValues.ts_x_origin 80
|
XGCValues.ts_x_origin 80
|
||||||
XGCValues.ts_y_origin 84
|
XGCValues.ts_y_origin 84
|
||||||
|
XGenericEvent 40
|
||||||
|
XGenericEventCookie 56
|
||||||
|
XGenericEventCookie.cookie 40
|
||||||
|
XGenericEventCookie.data 48
|
||||||
|
XGenericEventCookie.display 24
|
||||||
|
XGenericEventCookie.evtype 36
|
||||||
|
XGenericEventCookie.extension 32
|
||||||
|
XGenericEventCookie.send_event 16
|
||||||
|
XGenericEventCookie.serial 8
|
||||||
|
XGenericEventCookie.type 0
|
||||||
|
XGenericEvent.display 24
|
||||||
|
XGenericEvent.evtype 36
|
||||||
|
XGenericEvent.extension 32
|
||||||
|
XGenericEvent.send_event 16
|
||||||
|
XGenericEvent.serial 8
|
||||||
|
XGenericEvent.type 0
|
||||||
XGraphicsExposeEvent 72
|
XGraphicsExposeEvent 72
|
||||||
XGraphicsExposeEvent.count 56
|
XGraphicsExposeEvent.count 56
|
||||||
XGraphicsExposeEvent.display 24
|
XGraphicsExposeEvent.display 24
|
||||||
@@ -396,6 +414,9 @@ XHostAddress 16
|
|||||||
XHostAddress.address 8
|
XHostAddress.address 8
|
||||||
XHostAddress.family 0
|
XHostAddress.family 0
|
||||||
XHostAddress.length 4
|
XHostAddress.length 4
|
||||||
|
XIButtonState 16
|
||||||
|
XIButtonState.mask 8
|
||||||
|
XIButtonState.mask_len 0
|
||||||
XIconSize 24
|
XIconSize 24
|
||||||
XIconSize.height_inc 20
|
XIconSize.height_inc 20
|
||||||
XIconSize.max_height 12
|
XIconSize.max_height 12
|
||||||
@@ -403,6 +424,29 @@ XIconSize.max_width 8
|
|||||||
XIconSize.min_height 4
|
XIconSize.min_height 4
|
||||||
XIconSize.min_width 0
|
XIconSize.min_width 0
|
||||||
XIconSize.width_inc 16
|
XIconSize.width_inc 16
|
||||||
|
XIDeviceEvent 200
|
||||||
|
XIDeviceEvent.buttons 128
|
||||||
|
XIDeviceEvent.child 80
|
||||||
|
XIDeviceEvent.detail 56
|
||||||
|
XIDeviceEvent.deviceid 48
|
||||||
|
XIDeviceEvent.display 24
|
||||||
|
XIDeviceEvent.event 72
|
||||||
|
XIDeviceEvent.event_x 104
|
||||||
|
XIDeviceEvent.event_y 112
|
||||||
|
XIDeviceEvent.evtype 36
|
||||||
|
XIDeviceEvent.extension 32
|
||||||
|
XIDeviceEvent.flags 120
|
||||||
|
XIDeviceEvent.group 184
|
||||||
|
XIDeviceEvent.mods 168
|
||||||
|
XIDeviceEvent.root 64
|
||||||
|
XIDeviceEvent.root_x 88
|
||||||
|
XIDeviceEvent.root_y 96
|
||||||
|
XIDeviceEvent.send_event 16
|
||||||
|
XIDeviceEvent.serial 8
|
||||||
|
XIDeviceEvent.sourceid 52
|
||||||
|
XIDeviceEvent.time 40
|
||||||
|
XIDeviceEvent.type 0
|
||||||
|
XIDeviceEvent.valuators 144
|
||||||
XImage 136
|
XImage 136
|
||||||
XImage.bitmap_bit_order 32
|
XImage.bitmap_bit_order 32
|
||||||
XImage.bitmap_pad 36
|
XImage.bitmap_pad 36
|
||||||
@@ -436,6 +480,11 @@ XIMHotKeyTrigger.modifier_mask 12
|
|||||||
XIMHotKeyTriggers 16
|
XIMHotKeyTriggers 16
|
||||||
XIMHotKeyTriggers.key 8
|
XIMHotKeyTriggers.key 8
|
||||||
XIMHotKeyTriggers.num_hot_key 0
|
XIMHotKeyTriggers.num_hot_key 0
|
||||||
|
XIModifierState 16
|
||||||
|
XIModifierState.base 0
|
||||||
|
XIModifierState.effective 12
|
||||||
|
XIModifierState.latched 4
|
||||||
|
XIModifierState.locked 8
|
||||||
XIMPreeditCaretCallbackStruct 12
|
XIMPreeditCaretCallbackStruct 12
|
||||||
XIMPreeditCaretCallbackStruct.direction 4
|
XIMPreeditCaretCallbackStruct.direction 4
|
||||||
XIMPreeditCaretCallbackStruct.position 0
|
XIMPreeditCaretCallbackStruct.position 0
|
||||||
@@ -472,6 +521,10 @@ XIMText.string 24
|
|||||||
XIMValuesList 16
|
XIMValuesList 16
|
||||||
XIMValuesList.count_values 0
|
XIMValuesList.count_values 0
|
||||||
XIMValuesList.supported_values 8
|
XIMValuesList.supported_values 8
|
||||||
|
XIValuatorState 24
|
||||||
|
XIValuatorState.mask 8
|
||||||
|
XIValuatorState.mask_len 0
|
||||||
|
XIValuatorState.values 16
|
||||||
XkbAccessXNotifyEvent 64
|
XkbAccessXNotifyEvent 64
|
||||||
XkbAccessXNotifyEvent.debounce_delay 60
|
XkbAccessXNotifyEvent.debounce_delay 60
|
||||||
XkbAccessXNotifyEvent.detail 48
|
XkbAccessXNotifyEvent.detail 48
|
||||||
|
|||||||
@@ -127,6 +127,22 @@ XKeymapEvent
|
|||||||
display long
|
display long
|
||||||
window long
|
window long
|
||||||
key_vector array byte 32
|
key_vector array byte 32
|
||||||
|
XGenericEvent
|
||||||
|
type int
|
||||||
|
serial long
|
||||||
|
send_event Bool
|
||||||
|
display long
|
||||||
|
extension int
|
||||||
|
evtype int
|
||||||
|
XGenericEventCookie
|
||||||
|
type int
|
||||||
|
serial long
|
||||||
|
send_event Bool
|
||||||
|
display long
|
||||||
|
extension int
|
||||||
|
evtype int
|
||||||
|
cookie int
|
||||||
|
data pointer
|
||||||
XDestroyWindowEvent
|
XDestroyWindowEvent
|
||||||
type int
|
type int
|
||||||
serial long
|
serial long
|
||||||
@@ -814,6 +830,8 @@ XEvent
|
|||||||
xmapping struct XMappingEvent
|
xmapping struct XMappingEvent
|
||||||
xerror struct XErrorEvent
|
xerror struct XErrorEvent
|
||||||
xkeymap struct XKeymapEvent
|
xkeymap struct XKeymapEvent
|
||||||
|
xgeneric struct XGenericEvent
|
||||||
|
xcookie struct XGenericEventCookie
|
||||||
pad array long 24
|
pad array long 24
|
||||||
|
|
||||||
XkbAnyEvent
|
XkbAnyEvent
|
||||||
@@ -1039,3 +1057,42 @@ XkbEvent
|
|||||||
accessx struct XkbAccessXNotifyEvent
|
accessx struct XkbAccessXNotifyEvent
|
||||||
device struct XkbExtensionDeviceNotifyEvent
|
device struct XkbExtensionDeviceNotifyEvent
|
||||||
core struct XEvent
|
core struct XEvent
|
||||||
|
|
||||||
|
XIButtonState
|
||||||
|
mask_len int
|
||||||
|
mask pointer byte
|
||||||
|
|
||||||
|
XIValuatorState
|
||||||
|
mask_len int
|
||||||
|
mask pointer byte
|
||||||
|
values pointer double
|
||||||
|
|
||||||
|
XIModifierState
|
||||||
|
base int
|
||||||
|
latched int
|
||||||
|
locked int
|
||||||
|
effective int
|
||||||
|
|
||||||
|
XIDeviceEvent
|
||||||
|
type int
|
||||||
|
serial long
|
||||||
|
send_event Bool
|
||||||
|
display long
|
||||||
|
extension int
|
||||||
|
evtype int
|
||||||
|
time ulong
|
||||||
|
deviceid int
|
||||||
|
sourceid int
|
||||||
|
detail int
|
||||||
|
root long
|
||||||
|
event long
|
||||||
|
child long
|
||||||
|
root_x double
|
||||||
|
root_y double
|
||||||
|
event_x double
|
||||||
|
event_y double
|
||||||
|
flags int
|
||||||
|
buttons struct XIButtonState
|
||||||
|
valuators struct XIValuatorState
|
||||||
|
mods struct XIModifierState
|
||||||
|
group struct XIModifierState
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
<!-- importing.xml -->
|
|
||||||
<project name="jdk">
|
|
||||||
|
|
||||||
<taskdef name="wrapLogger" classname="idea.IdeaLoggerWrapper" classpath="${idea.dir}/classes"/>
|
|
||||||
|
|
||||||
<wrapLogger/>
|
|
||||||
|
|
||||||
<macrodef name="call-make">
|
|
||||||
<attribute name="dir"/>
|
|
||||||
<attribute name="args"/>
|
|
||||||
<sequential>
|
|
||||||
<exec executable="make" dir="@{dir}" failonerror="true">
|
|
||||||
<arg line="@{args}"/>
|
|
||||||
<env key="CLASSPATH" value = ""/>
|
|
||||||
</exec>
|
|
||||||
</sequential>
|
|
||||||
</macrodef>
|
|
||||||
|
|
||||||
<target name="cond-clean" unless="${intellij.ismake}">
|
|
||||||
<antcall target="clean"/>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="post-make" depends="cond-clean, build-module"/>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
**** Global JDK Build Targets
|
|
||||||
-->
|
|
||||||
|
|
||||||
<target name="clean">
|
|
||||||
<echo message="base = ${basedir}"/>
|
|
||||||
<call-make dir = "${build.target.dir}" args = "reconfigure"/>
|
|
||||||
<call-make dir = "${build.target.dir}" args = "clean"/>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="images">
|
|
||||||
<call-make dir = "${build.target.dir}" args = "images"/>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="build-module">
|
|
||||||
<call-make dir = "${build.target.dir}" args = "${module.name}"/>
|
|
||||||
</target>
|
|
||||||
</project>
|
|
||||||
@@ -46,13 +46,18 @@ else #with SPEC
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
idea:
|
idea:
|
||||||
$(ECHO) "SUPPORT=$(SUPPORT_OUTPUTDIR)" >> $(OUT)
|
$(ECHO) "MODULES=\"$(foreach mod, $(SEL_MODULES), \
|
||||||
$(ECHO) "MODULE_ROOTS=\"$(foreach mod, $(SEL_MODULES), $(call FindModuleSrcDirs,$(mod)))\"" >> $(OUT)
|
module='$(mod)' \
|
||||||
|
moduleSrcDirs='$(foreach m,$(call FindModuleSrcDirs,$(mod)),$(call RelativePath,$m,$(topdir)))' \
|
||||||
|
moduleDependencies='$(call FindTransitiveDepsForModule,$(mod))' \
|
||||||
|
#)\"" > $(OUT)
|
||||||
$(ECHO) "MODULE_NAMES=\"$(strip $(foreach mod, $(SEL_MODULES), $(mod)))\"" >> $(OUT)
|
$(ECHO) "MODULE_NAMES=\"$(strip $(foreach mod, $(SEL_MODULES), $(mod)))\"" >> $(OUT)
|
||||||
$(ECHO) "SEL_MODULES=\"$(SEL_MODULES)\"" >> $(OUT)
|
$(ECHO) "RELATIVE_TOPLEVEL_PROJECT_DIR=\"$(call RelativePath,$(TOPLEVEL_DIR),$(IDEA_OUTPUT_PARENT))\"" >> $(OUT)
|
||||||
$(ECHO) "BOOT_JDK=\"$(BOOT_JDK)\"" >> $(OUT)
|
$(ECHO) "RELATIVE_PROJECT_DIR=\"$(call RelativePath,$(topdir),$(IDEA_OUTPUT_PARENT))\"" >> $(OUT)
|
||||||
$(ECHO) "CYGPATH=\"$(PATHTOOL)\"" >> $(OUT)
|
$(ECHO) "RELATIVE_BUILD_DIR=\"$(call RelativePath,$(OUTPUTDIR),$(IDEA_OUTPUT_PARENT))\"" >> $(OUT)
|
||||||
$(ECHO) "SPEC=\"$(SPEC)\"" >> $(OUT)
|
$(ECHO) "CLION_RELATIVE_PROJECT_DIR=\"$(call RelativePath,$(topdir),$(IDEA_OUTPUT_PARENT)/.idea/jdk-clion)\"" >> $(OUT)
|
||||||
|
$(ECHO) "PATHTOOL=\"$(PATHTOOL)\"" >> $(OUT)
|
||||||
$(ECHO) "JT_HOME=\"$(JT_HOME)\"" >> $(OUT)
|
$(ECHO) "JT_HOME=\"$(JT_HOME)\"" >> $(OUT)
|
||||||
|
$(ECHO) "WINENV_ROOT=\"$(WINENV_ROOT)\"" >> $(OUT)
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="AntConfiguration">
|
|
||||||
<buildFile url="file://###ROOT_DIR###/make/ide/idea/jdk/build.xml">
|
|
||||||
<properties>
|
|
||||||
<property name="intellij.ismake" value="$IsMake$" />
|
|
||||||
<property name="build.target.dir" value="###BUILD_DIR###" />
|
|
||||||
<property name="module.name" value="###MODULE_NAMES###" />
|
|
||||||
<property name="idea.dir" value="###IDEA_DIR###" />
|
|
||||||
</properties>
|
|
||||||
<executeOn event="afterCompilation" target="post-make" />
|
|
||||||
</buildFile>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -3,10 +3,10 @@
|
|||||||
<component name="CompilerConfiguration">
|
<component name="CompilerConfiguration">
|
||||||
<option name="DEFAULT_COMPILER" value="Javac" />
|
<option name="DEFAULT_COMPILER" value="Javac" />
|
||||||
<excludeFromCompile>
|
<excludeFromCompile>
|
||||||
<directory url="file://###ROOT_DIR###/src" includeSubdirectories="true" />
|
<directory url="file://###PROJECT_DIR###/src" includeSubdirectories="true" />
|
||||||
<directory url="file://###ROOT_DIR###/build" includeSubdirectories="true" />
|
<directory url="file://###PROJECT_DIR###/build" includeSubdirectories="true" />
|
||||||
<directory url="file://###ROOT_DIR###/make" includeSubdirectories="true" />
|
<directory url="file://###PROJECT_DIR###/make" includeSubdirectories="true" />
|
||||||
<directory url="file://###ROOT_DIR###/test" includeSubdirectories="true" />
|
<directory url="file://###PROJECT_DIR###/test" includeSubdirectories="false" />
|
||||||
</excludeFromCompile>
|
</excludeFromCompile>
|
||||||
<resourceExtensions />
|
<resourceExtensions />
|
||||||
<wildcardResourcePatterns>
|
<wildcardResourcePatterns>
|
||||||
|
|||||||
25
make/ide/idea/jdk/template/jdk-clion/.idea/misc.xml
generated
Normal file
25
make/ide/idea/jdk/template/jdk-clion/.idea/misc.xml
generated
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CidrRootsConfiguration">
|
||||||
|
<excludeRoots>
|
||||||
|
<file path="###CLION_PROJECT_DIR###/build" />
|
||||||
|
<file path="###CLION_PROJECT_DIR###/make" />
|
||||||
|
</excludeRoots>
|
||||||
|
</component>
|
||||||
|
<component name="CompDBSettings">
|
||||||
|
<option name="linkedExternalProjectsSettings">
|
||||||
|
<CompDBProjectSettings>
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="modules">
|
||||||
|
<set>
|
||||||
|
<option value="$PROJECT_DIR$" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
</CompDBProjectSettings>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="CompDBWorkspace" PROJECT_DIR="$PROJECT_DIR$">
|
||||||
|
<contentRoot DIR="###CLION_PROJECT_DIR###" />
|
||||||
|
</component>
|
||||||
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
|
</project>
|
||||||
16
make/ide/idea/jdk/template/jdk-clion/.idea/vcs.xml
generated
Normal file
16
make/ide/idea/jdk/template/jdk-clion/.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="IssueNavigationConfiguration">
|
||||||
|
<option name="links">
|
||||||
|
<list>
|
||||||
|
<IssueNavigationLink>
|
||||||
|
<option name="issueRegexp" value="(?:^|\s|\p{Punct})(?:JDK-)?(\d{7})(?=$|\s|\p{Punct})" />
|
||||||
|
<option name="linkRegexp" value="https://bugs.openjdk.java.net/browse/JDK-$1" />
|
||||||
|
</IssueNavigationLink>
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="###CLION_PROJECT_DIR###" vcs="###VCS_TYPE###" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
55
make/ide/idea/jdk/template/jdk-clion/.idea/workspace.xml
generated
Normal file
55
make/ide/idea/jdk/template/jdk-clion/.idea/workspace.xml
generated
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="AutoImportSettings">
|
||||||
|
<option name="autoReloadType" value="SELECTIVE" />
|
||||||
|
</component>
|
||||||
|
<component name="ClangdSettings">
|
||||||
|
<option name="formatViaClangd" value="false" />
|
||||||
|
</component>
|
||||||
|
<component name="CompDBLocalSettings">
|
||||||
|
<option name="availableProjects">
|
||||||
|
<map>
|
||||||
|
<entry>
|
||||||
|
<key>
|
||||||
|
<ExternalProjectPojo>
|
||||||
|
<option name="name" value="jdk-clion" />
|
||||||
|
<option name="path" value="$PROJECT_DIR$" />
|
||||||
|
</ExternalProjectPojo>
|
||||||
|
</key>
|
||||||
|
<value>
|
||||||
|
<list>
|
||||||
|
<ExternalProjectPojo>
|
||||||
|
<option name="name" value="jdk-clion" />
|
||||||
|
<option name="path" value="$PROJECT_DIR$" />
|
||||||
|
</ExternalProjectPojo>
|
||||||
|
</list>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
<option name="projectSyncType">
|
||||||
|
<map>
|
||||||
|
<entry key="$PROJECT_DIR$" value="RE_IMPORT" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="ExternalProjectsData">
|
||||||
|
<projectState path="$PROJECT_DIR$">
|
||||||
|
<ProjectState />
|
||||||
|
</projectState>
|
||||||
|
</component>
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
|
<option name="showLibraryContents" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PropertiesComponent">
|
||||||
|
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
|
||||||
|
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
|
||||||
|
<property name="RunOnceActivity.cidr.known.project.marker" value="true" />
|
||||||
|
<property name="WebServerToolWindowFactoryState" value="false" />
|
||||||
|
<property name="cf.first.check.clang-format" value="false" />
|
||||||
|
<property name="cidr.known.project.marker" value="true" />
|
||||||
|
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
|
||||||
|
<property name="settings.editor.selected.configurable" value="CPPToolchains" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user