Skip to content

Commit d5fb6b4

Browse files
Yudi ZhengDoug Simon
Yudi Zheng
and
Doug Simon
committed
8339939: [JVMCI] Don't compress abstract and interface Klasses
Co-authored-by: Doug Simon <dnsimon@openjdk.org> Reviewed-by: dnsimon
1 parent a5ad974 commit d5fb6b4

File tree

7 files changed

+72
-8
lines changed

7 files changed

+72
-8
lines changed

src/hotspot/share/jvmci/jvmciCodeInstaller.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ narrowKlass CodeInstaller::record_narrow_metadata_reference(CodeSection* section
343343
int index = _oop_recorder->find_index(klass);
344344
section->relocate(dest, metadata_Relocation::spec(index));
345345
JVMCI_event_3("narrowKlass[%d of %d] = %s", index, _oop_recorder->metadata_count(), klass->name()->as_C_string());
346+
guarantee(CompressedKlassPointers::is_encodable(klass), "klass cannot be compressed: %s", klass->external_name());
346347
return CompressedKlassPointers::encode(klass);
347348
}
348349
#endif

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/DirectHotSpotObjectConstantImpl.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,17 @@ private DirectHotSpotObjectConstantImpl(Object object, boolean compressed) {
5151

5252
@Override
5353
public JavaConstant compress() {
54-
assert !compressed;
54+
if (compressed) {
55+
throw new IllegalArgumentException("already compressed: " + this);
56+
}
5557
return new DirectHotSpotObjectConstantImpl(object, true);
5658
}
5759

5860
@Override
5961
public JavaConstant uncompress() {
60-
assert compressed;
62+
if (!compressed) {
63+
throw new IllegalArgumentException("not compressed: " + this);
64+
}
6165
return new DirectHotSpotObjectConstantImpl(object, false);
6266
}
6367

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotCompressedNullConstant.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,14 @@ public boolean isCompressed() {
5151
return true;
5252
}
5353

54+
@Override
55+
public boolean isCompressible() {
56+
return false;
57+
}
58+
5459
@Override
5560
public Constant compress() {
56-
throw new IllegalArgumentException();
61+
throw new IllegalArgumentException("not compressible");
5762
}
5863

5964
@Override

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotConstant.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,34 @@
2525
import jdk.vm.ci.meta.Constant;
2626

2727
/**
28-
* Marker interface for hotspot specific constants.
28+
* A value in a space managed by Hotspot (e.g. heap or metaspace).
29+
* Some of these values can be referenced with a compressed pointer
30+
* instead of a full word-sized pointer.
2931
*/
3032
public interface HotSpotConstant extends Constant {
3133

34+
/**
35+
* Determines if this constant is compressed.
36+
*/
3237
boolean isCompressed();
3338

39+
/**
40+
* Determines if this constant is compressible.
41+
*/
42+
boolean isCompressible();
43+
44+
/**
45+
* Gets a compressed version of this uncompressed constant.
46+
*
47+
* @throws IllegalArgumentException if this constant is not compressible
48+
*/
3449
Constant compress();
3550

51+
/**
52+
* Gets an uncompressed version of this compressed constant.
53+
*
54+
* @throws IllegalArgumentException if this is an uncompressed constant
55+
* or this constant is not compressible
56+
*/
3657
Constant uncompress();
3758
}

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMetaspaceConstantImpl.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ static MetaspaceObject getMetaspaceObject(Constant constant) {
4343
private HotSpotMetaspaceConstantImpl(MetaspaceObject metaspaceObject, boolean compressed) {
4444
this.metaspaceObject = metaspaceObject;
4545
this.compressed = compressed;
46+
if (compressed && !canBeStoredInCompressibleMetaSpace()) {
47+
throw new IllegalArgumentException("constant cannot be compressed: " + metaspaceObject);
48+
}
4649
}
4750

4851
@Override
@@ -83,17 +86,38 @@ public boolean isCompressed() {
8386
return compressed;
8487
}
8588

89+
@Override
90+
public boolean isCompressible() {
91+
if (compressed) {
92+
return false;
93+
}
94+
return canBeStoredInCompressibleMetaSpace();
95+
}
96+
97+
private boolean canBeStoredInCompressibleMetaSpace() {
98+
if (metaspaceObject instanceof HotSpotResolvedJavaType t && !t.isArray()) {
99+
// As of JDK-8338526, interface and abstract types are not stored
100+
// in compressible metaspace.
101+
return !t.isInterface() && !t.isAbstract();
102+
}
103+
return true;
104+
}
105+
86106
@Override
87107
public Constant compress() {
88-
assert !isCompressed();
108+
if (compressed) {
109+
throw new IllegalArgumentException("already compressed: " + this);
110+
}
89111
HotSpotMetaspaceConstantImpl res = HotSpotMetaspaceConstantImpl.forMetaspaceObject(metaspaceObject, true);
90112
assert res.isCompressed();
91113
return res;
92114
}
93115

94116
@Override
95117
public Constant uncompress() {
96-
assert isCompressed();
118+
if (!compressed) {
119+
throw new IllegalArgumentException("not compressed: " + this);
120+
}
97121
HotSpotMetaspaceConstantImpl res = HotSpotMetaspaceConstantImpl.forMetaspaceObject(metaspaceObject, false);
98122
assert !res.isCompressed();
99123
return res;

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotObjectConstantImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ public boolean isCompressed() {
5252
return compressed;
5353
}
5454

55+
@Override
56+
public boolean isCompressible() {
57+
return !compressed;
58+
}
59+
5560
@Override
5661
public abstract JavaConstant compress();
5762

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/IndirectHotSpotObjectConstantImpl.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,17 @@ static void clearHandle(long handle) {
164164

165165
@Override
166166
public JavaConstant compress() {
167-
assert !compressed;
167+
if (compressed) {
168+
throw new IllegalArgumentException("already compressed: " + this);
169+
}
168170
return new IndirectHotSpotObjectConstantImpl(this, true);
169171
}
170172

171173
@Override
172174
public JavaConstant uncompress() {
173-
assert compressed;
175+
if (!compressed) {
176+
throw new IllegalArgumentException("not compressed: " + this);
177+
}
174178
return new IndirectHotSpotObjectConstantImpl(this, false);
175179
}
176180

0 commit comments

Comments
 (0)