Skip to content
Closed
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/hotspot/share/opto/runtime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -857,8 +857,9 @@ static const TypeFunc* make_jfr_write_checkpoint_Type() {
const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms, fields);

// create result type (range)
fields = TypeTuple::fields(0);
const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields);
fields = TypeTuple::fields(1);
fields[TypeFunc::Parms] = TypeInstPtr::BOTTOM;
const TypeTuple *range = TypeTuple::make(TypeFunc::Parms + 1, fields);
return TypeFunc::make(domain, range);
}

Expand Down
5 changes: 5 additions & 0 deletions src/hotspot/share/opto/runtime.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@
// it calls the C++ code "xxx_C". The generated nmethod is saved in the
// CodeCache. Exception handlers use the nmethod to get the callee-save
// register OopMaps.
//
// Please note that correctly matching the type of the call with the specified
// signature. Even if you don't plan on consuming the output of the call, C2
// needs this information to correctly track returned oops and avoid strange
// deoptimization crashes (JDK-8347463).
class CallInfo;

//
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* Copyright (c) 2025, 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.
*/

package compiler.intrinsics;

import compiler.lib.ir_framework.*;

import jdk.jfr.Event;
import jdk.jfr.Name;
import jdk.jfr.Recording;

/**
* @test
* @summary Tests that the getEventWriter call to write_checkpoint correctly
* reports returning an oop
* @requires vm.hasJFR & vm.continuations
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need vm.continuations?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't. Removed the requirement

* @library /test/lib /
* @modules jdk.jfr/jdk.jfr.internal
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need this?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't. Removed as well!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Referring to line 38 only).

* @run driver compiler.intrinsics.TestReturnsOopSetForJFRWriteCheckpoint
*/
public class TestReturnsOopSetForJFRWriteCheckpoint {

private static class TestEvent extends Event {
}

public static void main(String... args) {
TestFramework.run();
}

// JDK-8347463: crash was due to the returns_oop field not being set
// for the write_checkpoint call. Instead of explicitly checking for
// it, we look for a non-void return type (which comes hand-in-hand
// with the returns_oop information)
@Test
@IR(failOn = { IRNode.STATIC_CALL_OF_METHOD, "write_checkpoint.*void"})
public void myTest() {
try (Recording r = new Recording()) {
r.start();

emitEvent();
}

}

@ForceInline
public void emitEvent() {
TestEvent t = new TestEvent();
t.commit();
}
}