Skip to content

Commit 91e3748

Browse files
committed
[GR-69273] Fix error in bad toString reporting.
PullRequest: graal/22031
2 parents e2b01b0 + 0ffe348 commit 91e3748

File tree

4 files changed

+44
-36
lines changed

4 files changed

+44
-36
lines changed

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/ObjectScanner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -747,7 +747,7 @@ public AnalysisMethod getMethod() {
747747

748748
@Override
749749
public String toString(BigBang bb) {
750-
return "scanning root " + asString(bb, constant) + " embedded in" + System.lineSeparator() + INDENTATION_AFTER_NEWLINE + asStackTraceElement();
750+
return "scanning root constant " + asString(bb, constant) + " embedded in" + System.lineSeparator() + INDENTATION_AFTER_NEWLINE + asStackTraceElement();
751751
}
752752

753753
@Override

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisElement.java

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import java.util.function.BiConsumer;
3939
import java.util.function.Consumer;
4040

41-
import com.oracle.graal.pointsto.util.AtomicUtils;
4241
import org.graalvm.nativeimage.hosted.Feature.DuringAnalysisAccess;
4342

4443
import com.oracle.graal.pointsto.BigBang;
@@ -47,6 +46,7 @@
4746
import com.oracle.graal.pointsto.reports.ReportUtils;
4847
import com.oracle.graal.pointsto.util.AnalysisError;
4948
import com.oracle.graal.pointsto.util.AnalysisFuture;
49+
import com.oracle.graal.pointsto.util.AtomicUtils;
5050
import com.oracle.graal.pointsto.util.ConcurrentLightHashSet;
5151

5252
import jdk.graal.compiler.debug.GraalError;
@@ -309,8 +309,7 @@ private void build() {
309309
while (!reasonStack.isEmpty()) {
310310
boolean expanded;
311311
Object top = reasonStack.peekLast();
312-
if (top instanceof CompoundReason) {
313-
CompoundReason compoundReason = (CompoundReason) top;
312+
if (top instanceof CompoundReason compoundReason) {
314313
if (compoundReason.isFirst()) {
315314
compoundReason.storeCurrentIndent(indent);
316315
}
@@ -378,23 +377,20 @@ private boolean processReason(Object current, String prefix) {
378377
if (current instanceof String) {
379378
reasonStr = "str: " + current;
380379

381-
} else if (current instanceof AnalysisMethod) {
382-
AnalysisMethod method = (AnalysisMethod) current;
383-
reasonStr = "at " + method.format("%f method %H.%n(%p)") + ", " + methodReasonStr(method);
384-
expanded = methodReason((AnalysisMethod) current);
380+
} else if (current instanceof AnalysisMethod method) {
381+
reasonStr = "at " + method.format("%f method %H.%n(%p)") + " " + methodReasonStr(method);
382+
expanded = methodReason(method);
385383

386-
} else if (current instanceof AnalysisField) {
387-
AnalysisField field = (AnalysisField) current;
384+
} else if (current instanceof AnalysisField field) {
388385
reasonStr = "field " + field.format("%H.%n") + " " + fieldReasonStr(field);
389386
expanded = fieldReason(field);
390387

391-
} else if (current instanceof AnalysisType) {
392-
AnalysisType type = (AnalysisType) current;
393-
reasonStr = "type " + (type).toJavaName() + " " + typeReasonStr(type);
388+
} else if (current instanceof AnalysisType type) {
389+
reasonStr = "type " + type.toJavaName() + " " + typeReasonStr(type);
394390
expanded = typeReason(type);
395391

396-
} else if (current instanceof ResolvedJavaMethod) {
397-
reasonStr = ((ResolvedJavaMethod) current).format("%f method %H.%n");
392+
} else if (current instanceof ResolvedJavaMethod method) {
393+
reasonStr = method.format("%f method %H.%n");
398394

399395
} else if (current instanceof ResolvedJavaField field) {
400396
/*
@@ -408,26 +404,23 @@ private boolean processReason(Object current, String prefix) {
408404
if (analysisField != null) {
409405
return processReason(analysisField, prefix);
410406
} else {
411-
reasonStr = "field " + ((ResolvedJavaField) current).format("%H.%n");
407+
reasonStr = "field " + field.format("%H.%n");
412408
}
413409

414410
} else if (current instanceof ResolvedJavaType) {
415411
reasonStr = "type " + ((ResolvedJavaType) current).getName();
416412

417-
} else if (current instanceof BytecodePosition) {
418-
BytecodePosition position = (BytecodePosition) current;
413+
} else if (current instanceof BytecodePosition position) {
419414
ResolvedJavaMethod method = position.getMethod();
420415
reasonStr = "at " + method.format("%f") + " method " + method.asStackTraceElement(position.getBCI()) + ", " + methodReasonStr(method);
421416
expanded = methodReason(position.getMethod());
422417

423-
} else if (current instanceof MethodParsing) {
424-
MethodParsing methodParsing = (MethodParsing) current;
418+
} else if (current instanceof MethodParsing methodParsing) {
425419
AnalysisMethod method = methodParsing.getMethod();
426420
reasonStr = "at " + method.format("%f method %H.%n(%p)") + ", " + methodReasonStr(method);
427421
expanded = methodReason(methodParsing.getMethod());
428422

429-
} else if (current instanceof ObjectScanner.ScanReason) {
430-
ObjectScanner.ScanReason scanReason = (ObjectScanner.ScanReason) current;
423+
} else if (current instanceof ObjectScanner.ScanReason scanReason) {
431424
reasonStr = scanReason.toString(bb);
432425
expanded = maybeExpandReasonStack(scanReason.getPrevious());
433426

@@ -447,6 +440,8 @@ private void print(String prefix, String reasonStr) {
447440
private boolean typeReason(AnalysisType type) {
448441
if (type.isInstantiated()) {
449442
return maybeExpandReasonStack(type.getInstantiatedReason());
443+
} else if (type.isAnySubtypeInstantiated()) {
444+
return maybeExpandReasonStack(type.getAnyInstantiatedSubtype());
450445
} else {
451446
return maybeExpandReasonStack(type.getReachableReason());
452447
}
@@ -455,6 +450,8 @@ private boolean typeReason(AnalysisType type) {
455450
private static String typeReasonStr(AnalysisType type) {
456451
if (type.isInstantiated()) {
457452
return "is marked as instantiated";
453+
} else if (type.isAnySubtypeInstantiated()) {
454+
return "has a subtype marked as instantiated";
458455
}
459456
return "is reachable";
460457
}
@@ -489,8 +486,7 @@ private static String fieldReasonStr(AnalysisField field) {
489486
}
490487

491488
private boolean methodReason(ResolvedJavaMethod method) {
492-
if (method instanceof AnalysisMethod) {
493-
AnalysisMethod aMethod = (AnalysisMethod) method;
489+
if (method instanceof AnalysisMethod aMethod) {
494490
if (aMethod.isSimplyImplementationInvoked()) {
495491
if (aMethod.isStatic()) {
496492
return maybeExpandReasonStack(aMethod.getImplementationInvokedReason());
@@ -522,29 +518,28 @@ private boolean maybeExpandReasonStack(Object reason) {
522518
}
523519

524520
private static String methodReasonStr(ResolvedJavaMethod method) {
525-
if (method instanceof AnalysisMethod) {
526-
AnalysisMethod aMethod = (AnalysisMethod) method;
521+
if (method instanceof AnalysisMethod aMethod) {
527522
if (aMethod.isSimplyImplementationInvoked()) {
528523
if (aMethod.isStatic()) {
529-
return "implementation invoked";
524+
return "is implementation invoked";
530525
} else {
531526
/* For virtual methods we follow back type reachability. */
532527
AnalysisType declaringClass = aMethod.getDeclaringClass();
533528
assert declaringClass.isInstantiated() || declaringClass.isAbstract() ||
534529
(declaringClass.isInterface() && aMethod.isDefault()) || declaringClass.isReachable() : declaringClass + " is not reachable";
535-
return "implementation invoked";
530+
return "is implementation invoked";
536531
}
537532
} else if (aMethod.isInlined()) {
538533
if (aMethod.isStatic()) {
539-
return "inlined";
534+
return "is inlined";
540535
} else {
541536
AnalysisType declaringClass = aMethod.getDeclaringClass();
542537
assert declaringClass.isInstantiated() || declaringClass.isAbstract() ||
543538
(declaringClass.isInterface() && aMethod.isDefault()) || declaringClass.isReachable() : declaringClass + " is not reachable";
544-
return "inlined";
539+
return "is inlined";
545540
}
546541
} else if (aMethod.isIntrinsicMethod()) {
547-
return "intrinsified";
542+
return "is intrinsified";
548543
}
549544
}
550545
return "<no available reason>";

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import java.util.Set;
3535
import java.util.concurrent.ConcurrentHashMap;
3636
import java.util.concurrent.ConcurrentMap;
37-
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
3837
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
3938
import java.util.function.Consumer;
4039
import java.util.function.Function;
@@ -100,8 +99,8 @@ public abstract class AnalysisType extends AnalysisElement implements WrappedJav
10099
private static final AtomicReferenceFieldUpdater<AnalysisType, Object> isReachableUpdater = AtomicReferenceFieldUpdater
101100
.newUpdater(AnalysisType.class, Object.class, "isReachable");
102101

103-
private static final AtomicIntegerFieldUpdater<AnalysisType> isAnySubtypeInstantiatedUpdater = AtomicIntegerFieldUpdater
104-
.newUpdater(AnalysisType.class, "isAnySubtypeInstantiated");
102+
private static final AtomicReferenceFieldUpdater<AnalysisType, Object> isAnySubtypeInstantiatedUpdater = AtomicReferenceFieldUpdater
103+
.newUpdater(AnalysisType.class, Object.class, "isAnySubtypeInstantiated");
105104

106105
static final AtomicReferenceFieldUpdater<AnalysisType, Object> overrideableMethodsUpdater = AtomicReferenceFieldUpdater
107106
.newUpdater(AnalysisType.class, Object.class, "overrideableMethods");
@@ -121,7 +120,7 @@ public abstract class AnalysisType extends AnalysisElement implements WrappedJav
121120
/** Can be allocated via Unsafe or JNI, i.e., without executing a constructor. */
122121
@SuppressWarnings("unused") private volatile Object isUnsafeAllocated;
123122
@SuppressWarnings("unused") private volatile Object isReachable;
124-
@SuppressWarnings("unused") private volatile int isAnySubtypeInstantiated;
123+
@SuppressWarnings("unused") private volatile Object isAnySubtypeInstantiated;
125124
private boolean reachabilityListenerNotified;
126125
private boolean unsafeFieldsRecomputed;
127126

@@ -533,7 +532,7 @@ public boolean registerAsInstantiated(Object reason) {
533532

534533
protected void onInstantiated() {
535534
assert !isWordType() : Assertions.errorMessage("Word types cannot be instantiated", this);
536-
forAllSuperTypes(superType -> AtomicUtils.atomicMark(superType, isAnySubtypeInstantiatedUpdater));
535+
forAllSuperTypes(superType -> AtomicUtils.atomicSet(superType, this, isAnySubtypeInstantiatedUpdater));
537536

538537
universe.onTypeInstantiated(this);
539538
notifyInstantiatedCallbacks();
@@ -836,6 +835,10 @@ public Object getInstantiatedReason() {
836835
return isInstantiated;
837836
}
838837

838+
public Object getAnyInstantiatedSubtype() {
839+
return isAnySubtypeInstantiated;
840+
}
841+
839842
public boolean isUnsafeAllocated() {
840843
return AtomicUtils.isSet(this, isUnsafeAllocatedUpdater);
841844
}

substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/substitutions/GraalSubstitutions.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.io.PrintStream;
3333
import java.util.ArrayList;
3434
import java.util.List;
35+
import java.util.Set;
3536

3637
import org.graalvm.collections.EconomicMap;
3738
import org.graalvm.collections.EconomicSet;
@@ -373,6 +374,15 @@ static void set(Target_jdk_vm_ci_code_TargetDescription receiver, boolean value)
373374
}
374375
}
375376

377+
@TargetClass(className = "jdk.graal.compiler.graphio.GraphProtocol")
378+
final class Target_jdk_graal_compiler_graphio_GraphProtocol {
379+
380+
/** GraphProtocol.badToString can capture hosted only types such as ImageHeapInstance. */
381+
@Alias//
382+
@RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Reset) //
383+
private static Set<Class<?>> badToString;
384+
}
385+
376386
/** Dummy class to have a class with the file's name. Do not remove. */
377387
public final class GraalSubstitutions {
378388
// Dummy

0 commit comments

Comments
 (0)