Request for review (XS): JDK-8006758: LinkResolver assertion (caused by @Contended changes)

Krystal Mo krystal.mo at oracle.com
Thu Jan 24 00:14:07 PST 2013


The fix is being tested with (1) JPRT, (2) jtreg compiler and (3) jtreg 
java/lang/invoke

I'm seeing some javac compilation timeouts in (3), but the tests that 
built fine are passing.
Will update on test results when all three tests finish.

- Kris

On 01/24/2013 04:06 PM, Krystal Mo wrote:
> Hi all,
>
> Could anyone review this patch, please?
> It's causing a lot of failures in nightlies, so I'd like to get it 
> reviewed quickly and push it ASAP.
>
> Webrev: http://cr.openjdk.java.net/~kmo/8006758/webrev.00/
> Bug: https://jbs.oracle.com/bugs/browse/JDK-8006758
> (There's no public bug for this yet. The description is copied below.)
>
> Bug to cover recent nightly failures with:
>
> # To suppress the following error report, specify this argument
> # after -XX: or in .hotspotrc: SuppressErrorAt=/linkResolver.cpp:99
> #
> # A fatal error has been detected by the Java Runtime Environment:
> #
> # Internal Error 
> (XXX/hotspot/src/share/vm/interpreter/linkResolver.cpp:99), pid=7993, 
> tid=2731850608
> # assert(resolved_method->intrinsic_id() == vmIntrinsics::_invokeBasic 
> || resolved_method->is_compiled_lambda_form()) failed: linkMethod must 
> return one of these
> #
> # JRE version: Java(TM) SE Runtime Environment (8.0) (build 
> 1.8.0-internal-fastdebug-201301181518.amurillo.hs25-b16-jdk8-b74--b00)
> # Java VM: Java HotSpot(TM) Client VM (25.0-b16-fastdebug compiled 
> mode, sharing linux-x86 )
> # Core dump written. Default location: XXX/core or core.7993
> #
> # An error report file with more information is saved as:
> # XXX/hs_err_pid7993.log
> #
> # If you would like to submit a bug report, please visit:
> # http://bugreport.sun.com/bugreport/crash.jsp
> #
>
> This assertion is caused by a predicate on code privilege in 
> ClassFileParser::AnnotationCollector::annotation_index():
>
>   bool privileged = false;
>   if (loader_data->is_the_null_class_loader_data()) {
>     // Privileged code can use all annotations. Other code silently 
> drops some.
>     privileged = true;
>   }
>
> The problematic code was introduced in the @Contended change,
> JDK-8003985: Support @Contended Annotation - JEP 142
> It didn't take into account that, with recent NPG changes for 292, 
> every anonymous class would have a dedicated ClassLoaderData which is 
> not the null_CLD, so the condition for privileged code was not complete.
>
> The way how this code triggers the assertion far away goes like this:
>
> (1) The new MethodHandle implementation for 292 via LambdaForm uses 
> anonymous classes to represent "compiled lambda forms".
> (2) The sole method in compiled lambda forms is marked with three 
> special marker annotations: @Hidden, @Compiled and @ForceInline.
> (3) There's special handling in the VM to recognized these annotations 
> while parsing the class file; but these annotations are handled 
> specially only when the class is privileged, otherwise the special 
> handling for them is ignored silently.
> (4) That information is later used to tell if a Method is a compiled 
> lambda form.
>
> This bug introduced an incomplete predicate for code privilege in (3), 
> silently missed the special handling, and then triggered an assertion 
> in (4).
>
> The fix is to treat all anonymous classes as privileged code. This is 
> assumed to be safe in an internal discussion thread.
>
> --- a/src/share/vm/classfile/classFileParser.cpp
> +++ b/src/share/vm/classfile/classFileParser.cpp
> @@ -1802,11 +1802,9 @@
>  ClassFileParser::AnnotationCollector::annotation_index(ClassLoaderData* 
> loader_data,
> Symbol* name) {
>    vmSymbols::SID sid = vmSymbols::find_sid(name);
> -  bool privileged = false;
> -  if (loader_data->is_the_null_class_loader_data()) {
> -    // Privileged code can use all annotations.  Other code silently 
> drops some.
> -    privileged = true;
> -  }
> +  // Privileged code can use all annotations.  Other code silently 
> drops some.
> +  bool privileged = loader_data->is_the_null_class_loader_data() ||
> +                    loader_data->is_anonymous();
>    switch (sid) {
>    case 
> vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_ForceInline_signature):
>      if (_location != _in_method)  break;  // only allow for methods
>
> Thanks,
> Kris



More information about the hotspot-dev mailing list