Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8264395: WB_EnqueueInitializerForCompilation fails with "method holder must be initialized" when called for uninitialized class #3757

Closed
wants to merge 3 commits into from
Closed
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
@@ -1039,7 +1039,7 @@ WB_END
WB_ENTRY(jboolean, WB_EnqueueInitializerForCompilation(JNIEnv* env, jobject o, jclass klass, jint comp_level))
InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
Method* clinit = ik->class_initializer();
if (clinit == NULL) {
if (clinit == NULL || clinit->method_holder()->is_not_initialized()) {
return false;
}
return WhiteBox::compile_method(clinit, comp_level, InvocationEntryBci, THREAD);
@@ -0,0 +1,48 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

/*
* @test
* @bug 8264395
* @summary testing compilation of the class initializer of a class that is not initialized yet
* @library /test/lib
* @build sun.hotspot.WhiteBox
* @run driver jdk.test.lib.helpers.ClassFileInstaller sun.hotspot.WhiteBox
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
* -XX:+WhiteBoxAPI compiler.whitebox.TestEnqueueInitializerForCompilation
*/

package compiler.whitebox;

import sun.hotspot.WhiteBox;

public class TestEnqueueInitializerForCompilation {

public static void main(String[] args) {
WhiteBox.getWhiteBox().enqueueInitializerForCompilation(LongWrapper.class, 4);

This comment has been minimized.

Loading
@TobiHartmann

TobiHartmann Apr 28, 2021
Member

What if compilation level 4 (= C2) is not available?

This comment has been minimized.

Loading
@r-v-raghav

r-v-raghav Apr 29, 2021
Author Member

Found unavailable/bad comp levels handled in WhiteBox::compile_method() or later in CompileBroker::compile_method.

This comment has been minimized.

Loading
@TobiHartmann

TobiHartmann Apr 29, 2021
Member

Right but wouldn't we hit an assert there if C2 is not available?

This comment has been minimized.

Loading
@r-v-raghav

r-v-raghav Apr 30, 2021
Author Member

For the case scenario mentioned found that the test simply displays a WB whitebox error that is ignored.
So seems we can go ahead with the current test case itself. Thanks

This comment has been minimized.

Loading
@TobiHartmann

TobiHartmann Apr 30, 2021
Member

Yes, as we've discussed off-thread, that's fine. Thanks for investigating.

}

static class LongWrapper {
final static LongWrapper ZERO = new LongWrapper();
}
}