mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 22:34:27 +02:00
8066433: Move Whitebox test library to top level repository
Moved Whitebox test library to top level repository. Reviewed-by: iignatyev, sla, mr
This commit is contained in:
parent
e3198c371a
commit
38a4e8874b
7 changed files with 704 additions and 0 deletions
65
test/lib/Makefile
Normal file
65
test/lib/Makefile
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
#
|
||||||
|
# Copyright (c) 2013, 2014, 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Utility Makefile that creates wb.jar, which is used to simplify using
|
||||||
|
# the Whitebox API outside the jtreg-testbase.
|
||||||
|
|
||||||
|
ifneq "x$(ALT_BOOTDIR)" "x"
|
||||||
|
BOOTDIR := $(ALT_BOOTDIR)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq "x$(BOOTDIR)" "x"
|
||||||
|
JDK_HOME := $(shell dirname $(shell which java))/..
|
||||||
|
else
|
||||||
|
JDK_HOME := $(BOOTDIR)
|
||||||
|
endif
|
||||||
|
|
||||||
|
SRC_DIR = ./
|
||||||
|
BUILD_DIR = build
|
||||||
|
OUTPUT_DIR = $(BUILD_DIR)/classes
|
||||||
|
|
||||||
|
JAVAC = $(JDK_HOME)/bin/javac
|
||||||
|
JAR = $(JDK_HOME)/bin/jar
|
||||||
|
|
||||||
|
SRC_FILES = $(shell find $(SRC_DIR) -name '*.java')
|
||||||
|
|
||||||
|
.PHONY: filelist clean cleantmp
|
||||||
|
|
||||||
|
all: wb.jar cleantmp
|
||||||
|
|
||||||
|
wb.jar: filelist
|
||||||
|
@mkdir -p $(OUTPUT_DIR)
|
||||||
|
$(JAVAC) -sourcepath $(SRC_DIR) -d $(OUTPUT_DIR) -cp $(OUTPUT_DIR) @filelist
|
||||||
|
$(JAR) cf wb.jar -C $(OUTPUT_DIR) .
|
||||||
|
@rm -rf $(OUTPUT_DIR)
|
||||||
|
|
||||||
|
filelist: $(SRC_FILES)
|
||||||
|
@rm -f $@
|
||||||
|
@echo $(SRC_FILES) > $@
|
||||||
|
|
||||||
|
clean: cleantmp
|
||||||
|
@rm -rf wb.jar
|
||||||
|
|
||||||
|
cleantmp:
|
||||||
|
@rm -rf filelist
|
||||||
|
@rm -rf $(BUILD_DIR)
|
251
test/lib/sun/hotspot/WhiteBox.java
Normal file
251
test/lib/sun/hotspot/WhiteBox.java
Normal file
|
@ -0,0 +1,251 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012, 2014, 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 sun.hotspot;
|
||||||
|
|
||||||
|
import java.lang.reflect.Executable;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import java.security.BasicPermission;
|
||||||
|
|
||||||
|
import sun.hotspot.parser.DiagnosticCommand;
|
||||||
|
|
||||||
|
public class WhiteBox {
|
||||||
|
|
||||||
|
@SuppressWarnings("serial")
|
||||||
|
public static class WhiteBoxPermission extends BasicPermission {
|
||||||
|
public WhiteBoxPermission(String s) {
|
||||||
|
super(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private WhiteBox() {}
|
||||||
|
private static final WhiteBox instance = new WhiteBox();
|
||||||
|
private static native void registerNatives();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the singleton WhiteBox instance.
|
||||||
|
*
|
||||||
|
* The returned WhiteBox object should be carefully guarded
|
||||||
|
* by the caller, since it can be used to read and write data
|
||||||
|
* at arbitrary memory addresses. It must never be passed to
|
||||||
|
* untrusted code.
|
||||||
|
*/
|
||||||
|
public synchronized static WhiteBox getWhiteBox() {
|
||||||
|
SecurityManager sm = System.getSecurityManager();
|
||||||
|
if (sm != null) {
|
||||||
|
sm.checkPermission(new WhiteBoxPermission("getInstance"));
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
registerNatives();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the maximum heap size supporting COOPs
|
||||||
|
public native long getCompressedOopsMaxHeapSize();
|
||||||
|
// Arguments
|
||||||
|
public native void printHeapSizes();
|
||||||
|
|
||||||
|
// Memory
|
||||||
|
public native long getObjectAddress(Object o);
|
||||||
|
public native int getHeapOopSize();
|
||||||
|
public native int getVMPageSize();
|
||||||
|
public native boolean isObjectInOldGen(Object o);
|
||||||
|
public native long getObjectSize(Object o);
|
||||||
|
|
||||||
|
// Runtime
|
||||||
|
// Make sure class name is in the correct format
|
||||||
|
public boolean isClassAlive(String name) {
|
||||||
|
return isClassAlive0(name.replace('.', '/'));
|
||||||
|
}
|
||||||
|
private native boolean isClassAlive0(String name);
|
||||||
|
|
||||||
|
// JVMTI
|
||||||
|
public native void addToBootstrapClassLoaderSearch(String segment);
|
||||||
|
public native void addToSystemClassLoaderSearch(String segment);
|
||||||
|
|
||||||
|
// G1
|
||||||
|
public native boolean g1InConcurrentMark();
|
||||||
|
public native boolean g1IsHumongous(Object o);
|
||||||
|
public native long g1NumFreeRegions();
|
||||||
|
public native int g1RegionSize();
|
||||||
|
public native Object[] parseCommandLine(String commandline, char delim, DiagnosticCommand[] args);
|
||||||
|
|
||||||
|
// NMT
|
||||||
|
public native long NMTMalloc(long size);
|
||||||
|
public native void NMTFree(long mem);
|
||||||
|
public native long NMTReserveMemory(long size);
|
||||||
|
public native void NMTCommitMemory(long addr, long size);
|
||||||
|
public native void NMTUncommitMemory(long addr, long size);
|
||||||
|
public native void NMTReleaseMemory(long addr, long size);
|
||||||
|
public native long NMTMallocWithPseudoStack(long size, int index);
|
||||||
|
public native boolean NMTIsDetailSupported();
|
||||||
|
public native boolean NMTChangeTrackingLevel();
|
||||||
|
public native int NMTGetHashSize();
|
||||||
|
|
||||||
|
// Compiler
|
||||||
|
public native void deoptimizeAll();
|
||||||
|
public boolean isMethodCompiled(Executable method) {
|
||||||
|
return isMethodCompiled(method, false /*not osr*/);
|
||||||
|
}
|
||||||
|
public native boolean isMethodCompiled(Executable method, boolean isOsr);
|
||||||
|
public boolean isMethodCompilable(Executable method) {
|
||||||
|
return isMethodCompilable(method, -1 /*any*/);
|
||||||
|
}
|
||||||
|
public boolean isMethodCompilable(Executable method, int compLevel) {
|
||||||
|
return isMethodCompilable(method, compLevel, false /*not osr*/);
|
||||||
|
}
|
||||||
|
public native boolean isMethodCompilable(Executable method, int compLevel, boolean isOsr);
|
||||||
|
public native boolean isMethodQueuedForCompilation(Executable method);
|
||||||
|
public int deoptimizeMethod(Executable method) {
|
||||||
|
return deoptimizeMethod(method, false /*not osr*/);
|
||||||
|
}
|
||||||
|
public native int deoptimizeMethod(Executable method, boolean isOsr);
|
||||||
|
public void makeMethodNotCompilable(Executable method) {
|
||||||
|
makeMethodNotCompilable(method, -1 /*any*/);
|
||||||
|
}
|
||||||
|
public void makeMethodNotCompilable(Executable method, int compLevel) {
|
||||||
|
makeMethodNotCompilable(method, compLevel, false /*not osr*/);
|
||||||
|
}
|
||||||
|
public native void makeMethodNotCompilable(Executable method, int compLevel, boolean isOsr);
|
||||||
|
public int getMethodCompilationLevel(Executable method) {
|
||||||
|
return getMethodCompilationLevel(method, false /*not ost*/);
|
||||||
|
}
|
||||||
|
public native int getMethodCompilationLevel(Executable method, boolean isOsr);
|
||||||
|
public native boolean testSetDontInlineMethod(Executable method, boolean value);
|
||||||
|
public int getCompileQueuesSize() {
|
||||||
|
return getCompileQueueSize(-1 /*any*/);
|
||||||
|
}
|
||||||
|
public native int getCompileQueueSize(int compLevel);
|
||||||
|
public native boolean testSetForceInlineMethod(Executable method, boolean value);
|
||||||
|
public boolean enqueueMethodForCompilation(Executable method, int compLevel) {
|
||||||
|
return enqueueMethodForCompilation(method, compLevel, -1 /*InvocationEntryBci*/);
|
||||||
|
}
|
||||||
|
public native boolean enqueueMethodForCompilation(Executable method, int compLevel, int entry_bci);
|
||||||
|
public native void clearMethodState(Executable method);
|
||||||
|
public native void lockCompilation();
|
||||||
|
public native void unlockCompilation();
|
||||||
|
public native int getMethodEntryBci(Executable method);
|
||||||
|
public native Object[] getNMethod(Executable method, boolean isOsr);
|
||||||
|
public native long allocateCodeBlob(int size, int type);
|
||||||
|
public long allocateCodeBlob(long size, int type) {
|
||||||
|
int intSize = (int) size;
|
||||||
|
if ((long) intSize != size || size < 0) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"size argument has illegal value " + size);
|
||||||
|
}
|
||||||
|
return allocateCodeBlob( intSize, type);
|
||||||
|
}
|
||||||
|
public native void freeCodeBlob(long addr);
|
||||||
|
public void forceNMethodSweep() {
|
||||||
|
try {
|
||||||
|
forceNMethodSweep0().join();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public native Thread forceNMethodSweep0();
|
||||||
|
public native Object[] getCodeHeapEntries(int type);
|
||||||
|
public native int getCompilationActivityMode();
|
||||||
|
public native Object[] getCodeBlob(long addr);
|
||||||
|
|
||||||
|
// Intered strings
|
||||||
|
public native boolean isInStringTable(String str);
|
||||||
|
|
||||||
|
// Memory
|
||||||
|
public native void readReservedMemory();
|
||||||
|
public native long allocateMetaspace(ClassLoader classLoader, long size);
|
||||||
|
public native void freeMetaspace(ClassLoader classLoader, long addr, long size);
|
||||||
|
public native long incMetaspaceCapacityUntilGC(long increment);
|
||||||
|
public native long metaspaceCapacityUntilGC();
|
||||||
|
|
||||||
|
// Force Young GC
|
||||||
|
public native void youngGC();
|
||||||
|
|
||||||
|
// Force Full GC
|
||||||
|
public native void fullGC();
|
||||||
|
|
||||||
|
// Method tries to start concurrent mark cycle.
|
||||||
|
// It returns false if CM Thread is always in concurrent cycle.
|
||||||
|
public native boolean g1StartConcMarkCycle();
|
||||||
|
|
||||||
|
// Tests on ReservedSpace/VirtualSpace classes
|
||||||
|
public native int stressVirtualSpaceResize(long reservedSpaceSize, long magnitude, long iterations);
|
||||||
|
public native void runMemoryUnitTests();
|
||||||
|
public native void readFromNoaccessArea();
|
||||||
|
public native long getThreadStackSize();
|
||||||
|
public native long getThreadRemainingStackSize();
|
||||||
|
|
||||||
|
// CPU features
|
||||||
|
public native String getCPUFeatures();
|
||||||
|
|
||||||
|
// Native extensions
|
||||||
|
public native long getHeapUsageForContext(int context);
|
||||||
|
public native long getHeapRegionCountForContext(int context);
|
||||||
|
public native int getContextForObject(Object obj);
|
||||||
|
public native void printRegionInfo(int context);
|
||||||
|
|
||||||
|
// VM flags
|
||||||
|
public native boolean isConstantVMFlag(String name);
|
||||||
|
public native boolean isLockedVMFlag(String name);
|
||||||
|
public native void setBooleanVMFlag(String name, boolean value);
|
||||||
|
public native void setIntxVMFlag(String name, long value);
|
||||||
|
public native void setUintxVMFlag(String name, long value);
|
||||||
|
public native void setUint64VMFlag(String name, long value);
|
||||||
|
public native void setSizeTVMFlag(String name, long value);
|
||||||
|
public native void setStringVMFlag(String name, String value);
|
||||||
|
public native void setDoubleVMFlag(String name, double value);
|
||||||
|
public native Boolean getBooleanVMFlag(String name);
|
||||||
|
public native Long getIntxVMFlag(String name);
|
||||||
|
public native Long getUintxVMFlag(String name);
|
||||||
|
public native Long getUint64VMFlag(String name);
|
||||||
|
public native Long getSizeTVMFlag(String name);
|
||||||
|
public native String getStringVMFlag(String name);
|
||||||
|
public native Double getDoubleVMFlag(String name);
|
||||||
|
private final List<Function<String,Object>> flagsGetters = Arrays.asList(
|
||||||
|
this::getBooleanVMFlag, this::getIntxVMFlag, this::getUintxVMFlag,
|
||||||
|
this::getUint64VMFlag, this::getSizeTVMFlag, this::getStringVMFlag,
|
||||||
|
this::getDoubleVMFlag);
|
||||||
|
|
||||||
|
public Object getVMFlag(String name) {
|
||||||
|
return flagsGetters.stream()
|
||||||
|
.map(f -> f.apply(name))
|
||||||
|
.filter(x -> x != null)
|
||||||
|
.findAny()
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
public native int getOffsetForName0(String name);
|
||||||
|
public int getOffsetForName(String name) throws Exception {
|
||||||
|
int offset = getOffsetForName0(name);
|
||||||
|
if (offset == -1) {
|
||||||
|
throw new RuntimeException(name + " not found");
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
90
test/lib/sun/hotspot/code/BlobType.java
Normal file
90
test/lib/sun/hotspot/code/BlobType.java
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014, 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 sun.hotspot.code;
|
||||||
|
|
||||||
|
import java.lang.management.ManagementFactory;
|
||||||
|
import java.lang.management.MemoryPoolMXBean;
|
||||||
|
import java.util.EnumSet;
|
||||||
|
|
||||||
|
import sun.hotspot.WhiteBox;
|
||||||
|
|
||||||
|
public enum BlobType {
|
||||||
|
// Execution level 1 and 4 (non-profiled) nmethods (including native nmethods)
|
||||||
|
MethodNonProfiled(0, "CodeHeap 'non-profiled nmethods'"),
|
||||||
|
// Execution level 2 and 3 (profiled) nmethods
|
||||||
|
MethodProfiled(1, "CodeHeap 'profiled nmethods'"),
|
||||||
|
// Non-nmethods like Buffers, Adapters and Runtime Stubs
|
||||||
|
NonNMethod(2, "CodeHeap 'non-nmethods'") {
|
||||||
|
@Override
|
||||||
|
public boolean allowTypeWhenOverflow(BlobType type) {
|
||||||
|
return super.allowTypeWhenOverflow(type)
|
||||||
|
|| type == BlobType.MethodNonProfiled;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// All types (No code cache segmentation)
|
||||||
|
All(3, "CodeCache");
|
||||||
|
|
||||||
|
public final int id;
|
||||||
|
private final String beanName;
|
||||||
|
|
||||||
|
private BlobType(int id, String beanName) {
|
||||||
|
this.id = id;
|
||||||
|
this.beanName = beanName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MemoryPoolMXBean getMemoryPool() {
|
||||||
|
for (MemoryPoolMXBean bean : ManagementFactory.getMemoryPoolMXBeans()) {
|
||||||
|
String name = bean.getName();
|
||||||
|
if (beanName.equals(name)) {
|
||||||
|
return bean;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean allowTypeWhenOverflow(BlobType type) {
|
||||||
|
return type == this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EnumSet<BlobType> getAvailable() {
|
||||||
|
WhiteBox whiteBox = WhiteBox.getWhiteBox();
|
||||||
|
if (!whiteBox.getBooleanVMFlag("SegmentedCodeCache")) {
|
||||||
|
// only All for non segmented world
|
||||||
|
return EnumSet.of(All);
|
||||||
|
}
|
||||||
|
if (System.getProperty("java.vm.info").startsWith("interpreted ")) {
|
||||||
|
// only NonNMethod for -Xint
|
||||||
|
return EnumSet.of(NonNMethod);
|
||||||
|
}
|
||||||
|
|
||||||
|
EnumSet<BlobType> result = EnumSet.complementOf(EnumSet.of(All));
|
||||||
|
if (!whiteBox.getBooleanVMFlag("TieredCompilation")
|
||||||
|
|| whiteBox.getIntxVMFlag("TieredStopAtLevel") <= 1) {
|
||||||
|
// there is no MethodProfiled in non tiered world or pure C1
|
||||||
|
result.remove(MethodProfiled);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
68
test/lib/sun/hotspot/code/CodeBlob.java
Normal file
68
test/lib/sun/hotspot/code/CodeBlob.java
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014, 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 sun.hotspot.code;
|
||||||
|
|
||||||
|
import sun.hotspot.WhiteBox;
|
||||||
|
|
||||||
|
public class CodeBlob {
|
||||||
|
private static final WhiteBox WB = WhiteBox.getWhiteBox();
|
||||||
|
public static CodeBlob[] getCodeBlobs(BlobType type) {
|
||||||
|
Object[] obj = WB.getCodeHeapEntries(type.id);
|
||||||
|
if (obj == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
CodeBlob[] result = new CodeBlob[obj.length];
|
||||||
|
for (int i = 0, n = result.length; i < n; ++i) {
|
||||||
|
result[i] = new CodeBlob((Object[]) obj[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
public static CodeBlob getCodeBlob(long addr) {
|
||||||
|
Object[] obj = WB.getCodeBlob(addr);
|
||||||
|
if (obj == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new CodeBlob(obj);
|
||||||
|
}
|
||||||
|
protected CodeBlob(Object[] obj) {
|
||||||
|
assert obj.length == 3;
|
||||||
|
name = (String) obj[0];
|
||||||
|
size = (Integer) obj[1];
|
||||||
|
code_blob_type = BlobType.values()[(Integer) obj[2]];
|
||||||
|
assert code_blob_type.id == (Integer) obj[2];
|
||||||
|
}
|
||||||
|
public final String name;
|
||||||
|
public final int size;
|
||||||
|
public final BlobType code_blob_type;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "CodeBlob{"
|
||||||
|
+ "name=" + name
|
||||||
|
+ ", size=" + size
|
||||||
|
+ ", code_blob_type=" + code_blob_type
|
||||||
|
+ '}';
|
||||||
|
}
|
||||||
|
}
|
56
test/lib/sun/hotspot/code/NMethod.java
Normal file
56
test/lib/sun/hotspot/code/NMethod.java
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014, 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 sun.hotspot.code;
|
||||||
|
|
||||||
|
import java.lang.reflect.Executable;
|
||||||
|
import sun.hotspot.WhiteBox;
|
||||||
|
|
||||||
|
public class NMethod extends CodeBlob {
|
||||||
|
private static final WhiteBox wb = WhiteBox.getWhiteBox();
|
||||||
|
public static NMethod get(Executable method, boolean isOsr) {
|
||||||
|
Object[] obj = wb.getNMethod(method, isOsr);
|
||||||
|
return obj == null ? null : new NMethod(obj);
|
||||||
|
}
|
||||||
|
private NMethod(Object[] obj) {
|
||||||
|
super((Object[])obj[0]);
|
||||||
|
assert obj.length == 4;
|
||||||
|
comp_level = (Integer) obj[1];
|
||||||
|
insts = (byte[]) obj[2];
|
||||||
|
compile_id = (Integer) obj[3];
|
||||||
|
}
|
||||||
|
public final byte[] insts;
|
||||||
|
public final int comp_level;
|
||||||
|
public final int compile_id;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "NMethod{"
|
||||||
|
+ super.toString()
|
||||||
|
+ ", insts=" + insts
|
||||||
|
+ ", comp_level=" + comp_level
|
||||||
|
+ ", compile_id=" + compile_id
|
||||||
|
+ '}';
|
||||||
|
}
|
||||||
|
}
|
97
test/lib/sun/hotspot/cpuinfo/CPUInfo.java
Normal file
97
test/lib/sun/hotspot/cpuinfo/CPUInfo.java
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014, 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 sun.hotspot.cpuinfo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
|
||||||
|
import sun.hotspot.WhiteBox;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information about CPU on test box.
|
||||||
|
*
|
||||||
|
* CPUInfo uses WhiteBox to gather information,
|
||||||
|
* so WhiteBox class should be added to bootclasspath
|
||||||
|
* and option -XX:+WhiteBoxAPI should expclicetly
|
||||||
|
* specified on command line.
|
||||||
|
*/
|
||||||
|
public class CPUInfo {
|
||||||
|
|
||||||
|
private static final List<String> features;
|
||||||
|
private static final String additionalCPUInfo;
|
||||||
|
|
||||||
|
static {
|
||||||
|
WhiteBox wb = WhiteBox.getWhiteBox();
|
||||||
|
|
||||||
|
Pattern additionalCPUInfoRE =
|
||||||
|
Pattern.compile("([^(]*\\([^)]*\\)[^,]*),\\s*");
|
||||||
|
|
||||||
|
String cpuFeaturesString = wb.getCPUFeatures();
|
||||||
|
Matcher matcher = additionalCPUInfoRE.matcher(cpuFeaturesString);
|
||||||
|
if (matcher.find()) {
|
||||||
|
additionalCPUInfo = matcher.group(1);
|
||||||
|
} else {
|
||||||
|
additionalCPUInfo = "";
|
||||||
|
}
|
||||||
|
String splittedFeatures[] = matcher.replaceAll("").split("(, )| ");
|
||||||
|
|
||||||
|
features = Collections.unmodifiableList(Arrays.
|
||||||
|
asList(splittedFeatures));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get additional information about CPU.
|
||||||
|
* For example, on X86 in will be family/model/stepping
|
||||||
|
* and number of cores.
|
||||||
|
*
|
||||||
|
* @return additional CPU info
|
||||||
|
*/
|
||||||
|
public static String getAdditionalCPUInfo() {
|
||||||
|
return additionalCPUInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all known features supported by CPU.
|
||||||
|
*
|
||||||
|
* @return unmodifiable list with names of all known features
|
||||||
|
* supported by CPU.
|
||||||
|
*/
|
||||||
|
public static List<String> getFeatures() {
|
||||||
|
return features;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if some feature is supported by CPU.
|
||||||
|
*
|
||||||
|
* @param feature Name of feature to be tested.
|
||||||
|
* @return <b>true</b> if tested feature is supported by CPU.
|
||||||
|
*/
|
||||||
|
public static boolean hasFeature(String feature) {
|
||||||
|
return features.contains(feature.toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
77
test/lib/sun/hotspot/parser/DiagnosticCommand.java
Normal file
77
test/lib/sun/hotspot/parser/DiagnosticCommand.java
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012, 2014, 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 sun.hotspot.parser;
|
||||||
|
|
||||||
|
public class DiagnosticCommand {
|
||||||
|
|
||||||
|
public enum DiagnosticArgumentType {
|
||||||
|
JLONG, BOOLEAN, STRING, NANOTIME, STRINGARRAY, MEMORYSIZE
|
||||||
|
}
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private String desc;
|
||||||
|
private DiagnosticArgumentType type;
|
||||||
|
private boolean mandatory;
|
||||||
|
private String defaultValue;
|
||||||
|
private boolean argument;
|
||||||
|
|
||||||
|
public DiagnosticCommand(String name, String desc, DiagnosticArgumentType type,
|
||||||
|
boolean mandatory, String defaultValue) {
|
||||||
|
this(name, desc, type, false, mandatory, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DiagnosticCommand(String name, String desc, DiagnosticArgumentType type,
|
||||||
|
boolean argument, boolean mandatory, String defaultValue) {
|
||||||
|
this.name = name;
|
||||||
|
this.desc = desc;
|
||||||
|
this.type = type;
|
||||||
|
this.mandatory = mandatory;
|
||||||
|
this.defaultValue = defaultValue;
|
||||||
|
this.argument = argument;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDesc() {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DiagnosticArgumentType getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isMandatory() {
|
||||||
|
return mandatory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isArgument() {
|
||||||
|
return argument;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDefaultValue() {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue