mirror of
https://github.com/openjdk/jdk.git
synced 2026-06-06 10:42:45 +00:00
8383709: Linux perf map should record individual stubs
Reviewed-by: ysuenaga, adinn
This commit is contained in:
parent
85e2b3a01c
commit
7bb345a43e
@ -61,6 +61,7 @@
|
||||
#include "runtime/mutexLocker.hpp"
|
||||
#include "runtime/os.inline.hpp"
|
||||
#include "runtime/safepointVerifiers.hpp"
|
||||
#include "runtime/stubCodeGenerator.hpp"
|
||||
#include "runtime/vmThread.hpp"
|
||||
#include "sanitizers/leak.hpp"
|
||||
#include "services/memoryService.hpp"
|
||||
@ -1936,6 +1937,18 @@ void CodeCache::log_state(outputStream* st) {
|
||||
}
|
||||
|
||||
#ifdef LINUX
|
||||
static bool is_stub_code_blob(CodeBlob* cb) {
|
||||
if (!cb->is_buffer_blob()) {
|
||||
return false;
|
||||
}
|
||||
for (StubCodeDesc* d = StubCodeDesc::first(); d != nullptr; d = StubCodeDesc::next(d)) {
|
||||
if (cb->code_contains(d->begin())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void CodeCache::write_perf_map(const char* filename, outputStream* st) {
|
||||
MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
||||
char fname[JVM_MAXPATHLEN];
|
||||
@ -1958,6 +1971,10 @@ void CodeCache::write_perf_map(const char* filename, outputStream* st) {
|
||||
AllCodeBlobsIterator iter(AllCodeBlobsIterator::not_unloading);
|
||||
while (iter.next()) {
|
||||
CodeBlob *cb = iter.method();
|
||||
if (is_stub_code_blob(cb)) {
|
||||
// Individual stub routines are dumped after the main loop.
|
||||
continue;
|
||||
}
|
||||
ResourceMark rm;
|
||||
const char* method_name = nullptr;
|
||||
if (cb->is_nmethod()) {
|
||||
@ -1969,6 +1986,11 @@ void CodeCache::write_perf_map(const char* filename, outputStream* st) {
|
||||
fs.print_cr(INTPTR_FORMAT " " INTPTR_FORMAT " %s",
|
||||
(intptr_t)cb->code_begin(), (intptr_t)cb->code_size(), method_name);
|
||||
}
|
||||
for (StubCodeDesc* d = StubCodeDesc::first(); d != nullptr; d = StubCodeDesc::next(d)) {
|
||||
fs.print_cr(INTPTR_FORMAT " " INTPTR_FORMAT " %s %s",
|
||||
(intptr_t)d->begin(), (intptr_t)d->size_in_bytes(),
|
||||
d->group(), d->name());
|
||||
}
|
||||
}
|
||||
#endif // LINUX
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2020, 2026, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2020, 2023, Arm Limited. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -74,14 +74,20 @@ public class PerfMapTest {
|
||||
}
|
||||
|
||||
// Sanity check the file contents
|
||||
boolean sawCallStub = false;
|
||||
try {
|
||||
for (String entry : Files.readAllLines(path)) {
|
||||
Matcher m = LINE_PATTERN.matcher(entry);
|
||||
Assert.assertTrue(m.matches(), "Invalid file format: " + entry);
|
||||
if (m.group(3).contains("StubRoutines call_stub")) {
|
||||
sawCallStub = true;
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
Assert.fail(e.toString());
|
||||
}
|
||||
Assert.assertTrue(sawCallStub,
|
||||
"Expected StubRoutines call_stub entry in " + path);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user