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