> On Apr 27, 2017, at 11:51 AM, Doug Simon <doug.si...@oracle.com> wrote:
> 
>> 
>> On 27 Apr 2017, at 18:44, Christian Thalinger <cthalin...@twitter.com> wrote:
>> 
>> Thanks for doing this.  I have a hard time following what’s happening :-)
>> 
>> src/jdk.internal.vm.compiler/.mx.graal/suite.py
>> 
>> +  "jdklibraries" : {
>> +    "JVMCI_SERVICES" : {
>> +      "path" : "lib/jvmci-services.jar",
>> +      "sourcePath" : "lib/jvmci-services.src.zip",
>> +      "optional" : False,
>> +      "jdkStandardizedSince" : "9",
>> +      "module" : "jdk.internal.vm.ci"
>> +    },
>> +    "JVMCI_API" : {
>> +      "path" : "lib/jvmci/jvmci-api.jar",
>> +      "sourcePath" : "lib/jvmci/jvmci-api.src.zip",
>> +      "dependencies" : [
>> +        "JVMCI_SERVICES",
>> +      ],
>> +      "optional" : False,
>> +      "jdkStandardizedSince" : "9",
>> +      "module" : "jdk.internal.vm.ci"
>> +    },
>> +    "JVMCI_HOTSPOT" : {
>> +      "path" : "lib/jvmci/jvmci-hotspot.jar",
>> +      "sourcePath" : "lib/jvmci/jvmci-hotspot.src.zip",
>> +      "dependencies" : [
>> +        "JVMCI_API",
>> +      ],
>> +      "optional" : False,
>> +      "jdkStandardizedSince" : "9",
>> +      "module" : "jdk.internal.vm.ci"
>> +    },
>> +  },
>> 
>> Can you explain to me why we need this?  I don’t think these files are built 
>> in 9.
> 
> This simply allows `mx eclipseinit` to work when wanting to edit the JDK 
> Graal sources in Eclipse. As you state, this is completely by-passed by the 
> JDK make system.

Got it.

> 
>> 
>> src/jdk.internal.vm.ci/share/classes/module-info.java
>> 
>> Why can we remove the exports to jdk.internal.vm.compiler?  Because of this 
>> in JVMCIServiceLocator:
>> 
>> +        ReflectionAccessJDK.openJVMCITo(getClass());
> 
> Yes. And the --add-exports in CompileJavaModules.gmk[1] and 
> Launcher-jdk.aot.gmk[2]. It also means these VM options are required in 
> upstream Graal when running the Graal junit tests.

Ok, thanks.

