Mercurial > hg > graal-jvmci-8
comparison jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotMemoryAccessProviderImpl.java @ 23712:66059526b021 jvmci-0.16
8160177: [JVMCI] race condition in HotSpotMemoryAccessProviderImpl.verifyReadRawObject
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Thu, 23 Jun 2016 16:49:32 +0200 |
parents | b5557b757040 |
children | 8abcd8e1285d |
comparison
equal
deleted
inserted
replaced
23711:387870951564 | 23712:66059526b021 |
---|---|
109 throw new IllegalArgumentException(String.valueOf(bits)); | 109 throw new IllegalArgumentException(String.valueOf(bits)); |
110 } | 110 } |
111 } | 111 } |
112 } | 112 } |
113 | 113 |
114 private boolean verifyReadRawObject(Object expected, Constant base, long displacement, boolean compressed) { | 114 private boolean verifyReadRawObject(Object expected, Constant base, long displacement) { |
115 if (compressed == runtime.getConfig().useCompressedOops) { | |
116 Object obj = asObject(base); | |
117 if (obj != null) { | |
118 assert expected == UNSAFE.getObject(obj, displacement) : "readUnsafeOop doesn't agree with unsafe.getObject"; | |
119 } | |
120 } | |
121 if (base instanceof HotSpotMetaspaceConstant) { | 115 if (base instanceof HotSpotMetaspaceConstant) { |
122 MetaspaceWrapperObject metaspaceObject = HotSpotMetaspaceConstantImpl.getMetaspaceObject(base); | 116 MetaspaceWrapperObject metaspaceObject = HotSpotMetaspaceConstantImpl.getMetaspaceObject(base); |
123 if (metaspaceObject instanceof HotSpotResolvedObjectTypeImpl) { | 117 if (metaspaceObject instanceof HotSpotResolvedObjectTypeImpl) { |
124 if (displacement == runtime.getConfig().classMirrorOffset) { | 118 if (displacement == runtime.getConfig().classMirrorOffset) { |
125 assert expected == ((HotSpotResolvedObjectTypeImpl) metaspaceObject).mirror(); | 119 assert expected == ((HotSpotResolvedObjectTypeImpl) metaspaceObject).mirror(); |
138 Object base = asObject(baseConstant); | 132 Object base = asObject(baseConstant); |
139 if (base == null) { | 133 if (base == null) { |
140 assert !compressed; | 134 assert !compressed; |
141 displacement += asRawPointer(baseConstant); | 135 displacement += asRawPointer(baseConstant); |
142 ret = runtime.getCompilerToVM().readUncompressedOop(displacement); | 136 ret = runtime.getCompilerToVM().readUncompressedOop(displacement); |
137 assert verifyReadRawObject(ret, baseConstant, initialDisplacement); | |
143 } else { | 138 } else { |
144 assert runtime.getConfig().useCompressedOops == compressed; | 139 assert runtime.getConfig().useCompressedOops == compressed; |
145 ret = UNSAFE.getObject(base, displacement); | 140 ret = UNSAFE.getObject(base, displacement); |
146 } | 141 } |
147 assert verifyReadRawObject(ret, baseConstant, initialDisplacement, compressed); | |
148 return ret; | 142 return ret; |
149 } | 143 } |
150 | 144 |
151 /** | 145 /** |
152 * Reads a value of this kind using a base address and a displacement. No bounds checking or | 146 * Reads a value of this kind using a base address and a displacement. No bounds checking or |