From 530a28f881f5daebe5f8ce111a5b2000247846d9 Mon Sep 17 00:00:00 2001 From: Tomas Zezula Date: Wed, 30 Oct 2019 11:41:53 +0100 Subject: [PATCH] [GR-19268] PhysicalMemorySupportImpl needs to be added on whitelist on Linux platform. --- .../svm/truffle/tck/WhiteListParser.java | 86 +++++++++++++------ .../oracle/svm/truffle/tck/resources/jre.json | 9 ++ 2 files changed, 67 insertions(+), 28 deletions(-) diff --git a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/WhiteListParser.java b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/WhiteListParser.java index 343eb7cc3f78..51b2d467fad5 100644 --- a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/WhiteListParser.java +++ b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/WhiteListParser.java @@ -34,6 +34,7 @@ import java.io.IOException; import java.io.Reader; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -44,6 +45,7 @@ import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaType; import jdk.vm.ci.meta.Signature; +import org.graalvm.nativeimage.Platforms; final class WhiteListParser extends ConfigurationParser { @@ -88,32 +90,36 @@ private void parseClass(Map data) { } String className = castProperty(classObject, String.class, "name"); - AnalysisType clazz = resolve(className); - if (clazz == null) { - throw new JSONParserException("Class " + className + " not found"); - } + try { + AnalysisType clazz = resolve(className); + if (clazz == null) { + throw new JSONParserException("Class " + className + " not found"); + } - for (Map.Entry entry : data.entrySet()) { - String name = entry.getKey(); - Object value = entry.getValue(); - if (name.equals("name")) { - /* Already handled. */ - } else if (name.equals("justification")) { - /* Used only to document the whitelist file. */ - } else if (name.equals("allDeclaredConstructors")) { - if (castProperty(value, Boolean.class, "allDeclaredConstructors")) { - registerDeclaredConstructors(clazz); - } - } else if (name.equals("allDeclaredMethods")) { - if (castProperty(value, Boolean.class, "allDeclaredMethods")) { - registerDeclaredMethods(clazz); + for (Map.Entry entry : data.entrySet()) { + String name = entry.getKey(); + Object value = entry.getValue(); + if (name.equals("name")) { + /* Already handled. */ + } else if (name.equals("justification")) { + /* Used only to document the whitelist file. */ + } else if (name.equals("allDeclaredConstructors")) { + if (castProperty(value, Boolean.class, "allDeclaredConstructors")) { + registerDeclaredConstructors(clazz); + } + } else if (name.equals("allDeclaredMethods")) { + if (castProperty(value, Boolean.class, "allDeclaredMethods")) { + registerDeclaredMethods(clazz); + } + } else if (name.equals("methods")) { + parseMethods(castList(value, "Attribute 'methods' must be an array of method descriptors"), clazz); + } else { + throw new JSONParserException("Unknown attribute '" + name + + "' (supported attributes: allDeclaredConstructors, allDeclaredMethods, methods, justification) in defintion of class " + className); } - } else if (name.equals("methods")) { - parseMethods(castList(value, "Attribute 'methods' must be an array of method descriptors"), clazz); - } else { - throw new JSONParserException("Unknown attribute '" + name + - "' (supported attributes: allDeclaredConstructors, allDeclaredMethods, methods, justification) in defintion of class " + className); } + } catch (UnsupportedPlatformException unsupportedPlatform) { + // skip the type not available on active platform } } @@ -169,16 +175,20 @@ private List parseTypes(List types) { List result = new ArrayList<>(); for (Object type : types) { String typeName = castProperty(type, String.class, "types"); - AnalysisType clazz = resolve(typeName); - if (clazz == null) { - throw new JSONParserException("Class " + typeName + " not found"); + try { + AnalysisType clazz = resolve(typeName); + if (clazz == null) { + throw new JSONParserException("Parameter type " + typeName + " not found"); + } + result.add(clazz); + } catch (UnsupportedPlatformException unsupportedPlatform) { + throw new JSONParserException("Parameter type " + typeName + " is not available on active platform"); } - result.add(clazz); } return result; } - private AnalysisType resolve(String type) { + private AnalysisType resolve(String type) throws UnsupportedPlatformException { String useType; if (type.indexOf('[') != -1) { useType = MetaUtil.internalNameToJava(MetaUtil.toInternalName(type), true, true); @@ -186,9 +196,20 @@ private AnalysisType resolve(String type) { useType = type; } Class clz = imageClassLoader.findClassByName(useType, false); + verifySupportedOnActivePlatform(clz); return bigBang.forClass(clz); } + private void verifySupportedOnActivePlatform(Class clz) throws UnsupportedPlatformException { + Class current = clz; + do { + if (!bigBang.getUniverse().platformSupported(current)) { + throw new UnsupportedPlatformException(current); + } + current = current.getEnclosingClass(); + } while (current != null); + } + private boolean registerMethod(AnalysisType type, String methodName, List formalParameters) { Predicate p = (m) -> methodName.equals(m.getName()); p = p.and(new SignaturePredicate(type, formalParameters, bigBang)); @@ -280,4 +301,13 @@ public boolean test(ResolvedJavaMethod t) { } } + @SuppressWarnings("serial") + private static final class UnsupportedPlatformException extends Exception { + + UnsupportedPlatformException(Class clazz) { + super(String.format("The %s is supported only on platforms: %s", + clazz.getName(), + Arrays.toString(clazz.getAnnotation(Platforms.class).value()))); + } + } } diff --git a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/resources/jre.json b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/resources/jre.json index 32ab1de1e6d8..677355125080 100644 --- a/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/resources/jre.json +++ b/substratevm/src/com.oracle.svm.truffle.tck/src/com/oracle/svm/truffle/tck/resources/jre.json @@ -139,5 +139,14 @@ "byte[]" ]} ] + }, + { + "name" : "com.oracle.svm.core.posix.linux.LinuxPhysicalMemory$PhysicalMemorySupportImpl", + "methods" : [ + { "name" : "sizeFromCGroup", + "justification" : "Native application on Linux determines heap size by reading /sys/fs/cgroup/memory/memory.limit_in_bytes at start.", + "parameterTypes" : [ + ]} + ] } ]