> 
> -Doug
> 
> [1] 
> http://cr.openjdk.java.net/~dnsimon/8177845.02/make/make/CompileJavaModules.gmk.udiff.html
>  
> <http://cr.openjdk.java.net/~dnsimon/8177845.02/make/make/CompileJavaModules.gmk.udiff.html>
> [2] 
> http://cr.openjdk.java.net/~dnsimon/8177845.02/jdk/make/launcher/Launcher-jdk.aot.gmk.udiff.html
>  
> <http://cr.openjdk.java.net/~dnsimon/8177845.02/jdk/make/launcher/Launcher-jdk.aot.gmk.udiff.html>
> 
>> 
>> ?
>> 
>>> On Apr 27, 2017, at 7:47 AM, Doug Simon <doug.si...@oracle.com> wrote:
>>> 
>>>> 
>>>> On 21 Apr 2017, at 13:46, Doug Simon <doug.si...@oracle.com> wrote:
>>>> 
>>>> There has been some discussion about whether we want to update Graal in 
>>>> the JDK at this late stage. The main (only?) risk is a regression in the 
>>>> AOT tool.
>>>> 
>>>> If we don't update Graal from upstream, then the qualified exports from 
>>>> JVMCI to jdk.internal.vm.compiler cannot be removed in JDK 9. Note that in 
>>>> addition to updating Graal to remove the qualified exports, there would 
>>>> also need to be changes in the relevant make files to add --add-exports 
>>>> options when compiling Graal and jaotc as they use the dynamically 
>>>> exported JVMCI packages.
>>>> 
>>>> I have an updated hotspot patch that adapts Graal to the JVMCI API changes:
>>>> 
>>>> http://cr.openjdk.java.net/~dnsimon/8177845/hotspot.02/
>>>> 
>>>> Note that this patch does not include the changes removing use of JDK 
>>>> internal API from Graal. Cherry picking those upstream Graal changes would 
>>>> be more work than simply doing a complete update from upstream Graal.
>>>> 
>>>> As I see it, there are 2 options here:
>>>> 
>>>> 1. Go with the current webrev (including hotspot.02 patch) and live with 
>>>> the qualified exports.
>>>> 2. Go with the current webrev (including hotspot.02 patch) and create a 
>>>> follow up bug to update Graal from upstream, perform the relevant make 
>>>> file changes and remove the qualified exports.
>>> 
>>> I made a new webrev[1] that implements option 1.5 ;-) The changes added 
>>> since the first webrev[2] are:
>>> 
>>> - Cherry picked changes from upstream Graal that remove use of JDK 
>>> internals.
>>> 
>>> - The jdk.internal.vm.ci.enabled system property is set to true in 
>>> arguments.cpp[3] iff EnableJVMCI is true
>>> and this property is checked in all the public methods in 
>>> jdk.vm.ci.services.
>>> 
>>> - The jdk.vm.ci.services package is (once again) only exported to 
>>> jdk.internal.vm.compiler based on
>>> advice from the jigsaw team:
>>> 
>>> "We reviewed the unqualified export jdk.vm.ci.services from 
>>> jdk.internal.vm.ci module. This brings
>>>  jdk.internal.vm.ci to be resolved by default that of course may resolve 
>>> additional modules that
>>>  provides the services that JVMCI uses.  In addition.  JVMCI is meant to be 
>>> used (only) when
>>>  -XX:+EnableJVMCI is specified but now it’s defined by default.
>>> 
>>>  An internal module should only have qualified exports as a design 
>>> principle.  The Lab Graal will
>>>  have the same module name, jdk.internal.vm.compiler.  The advise is to 
>>> keep it as qualified export
>>>  `exports jdk.vm.ci.services to jdk.internal.vm.compiler` and remove all 
>>> other qualified exports as
>>>   we discussed."
>>> 
>>> - The jaotc launcher now needs to explicitly export JVMCI and 
>>> jdk.internal.vm.compiler to jdk.aot[4].
>>> Unfortunately there needs to be one --add-exports option per qualified 
>>> export target as combining
>>> them with a comma (e.g., 
>>> --add-exports=jdk.internal.vm.ci/jdk.vm.ci.code=jdk.internal.vm.compiler,jdk.aot)
>>> breaks the make process:
>>> 
>>>   Launcher-jdk.aot.gmk:31: *** missing separator.  Stop.
>>>   make/Main.gmk:232: recipe for target 'jdk.aot-launchers' failed.
>>> 
>>> The latest webrev has been tested against upstream Graal, the closed AOT 
>>> tests and jprt.
>>> 
>>> -Doug
>>> 
>>> [1] http://cr.openjdk.java.net/~dnsimon/8177845.02
>>> [2] http://cr.openjdk.java.net/~dnsimon/8177845
>>> [3] 
>>> http://cr.openjdk.java.net/~dnsimon/8177845.02/hotspot/src/share/vm/runtime/arguments.cpp.udiff.html
>>> [4] 
>>> http://cr.openjdk.java.net/~dnsimon/8177845.02/jdk/make/launcher/Launcher-jdk.aot.gmk.udiff.html
>>> 
>>>> 
>>>>> On 20 Apr 2017, at 20:50, Doug Simon <doug.si...@oracle.com> wrote:
>>>>> 
>>>>> I've had to update the webrev again to support selection of a "null" 
>>>>> compiler (i.e. one that raises an
>>>>> exception upon a compilation request) and added -Djvmci.Compiler=null to 
>>>>> a large number of JVMCI jtreg
>>>>> tests to prevent Graal being selected and initialized by the JVMCI 
>>>>> compiler auto-selection mechanism.
>>>>> Initializing Graal will currently fail with errors (see stack trace 
>>>>> below) until Graal is updated to
>>>>> the version compatible with the JVMCI API changes.
>>>>> 
>>>>> In addition to resolving the compatibility issue, explicitly selecting 
>>>>> the "null" compiler for these
>>>>> tests better isolates them from parts of the runtime they are not aiming 
>>>>> to test.
>>>>> 
>>>>> org.graalvm.compiler.debug.GraalError: java.lang.ClassCastException: 
>>>>> java.base/java.util.ImmutableCollections$MapN cannot be cast to 
>>>>> java.base/java.util.Properties
>>>>>   at 
>>>>> jdk.internal.vm.compiler/org.graalvm.compiler.hotspot.HotSpotGraalCompilerFactory.getSavedProperties(HotSpotGraalCompilerFactory.java:217)
>>>>>   at 
>>>>> jdk.internal.vm.compiler/org.graalvm.compiler.hotspot.HotSpotGraalCompilerFactory.initializeOptions(HotSpotGraalCompilerFactory.java:138)
>>>>>   at 
>>>>> jdk.internal.vm.compiler/org.graalvm.compiler.hotspot.HotSpotGraalCompilerFactory.onSelection(HotSpotGraalCompilerFactory.java:95)
>>>>>   at 
>>>>> jdk.internal.vm.ci/jdk.vm.ci.hotspot.HotSpotJVMCICompilerConfig.getCompilerFactory(HotSpotJVMCICompilerConfig.java:104)
>>>>>   at 
>>>>> jdk.internal.vm.ci/jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.<init>(HotSpotJVMCIRuntime.java:290)
>>>>>   at 
>>>>> jdk.internal.vm.ci/jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.<init>(HotSpotJVMCIRuntime.java:65)
>>>>>   at 
>>>>> jdk.internal.vm.ci/jdk.vm.ci.hotspot.HotSpotJVMCIRuntime$DelayedInit.<clinit>(HotSpotJVMCIRuntime.java:73)
>>>>>   at 
>>>>> jdk.internal.vm.ci/jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.runtime(HotSpotJVMCIRuntime.java:83)
>>>>>   at jdk.internal.vm.ci/jdk.vm.ci.runtime.JVMCI.initializeRuntime(Native 
>>>>> Method)
>>>>>   at jdk.internal.vm.ci/jdk.vm.ci.runtime.JVMCI.<clinit>(JVMCI.java:58)
>>>>>   at 
>>>>> jdk.internal.vm.ci/jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.runtime(HotSpotJVMCIRuntime.java:82)
>>>>>   at 
>>>>> jdk.internal.vm.ci/jdk.vm.ci.hotspot.HotSpotVMConfig.config(HotSpotVMConfig.java:41)
>>>>>   at 
>>>>> jdk.internal.vm.ci/jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl.getHolder(HotSpotResolvedJavaMethodImpl.java:92)
>>>>>   at 
>>>>> jdk.internal.vm.ci/jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl.fromMetaspace(HotSpotResolvedJavaMethodImpl.java:110)
>>>>>   at 
>>>>> jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVM.asResolvedJavaMethod(Native
>>>>>  Method)
>>>>>   at 
>>>>> jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper.asResolvedJavaMethod(CompilerToVMHelper.java:185)
>>>>>   at 
>>>>> compiler.jvmci.common.CTVMUtilities.getResolvedMethod(CTVMUtilities.java:59)
>>>>>   at 
>>>>> compiler.jvmci.common.CTVMUtilities.getResolvedMethod(CTVMUtilities.java:64)
>>>>>   at 
>>>>> compiler.jvmci.compilerToVM.AllocateCompileIdTest.runSanityCorrectTest(AllocateCompileIdTest.java:125)
>>>>>   at java.base/java.util.ArrayList.forEach(ArrayList.java:1378)
>>>>>   at 
>>>>> compiler.jvmci.compilerToVM.AllocateCompileIdTest.main(AllocateCompileIdTest.java:71)
>>>>>   at 
>>>>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 
>>>>> Method)
>>>>>   at 
>>>>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>>>>>   at 
>>>>> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>>>>   at java.base/java.lang.reflect.Method.invoke(Method.java:563)
>>>>>   at 
>>>>> com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:115)
>>>>>   at java.base/java.lang.Thread.run(Thread.java:844)
>>>>> Caused by: java.lang.ClassCastException: 
>>>>> java.base/java.util.ImmutableCollections$MapN cannot be cast to 
>>>>> java.base/java.util.Properties
>>>>>   at 
>>>>> jdk.internal.vm.compiler/org.graalvm.compiler.hotspot.HotSpotGraalCompilerFactory.getSavedProperties(HotSpotGraalCompilerFactory.java:215)
>>>>>   ... 26 more
>>>>> 
>>>>> -Doug
>>>>> 
>>>>>> On 19 Apr 2017, at 23:26, Doug Simon <doug.si...@oracle.com> wrote:
>>>>>> 
>>>>>> I've updated http://cr.openjdk.java.net/~dnsimon/8177845/hotspot/ with 
>>>>>> these changes:
>>>>>> 
>>>>>> 1. JVMCIServiceLocator.getProvider(Class<S>) is now protected
>>>>>> 2. JVMCIServiceLocator.getProviders(Class<S>) now checks JVMCIPermission
>>>>>> 3. Rename: jdk.vm.ci.services.internal.JDK9 -> 
>>>>>> jdk.vm.ci.services.internal.ReflectionAccessJDK
>>>>>> 
>>>>>> -Doug
>>>>>> 
>>>>>>> On 19 Apr 2017, at 23:12, Doug Simon <doug.si...@oracle.com> wrote:
>>>>>>> 
>>>>>>>> 
>>>>>>>> On 19 Apr 2017, at 21:40, Christian Thalinger <cthalin...@twitter.com> 
>>>>>>>> wrote:
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> On Apr 19, 2017, at 9:27 AM, Doug Simon <doug.si...@oracle.com> wrote:
>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> On 19 Apr 2017, at 21:04, Mandy Chung <mandy.ch...@oracle.com> wrote:
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>>> On Apr 19, 2017, at 11:55 AM, Christian Thalinger 
>>>>>>>>>>> <cthalin...@twitter.com> wrote:
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>>> On Apr 19, 2017, at 8:38 AM, Mandy Chung <mandy.ch...@oracle.com> 
>>>>>>>>>>>> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> Since jdk.internal.vm.compiler becomes an upgradeable module, it 
>>>>>>>>>>>> is not hashed with java.base to allow it to be upgraded and there 
>>>>>>>>>>>> is no integrity check.  Such qualified export will be granted to 
>>>>>>>>>>>> any module named jdk.internal.vm.compiler at runtime.  The goal is 
>>>>>>>>>>>> for upgradeable modules not to use any internal APIs and eliminate 
>>>>>>>>>>>> the qualified exports.
>>>>>>>>>>>> 
>>>>>>>>>>>> The main thing is that jdk.vm.ci.services API would need to be 
>>>>>>>>>>>> guarded if it’s used by non-Graal modules.
>>>>>>>>>>> 
>>>>>>>>>>> This all makes sense but where is the restriction that only 
>>>>>>>>>>> jdk.internal.vm.compiler can use jdk.vm.ci.services?  
>>>>>>>>>> 
>>>>>>>>>> It's unqualified and no restriction in this change.
>>>>>>>>> 
>>>>>>>>> The public methods currently in jdk.vm.ci.services are:
>>>>>>>>> 
>>>>>>>>> 1. JVMCIServiceLocator.getProvider(Class<S>)
>>>>>>>>> 2. JVMCIServiceLocator.getProviders(Class<S>)
>>>>>>>>> 3. Services.initializeJVMCI()
>>>>>>>>> 4. Services.getSavedProperties()
>>>>>>>>> 5. Services.exportJVMCITo(Class<?>)
>>>>>>>>> 6. Services.load(Class<S>)
>>>>>>>>> 7. Services.loadSingle(Class<S>, boolean)
>>>>>>>>> 
>>>>>>>>> 1 should be made protected. I'll update the webrev with this change.
>>>>>>>> 
>>>>>>>> Good.
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 2 should check for JVMCIPermission. I'll update the webrev with this 
>>>>>>>>> change.
>>>>>>>> 
>>>>>>>> Good.
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 3 is harmless from a security perspective in my opinion.
>>>>>>>> 
>>>>>>>> Would be good if one of Oracle’s security engineers could take a quick 
>>>>>>>> look just to be sure.
>>>>>>> 
>>>>>>> Vladimir, can you please bring this to the attention of the relevant 
>>>>>>> engineer.
>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 4 checks for JVMCIPermission.
>>>>>>>> 
>>>>>>>> Ok.
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 5, 6 and 7 will be removed in a follow bug that updates Graal from 
>>>>>>>>> upstream (and removes its usage of these methods).
>>>>>>>> 
>>>>>>>> About this, will this Graal update happen for JDK 9?
>>>>>>> 
>>>>>>> Yes.
>>>>>>> 
>>>>>>>> It’s awfully late in the cycle...
>>>>>>> 
>>>>>>> These are jigsaw related changes and I've been told jigsaw has an FC 
>>>>>>> exception (although I don't exactly know what that is).
>>>>>>> 
>>>>>>> -Doug

Reply via email to