blob: d5e2f16c81f470e987c85a216fc3e976f2c412c1 [file] [log] [blame]
/*
* Copyright (c) 2014, 2015, 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.codecache.cli.common;
import jdk.test.lib.cli.CommandLineOptionTest;
import sun.hotspot.code.BlobType;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
public class CodeCacheOptions {
public static final String SEGMENTED_CODE_CACHE = "SegmentedCodeCache";
private static final EnumSet<BlobType> NON_SEGMENTED_HEAPS
= EnumSet.of(BlobType.All);
private static final EnumSet<BlobType> ALL_SEGMENTED_HEAPS
= EnumSet.complementOf(NON_SEGMENTED_HEAPS);
private static final EnumSet<BlobType> SEGMENTED_HEAPS_WO_PROFILED
= EnumSet.of(BlobType.NonNMethod, BlobType.MethodNonProfiled);
private static final EnumSet<BlobType> ONLY_NON_METHODS_HEAP
= EnumSet.of(BlobType.NonNMethod);
public final long reserved;
public final long nonNmethods;
public final long nonProfiled;
public final long profiled;
public final boolean segmented;
public static long mB(long val) {
return CodeCacheOptions.kB(val) * 1024L;
}
public static long kB(long val) {
return val * 1024L;
}
public CodeCacheOptions(long reserved) {
this.reserved = reserved;
this.nonNmethods = 0;
this.nonProfiled = 0;
this.profiled = 0;
this.segmented = false;
}
public CodeCacheOptions(long reserved, long nonNmethods, long nonProfiled,
long profiled) {
this.reserved = reserved;
this.nonNmethods = nonNmethods;
this.nonProfiled = nonProfiled;
this.profiled = profiled;
this.segmented = true;
}
public long sizeForHeap(BlobType heap) {
switch (heap) {
case All:
return this.reserved;
case NonNMethod:
return this.nonNmethods;
case MethodNonProfiled:
return this.nonProfiled;
case MethodProfiled:
return this.profiled;
default:
throw new Error("Unknown heap: " + heap.name());
}
}
public String[] prepareOptions(String... additionalOptions) {
List<String> options = new ArrayList<>();
Collections.addAll(options, additionalOptions);
Collections.addAll(options,
CommandLineOptionTest.prepareBooleanFlag(
SEGMENTED_CODE_CACHE, segmented),
CommandLineOptionTest.prepareNumericFlag(
BlobType.All.sizeOptionName, reserved));
if (segmented) {
Collections.addAll(options,
CommandLineOptionTest.prepareNumericFlag(
BlobType.NonNMethod.sizeOptionName, nonNmethods),
CommandLineOptionTest.prepareNumericFlag(
BlobType.MethodNonProfiled.sizeOptionName,
nonProfiled),
CommandLineOptionTest.prepareNumericFlag(
BlobType.MethodProfiled.sizeOptionName, profiled));
}
return options.toArray(new String[options.size()]);
}
public CodeCacheOptions mapOptions(EnumSet<BlobType> involvedCodeHeaps) {
if (involvedCodeHeaps.isEmpty()
|| involvedCodeHeaps.equals(NON_SEGMENTED_HEAPS)
|| involvedCodeHeaps.equals(ALL_SEGMENTED_HEAPS)) {
return this;
} else if (involvedCodeHeaps.equals(SEGMENTED_HEAPS_WO_PROFILED)) {
return new CodeCacheOptions(reserved, nonNmethods,
profiled + nonProfiled, 0L);
} else if (involvedCodeHeaps.equals(ONLY_NON_METHODS_HEAP)) {
return new CodeCacheOptions(reserved, nonNmethods + profiled
+ nonProfiled, 0L, 0L);
} else {
throw new Error("Test bug: unexpected set of code heaps involved "
+ "into test.");
}
}
}