--- a/hotspot/.hgtags Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/.hgtags Wed Aug 23 12:39:55 2017 +0000
@@ -604,3 +604,4 @@
33b74e13c1457f36041addb8b850831f81ca6e9f jdk-10+19
d7baadc223e790c08bc69bf7e553bce65b4e7e40 jdk-9+180
4a443796f6f57842d6a0434ac27ca3d1033ccc20 jdk-9+181
+e93ed1a092409351c90b3a76d80b9aa8b44d5e6a jdk-10+20
--- a/hotspot/src/cpu/aarch64/vm/aarch64.ad Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/cpu/aarch64/vm/aarch64.ad Wed Aug 23 12:39:55 2017 +0000
@@ -4415,6 +4415,22 @@
/*weak*/ false, noreg);
%}
+ enc_class aarch64_enc_cmpxchgs(memory mem, iRegINoSp oldval, iRegINoSp newval) %{
+ MacroAssembler _masm(&cbuf);
+ guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
+ __ cmpxchg($mem$$base$$Register, $oldval$$Register, $newval$$Register,
+ Assembler::halfword, /*acquire*/ false, /*release*/ true,
+ /*weak*/ false, noreg);
+ %}
+
+ enc_class aarch64_enc_cmpxchgb(memory mem, iRegINoSp oldval, iRegINoSp newval) %{
+ MacroAssembler _masm(&cbuf);
+ guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
+ __ cmpxchg($mem$$base$$Register, $oldval$$Register, $newval$$Register,
+ Assembler::byte, /*acquire*/ false, /*release*/ true,
+ /*weak*/ false, noreg);
+ %}
+
// The only difference between aarch64_enc_cmpxchg and
// aarch64_enc_cmpxchg_acq is that we use load-acquire in the
@@ -9637,6 +9653,42 @@
// XXX No flag versions for CompareAndSwap{I,L,P,N} because matcher
// can't match them
+instruct compareAndSwapB(iRegINoSp res, indirect mem, iRegINoSp oldval, iRegINoSp newval, rFlagsReg cr) %{
+
+ match(Set res (CompareAndSwapB mem (Binary oldval newval)));
+ ins_cost(2 * VOLATILE_REF_COST);
+
+ effect(KILL cr);
+
+ format %{
+ "cmpxchgb $mem, $oldval, $newval\t# (int) if $mem == $oldval then $mem <-- $newval"
+ "cset $res, EQ\t# $res <-- (EQ ? 1 : 0)"
+ %}
+
+ ins_encode(aarch64_enc_cmpxchgb(mem, oldval, newval),
+ aarch64_enc_cset_eq(res));
+
+ ins_pipe(pipe_slow);
+%}
+
+instruct compareAndSwapS(iRegINoSp res, indirect mem, iRegINoSp oldval, iRegINoSp newval, rFlagsReg cr) %{
+
+ match(Set res (CompareAndSwapS mem (Binary oldval newval)));
+ ins_cost(2 * VOLATILE_REF_COST);
+
+ effect(KILL cr);
+
+ format %{
+ "cmpxchgs $mem, $oldval, $newval\t# (int) if $mem == $oldval then $mem <-- $newval"
+ "cset $res, EQ\t# $res <-- (EQ ? 1 : 0)"
+ %}
+
+ ins_encode(aarch64_enc_cmpxchgs(mem, oldval, newval),
+ aarch64_enc_cset_eq(res));
+
+ ins_pipe(pipe_slow);
+%}
+
instruct compareAndSwapI(iRegINoSp res, indirect mem, iRegINoSp oldval, iRegINoSp newval, rFlagsReg cr) %{
match(Set res (CompareAndSwapI mem (Binary oldval newval)));
--- a/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp Wed Aug 23 12:39:55 2017 +0000
@@ -246,8 +246,8 @@
inline void Assembler::z_mvhhi( int64_t d1, Register b1, int64_t i2) { emit_48( MVHHI_ZOPC | uimm12( d1, 20, 48) | regz(b1, 16, 48) | simm16(i2, 32, 48)); }
inline void Assembler::z_mvhi ( int64_t d1, Register b1, int64_t i2) { emit_48( MVHI_ZOPC | uimm12( d1, 20, 48) | regz(b1, 16, 48) | simm16(i2, 32, 48)); }
inline void Assembler::z_mvghi( int64_t d1, Register b1, int64_t i2) { emit_48( MVGHI_ZOPC | uimm12( d1, 20, 48) | regz(b1, 16, 48) | simm16(i2, 32, 48)); }
-inline void Assembler::z_mvhhi( const Address &d, int64_t i2) { assert(!d.has_index(), " no index reg allowed in MVHHI"); z_mvghi( d.disp(), d.baseOrR0(), i2); }
-inline void Assembler::z_mvhi ( const Address &d, int64_t i2) { assert(!d.has_index(), " no index reg allowed in MVHI"); z_mvghi( d.disp(), d.baseOrR0(), i2); }
+inline void Assembler::z_mvhhi( const Address &d, int64_t i2) { assert(!d.has_index(), " no index reg allowed in MVHHI"); z_mvhhi( d.disp(), d.baseOrR0(), i2); }
+inline void Assembler::z_mvhi ( const Address &d, int64_t i2) { assert(!d.has_index(), " no index reg allowed in MVHI"); z_mvhi( d.disp(), d.baseOrR0(), i2); }
inline void Assembler::z_mvghi( const Address &d, int64_t i2) { assert(!d.has_index(), " no index reg allowed in MVGHI"); z_mvghi( d.disp(), d.baseOrR0(), i2); }
inline void Assembler::z_ex(Register r1, int64_t d2, Register x2, Register b2) { emit_32( EX_ZOPC | regz(r1, 8, 32) | uimm12(d2, 20, 32) | reg(x2, 12, 32) | regz(b2, 16, 32)); }
--- a/hotspot/src/cpu/s390/vm/compiledIC_s390.cpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/cpu/s390/vm/compiledIC_s390.cpp Wed Aug 23 12:39:55 2017 +0000
@@ -105,15 +105,18 @@
NativeMovConstReg* method_holder = nativeMovConstReg_at(stub + NativeCall::get_IC_pos_in_java_to_interp_stub());
NativeJump* jump = nativeJump_at(method_holder->next_instruction_address());
+#ifdef ASSERT
// A generated lambda form might be deleted from the Lambdaform
// cache in MethodTypeForm. If a jit compiled lambdaform method
// becomes not entrant and the cache access returns null, the new
// resolve will lead to a new generated LambdaForm.
-
- assert(method_holder->data() == 0 || method_holder->data() == (intptr_t)callee() || callee->is_compiled_lambda_form(),
+ volatile intptr_t data = method_holder->data();
+ volatile address destination = jump->jump_destination();
+ assert(data == 0 || data == (intptr_t)callee() || callee->is_compiled_lambda_form(),
"a) MT-unsafe modification of inline cache");
- assert(jump->jump_destination() == (address)-1 || jump->jump_destination() == entry,
+ assert(destination == (address)-1 || destination == entry,
"b) MT-unsafe modification of inline cache");
+#endif
// Update stub.
method_holder->set_data((intptr_t)callee());
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/BinaryContainer.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/BinaryContainer.java Wed Aug 23 12:39:55 2017 +0000
@@ -58,7 +58,7 @@
* <p>
* Methods to record and access code section contents, symbols and relocations are provided.
*/
-public class BinaryContainer implements SymbolTable {
+public final class BinaryContainer implements SymbolTable {
private final OptionValues graalOptions;
private final int codeSegmentSize;
@@ -71,19 +71,19 @@
private final CodeContainer codeContainer;
/**
- * Container holding external hotspot linkage bits (PLT entries).
- */
- private final CodeContainer extLinkageContainer;
-
- /**
* Container holding global offset data for hotspot linkage.
*/
private final ByteContainer extLinkageGOTContainer;
/**
- * Patched by HotSpot, contains metaspace pointers.
+ * Patched by HotSpot, contains Klass pointers.
*/
- private final ByteContainer metaspaceGotContainer;
+ private final ByteContainer klassesGotContainer;
+
+ /**
+ * Patched by HotSpot, contains MethodCounters pointers.
+ */
+ private final ByteContainer countersGotContainer;
/**
* Patched lazily by hotspot, contains klass/method pointers.
@@ -268,33 +268,41 @@
this.graalOptions = graalOptions;
this.codeSegmentSize = graalHotSpotVMConfig.codeSegmentSize;
+ if (codeSegmentSize < 1 || codeSegmentSize > 1024) {
+ throw new InternalError("codeSegmentSize is not in range [1, 1024] bytes: (" + codeSegmentSize + "), update JPECoffRelocObject");
+ }
+ if ((codeSegmentSize & (codeSegmentSize - 1)) != 0) {
+ throw new InternalError("codeSegmentSize is not power of 2: (" + codeSegmentSize + "), update JPECoffRelocObject");
+ }
+
this.codeEntryAlignment = graalHotSpotVMConfig.codeEntryAlignment;
+ // Section unique name is limited to 8 characters due to limitation on Windows.
+ // Name could be longer but only first 8 characters are stored on Windows.
+
// read only, code
codeContainer = new CodeContainer(".text", this);
- extLinkageContainer = new CodeContainer(".hs.plt.linkage", this);
// read only, info
+ headerContainer = new HeaderContainer(jvmVersion, new ReadOnlyDataContainer(".header", this));
configContainer = new ReadOnlyDataContainer(".config", this);
metaspaceNamesContainer = new ReadOnlyDataContainer(".meta.names", this);
- methodsOffsetsContainer = new ReadOnlyDataContainer(".methods.offsets", this);
+ methodsOffsetsContainer = new ReadOnlyDataContainer(".meth.offsets", this);
klassesOffsetsContainer = new ReadOnlyDataContainer(".kls.offsets", this);
klassesDependenciesContainer = new ReadOnlyDataContainer(".kls.dependencies", this);
- headerContainer = new HeaderContainer(jvmVersion, new ReadOnlyDataContainer(".header", this));
stubsOffsetsContainer = new ReadOnlyDataContainer(".stubs.offsets", this);
codeSegmentsContainer = new ReadOnlyDataContainer(".code.segments", this);
constantDataContainer = new ReadOnlyDataContainer(".meth.constdata", this);
-
- // needs relocation patching at load time by the loader
methodMetadataContainer = new ReadOnlyDataContainer(".meth.metadata", this);
// writable sections
- metaspaceGotContainer = new ByteContainer(".meta.got", this);
- metadataGotContainer = new ByteContainer(".metadata.got", this);
+ oopGotContainer = new ByteContainer(".oop.got", this);
+ klassesGotContainer = new ByteContainer(".kls.got", this);
+ countersGotContainer = new ByteContainer(".cnt.got", this);
+ metadataGotContainer = new ByteContainer(".meta.got", this);
methodStateContainer = new ByteContainer(".meth.state", this);
- oopGotContainer = new ByteContainer(".oop.got", this);
- extLinkageGOTContainer = new ByteContainer(".hs.got.linkage", this);
+ extLinkageGOTContainer = new ByteContainer(".got.linkage", this);
addGlobalSymbols();
@@ -368,51 +376,51 @@
* in the named GOT cell.
*/
- public String getCardTableAddressSymbolName() {
+ public static String getCardTableAddressSymbolName() {
return "_aot_card_table_address";
}
- public String getHeapTopAddressSymbolName() {
+ public static String getHeapTopAddressSymbolName() {
return "_aot_heap_top_address";
}
- public String getHeapEndAddressSymbolName() {
+ public static String getHeapEndAddressSymbolName() {
return "_aot_heap_end_address";
}
- public String getCrcTableAddressSymbolName() {
+ public static String getCrcTableAddressSymbolName() {
return "_aot_stub_routines_crc_table_adr";
}
- public String getPollingPageSymbolName() {
+ public static String getPollingPageSymbolName() {
return "_aot_polling_page";
}
- public String getResolveStaticEntrySymbolName() {
+ public static String getResolveStaticEntrySymbolName() {
return "_resolve_static_entry";
}
- public String getResolveVirtualEntrySymbolName() {
+ public static String getResolveVirtualEntrySymbolName() {
return "_resolve_virtual_entry";
}
- public String getResolveOptVirtualEntrySymbolName() {
+ public static String getResolveOptVirtualEntrySymbolName() {
return "_resolve_opt_virtual_entry";
}
- public String getNarrowKlassBaseAddressSymbolName() {
+ public static String getNarrowKlassBaseAddressSymbolName() {
return "_aot_narrow_klass_base_address";
}
- public String getNarrowOopBaseAddressSymbolName() {
+ public static String getNarrowOopBaseAddressSymbolName() {
return "_aot_narrow_oop_base_address";
}
- public String getLogOfHeapRegionGrainBytesSymbolName() {
+ public static String getLogOfHeapRegionGrainBytesSymbolName() {
return "_aot_log_of_heap_region_grain_bytes";
}
- public String getInlineContiguousAllocationSupportedSymbolName() {
+ public static String getInlineContiguousAllocationSupportedSymbolName() {
return "_aot_inline_contiguous_allocation_supported";
}
@@ -430,7 +438,7 @@
* @param functionName function name
* @return AOT symbol for the given function name, or null if there is no mapping.
*/
- public String getAOTSymbolForVMFunctionName(String functionName) {
+ public static String getAOTSymbolForVMFunctionName(String functionName) {
return functionNamesToAOTSymbols.get(functionName);
}
@@ -441,7 +449,8 @@
createContainerSymbol(methodsOffsetsContainer);
createContainerSymbol(klassesOffsetsContainer);
createContainerSymbol(klassesDependenciesContainer);
- createContainerSymbol(metaspaceGotContainer);
+ createContainerSymbol(klassesGotContainer);
+ createContainerSymbol(countersGotContainer);
createContainerSymbol(metadataGotContainer);
createContainerSymbol(methodStateContainer);
createContainerSymbol(oopGotContainer);
@@ -469,12 +478,13 @@
}
/**
- * Creates a global symbol of the form {@code "JVM" + container name}.
+ * Creates a global symbol of the form {@code "A" + container name}.
+ * Note, linker on Windows does not allow names which start with '.'
*
* @param container container to create a symbol for
*/
private static void createContainerSymbol(ByteContainer container) {
- container.createSymbol(0, Kind.OBJECT, Binding.GLOBAL, 0, "JVM" + container.getContainerName());
+ container.createSymbol(0, Kind.OBJECT, Binding.GLOBAL, 0, "A" + container.getContainerName());
}
/**
@@ -499,12 +509,12 @@
*
* @throws IOException in case of file creation failure
*/
- public void createBinary(String outputFileName, String aotVersion) throws IOException {
+ public void createBinary(String outputFileName) throws IOException {
String osName = System.getProperty("os.name");
switch (osName) {
case "Linux":
case "SunOS":
- JELFRelocObject elfobj = new JELFRelocObject(this, outputFileName, aotVersion);
+ JELFRelocObject elfobj = new JELFRelocObject(this, outputFileName);
elfobj.createELFRelocObject(relocationTable, symbolTable.values());
break;
case "Mac OS X":
@@ -513,7 +523,7 @@
break;
default:
if (osName.startsWith("Windows")) {
- JPECoffRelocObject pecoffobj = new JPECoffRelocObject(this, outputFileName, aotVersion);
+ JPECoffRelocObject pecoffobj = new JPECoffRelocObject(this, outputFileName);
pecoffobj.createPECoffRelocObject(relocationTable, symbolTable.values());
break;
} else
@@ -626,12 +636,6 @@
return startOffset;
}
- public int appendMetaspaceGotBytes(byte[] bytes, int offset, int size) {
- int startOffset = metaspaceGotContainer.getByteStreamSize();
- appendBytes(metaspaceGotContainer, bytes, offset, size);
- return startOffset;
- }
-
public void addMetadataGotEntry(int offset) {
metadataGotContainer.appendLong(offset);
}
@@ -681,8 +685,7 @@
}
/**
- * Add oop symbol by as follows. Extend the oop.got section with another slot for the VM to
- * patch.
+ * Add oop symbol by as follows. Extend the oop.got section with another slot for the VM to patch.
*
* @param oopName name of the oop symbol
*/
@@ -708,13 +711,13 @@
return relocationSymbol.getOffset();
}
- public int addMetaspaceSymbol(String metaspaceName) {
+ public int addCountersSymbol(String metaspaceName) {
String gotName = "got." + metaspaceName;
Symbol relocationSymbol = getGotSymbol(gotName);
int metaspaceOffset = -1;
if (relocationSymbol == null) {
// Add slots when asked in the .metaspace.got section:
- metaspaceGotContainer.createGotSymbol(gotName);
+ countersGotContainer.createGotSymbol(gotName);
}
return metaspaceOffset;
}
@@ -725,29 +728,30 @@
}
/**
- * Add metaspace symbol by as follows. - Adding the symbol name to the metaspace.names section -
- * Add the offset of the name in metaspace.names to metaspace.offsets - Extend the metaspace.got
- * section with another slot for the VM to patch
+ * Add klass symbol by as follows.
+ * - Adding the symbol name to the metaspace.names section
+ * - Add the offset of the name in metaspace.names to metaspace.offsets
+ * - Extend the klasses.got section with another slot for the VM to patch
*
- * @param metaspaceName name of the metaspace symbol
- * @return the got offset in the metaspace.got of the metaspace symbol
+ * @param klassName name of the metaspace symbol
+ * @return the got offset in the klasses.got of the metaspace symbol
*/
- public int addTwoSlotMetaspaceSymbol(String metaspaceName) {
- String gotName = "got." + metaspaceName;
+ public int addTwoSlotKlassSymbol(String klassName) {
+ String gotName = "got." + klassName;
Symbol previous = getGotSymbol(gotName);
- assert previous == null : "should be called only once for: " + metaspaceName;
+ assert previous == null : "should be called only once for: " + klassName;
// Add slots when asked in the .metaspace.got section:
// First slot
- String gotInitName = "got.init." + metaspaceName;
- GotSymbol slot1Symbol = metaspaceGotContainer.createGotSymbol(gotInitName);
- GotSymbol slot2Symbol = metaspaceGotContainer.createGotSymbol(gotName);
+ String gotInitName = "got.init." + klassName;
+ GotSymbol slot1Symbol = klassesGotContainer.createGotSymbol(gotInitName);
+ GotSymbol slot2Symbol = klassesGotContainer.createGotSymbol(gotName);
slot1Symbol.getIndex(); // check alignment and ignore result
// Get the index (offset/8) to the got in the .metaspace.got section
return slot2Symbol.getIndex();
}
- public int addMethodsCount(int count, ReadOnlyDataContainer container) {
+ public static int addMethodsCount(int count, ReadOnlyDataContainer container) {
return appendInt(count, container);
}
@@ -772,7 +776,7 @@
return constantDataOffset;
}
- public int alignUp(ByteContainer container, int alignment) {
+ public static int alignUp(ByteContainer container, int alignment) {
if (Integer.bitCount(alignment) != 1) {
throw new IllegalArgumentException("Must be a power of 2");
}
@@ -814,15 +818,11 @@
appendBytes(codeSegmentsContainer, segments, 0, segmentsCount);
}
- public CodeContainer getExtLinkageContainer() {
- return extLinkageContainer;
- }
-
public ByteContainer getExtLinkageGOTContainer() {
return extLinkageGOTContainer;
}
- public ByteContainer getMethodMetadataContainer() {
+ public ReadOnlyDataContainer getMethodMetadataContainer() {
return methodMetadataContainer;
}
@@ -854,8 +854,12 @@
return constantDataContainer;
}
- public ByteContainer getMetaspaceGotContainer() {
- return metaspaceGotContainer;
+ public ByteContainer getKlassesGotContainer() {
+ return klassesGotContainer;
+ }
+
+ public ByteContainer getCountersGotContainer() {
+ return countersGotContainer;
}
public ByteContainer getMetadataGotContainer() {
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/CodeContainer.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/CodeContainer.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -26,7 +26,7 @@
/**
* A container that holds information about code section. This is simply a ByteContainer.
*/
-public class CodeContainer extends ByteContainer {
+public final class CodeContainer extends ByteContainer {
public CodeContainer(String containerName, SymbolTable symbolTable) {
super(containerName, symbolTable);
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Container.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Container.java Wed Aug 23 12:39:55 2017 +0000
@@ -23,7 +23,7 @@
package jdk.tools.jaotc.binformat;
-public interface Container {
+interface Container {
String getContainerName();
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/GotSymbol.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/GotSymbol.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -23,7 +23,7 @@
package jdk.tools.jaotc.binformat;
-public class GotSymbol extends Symbol {
+public final class GotSymbol extends Symbol {
private static final int GOT_SIZE = 8;
@@ -33,18 +33,27 @@
return offset / GOT_SIZE;
}
+ /**
+ * Create GOT symbol info.
+ *
+ * @param type type of the symbol (UNDEFINED, FUNC, etc)
+ * @param binding binding of the symbol (LOCAL, GLOBAL, ...)
+ * @param container section in which this symbol is "defined"
+ * @param name name of the symbol
+ */
public GotSymbol(Kind type, Binding binding, ByteContainer container, String name) {
this(container.getByteStreamSize(), type, binding, container, name);
container.appendBytes(new byte[GOT_SIZE], 0, GOT_SIZE);
}
/**
- * Create symbol info.
+ * Create GOT symbol info.
*
* @param offset section offset for the defined symbol
* @param type type of the symbol (UNDEFINED, FUNC, etc)
* @param binding binding of the symbol (LOCAL, GLOBAL, ...)
* @param sec section in which this symbol is "defined"
+ * @param name name of the symbol
*/
public GotSymbol(int offset, Kind type, Binding binding, ByteContainer sec, String name) {
super(offset, type, binding, sec, GOT_SIZE, name);
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/HeaderContainer.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/HeaderContainer.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -27,14 +27,15 @@
import java.io.DataOutputStream;
import java.io.IOException;
-public class HeaderContainer {
+public final class HeaderContainer {
private static final int CURRENT_VERSION = 1;
private final ReadOnlyDataContainer container;
+
// int _version;
// int _class_count;
// int _method_count;
- // int _metaspace_got_size;
+ // int _klasses_got_size;
// int _metadata_got_size;
// int _oop_got_size;
// int _jvm_version_offset;
@@ -76,7 +77,7 @@
this.container.putIntAt(2 * 4, count);
}
- public void setMetaspaceGotSize(int size) {
+ public void setKlassesGotSize(int size) {
this.container.putIntAt(3 * 4, size);
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/ReadOnlyDataContainer.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/ReadOnlyDataContainer.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -23,9 +23,9 @@
package jdk.tools.jaotc.binformat;
-public class ReadOnlyDataContainer extends ByteContainer {
+public final class ReadOnlyDataContainer extends ByteContainer {
- public ReadOnlyDataContainer(String containerName, SymbolTable symbolTable) {
+ ReadOnlyDataContainer(String containerName, SymbolTable symbolTable) {
super(containerName, symbolTable);
}
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Relocation.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Relocation.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -23,25 +23,17 @@
package jdk.tools.jaotc.binformat;
-public class Relocation {
+public final class Relocation {
public enum RelocType {
UNDEFINED,
JAVA_CALL_INDIRECT,
JAVA_CALL_DIRECT,
- FOREIGN_CALL_INDIRECT,
FOREIGN_CALL_INDIRECT_GOT, // Call to address in GOT cell
- FOREIGN_CALL_DIRECT,
- FOREIGN_CALL_DIRECT_FAR,
STUB_CALL_DIRECT,
- STUB_CALL_INDIRECT,
- EXTERNAL_DATA_REFERENCE_FAR,
METASPACE_GOT_REFERENCE,
EXTERNAL_GOT_TO_PLT,
- EXTERNAL_PLT_TO_GOT,
- STATIC_STUB_TO_STATIC_METHOD,
- STATIC_STUB_TO_HOTSPOT_LINKAGE_GOT,
- LOADTIME_ADDRESS
+ EXTERNAL_PLT_TO_GOT
}
private final RelocType type;
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Symbol.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/Symbol.java Wed Aug 23 12:39:55 2017 +0000
@@ -39,7 +39,6 @@
UNDEFINED,
NATIVE_FUNCTION,
JAVA_FUNCTION,
- STATIC_STUB_CALL, // static call stub inside the text section
OBJECT,
NOTYPE
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/Elf.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/Elf.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,17 +25,16 @@
/**
*
- * Support for the creation of Elf Object files.
- * Current support is limited to 64 bit x86_64.
+ * Support for the creation of Elf Object files. Current support is limited to 64 bit x86_64.
*
*/
-public class Elf {
-
+final class Elf {
+ //@formatter:off
/**
* Elf64_Ehdr structure defines
*/
- public enum Elf64_Ehdr {
+ enum Elf64_Ehdr {
e_ident( 0,16),
e_type(16, 2),
e_machine(18, 2),
@@ -51,15 +50,15 @@
e_shnum(60, 2),
e_shstrndx(62, 2);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
Elf64_Ehdr(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 64;
+ static int totalsize = 64;
/**
* Elf64_Ehdr defines
@@ -68,50 +67,44 @@
/**
* e_ident
*/
- public static final int EI_MAG0 = 0;
- public static final byte ELFMAG0 = 0x7f;
- public static final int EI_MAG1 = 1;
- public static final byte ELFMAG1 = 0x45;
- public static final int EI_MAG2 = 2;
- public static final byte ELFMAG2 = 0x4c;
- public static final int EI_MAG3 = 3;
- public static final byte ELFMAG3 = 0x46;
+ static final int EI_MAG0 = 0;
+ static final byte ELFMAG0 = 0x7f;
+ static final int EI_MAG1 = 1;
+ static final byte ELFMAG1 = 0x45;
+ static final int EI_MAG2 = 2;
+ static final byte ELFMAG2 = 0x4c;
+ static final int EI_MAG3 = 3;
+ static final byte ELFMAG3 = 0x46;
+ static final int EI_CLASS = 4;
+ static final byte ELFCLASS64 = 0x2;
- public static final int EI_CLASS = 4;
- public static final byte ELFCLASS64 = 0x2;
-
- public static final int EI_DATA = 5;
- public static final byte ELFDATA2LSB = 0x1;
+ static final int EI_DATA = 5;
+ static final byte ELFDATA2LSB = 0x1;
- public static final int EI_VERSION = 6;
- public static final byte EV_CURRENT = 0x1;
+ static final int EI_VERSION = 6;
+ static final byte EV_CURRENT = 0x1;
- public static final int EI_OSABI = 7;
- public static final byte ELFOSABI_NONE = 0x0;
+ static final int EI_OSABI = 7;
+ static final byte ELFOSABI_NONE = 0x0;
/**
* e_type
*/
- public static final char ET_REL = 0x1;
+ static final char ET_REL = 0x1;
/**
* e_machine
*/
- public static final char EM_NONE = 0;
- public static final char EM_X86_64 = 62;
- public static final char EM_AARCH64 = 183;
-
- /**
- * e_version
- */
- // public static final int EV_CURRENT = 1;
+ static final char EM_NONE = 0;
+ static final char EM_X86_64 = 62;
+ static final char EM_AARCH64 = 183;
}
/**
* Elf64_Shdr structure defines
*/
- public enum Elf64_Shdr {
+ enum Elf64_Shdr {
sh_name( 0, 4),
sh_type( 4, 4),
sh_flags( 8, 8),
@@ -123,15 +116,15 @@
sh_addralign(48, 8),
sh_entsize(56, 8);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
Elf64_Shdr(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 64;
+ static int totalsize = 64;
/**
* Elf64_Shdr defines
@@ -140,21 +133,21 @@
/**
* sh_type
*/
- public static final int SHT_PROGBITS = 0x1;
- public static final int SHT_SYMTAB = 0x2;
- public static final int SHT_STRTAB = 0x3;
- public static final int SHT_RELA = 0x4;
- public static final int SHT_NOBITS = 0x8;
- public static final int SHT_REL = 0x9;
+ static final int SHT_PROGBITS = 0x1;
+ static final int SHT_SYMTAB = 0x2;
+ static final int SHT_STRTAB = 0x3;
+ static final int SHT_RELA = 0x4;
+ static final int SHT_NOBITS = 0x8;
+ static final int SHT_REL = 0x9;
- public static final byte SHN_UNDEF = 0x0;
+ static final byte SHN_UNDEF = 0x0;
/**
* sh_flag
*/
- public static final int SHF_WRITE = 0x1;
- public static final int SHF_ALLOC = 0x2;
- public static final int SHF_EXECINSTR = 0x4;
+ static final int SHF_WRITE = 0x1;
+ static final int SHF_ALLOC = 0x2;
+ static final int SHF_EXECINSTR = 0x4;
}
@@ -163,7 +156,7 @@
*
* Elf64_Sym structure defines
*/
- public enum Elf64_Sym {
+ enum Elf64_Sym {
st_name( 0, 4),
st_info( 4, 1),
st_other( 5, 1),
@@ -171,25 +164,25 @@
st_value( 8, 8),
st_size(16, 8);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
Elf64_Sym(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 24;
+ static int totalsize = 24;
/* ST_BIND is in bits 4-7 of st_info. ST_TYPE is in low 4 bits */
- public static final byte STB_LOCAL = 0x0;
- public static final byte STB_GLOBAL = 0x1;
+ static final byte STB_LOCAL = 0x0;
+ static final byte STB_GLOBAL = 0x1;
- public static final byte STT_NOTYPE = 0x0;
- public static final byte STT_OBJECT = 0x1;
- public static final byte STT_FUNC = 0x2;
+ static final byte STT_NOTYPE = 0x0;
+ static final byte STT_OBJECT = 0x1;
+ static final byte STT_FUNC = 0x2;
- public static byte ELF64_ST_INFO(byte bind, byte type) {
+ static byte ELF64_ST_INFO(byte bind, byte type) {
return (byte)(((bind) << 4) + ((type) & 0xf));
}
@@ -198,59 +191,59 @@
/**
* Elf64_Rel structure defines
*/
- public enum Elf64_Rel {
+ enum Elf64_Rel {
r_offset( 0, 8),
r_info( 8, 8);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
Elf64_Rel(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 16;
+ static int totalsize = 16;
/**
* Relocation types
*/
- public static final int R_X86_64_NONE = 0x0;
- public static final int R_X86_64_64 = 0x1;
- public static final int R_X86_64_PC32 = 0x2;
- public static final int R_X86_64_PLT32 = 0x4;
- public static final int R_X86_64_GOTPCREL = 0x9;
+ static final int R_X86_64_NONE = 0x0;
+ static final int R_X86_64_64 = 0x1;
+ static final int R_X86_64_PC32 = 0x2;
+ static final int R_X86_64_PLT32 = 0x4;
+ static final int R_X86_64_GOTPCREL = 0x9;
}
/**
* Elf64_Rela structure defines
*/
- public enum Elf64_Rela {
+ enum Elf64_Rela {
r_offset( 0, 8),
r_info( 8, 8),
r_addend(16, 8);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
Elf64_Rela(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 24;
+ static int totalsize = 24;
- public static final int R_X86_64_NONE = 0x0;
- public static final int R_X86_64_64 = 0x1;
- public static final int R_X86_64_PC32 = 0x2;
- public static final int R_X86_64_PLT32 = 0x4;
- public static final int R_X86_64_GOTPCREL = 0x9;
+ static final int R_X86_64_NONE = 0x0;
+ static final int R_X86_64_64 = 0x1;
+ static final int R_X86_64_PC32 = 0x2;
+ static final int R_X86_64_PLT32 = 0x4;
+ static final int R_X86_64_GOTPCREL = 0x9;
- public static long ELF64_R_INFO(int symidx, int type) {
- return (((long)symidx << 32) + ((long)type));
+ static long ELF64_R_INFO(int symidx, int type) {
+ return (((long)symidx << 32) + type);
}
}
-
+ //@formatter:on
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfByteBuffer.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfByteBuffer.java Wed Aug 23 12:39:55 2017 +0000
@@ -23,20 +23,20 @@
package jdk.tools.jaotc.binformat.elf;
-
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Ehdr;
import jdk.tools.jaotc.binformat.elf.ElfTargetInfo;
-public class ElfByteBuffer {
+final class ElfByteBuffer {
- public static ByteBuffer allocate(int size) {
+ static ByteBuffer allocate(int size) {
ByteBuffer buf = ByteBuffer.allocate(size);
- if (ElfTargetInfo.getElfEndian() == Elf64_Ehdr.ELFDATA2LSB)
+ if (ElfTargetInfo.getElfEndian() == Elf64_Ehdr.ELFDATA2LSB) {
buf.order(ByteOrder.LITTLE_ENDIAN);
- else
+ } else {
buf.order(ByteOrder.BIG_ENDIAN);
+ }
return (buf);
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfContainer.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfContainer.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,14 +26,13 @@
import java.io.File;
import java.io.FileOutputStream;
-public class ElfContainer {
+final class ElfContainer {
- File outputFile;
- FileOutputStream outputStream;
- long fileOffset;
+ private final File outputFile;
+ private FileOutputStream outputStream;
+ private long fileOffset;
- public ElfContainer(String fileName, String aotVersion) {
- String baseName;
+ ElfContainer(String fileName) {
outputFile = new File(fileName);
if (outputFile.exists()) {
@@ -48,7 +47,7 @@
fileOffset = 0;
}
- public void close() {
+ void close() {
try {
outputStream.close();
} catch (Exception e) {
@@ -56,8 +55,10 @@
}
}
- public void writeBytes(byte [] bytes) {
- if (bytes == null) return;
+ void writeBytes(byte[] bytes) {
+ if (bytes == null) {
+ return;
+ }
try {
outputStream.write(bytes);
} catch (Exception e) {
@@ -67,11 +68,13 @@
}
// Write bytes to output file with up front alignment padding
- public void writeBytes(byte [] bytes, int alignment) {
- if (bytes == null) return;
+ void writeBytes(byte[] bytes, int alignment) {
+ if (bytes == null) {
+ return;
+ }
try {
// Pad to alignment
- while ((fileOffset & (long)(alignment-1)) != 0) {
+ while ((fileOffset & (alignment - 1)) != 0) {
outputStream.write(0);
fileOffset++;
}
@@ -82,4 +85,3 @@
fileOffset += bytes.length;
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfHeader.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfHeader.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,55 +24,52 @@
package jdk.tools.jaotc.binformat.elf;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.elf.Elf;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Ehdr;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Shdr;
import jdk.tools.jaotc.binformat.elf.ElfTargetInfo;
import jdk.tools.jaotc.binformat.elf.ElfByteBuffer;
-public class ElfHeader {
- ByteBuffer header;
+final class ElfHeader {
+ private final ByteBuffer header;
- public ElfHeader() {
+ ElfHeader() {
header = ElfByteBuffer.allocate(Elf64_Ehdr.totalsize);
- header.put(Elf64_Ehdr.e_ident.off+Elf64_Ehdr.EI_MAG0, Elf64_Ehdr.ELFMAG0);
- header.put(Elf64_Ehdr.e_ident.off+Elf64_Ehdr.EI_MAG1, Elf64_Ehdr.ELFMAG1);
- header.put(Elf64_Ehdr.e_ident.off+Elf64_Ehdr.EI_MAG2, Elf64_Ehdr.ELFMAG2);
- header.put(Elf64_Ehdr.e_ident.off+Elf64_Ehdr.EI_MAG3, Elf64_Ehdr.ELFMAG3);
- header.put(Elf64_Ehdr.e_ident.off+Elf64_Ehdr.EI_CLASS, Elf64_Ehdr.ELFCLASS64);
- header.put(Elf64_Ehdr.e_ident.off+Elf64_Ehdr.EI_DATA, Elf64_Ehdr.ELFDATA2LSB);
- header.put(Elf64_Ehdr.e_ident.off+Elf64_Ehdr.EI_VERSION, Elf64_Ehdr.EV_CURRENT);
- header.put(Elf64_Ehdr.e_ident.off+Elf64_Ehdr.EI_OSABI, Elf64_Ehdr.ELFOSABI_NONE);
+ header.put(Elf64_Ehdr.e_ident.off + Elf64_Ehdr.EI_MAG0, Elf64_Ehdr.ELFMAG0);
+ header.put(Elf64_Ehdr.e_ident.off + Elf64_Ehdr.EI_MAG1, Elf64_Ehdr.ELFMAG1);
+ header.put(Elf64_Ehdr.e_ident.off + Elf64_Ehdr.EI_MAG2, Elf64_Ehdr.ELFMAG2);
+ header.put(Elf64_Ehdr.e_ident.off + Elf64_Ehdr.EI_MAG3, Elf64_Ehdr.ELFMAG3);
+ header.put(Elf64_Ehdr.e_ident.off + Elf64_Ehdr.EI_CLASS, Elf64_Ehdr.ELFCLASS64);
+ header.put(Elf64_Ehdr.e_ident.off + Elf64_Ehdr.EI_DATA, Elf64_Ehdr.ELFDATA2LSB);
+ header.put(Elf64_Ehdr.e_ident.off + Elf64_Ehdr.EI_VERSION, Elf64_Ehdr.EV_CURRENT);
+ header.put(Elf64_Ehdr.e_ident.off + Elf64_Ehdr.EI_OSABI, Elf64_Ehdr.ELFOSABI_NONE);
header.putChar(Elf64_Ehdr.e_type.off, Elf64_Ehdr.ET_REL);
header.putChar(Elf64_Ehdr.e_machine.off, ElfTargetInfo.getElfArch());
header.putInt(Elf64_Ehdr.e_version.off, Elf64_Ehdr.EV_CURRENT);
- header.putChar(Elf64_Ehdr.e_ehsize.off, (char)Elf64_Ehdr.totalsize);
- header.putChar(Elf64_Ehdr.e_shentsize.off, (char)Elf64_Shdr.totalsize);
+ header.putChar(Elf64_Ehdr.e_ehsize.off, (char) Elf64_Ehdr.totalsize);
+ header.putChar(Elf64_Ehdr.e_shentsize.off, (char) Elf64_Shdr.totalsize);
}
// Update header with file offset of first section
- public void setSectionOff(int offset) {
+ void setSectionOff(int offset) {
header.putLong(Elf64_Ehdr.e_shoff.off, offset);
}
// Update header with the number of total sections
- public void setSectionNum(int count) {
- header.putChar(Elf64_Ehdr.e_shnum.off, (char)count);
+ void setSectionNum(int count) {
+ header.putChar(Elf64_Ehdr.e_shnum.off, (char) count);
}
// Update header with the section index containing the
// string table for section names
- public void setSectionStrNdx(int index) {
- header.putChar(Elf64_Ehdr.e_shstrndx.off, (char)index);
+ void setSectionStrNdx(int index) {
+ header.putChar(Elf64_Ehdr.e_shstrndx.off, (char) index);
}
- public byte[] getArray() {
+ byte[] getArray() {
return header.array();
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfRelocEntry.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfRelocEntry.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,28 +24,23 @@
package jdk.tools.jaotc.binformat.elf;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.elf.Elf;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Rela;
-import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Ehdr;
-import jdk.tools.jaotc.binformat.elf.ElfTargetInfo;
import jdk.tools.jaotc.binformat.elf.ElfByteBuffer;
-public class ElfRelocEntry {
- ByteBuffer entry;
+final class ElfRelocEntry {
+ private final ByteBuffer entry;
- public ElfRelocEntry(int offset, int symno, int type, int addend) {
+ ElfRelocEntry(int offset, int symno, int type, int addend) {
entry = ElfByteBuffer.allocate(Elf64_Rela.totalsize);
entry.putLong(Elf64_Rela.r_offset.off, offset);
- entry.putLong(Elf64_Rela.r_info.off, Elf64_Rela.ELF64_R_INFO(symno,type));
+ entry.putLong(Elf64_Rela.r_info.off, Elf64_Rela.ELF64_R_INFO(symno, type));
entry.putLong(Elf64_Rela.r_addend.off, addend);
}
- public byte[] getArray() {
+ byte[] getArray() {
return entry.array();
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfRelocTable.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfRelocTable.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,48 +25,38 @@
import java.util.ArrayList;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
import jdk.tools.jaotc.binformat.elf.ElfRelocEntry;
-import jdk.tools.jaotc.binformat.elf.ElfTargetInfo;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Rela;
-import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Ehdr;
import jdk.tools.jaotc.binformat.elf.ElfByteBuffer;
-public class ElfRelocTable {
- ArrayList<ArrayList<ElfRelocEntry>> relocEntries;
+final class ElfRelocTable {
+ private final ArrayList<ArrayList<ElfRelocEntry>> relocEntries;
- public ElfRelocTable(int numsects) {
- relocEntries = new ArrayList<ArrayList<ElfRelocEntry>>(numsects);
- for (int i = 0; i < numsects; i++)
+ ElfRelocTable(int numsects) {
+ relocEntries = new ArrayList<>(numsects);
+ for (int i = 0; i < numsects; i++) {
relocEntries.add(new ArrayList<ElfRelocEntry>());
+ }
}
- public void createRelocationEntry(int sectindex,
- int offset,
- int symno,
- int type,
- int addend) {
-
- ElfRelocEntry entry = new ElfRelocEntry(offset,
- symno,
- type,
- addend);
+ void createRelocationEntry(int sectindex, int offset, int symno, int type, int addend) {
+ ElfRelocEntry entry = new ElfRelocEntry(offset, symno, type, addend);
relocEntries.get(sectindex).add(entry);
}
- public int getNumRelocs(int section_index) {
+ int getNumRelocs(int section_index) {
return relocEntries.get(section_index).size();
}
// Return the relocation entries for a single section
- // or null if no entries added to section
- public byte [] getRelocData(int section_index) {
+ // or null if no entries added to section
+ byte[] getRelocData(int section_index) {
ArrayList<ElfRelocEntry> entryList = relocEntries.get(section_index);
- if (entryList.size() == 0)
+ if (entryList.size() == 0) {
return null;
-
+ }
ByteBuffer relocData = ElfByteBuffer.allocate(entryList.size() * Elf64_Rela.totalsize);
// Copy each entry to a single ByteBuffer
@@ -78,4 +68,3 @@
return (relocData.array());
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSection.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSection.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,40 +24,36 @@
package jdk.tools.jaotc.binformat.elf;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.elf.Elf;
-import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Ehdr;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Shdr;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Rel;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Rela;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Sym;
import jdk.tools.jaotc.binformat.elf.ElfByteBuffer;
-public class ElfSection {
- String name;
- ByteBuffer section;
- byte [] data;
- boolean hasrelocations;
- int sectionIndex;
+final class ElfSection {
+ private final String name;
+ private final ByteBuffer section;
+ private final byte[] data;
+ private final boolean hasrelocations;
+ private final int sectionIndex;
/**
* String holding section name strings
*/
- private static StringBuilder sectNameTab = new StringBuilder();
+ private final static StringBuilder sectNameTab = new StringBuilder();
/**
- * Keeps track of bytes in section string table since strTabContent.length()
- * is number of chars, not bytes.
+ * Keeps track of bytes in section string table since strTabContent.length() is number of chars,
+ * not bytes.
*/
private static int shStrTabNrOfBytes = 0;
- public ElfSection(String sectName, byte [] sectData, int sectFlags,
- int sectType, boolean hasRelocations, int align,
- int sectIndex) {
+ ElfSection(String sectName, byte[] sectData, int sectFlags, int sectType,
+ boolean hasRelocations, int align, int sectIndex) {
section = ElfByteBuffer.allocate(Elf64_Shdr.totalsize);
-
+ name = sectName;
// Return all 0's for NULL section
if (sectIndex == 0) {
sectNameTab.append('\0');
@@ -71,7 +67,6 @@
section.putInt(Elf64_Shdr.sh_name.off, shStrTabNrOfBytes);
sectNameTab.append(sectName).append('\0');
shStrTabNrOfBytes += (sectName.getBytes().length + 1);
- name = sectName;
section.putInt(Elf64_Shdr.sh_type.off, sectType);
section.putLong(Elf64_Shdr.sh_flags.off, sectFlags);
@@ -81,8 +76,7 @@
if (sectName.equals(".shstrtab")) {
section.putLong(Elf64_Shdr.sh_size.off, shStrTabNrOfBytes);
data = sectNameTab.toString().getBytes();
- }
- else {
+ } else {
data = sectData;
section.putLong(Elf64_Shdr.sh_size.off, sectData.length);
}
@@ -110,55 +104,53 @@
sectionIndex = sectIndex;
}
- public String getName() {
+ String getName() {
return name;
}
- public long getSize() {
+ long getSize() {
return section.getLong(Elf64_Shdr.sh_size.off);
}
- public int getDataAlign() {
- return ((int)section.getLong(Elf64_Shdr.sh_addralign.off));
+ int getDataAlign() {
+ return ((int) section.getLong(Elf64_Shdr.sh_addralign.off));
}
// Alignment requirements for the Elf64_Shdr structures
- public static int getShdrAlign() {
+ static int getShdrAlign() {
return (4);
}
- public byte[] getArray() {
+ byte[] getArray() {
return section.array();
}
- public byte[] getDataArray() {
+ byte[] getDataArray() {
return data;
}
- public void setOffset(long offset) {
+ void setOffset(long offset) {
section.putLong(Elf64_Shdr.sh_offset.off, offset);
}
- public void setLink(int link) {
+ void setLink(int link) {
section.putInt(Elf64_Shdr.sh_link.off, link);
}
- public void setInfo(int info) {
+ void setInfo(int info) {
section.putInt(Elf64_Shdr.sh_info.off, info);
}
- public long getOffset() {
+ long getOffset() {
return (section.getLong(Elf64_Shdr.sh_offset.off));
}
- public boolean hasRelocations() {
+ boolean hasRelocations() {
return hasrelocations;
}
- public int getSectionId() {
+ int getSectionId() {
return sectionIndex;
}
}
-
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSymbol.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSymbol.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,34 +24,29 @@
package jdk.tools.jaotc.binformat.elf;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
import jdk.tools.jaotc.binformat.NativeSymbol;
-import jdk.tools.jaotc.binformat.elf.Elf;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Sym;
-import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Ehdr;
import jdk.tools.jaotc.binformat.elf.ElfByteBuffer;
-public class ElfSymbol extends NativeSymbol {
- ByteBuffer sym;
+final class ElfSymbol extends NativeSymbol {
+ private final ByteBuffer sym;
- public ElfSymbol(int symbolindex, int strindex, byte type, byte bind,
- byte sectindex, long offset, long size) {
+ ElfSymbol(int symbolindex, int strindex, byte type, byte bind, byte sectindex, long offset, long size) {
super(symbolindex);
sym = ElfByteBuffer.allocate(Elf64_Sym.totalsize);
sym.putInt(Elf64_Sym.st_name.off, strindex);
sym.put(Elf64_Sym.st_info.off, Elf64_Sym.ELF64_ST_INFO(bind, type));
- sym.put(Elf64_Sym.st_other.off, (byte)0);
+ sym.put(Elf64_Sym.st_other.off, (byte) 0);
// Section indexes start at 1 but we manage the index internally
// as 0 relative
- sym.putChar(Elf64_Sym.st_shndx.off, (char)(sectindex));
+ sym.putChar(Elf64_Sym.st_shndx.off, (char) (sectindex));
sym.putLong(Elf64_Sym.st_value.off, offset);
sym.putLong(Elf64_Sym.st_size.off, size);
}
- public byte[] getArray() {
+ byte[] getArray() {
return sym.array();
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSymtab.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfSymtab.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,41 +24,38 @@
package jdk.tools.jaotc.binformat.elf;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
import java.util.ArrayList;
-import jdk.tools.jaotc.binformat.elf.Elf;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Sym;
import jdk.tools.jaotc.binformat.elf.ElfSymbol;
import jdk.tools.jaotc.binformat.elf.ElfByteBuffer;
-public class ElfSymtab {
+final class ElfSymtab {
- ArrayList<ElfSymbol>localSymbols = new ArrayList<ElfSymbol>();
- ArrayList<ElfSymbol>globalSymbols = new ArrayList<ElfSymbol>();
+ private final ArrayList<ElfSymbol> localSymbols = new ArrayList<>();
+ private final ArrayList<ElfSymbol> globalSymbols = new ArrayList<>();
/**
* number of symbols added
*/
- int symbolCount;
+ private int symbolCount;
/**
* String holding symbol table strings
*/
- private StringBuilder strTabContent = new StringBuilder();
+ private final StringBuilder strTabContent = new StringBuilder();
/**
- * Keeps track of bytes in string table since strTabContent.length()
- * is number of chars, not bytes.
+ * Keeps track of bytes in string table since strTabContent.length() is number of chars, not
+ * bytes.
*/
private int strTabNrOfBytes = 0;
- public ElfSymtab() {
+ ElfSymtab() {
symbolCount = 0;
}
- public ElfSymbol addSymbolEntry(String name, byte type, byte bind,
- byte secHdrIndex, long offset, long size) {
+ ElfSymbol addSymbolEntry(String name, byte type, byte bind, byte secHdrIndex, long offset, long size) {
// Get the current symbol index and append symbol name to string table.
int index;
ElfSymbol sym;
@@ -76,7 +73,7 @@
// strTabContent.append("_").append(name).append('\0');
strTabContent.append(name).append('\0');
// + 1 for null, + 1 for "_"
- //strTabNrOfBytes += (name.getBytes().length + 1 + 1);
+ // strTabNrOfBytes += (name.getBytes().length + 1 + 1);
strTabNrOfBytes += (name.getBytes().length + 1);
sym = new ElfSymbol(symbolCount, index, type, bind, secHdrIndex, offset, size);
@@ -92,44 +89,47 @@
// Update the symbol indexes once all symbols have been added.
// This is required since we'll be reordering the symbols in the
// file to be in the order of Local then global.
- public void updateIndexes() {
+ void updateIndexes() {
int index = 0;
// Update the local symbol indexes
- for (int i = 0; i < localSymbols.size(); i++ ) {
+ for (int i = 0; i < localSymbols.size(); i++) {
ElfSymbol sym = localSymbols.get(i);
sym.setIndex(index++);
}
// Update the global symbol indexes
- for (int i = 0; i < globalSymbols.size(); i++ ) {
+ for (int i = 0; i < globalSymbols.size(); i++) {
ElfSymbol sym = globalSymbols.get(i);
sym.setIndex(index++);
}
}
- public int getNumLocalSyms() { return localSymbols.size(); }
- public int getNumGlobalSyms() { return globalSymbols.size(); }
+ int getNumLocalSyms() {
+ return localSymbols.size();
+ }
+ int getNumGlobalSyms() {
+ return globalSymbols.size();
+ }
// Create a single byte array that contains the symbol table entries
- public byte[] getSymtabArray() {
- int index = 0;
- ByteBuffer symtabData = ElfByteBuffer.allocate(symbolCount*Elf64_Sym.totalsize);
- byte [] retarray;
+ byte[] getSymtabArray() {
+ ByteBuffer symtabData = ElfByteBuffer.allocate(symbolCount * Elf64_Sym.totalsize);
+ byte[] retarray;
updateIndexes();
// Add the local symbols
- for (int i = 0; i < localSymbols.size(); i++ ) {
+ for (int i = 0; i < localSymbols.size(); i++) {
ElfSymbol sym = localSymbols.get(i);
- byte [] arr = sym.getArray();
+ byte[] arr = sym.getArray();
symtabData.put(arr);
}
// Add the global symbols
- for (int i = 0; i < globalSymbols.size(); i++ ) {
+ for (int i = 0; i < globalSymbols.size(); i++) {
ElfSymbol sym = globalSymbols.get(i);
- byte [] arr = sym.getArray();
+ byte[] arr = sym.getArray();
symtabData.put(arr);
}
retarray = symtabData.array();
@@ -138,10 +138,8 @@
}
// Return the string table array
- public byte[] getStrtabArray() {
- byte [] strs = strTabContent.toString().getBytes();
+ byte[] getStrtabArray() {
+ byte[] strs = strTabContent.toString().getBytes();
return (strs);
}
}
-
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfTargetInfo.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/ElfTargetInfo.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,14 +24,13 @@
package jdk.tools.jaotc.binformat.elf;
import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.elf.Elf;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Ehdr;
/**
* Class that abstracts MACH-O target details.
*
*/
-public class ElfTargetInfo {
+final class ElfTargetInfo {
/**
* Target architecture.
*/
@@ -68,16 +67,15 @@
}
}
- public static char getElfArch() {
+ static char getElfArch() {
return arch;
}
- public static int getElfEndian() {
+ static int getElfEndian() {
return endian;
}
- public static String getOsName() {
+ static String getOsName() {
return osName;
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/JELFRelocObject.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/elf/JELFRelocObject.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,13 +24,11 @@
package jdk.tools.jaotc.binformat.elf;
import java.io.IOException;
-import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
-import jdk.tools.jaotc.binformat.Container;
import jdk.tools.jaotc.binformat.BinaryContainer;
import jdk.tools.jaotc.binformat.ByteContainer;
import jdk.tools.jaotc.binformat.CodeContainer;
@@ -38,17 +36,14 @@
import jdk.tools.jaotc.binformat.Relocation;
import jdk.tools.jaotc.binformat.Relocation.RelocType;
import jdk.tools.jaotc.binformat.Symbol;
-import jdk.tools.jaotc.binformat.NativeSymbol;
import jdk.tools.jaotc.binformat.Symbol.Binding;
import jdk.tools.jaotc.binformat.Symbol.Kind;
-import jdk.tools.jaotc.binformat.elf.Elf;
import jdk.tools.jaotc.binformat.elf.ElfSymbol;
import jdk.tools.jaotc.binformat.elf.ElfTargetInfo;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Ehdr;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Shdr;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Sym;
-import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Rel;
import jdk.tools.jaotc.binformat.elf.Elf.Elf64_Rela;
public class JELFRelocObject {
@@ -59,34 +54,29 @@
private final int segmentSize;
- public JELFRelocObject(BinaryContainer binContainer, String outputFileName, String aotVersion) {
+ public JELFRelocObject(BinaryContainer binContainer, String outputFileName) {
this.binContainer = binContainer;
- this.elfContainer = new ElfContainer(outputFileName, aotVersion);
+ this.elfContainer = new ElfContainer(outputFileName);
this.segmentSize = binContainer.getCodeSegmentSize();
}
- private ElfSection createByteSection(ArrayList<ElfSection>sections,
- String sectName,
- byte [] scnData,
- boolean hasRelocs,
- int align,
- int scnFlags,
- int scnType) {
+ private static ElfSection createByteSection(ArrayList<ElfSection> sections,
+ String sectName,
+ byte[] scnData,
+ boolean hasRelocs,
+ int align,
+ int scnFlags,
+ int scnType) {
- ElfSection sect = new ElfSection(sectName,
- scnData,
- scnFlags,
- scnType,
- hasRelocs,
- align,
- sections.size());
+ ElfSection sect = new ElfSection(sectName, scnData, scnFlags, scnType,
+ hasRelocs, align, sections.size());
// Add this section to our list
sections.add(sect);
return (sect);
}
- private void createByteSection(ArrayList<ElfSection>sections,
+ private void createByteSection(ArrayList<ElfSection> sections,
ByteContainer c, int scnFlags) {
ElfSection sect;
boolean hasRelocs = c.hasRelocations();
@@ -112,15 +102,15 @@
c.setSectionId(sect.getSectionId());
}
- private void createCodeSection(ArrayList<ElfSection>sections, CodeContainer c) {
+ private void createCodeSection(ArrayList<ElfSection> sections, CodeContainer c) {
createByteSection(sections, c, Elf64_Shdr.SHF_ALLOC | Elf64_Shdr.SHF_EXECINSTR);
}
- private void createReadOnlySection(ArrayList<ElfSection>sections, ReadOnlyDataContainer c) {
+ private void createReadOnlySection(ArrayList<ElfSection> sections, ReadOnlyDataContainer c) {
createByteSection(sections, c, Elf64_Shdr.SHF_ALLOC);
}
- private void createReadWriteSection(ArrayList<ElfSection>sections, ByteContainer c) {
+ private void createReadWriteSection(ArrayList<ElfSection> sections, ByteContainer c) {
createByteSection(sections, c, Elf64_Shdr.SHF_ALLOC | Elf64_Shdr.SHF_WRITE);
}
@@ -135,7 +125,7 @@
// Allocate ELF Header
ElfHeader eh = new ElfHeader();
- ArrayList<ElfSection> sections = new ArrayList<ElfSection>();
+ ArrayList<ElfSection> sections = new ArrayList<>();
// Create the null section
createByteSection(sections, null, null, false, 1, 0, 0);
@@ -146,63 +136,49 @@
createReadOnlySection(sections, binContainer.getKlassesOffsetsContainer());
createReadOnlySection(sections, binContainer.getMethodsOffsetsContainer());
createReadOnlySection(sections, binContainer.getKlassesDependenciesContainer());
- createReadWriteSection(sections, binContainer.getMetaspaceGotContainer());
- createReadWriteSection(sections, binContainer.getMetadataGotContainer());
- createReadWriteSection(sections, binContainer.getMethodStateContainer());
- createReadWriteSection(sections, binContainer.getOopGotContainer());
- createReadWriteSection(sections, binContainer.getMethodMetadataContainer());
+ createReadOnlySection(sections, binContainer.getMethodMetadataContainer());
createReadOnlySection(sections, binContainer.getStubsOffsetsContainer());
createReadOnlySection(sections, binContainer.getHeaderContainer().getContainer());
createReadOnlySection(sections, binContainer.getCodeSegmentsContainer());
createReadOnlySection(sections, binContainer.getConstantDataContainer());
createReadOnlySection(sections, binContainer.getConfigContainer());
-
- // createExternalLinkage();
-
- createCodeSection(sections, binContainer.getExtLinkageContainer());
+ createReadWriteSection(sections, binContainer.getKlassesGotContainer());
+ createReadWriteSection(sections, binContainer.getCountersGotContainer());
+ createReadWriteSection(sections, binContainer.getMetadataGotContainer());
+ createReadWriteSection(sections, binContainer.getOopGotContainer());
+ createReadWriteSection(sections, binContainer.getMethodStateContainer());
createReadWriteSection(sections, binContainer.getExtLinkageGOTContainer());
// Get ELF symbol data from BinaryContainer object's symbol tables
- ElfSymtab symtab = createELFSymbolTables(sections, symbols);
+ ElfSymtab symtab = createELFSymbolTables(symbols);
// Create string table section and symbol table sections in
// that order since symtab section needs to set the index of
// strtab in sh_link field
- ElfSection strTabSection = createByteSection(sections,
- ".strtab",
+ ElfSection strTabSection = createByteSection(sections, ".strtab",
symtab.getStrtabArray(),
- false,
- 1,
- 0,
+ false, 1, 0,
Elf64_Shdr.SHT_STRTAB);
// Now create .symtab section with the symtab data constructed.
// On Linux, sh_link of symtab contains the index of string table
// its symbols reference and sh_info contains the index of first
// non-local symbol
- ElfSection symTabSection = createByteSection(sections,
- ".symtab",
- symtab.getSymtabArray(),
- false,
- 8,
- 0,
- Elf64_Shdr.SHT_SYMTAB);
+ ElfSection symTabSection = createByteSection(sections, ".symtab",
+ symtab.getSymtabArray(),
+ false, 8, 0,
+ Elf64_Shdr.SHT_SYMTAB);
symTabSection.setLink(strTabSection.getSectionId());
symTabSection.setInfo(symtab.getNumLocalSyms());
- ElfRelocTable elfRelocTable = createElfRelocTable(sections,
- relocationTable);
+ ElfRelocTable elfRelocTable = createElfRelocTable(sections, relocationTable);
createElfRelocSections(sections, elfRelocTable, symTabSection.getSectionId());
// Now, finally, after creating all sections, create shstrtab section
- ElfSection shStrTabSection = createByteSection(sections,
- ".shstrtab",
- null,
- false,
- 1,
- 0,
- Elf64_Shdr.SHT_STRTAB);
+ ElfSection shStrTabSection = createByteSection(sections, ".shstrtab",
+ null, false, 1, 0,
+ Elf64_Shdr.SHT_STRTAB);
eh.setSectionStrNdx(shStrTabSection.getSectionId());
// Update all section offsets and the Elf header section offset
@@ -211,21 +187,21 @@
int file_offset = Elf64_Ehdr.totalsize;
// and round it up
- file_offset = (file_offset + (sections.get(1).getDataAlign()-1)) &
- ~((sections.get(1).getDataAlign()-1));
+ file_offset = (file_offset + (sections.get(1).getDataAlign() - 1)) &
+ ~((sections.get(1).getDataAlign() - 1));
// Calc file offsets for section data skipping null section
for (int i = 1; i < sections.size(); i++) {
ElfSection sect = sections.get(i);
- file_offset = (file_offset + (sect.getDataAlign()-1)) &
- ~((sect.getDataAlign()-1));
+ file_offset = (file_offset + (sect.getDataAlign() - 1)) &
+ ~((sect.getDataAlign() - 1));
sect.setOffset(file_offset);
file_offset += sect.getSize();
}
// Align the section table
- file_offset = (file_offset + (ElfSection.getShdrAlign()-1)) &
- ~((ElfSection.getShdrAlign()-1));
+ file_offset = (file_offset + (ElfSection.getShdrAlign() - 1)) &
+ ~((ElfSection.getShdrAlign() - 1));
// Update the Elf Header with the offset of the first Elf64_Shdr
// and the number of sections.
@@ -249,24 +225,25 @@
elfContainer.close();
}
+
/**
- * Construct ELF symbol data from BinaryContainer object's symbol tables. Both dynamic ELF
- * symbol table and ELF symbol table are created from BinaryContainer's symbol info.
+ * Construct ELF symbol data from BinaryContainer object's symbol tables. Both dynamic ELF symbol
+ * table and ELF symbol table are created from BinaryContainer's symbol info.
*
* @param symbols
*/
- private ElfSymtab createELFSymbolTables(ArrayList<ElfSection> sections, Collection<Symbol> symbols) {
+ private static ElfSymtab createELFSymbolTables(Collection<Symbol> symbols) {
ElfSymtab symtab = new ElfSymtab();
// First, create the initial null symbol. This is a local symbol.
- symtab.addSymbolEntry("", (byte)0, (byte)0, Elf64_Shdr.SHN_UNDEF, 0, 0);
+ symtab.addSymbolEntry("", (byte) 0, (byte) 0, Elf64_Shdr.SHN_UNDEF, 0, 0);
// Now create ELF symbol entries for all symbols.
for (Symbol symbol : symbols) {
// Get the index of section this symbol is defined in.
int secHdrIndex = symbol.getSection().getSectionId();
- ElfSymbol elfSymbol = symtab.addSymbolEntry(symbol.getName(), getELFTypeOf(symbol), getELFBindOf(symbol), (byte)secHdrIndex, symbol.getOffset(), symbol.getSize());
- symbol.setNativeSymbol((NativeSymbol)elfSymbol);
+ ElfSymbol elfSymbol = symtab.addSymbolEntry(symbol.getName(), getELFTypeOf(symbol), getELFBindOf(symbol), (byte) secHdrIndex, symbol.getOffset(), symbol.getSize());
+ symbol.setNativeSymbol(elfSymbol);
}
return (symtab);
}
@@ -300,8 +277,7 @@
ElfRelocTable elfRelocTable = new ElfRelocTable(sections.size());
/*
- * For each of the symbols with associated relocation records, create a Elf relocation
- * entry.
+ * For each of the symbols with associated relocation records, create a Elf relocation entry.
*/
for (Map.Entry<Symbol, List<Relocation>> entry : relocationTable.entrySet()) {
List<Relocation> relocs = entry.getValue();
@@ -319,69 +295,39 @@
return (elfRelocTable);
}
- private void createRelocation(Symbol symbol, Relocation reloc, ElfRelocTable elfRelocTable) {
+ private static void createRelocation(Symbol symbol, Relocation reloc, ElfRelocTable elfRelocTable) {
RelocType relocType = reloc.getType();
int elfRelocType = getELFRelocationType(relocType);
- ElfSymbol sym = (ElfSymbol)symbol.getNativeSymbol();
+ ElfSymbol sym = (ElfSymbol) symbol.getNativeSymbol();
int symno = sym.getIndex();
int sectindex = reloc.getSection().getSectionId();
int offset = reloc.getOffset();
int addend = 0;
switch (relocType) {
- case FOREIGN_CALL_DIRECT:
case JAVA_CALL_DIRECT:
case STUB_CALL_DIRECT:
case FOREIGN_CALL_INDIRECT_GOT: {
// Create relocation entry
- // System.out.println("getELFRelocationType: PLT relocation type using X86_64_RELOC_BRANCH");
addend = -4; // Size in bytes of the patch location
// Relocation should be applied at the location after call operand
offset = offset + reloc.getSize() + addend;
break;
}
- case FOREIGN_CALL_DIRECT_FAR: {
- // Create relocation entry
- addend = -8; // Size in bytes of the patch location
- // Relocation should be applied at the location after call operand
- // 10 = 2 (jmp [r]) + 8 (imm64)
- offset = offset + reloc.getSize() + addend - 2;
- break;
- }
- case FOREIGN_CALL_INDIRECT:
case JAVA_CALL_INDIRECT:
- case STUB_CALL_INDIRECT: {
- // Do nothing.
- return;
- }
- case EXTERNAL_DATA_REFERENCE_FAR: {
- // Create relocation entry
+ case METASPACE_GOT_REFERENCE:
+ case EXTERNAL_PLT_TO_GOT: {
addend = -4; // Size of 32-bit address of the GOT
/*
* Relocation should be applied before the test instruction to the move instruction.
- * offset points to the test instruction after the instruction that loads
- * the address of polling page. So set the offset appropriately.
+ * reloc.getOffset() points to the test instruction after the instruction that loads the address of
+ * polling page. So set the offset appropriately.
*/
offset = offset + addend;
break;
}
- case METASPACE_GOT_REFERENCE:
- case EXTERNAL_PLT_TO_GOT:
- case STATIC_STUB_TO_STATIC_METHOD:
- case STATIC_STUB_TO_HOTSPOT_LINKAGE_GOT: {
- addend = -4; // Size of 32-bit address of the GOT
- /*
- * Relocation should be applied before the test instruction to
- * the move instruction. reloc.getOffset() points to the
- * test instruction after the instruction that loads the
- * address of polling page. So set the offset appropriately.
- */
- offset = offset + addend;
- break;
- }
- case EXTERNAL_GOT_TO_PLT:
- case LOADTIME_ADDRESS: {
+ case EXTERNAL_GOT_TO_PLT: {
// this is load time relocations
break;
}
@@ -396,27 +342,17 @@
switch (ElfTargetInfo.getElfArch()) {
case Elf64_Ehdr.EM_X86_64:
// Return R_X86_64_* entries based on relocType
- if (relocType == RelocType.FOREIGN_CALL_DIRECT ||
- relocType == RelocType.JAVA_CALL_DIRECT ||
+ if (relocType == RelocType.JAVA_CALL_DIRECT ||
relocType == RelocType.FOREIGN_CALL_INDIRECT_GOT) {
elfRelocType = Elf64_Rela.R_X86_64_PLT32;
} else if (relocType == RelocType.STUB_CALL_DIRECT) {
elfRelocType = Elf64_Rela.R_X86_64_PC32;
- } else if (relocType == RelocType.FOREIGN_CALL_DIRECT_FAR) {
- elfRelocType = Elf64_Rela.R_X86_64_64;
- } else if (relocType == RelocType.FOREIGN_CALL_INDIRECT ||
- relocType == RelocType.JAVA_CALL_INDIRECT ||
- relocType == RelocType.STUB_CALL_INDIRECT) {
+ } else if (relocType == RelocType.JAVA_CALL_INDIRECT) {
elfRelocType = Elf64_Rela.R_X86_64_NONE;
- } else if ((relocType == RelocType.EXTERNAL_DATA_REFERENCE_FAR)) {
- elfRelocType = Elf64_Rela.R_X86_64_GOTPCREL;
} else if (relocType == RelocType.METASPACE_GOT_REFERENCE ||
- relocType == RelocType.EXTERNAL_PLT_TO_GOT ||
- relocType == RelocType.STATIC_STUB_TO_STATIC_METHOD ||
- relocType == RelocType.STATIC_STUB_TO_HOTSPOT_LINKAGE_GOT) {
+ relocType == RelocType.EXTERNAL_PLT_TO_GOT) {
elfRelocType = Elf64_Rela.R_X86_64_PC32;
- } else if (relocType == RelocType.EXTERNAL_GOT_TO_PLT ||
- relocType == RelocType.LOADTIME_ADDRESS) {
+ } else if (relocType == RelocType.EXTERNAL_GOT_TO_PLT) {
elfRelocType = Elf64_Rela.R_X86_64_64;
} else {
assert false : "Unhandled relocation type: " + relocType;
@@ -428,9 +364,9 @@
return elfRelocType;
}
- private void createElfRelocSections(ArrayList<ElfSection> sections,
- ElfRelocTable elfRelocTable,
- int symtabsectidx) {
+ private static void createElfRelocSections(ArrayList<ElfSection> sections,
+ ElfRelocTable elfRelocTable,
+ int symtabsectidx) {
// Grab count before we create new sections
int count = sections.size();
@@ -439,15 +375,11 @@
if (elfRelocTable.getNumRelocs(i) > 0) {
ElfSection sect = sections.get(i);
String relname = ".rela" + sect.getName();
- ElfSection relocSection = createByteSection(sections,
- relname,
- elfRelocTable.getRelocData(i),
- false,
- 8,
- 0,
- Elf64_Shdr.SHT_RELA);
- relocSection.setLink(symtabsectidx);
- relocSection.setInfo(sect.getSectionId());
+ ElfSection relocSection = createByteSection(sections, relname,
+ elfRelocTable.getRelocData(i),
+ false, 8, 0, Elf64_Shdr.SHT_RELA);
+ relocSection.setLink(symtabsectidx);
+ relocSection.setInfo(sect.getSectionId());
}
}
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/JMachORelocObject.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/JMachORelocObject.java Wed Aug 23 12:39:55 2017 +0000
@@ -53,11 +53,8 @@
import jdk.tools.jaotc.binformat.Relocation;
import jdk.tools.jaotc.binformat.Relocation.RelocType;
import jdk.tools.jaotc.binformat.Symbol;
-import jdk.tools.jaotc.binformat.NativeSymbol;
-import jdk.tools.jaotc.binformat.Symbol.Binding;
import jdk.tools.jaotc.binformat.Symbol.Kind;
-import jdk.tools.jaotc.binformat.macho.MachO;
import jdk.tools.jaotc.binformat.macho.MachO.section_64;
import jdk.tools.jaotc.binformat.macho.MachO.mach_header_64;
import jdk.tools.jaotc.binformat.macho.MachO.segment_command_64;
@@ -85,7 +82,7 @@
this.segmentSize = binContainer.getCodeSegmentSize();
}
- private void createByteSection(ArrayList<MachOSection>sections,
+ private void createByteSection(ArrayList<MachOSection> sections,
ByteContainer c, String sectName, String segName, int scnFlags) {
if (c.getByteArray().length == 0) {
@@ -102,24 +99,24 @@
sections.add(sect);
// Record the section Id (0 relative)
- c.setSectionId(sections.size()-1);
+ c.setSectionId(sections.size() - 1);
// TODO: Clear out code section data to allow for GC
// c.clear();
}
- private void createCodeSection(ArrayList<MachOSection>sections, CodeContainer c) {
- createByteSection(sections, c, /*c.getContainerName()*/ "__text", "__TEXT",
- section_64.S_ATTR_PURE_INSTRUCTIONS|
+ private void createCodeSection(ArrayList<MachOSection> sections, CodeContainer c) {
+ createByteSection(sections, c, /* c.getContainerName() */ "__text", "__TEXT",
+ section_64.S_ATTR_PURE_INSTRUCTIONS |
section_64.S_ATTR_SOME_INSTRUCTIONS);
}
- private void createReadOnlySection(ArrayList<MachOSection>sections, ReadOnlyDataContainer c) {
+ private void createReadOnlySection(ArrayList<MachOSection> sections, ReadOnlyDataContainer c) {
createByteSection(sections, c, c.getContainerName(), "__TEXT",
section_64.S_ATTR_SOME_INSTRUCTIONS);
}
- private void createReadWriteSection(ArrayList<MachOSection>sections, ByteContainer c) {
+ private void createReadWriteSection(ArrayList<MachOSection> sections, ByteContainer c) {
createByteSection(sections, c, c.getContainerName(), "__DATA", section_64.S_REGULAR);
}
@@ -140,7 +137,7 @@
MachOHeader mh = new MachOHeader();
- ArrayList<MachOSection> sections = new ArrayList<MachOSection>();
+ ArrayList<MachOSection> sections = new ArrayList<>();
// Create Sections contained in the main Segment LC_SEGMENT_64
@@ -149,21 +146,19 @@
createReadOnlySection(sections, binContainer.getKlassesOffsetsContainer());
createReadOnlySection(sections, binContainer.getMethodsOffsetsContainer());
createReadOnlySection(sections, binContainer.getKlassesDependenciesContainer());
- createReadWriteSection(sections, binContainer.getMetaspaceGotContainer());
- createReadWriteSection(sections, binContainer.getMetadataGotContainer());
- createReadWriteSection(sections, binContainer.getMethodStateContainer());
- createReadWriteSection(sections, binContainer.getOopGotContainer());
- createReadWriteSection(sections, binContainer.getMethodMetadataContainer());
+ createReadOnlySection(sections, binContainer.getMethodMetadataContainer());
createReadOnlySection(sections, binContainer.getStubsOffsetsContainer());
createReadOnlySection(sections, binContainer.getHeaderContainer().getContainer());
createReadOnlySection(sections, binContainer.getCodeSegmentsContainer());
createReadOnlySection(sections, binContainer.getConstantDataContainer());
createReadOnlySection(sections, binContainer.getConfigContainer());
-
- // createExternalLinkage();
+ createReadWriteSection(sections, binContainer.getKlassesGotContainer());
+ createReadWriteSection(sections, binContainer.getCountersGotContainer());
+ createReadWriteSection(sections, binContainer.getMetadataGotContainer());
+ createReadWriteSection(sections, binContainer.getMethodStateContainer());
+ createReadWriteSection(sections, binContainer.getOopGotContainer());
+ createReadWriteSection(sections, binContainer.getExtLinkageGOTContainer());
- createCodeSection(sections, binContainer.getExtLinkageContainer());
- createReadWriteSection(sections, binContainer.getExtLinkageGOTContainer());
// Update the Header sizeofcmds size.
// This doesn't include the Header struct size
mh.setCmdSizes(4, segment_command_64.totalsize +
@@ -175,14 +170,14 @@
// Initialize file offset for data past commands
int file_offset = mach_header_64.totalsize + mh.getCmdSize();
// and round it up
- file_offset = (file_offset + (sections.get(0).getAlign()-1)) & ~((sections.get(0).getAlign()-1));
+ file_offset = (file_offset + (sections.get(0).getAlign() - 1)) & ~((sections.get(0).getAlign() - 1));
long address = 0;
int segment_offset = file_offset;
for (int i = 0; i < sections.size(); i++) {
MachOSection sect = sections.get(i);
- file_offset = (file_offset + (sect.getAlign()-1)) & ~((sect.getAlign()-1));
- address = (address + (sect.getAlign()-1)) & ~((sect.getAlign()-1));
+ file_offset = (file_offset + (sect.getAlign() - 1)) & ~((sect.getAlign() - 1));
+ address = (address + (sect.getAlign() - 1)) & ~((sect.getAlign() - 1));
sect.setOffset(file_offset);
sect.setAddr(address);
file_offset += sect.getSize();
@@ -199,7 +194,6 @@
segment_size,
sections.size());
-
MachOVersion vers = new MachOVersion();
// Get symbol data from BinaryContainer object's symbol tables
@@ -213,7 +207,7 @@
// Create the Relocation Tables
MachORelocTable machORelocs = createMachORelocTable(sections, relocationTable, symtab);
// Calculate file offset for relocation data
- file_offset = (file_offset + (machORelocs.getAlign()-1)) & ~((machORelocs.getAlign()-1));
+ file_offset = (file_offset + (MachORelocTable.getAlign() - 1)) & ~((MachORelocTable.getAlign() - 1));
// Update relocation sizing information in each section
for (int i = 0; i < sections.size(); i++) {
@@ -227,10 +221,9 @@
}
// Calculate and set file offset for symbol table data
- file_offset = (file_offset + (symtab.getAlign()-1)) & ~((symtab.getAlign()-1));
+ file_offset = (file_offset + (MachOSymtab.getAlign() - 1)) & ~((MachOSymtab.getAlign() - 1));
symtab.setOffset(file_offset);
-
// Write Out Header
machoContainer.writeBytes(mh.getArray());
// Write out first Segment
@@ -259,12 +252,13 @@
// Write out the relocation tables for all sections
for (int i = 0; i < sections.size(); i++) {
- if (machORelocs.getNumRelocs(i) > 0)
- machoContainer.writeBytes(machORelocs.getRelocData(i), machORelocs.getAlign());
+ if (machORelocs.getNumRelocs(i) > 0) {
+ machoContainer.writeBytes(machORelocs.getRelocData(i), MachORelocTable.getAlign());
+ }
}
// Write out data associated with LC_SYMTAB
- machoContainer.writeBytes(symtab.getDataArray(), symtab.getAlign());
+ machoContainer.writeBytes(symtab.getDataArray(), MachOSymtab.getAlign());
machoContainer.close();
}
@@ -273,14 +267,14 @@
* Construct MachO symbol data from BinaryContainer object's symbol tables. Both dynamic MachO
* symbol table and MachO symbol table are created from BinaryContainer's symbol info.
*
+ * @param sections
* @param symbols
- * @param symtab
*/
- private MachOSymtab createMachOSymbolTables(ArrayList<MachOSection>sections,
- Collection<Symbol> symbols) {
+ private static MachOSymtab createMachOSymbolTables(ArrayList<MachOSection> sections,
+ Collection<Symbol> symbols) {
MachOSymtab symtab = new MachOSymtab();
// First, create the initial null symbol. This is a local symbol.
- symtab.addSymbolEntry("", (byte)nlist_64.N_UNDF, (byte)0, (long)0);
+ symtab.addSymbolEntry("", (byte) nlist_64.N_UNDF, (byte) 0, 0);
// Now create MachO symbol entries for all symbols.
for (Symbol symbol : symbols) {
@@ -290,14 +284,14 @@
long sectionAddr = sections.get(sectionId).getAddr();
MachOSymbol machoSymbol = symtab.addSymbolEntry(symbol.getName(),
- getMachOTypeOf(symbol),
- (byte)sectionId,
- symbol.getOffset() + sectionAddr);
- symbol.setNativeSymbol((NativeSymbol)machoSymbol);
+ getMachOTypeOf(symbol),
+ (byte) sectionId,
+ symbol.getOffset() + sectionAddr);
+ symbol.setNativeSymbol(machoSymbol);
}
// Now that all symbols are enterred, update the
- // symbol indexes. This is necessary since they will
+ // symbol indexes. This is necessary since they will
// be reordered based on local, global and undefined.
symtab.updateIndexes();
@@ -309,9 +303,9 @@
byte type = nlist_64.N_UNDF;
// Global or Local
- if (sym.getBinding() == Symbol.Binding.GLOBAL)
+ if (sym.getBinding() == Symbol.Binding.GLOBAL) {
type = nlist_64.N_EXT;
-
+ }
// If Function or Data, add section type
if (kind == Symbol.Kind.NATIVE_FUNCTION ||
kind == Symbol.Kind.JAVA_FUNCTION ||
@@ -335,8 +329,7 @@
MachORelocTable machORelocTable = new MachORelocTable(sections.size());
/*
- * For each of the symbols with associated relocation records, create a MachO relocation
- * entry.
+ * For each of the symbols with associated relocation records, create a MachO relocation entry.
*/
for (Map.Entry<Symbol, List<Relocation>> entry : relocationTable.entrySet()) {
List<Relocation> relocs = entry.getValue();
@@ -354,11 +347,11 @@
return (machORelocTable);
}
- private void createRelocation(Symbol symbol, Relocation reloc, MachORelocTable machORelocTable) {
+ private static void createRelocation(Symbol symbol, Relocation reloc, MachORelocTable machORelocTable) {
RelocType relocType = reloc.getType();
int machORelocType = getMachORelocationType(relocType);
- MachOSymbol sym = (MachOSymbol)symbol.getNativeSymbol();
+ MachOSymbol sym = (MachOSymbol) symbol.getNativeSymbol();
int symno = sym.getIndex();
int sectindex = reloc.getSection().getSectionId();
int offset = reloc.getOffset();
@@ -366,73 +359,39 @@
int length = 0;
int isextern = 1;
-/*
- System.out.println("reloctype: " + relocType + " size is " +
- reloc.getSize() + " offset is " + offset +
- " Section Index is " + (sectindex) +
- " Symbol Index is " + symno +
- " Symbol Name is " + symbol.getName() + "\n");
-*/
-
switch (relocType) {
- case FOREIGN_CALL_DIRECT:
case JAVA_CALL_DIRECT:
case STUB_CALL_DIRECT:
case FOREIGN_CALL_INDIRECT_GOT: {
// Create relocation entry
- // System.out.println("getMachORelocationType: PLT relocation type using X86_64_RELOC_BRANCH");
int addend = -4; // Size in bytes of the patch location
// Relocation should be applied at the location after call operand
offset = offset + reloc.getSize() + addend;
- pcrel = 1; length = 2;
+ pcrel = 1;
+ length = 2;
break;
}
- case FOREIGN_CALL_DIRECT_FAR: {
- // Create relocation entry
- int addend = -8; // Size in bytes of the patch location
- // Relocation should be applied at the location after call operand
- // 10 = 2 (jmp [r]) + 8 (imm64)
- offset = offset + reloc.getSize() + addend - 2;
- pcrel = 0; length = 3;
- break;
- }
- case FOREIGN_CALL_INDIRECT:
- case JAVA_CALL_INDIRECT:
- case STUB_CALL_INDIRECT: {
+ case JAVA_CALL_INDIRECT: {
// Do nothing.
return;
}
- case EXTERNAL_DATA_REFERENCE_FAR: {
- // Create relocation entry
+ case METASPACE_GOT_REFERENCE:
+ case EXTERNAL_PLT_TO_GOT: {
int addend = -4; // Size of 32-bit address of the GOT
/*
* Relocation should be applied before the test instruction to the move instruction.
- * offset points to the test instruction after the instruction that loads
- * the address of polling page. So set the offset appropriately.
+ * reloc.getOffset() points to the test instruction after the instruction that loads the address of
+ * polling page. So set the offset appropriately.
*/
offset = offset + addend;
- pcrel = 0; length = 2;
+ pcrel = 1;
+ length = 2;
break;
}
- case METASPACE_GOT_REFERENCE:
- case EXTERNAL_PLT_TO_GOT:
- case STATIC_STUB_TO_STATIC_METHOD:
- case STATIC_STUB_TO_HOTSPOT_LINKAGE_GOT: {
- int addend = -4; // Size of 32-bit address of the GOT
- /*
- * Relocation should be applied before the test instruction to
- * the move instruction. reloc.getOffset() points to the
- * test instruction after the instruction that loads the
- * address of polling page. So set the offset appropriately.
- */
- offset = offset + addend;
- pcrel = 1; length = 2;
- break;
- }
- case EXTERNAL_GOT_TO_PLT:
- case LOADTIME_ADDRESS: {
+ case EXTERNAL_GOT_TO_PLT: {
// this is load time relocations
- pcrel = 0; length = 3;
+ pcrel = 0;
+ length = 3;
break;
}
default:
@@ -448,20 +407,17 @@
switch (MachOTargetInfo.getMachOArch()) {
case mach_header_64.CPU_TYPE_X86_64:
// Return X86_64_RELOC_* entries based on relocType
- if (relocType == RelocType.FOREIGN_CALL_DIRECT || relocType == RelocType.JAVA_CALL_DIRECT || relocType == RelocType.FOREIGN_CALL_INDIRECT_GOT) {
+ if (relocType == RelocType.JAVA_CALL_DIRECT ||
+ relocType == RelocType.FOREIGN_CALL_INDIRECT_GOT) {
machORelocType = reloc_info.X86_64_RELOC_BRANCH;
} else if (relocType == RelocType.STUB_CALL_DIRECT) {
machORelocType = reloc_info.X86_64_RELOC_BRANCH;
- } else if (relocType == RelocType.FOREIGN_CALL_DIRECT_FAR) {
- machORelocType = reloc_info.X86_64_RELOC_UNSIGNED;
- } else if (relocType == RelocType.FOREIGN_CALL_INDIRECT || relocType == RelocType.JAVA_CALL_INDIRECT || relocType == RelocType.STUB_CALL_INDIRECT) {
+ } else if (relocType == RelocType.JAVA_CALL_INDIRECT) {
machORelocType = reloc_info.X86_64_RELOC_NONE;
- } else if ((relocType == RelocType.EXTERNAL_DATA_REFERENCE_FAR)) {
- machORelocType = reloc_info.X86_64_RELOC_GOT;
- } else if (relocType == RelocType.METASPACE_GOT_REFERENCE || relocType == RelocType.EXTERNAL_PLT_TO_GOT || relocType == RelocType.STATIC_STUB_TO_STATIC_METHOD ||
- relocType == RelocType.STATIC_STUB_TO_HOTSPOT_LINKAGE_GOT) {
+ } else if (relocType == RelocType.METASPACE_GOT_REFERENCE ||
+ relocType == RelocType.EXTERNAL_PLT_TO_GOT) {
machORelocType = reloc_info.X86_64_RELOC_BRANCH;
- } else if (relocType == RelocType.EXTERNAL_GOT_TO_PLT || relocType == RelocType.LOADTIME_ADDRESS) {
+ } else if (relocType == RelocType.EXTERNAL_GOT_TO_PLT) {
machORelocType = reloc_info.X86_64_RELOC_UNSIGNED;
} else {
assert false : "Unhandled relocation type: " + relocType;
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachO.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachO.java Wed Aug 23 12:39:55 2017 +0000
@@ -23,10 +23,10 @@
package jdk.tools.jaotc.binformat.macho;
+//@formatter:off
/**
*
- * Support for the creation of Mach-o Object files.
- * Current support is limited to 64 bit x86_64.
+ * Support for the creation of Mach-o Object files. Current support is limited to 64 bit x86_64.
*
* File Format Overview:
*
@@ -38,12 +38,12 @@
* (which each include multiple Sections)
*/
-public class MachO {
+final class MachO {
/**
* mach_header_64 structure defines
*/
- public enum mach_header_64 {
+ enum mach_header_64 {
magic( 0, 4),
cputype( 4, 4),
cpusubtype( 8, 4),
@@ -53,49 +53,49 @@
flags(24, 4),
reserved(28, 4);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
mach_header_64(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 32;
+ static int totalsize = 32;
/**
* mach_header_64 defines
*/
- public static final int MH_MAGIC = 0xfeedface;
- public static final int MH_MAGIC_64 = 0xfeedfacf;
- public static final int MH_SUBSECTIONS_VIA_SYMBOLS = 0x2000;
+ static final int MH_MAGIC = 0xfeedface;
+ static final int MH_MAGIC_64 = 0xfeedfacf;
+ static final int MH_SUBSECTIONS_VIA_SYMBOLS = 0x2000;
/**
* filetype
*/
- public static final int MH_OBJECT = 0x1;
+ static final int MH_OBJECT = 0x1;
/**
* cputype
*/
- public static final int CPU_TYPE_ANY = -1;
- public static final int CPU_ARCH_ABI64 = 0x1000000;
- public static final int CPU_TYPE_X86_64 = 0x1000007;
- public static final int CPU_TYPE_ARM64 = 0x100000c;
+ static final int CPU_TYPE_ANY = -1;
+ static final int CPU_ARCH_ABI64 = 0x1000000;
+ static final int CPU_TYPE_X86_64 = 0x1000007;
+ static final int CPU_TYPE_ARM64 = 0x100000c;
/**
* cpusubtype
*/
- public static final int CPU_SUBTYPE_I386_ALL = 3;
- public static final int CPU_SUBTYPE_ARM64_ALL = 0;
- public static final int CPU_SUBTYPE_LITTLE_ENDIAN = 0;
- public static final int CPU_SUBTYPE_BIG_ENDIAN = 1;
+ static final int CPU_SUBTYPE_I386_ALL = 3;
+ static final int CPU_SUBTYPE_ARM64_ALL = 0;
+ static final int CPU_SUBTYPE_LITTLE_ENDIAN = 0;
+ static final int CPU_SUBTYPE_BIG_ENDIAN = 1;
}
/**
* segment_command_64 structure defines
*/
- public enum segment_command_64 {
+ enum segment_command_64 {
cmd( 0, 4),
cmdsize( 4, 4),
segname( 8,16),
@@ -108,23 +108,23 @@
nsects(64, 4),
flags(68, 4);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
segment_command_64(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 72;
+ static int totalsize = 72;
- public static final int LC_SEGMENT_64 = 0x19;
+ static final int LC_SEGMENT_64 = 0x19;
}
/**
* section_64 structure defines
*/
- public enum section_64 {
+ enum section_64 {
sectname( 0,16),
segname(16,16),
addr(32, 8),
@@ -138,49 +138,49 @@
reserved2(72, 4),
reserved3(76, 4);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
section_64(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 80;
+ static int totalsize = 80;
- public static int S_REGULAR = 0x0;
- public static int S_CSTRING_LITERALS = 0x2;
- public static int S_ATTR_PURE_INSTRUCTIONS = 0x80000000;
- public static int S_ATTR_SOME_INSTRUCTIONS = 0x400;
+ static int S_REGULAR = 0x0;
+ static int S_CSTRING_LITERALS = 0x2;
+ static int S_ATTR_PURE_INSTRUCTIONS = 0x80000000;
+ static int S_ATTR_SOME_INSTRUCTIONS = 0x400;
}
/**
* version_min_command structure defines
*/
- public enum version_min_command {
+ enum version_min_command {
cmd( 0, 4),
cmdsize( 4, 4),
version( 8, 4),
sdk(12, 4);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
version_min_command(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 16;
+ static int totalsize = 16;
- public static final int LC_VERSION_MIN_MACOSX = 0x24;
- public static final int LC_VERSION_MIN_IPHONEOS = 0x25;
+ static final int LC_VERSION_MIN_MACOSX = 0x24;
+ static final int LC_VERSION_MIN_IPHONEOS = 0x25;
}
/**
* symtab_command structure defines
*/
- public enum symtab_command {
+ enum symtab_command {
cmd( 0, 4),
cmdsize( 4, 4),
symoff( 8, 4),
@@ -188,17 +188,17 @@
stroff(16, 4),
strsize(20, 4);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
symtab_command(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 24;
+ static int totalsize = 24;
- public static final int LC_SYMTAB = 0x2;
+ static final int LC_SYMTAB = 0x2;
}
/**
@@ -206,33 +206,33 @@
*
* nlist_64 structure defines
*/
- public enum nlist_64 {
+ enum nlist_64 {
n_strx( 0, 4),
n_type( 4, 1),
n_sect( 5, 1),
n_desc( 6, 2),
n_value( 8, 8);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
nlist_64(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 16;
+ static int totalsize = 16;
- public static final int N_EXT = 0x1;
- public static final int N_TYPE = 0xe;
- public static final int N_UNDF = 0x0;
- public static final int N_SECT = 0xe;
+ static final int N_EXT = 0x1;
+ static final int N_TYPE = 0xe;
+ static final int N_UNDF = 0x0;
+ static final int N_SECT = 0xe;
}
/**
* dysymtab_command structure defines
*/
- public enum dysymtab_command {
+ enum dysymtab_command {
cmd( 0, 4),
cmdsize( 4, 4),
ilocalsym( 8, 4),
@@ -254,54 +254,55 @@
locreloff(72, 4),
nlocrel(76, 4);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
dysymtab_command(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 80;
+ static int totalsize = 80;
- public static final int LC_DYSYMTAB = 0xb;
+ static final int LC_DYSYMTAB = 0xb;
}
/**
* relocation_info structure defines
*/
- public enum reloc_info {
+ enum reloc_info {
r_address( 0, 4),
r_relocinfo( 4, 4);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
reloc_info(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 8;
+ static int totalsize = 8;
- public static final int REL_SYMNUM_MASK = 0xffffff;
- public static final int REL_SYMNUM_SHIFT = 0x0;
- public static final int REL_PCREL_MASK = 0x1;
- public static final int REL_PCREL_SHIFT = 0x18;
- public static final int REL_LENGTH_MASK = 0x3;
- public static final int REL_LENGTH_SHIFT = 0x19;
- public static final int REL_EXTERN_MASK = 0x1;
- public static final int REL_EXTERN_SHIFT = 0x1b;
- public static final int REL_TYPE_MASK = 0xf;
- public static final int REL_TYPE_SHIFT = 0x1c;
+ static final int REL_SYMNUM_MASK = 0xffffff;
+ static final int REL_SYMNUM_SHIFT = 0x0;
+ static final int REL_PCREL_MASK = 0x1;
+ static final int REL_PCREL_SHIFT = 0x18;
+ static final int REL_LENGTH_MASK = 0x3;
+ static final int REL_LENGTH_SHIFT = 0x19;
+ static final int REL_EXTERN_MASK = 0x1;
+ static final int REL_EXTERN_SHIFT = 0x1b;
+ static final int REL_TYPE_MASK = 0xf;
+ static final int REL_TYPE_SHIFT = 0x1c;
/* reloc_type_x86_64 defines */
- public static final int X86_64_RELOC_NONE = 0x0;
- public static final int X86_64_RELOC_BRANCH = 0x2;
- public static final int X86_64_RELOC_GOT = 0x4;
- public static final int X86_64_RELOC_GOT_LOAD = 0x3;
- public static final int X86_64_RELOC_SIGNED = 0x1;
- public static final int X86_64_RELOC_UNSIGNED = 0x0;
+ static final int X86_64_RELOC_NONE = 0x0;
+ static final int X86_64_RELOC_BRANCH = 0x2;
+ static final int X86_64_RELOC_GOT = 0x4;
+ static final int X86_64_RELOC_GOT_LOAD = 0x3;
+ static final int X86_64_RELOC_SIGNED = 0x1;
+ static final int X86_64_RELOC_UNSIGNED = 0x0;
}
}
+//@formatter:on
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOByteBuffer.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOByteBuffer.java Wed Aug 23 12:39:55 2017 +0000
@@ -23,21 +23,19 @@
package jdk.tools.jaotc.binformat.macho;
-
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import jdk.tools.jaotc.binformat.macho.MachOTargetInfo;
-import jdk.tools.jaotc.binformat.macho.MachO.mach_header_64;
-public class MachOByteBuffer {
+final class MachOByteBuffer {
- public static ByteBuffer allocate(int size) {
+ static ByteBuffer allocate(int size) {
ByteBuffer buf = ByteBuffer.allocate(size);
- if (MachOTargetInfo.getMachOEndian() ==
- MachO.mach_header_64.CPU_SUBTYPE_LITTLE_ENDIAN)
+ if (MachOTargetInfo.getMachOEndian() == MachO.mach_header_64.CPU_SUBTYPE_LITTLE_ENDIAN) {
buf.order(ByteOrder.LITTLE_ENDIAN);
- else
+ } else {
buf.order(ByteOrder.BIG_ENDIAN);
+ }
return (buf);
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOContainer.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOContainer.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,14 +26,13 @@
import java.io.File;
import java.io.FileOutputStream;
-public class MachOContainer {
+final class MachOContainer {
- File outputFile;
- FileOutputStream outputStream;
- long fileOffset;
+ private final File outputFile;
+ private FileOutputStream outputStream;
+ private long fileOffset;
- public MachOContainer(String fileName) {
- String baseName;
+ MachOContainer(String fileName) {
outputFile = new File(fileName);
if (outputFile.exists()) {
@@ -48,7 +47,7 @@
fileOffset = 0;
}
- public void close() {
+ void close() {
try {
outputStream.close();
} catch (Exception e) {
@@ -56,7 +55,7 @@
}
}
- public void writeBytes(byte [] bytes) {
+ void writeBytes(byte[] bytes) {
try {
outputStream.write(bytes);
} catch (Exception e) {
@@ -66,10 +65,10 @@
}
// Write bytes to output file with up front alignment padding
- public void writeBytes(byte [] bytes, int alignment) {
+ void writeBytes(byte[] bytes, int alignment) {
try {
// Pad to alignment
- while ((fileOffset & (long)(alignment-1)) != 0) {
+ while ((fileOffset & (alignment - 1)) != 0) {
outputStream.write(0);
fileOffset++;
}
@@ -80,4 +79,3 @@
fileOffset += bytes.length;
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachODySymtab.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachODySymtab.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,16 +24,14 @@
package jdk.tools.jaotc.binformat.macho;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.macho.MachO;
import jdk.tools.jaotc.binformat.macho.MachO.dysymtab_command;
import jdk.tools.jaotc.binformat.macho.MachOByteBuffer;
-public class MachODySymtab {
- ByteBuffer dysymtab;
+final class MachODySymtab {
+ private final ByteBuffer dysymtab;
- public MachODySymtab(int nlocal, int nglobal, int nundef) {
+ MachODySymtab(int nlocal, int nglobal, int nundef) {
dysymtab = MachOByteBuffer.allocate(dysymtab_command.totalsize);
dysymtab.putInt(dysymtab_command.cmd.off, dysymtab_command.LC_DYSYMTAB);
@@ -42,13 +40,11 @@
dysymtab.putInt(dysymtab_command.nlocalsym.off, nlocal);
dysymtab.putInt(dysymtab_command.iextdefsym.off, nlocal);
dysymtab.putInt(dysymtab_command.nextdefsym.off, nglobal);
- dysymtab.putInt(dysymtab_command.iundefsym.off, nlocal+nglobal);
+ dysymtab.putInt(dysymtab_command.iundefsym.off, nlocal + nglobal);
dysymtab.putInt(dysymtab_command.nundefsym.off, nundef);
}
- public byte[] getArray() {
+ byte[] getArray() {
return dysymtab.array();
}
}
-
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOHeader.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOHeader.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,17 +24,15 @@
package jdk.tools.jaotc.binformat.macho;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.macho.MachO;
import jdk.tools.jaotc.binformat.macho.MachO.mach_header_64;
import jdk.tools.jaotc.binformat.macho.MachOTargetInfo;
import jdk.tools.jaotc.binformat.macho.MachOByteBuffer;
-public class MachOHeader {
- ByteBuffer header;
+final class MachOHeader {
+ private final ByteBuffer header;
- public MachOHeader() {
+ MachOHeader() {
header = MachOByteBuffer.allocate(mach_header_64.totalsize);
header.putInt(mach_header_64.magic.off, mach_header_64.MH_MAGIC_64);
@@ -44,17 +42,16 @@
header.putInt(mach_header_64.filetype.off, mach_header_64.MH_OBJECT);
}
- public void setCmdSizes(int ncmds, int sizeofcmds) {
+ void setCmdSizes(int ncmds, int sizeofcmds) {
header.putInt(mach_header_64.ncmds.off, ncmds);
header.putInt(mach_header_64.sizeofcmds.off, sizeofcmds);
}
- public int getCmdSize() {
+ int getCmdSize() {
return (header.getInt(mach_header_64.sizeofcmds.off));
}
- public byte[] getArray() {
+ byte[] getArray() {
return header.array();
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachORelocEntry.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachORelocEntry.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,42 +24,31 @@
package jdk.tools.jaotc.binformat.macho;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.macho.MachO;
import jdk.tools.jaotc.binformat.macho.MachO.reloc_info;
import jdk.tools.jaotc.binformat.macho.MachOByteBuffer;
-public class MachORelocEntry {
- ByteBuffer entry;
+final class MachORelocEntry {
+ private final ByteBuffer entry;
- public MachORelocEntry(int offset,
- int symno,
- int pcrel,
- int length,
- int isextern,
- int type) {
+ MachORelocEntry(int offset, int symno, int pcrel, int length, int isextern, int type) {
entry = MachOByteBuffer.allocate(reloc_info.totalsize);
entry.putInt(reloc_info.r_address.off, offset);
// Encode and store the relocation entry bitfields
+ // @formatter:off
entry.putInt(reloc_info.r_relocinfo.off,
- ((symno & reloc_info.REL_SYMNUM_MASK)
- << reloc_info.REL_SYMNUM_SHIFT) |
- ((pcrel & reloc_info.REL_PCREL_MASK)
- << reloc_info.REL_PCREL_SHIFT) |
- ((length & reloc_info.REL_LENGTH_MASK)
- << reloc_info.REL_LENGTH_SHIFT) |
- ((isextern & reloc_info.REL_EXTERN_MASK)
- << reloc_info.REL_EXTERN_SHIFT) |
- ((type & reloc_info.REL_TYPE_MASK)
- << reloc_info.REL_TYPE_SHIFT));
+ ((symno & reloc_info.REL_SYMNUM_MASK) << reloc_info.REL_SYMNUM_SHIFT) |
+ ((pcrel & reloc_info.REL_PCREL_MASK) << reloc_info.REL_PCREL_SHIFT) |
+ ((length & reloc_info.REL_LENGTH_MASK) << reloc_info.REL_LENGTH_SHIFT) |
+ ((isextern & reloc_info.REL_EXTERN_MASK) << reloc_info.REL_EXTERN_SHIFT) |
+ ((type & reloc_info.REL_TYPE_MASK) << reloc_info.REL_TYPE_SHIFT));
+ // @formatter:on
}
- public byte[] getArray() {
+ byte[] getArray() {
return entry.array();
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachORelocTable.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachORelocTable.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,56 +25,43 @@
import java.util.ArrayList;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
import jdk.tools.jaotc.binformat.macho.MachORelocEntry;
-import jdk.tools.jaotc.binformat.macho.MachOTargetInfo;
import jdk.tools.jaotc.binformat.macho.MachO.reloc_info;
import jdk.tools.jaotc.binformat.macho.MachOByteBuffer;
-public class MachORelocTable {
- ArrayList<ArrayList<MachORelocEntry>> relocEntries;
+final class MachORelocTable {
+ private final ArrayList<ArrayList<MachORelocEntry>> relocEntries;
int fileOffset;
- public MachORelocTable(int numsects) {
- relocEntries = new ArrayList<ArrayList<MachORelocEntry>>(numsects);
- for (int i = 0; i < numsects; i++)
+ MachORelocTable(int numsects) {
+ relocEntries = new ArrayList<>(numsects);
+ for (int i = 0; i < numsects; i++) {
relocEntries.add(new ArrayList<MachORelocEntry>());
+ }
}
- public void createRelocationEntry(int sectindex,
- int offset,
- int symno,
- int pcrel,
- int length,
- int isextern,
- int type) {
-
- MachORelocEntry entry = new MachORelocEntry(offset,
- symno,
- pcrel,
- length,
- isextern,
- type);
+ void createRelocationEntry(int sectindex, int offset, int symno, int pcrel, int length, int isextern, int type) {
+ MachORelocEntry entry = new MachORelocEntry(offset, symno, pcrel, length, isextern, type);
relocEntries.get(sectindex).add(entry);
}
- public int getAlign() {
+ static int getAlign() {
return (4);
}
- public int getNumRelocs(int section_index) {
+ int getNumRelocs(int section_index) {
return relocEntries.get(section_index).size();
}
// Return the relocation entries for a single section
- // or null if no entries added to section
- public byte [] getRelocData(int section_index) {
+ // or null if no entries added to section
+ byte[] getRelocData(int section_index) {
ArrayList<MachORelocEntry> entryList = relocEntries.get(section_index);
- if (entryList.size() == 0)
+ if (entryList.size() == 0) {
return null;
-
+ }
ByteBuffer relocData = MachOByteBuffer.allocate(entryList.size() * reloc_info.totalsize);
// Copy each entry to a single ByteBuffer
@@ -86,4 +73,3 @@
return (relocData.array());
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSection.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSection.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,41 +24,36 @@
package jdk.tools.jaotc.binformat.macho;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.macho.MachO;
import jdk.tools.jaotc.binformat.macho.MachO.section_64;
import jdk.tools.jaotc.binformat.macho.MachOByteBuffer;
-public class MachOSection {
- ByteBuffer section;
- byte [] data;
- boolean hasrelocations;
+final class MachOSection {
+ private final ByteBuffer section;
+ private final byte[] data;
+ private final boolean hasrelocations;
- public MachOSection(String sectName, String segName, byte [] sectData, int sectFlags, boolean hasRelocations, int align) {
+ MachOSection(String sectName, String segName, byte[] sectData, int sectFlags, boolean hasRelocations, int align) {
section = MachOByteBuffer.allocate(section_64.totalsize);
// TODO: Hotspot uses long section names.
- // They are getting truncated.
- // Is this a problem??
+ // They are getting truncated.
+ // Is this a problem??
byte[] sectNameBytes = sectName.getBytes();
- int sectNameMax = section_64.sectname.sz < sectNameBytes.length ?
- section_64.sectname.sz : sectNameBytes.length;
+ int sectNameMax = section_64.sectname.sz < sectNameBytes.length ? section_64.sectname.sz : sectNameBytes.length;
- for (int i = 0; i < sectNameMax; i++)
- section.put(section_64.sectname.off+i, sectNameBytes[i]);
-
+ for (int i = 0; i < sectNameMax; i++) {
+ section.put(section_64.sectname.off + i, sectNameBytes[i]);
+ }
byte[] segNameBytes = segName.getBytes();
- int segNameMax = section_64.segname.sz < segNameBytes.length ?
- section_64.segname.sz : segNameBytes.length;
+ int segNameMax = section_64.segname.sz < segNameBytes.length ? section_64.segname.sz : segNameBytes.length;
- for (int i = 0; i < segNameMax; i++)
- section.put(section_64.segname.off+i, segNameBytes[i]);
-
+ for (int i = 0; i < segNameMax; i++) {
+ section.put(section_64.segname.off + i, segNameBytes[i]);
+ }
section.putLong(section_64.size.off, sectData.length);
- section.putInt(section_64.align.off,
- 31 - Integer.numberOfLeadingZeros(align));
+ section.putInt(section_64.align.off, 31 - Integer.numberOfLeadingZeros(align));
section.putInt(section_64.flags.off, sectFlags);
@@ -67,49 +62,47 @@
hasrelocations = hasRelocations;
}
- public long getSize() {
+ long getSize() {
return section.getLong(section_64.size.off);
}
- public int getAlign() {
+ int getAlign() {
return (1 << section.getInt(section_64.align.off));
}
- public byte[] getArray() {
+ byte[] getArray() {
return section.array();
}
- public byte[] getDataArray() {
+ byte[] getDataArray() {
return data;
}
- public void setAddr(long addr) {
+ void setAddr(long addr) {
section.putLong(section_64.addr.off, addr);
}
- public long getAddr() {
+ long getAddr() {
return (section.getLong(section_64.addr.off));
}
- public void setOffset(int offset) {
+ void setOffset(int offset) {
section.putInt(section_64.offset.off, offset);
}
- public int getOffset() {
+ int getOffset() {
return (section.getInt(section_64.offset.off));
}
- public void setReloff(int offset) {
+ void setReloff(int offset) {
section.putInt(section_64.reloff.off, offset);
}
- public void setRelcount(int count) {
+ void setRelcount(int count) {
section.putInt(section_64.nreloc.off, count);
}
- public boolean hasRelocations() {
+ boolean hasRelocations() {
return hasrelocations;
}
}
-
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSegment.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSegment.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,9 +24,7 @@
package jdk.tools.jaotc.binformat.macho;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.macho.MachO;
import jdk.tools.jaotc.binformat.macho.MachO.segment_command_64;
import jdk.tools.jaotc.binformat.macho.MachOByteBuffer;
@@ -52,5 +50,3 @@
return segment.array();
}
}
-
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymbol.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymbol.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,17 +24,15 @@
package jdk.tools.jaotc.binformat.macho;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
import jdk.tools.jaotc.binformat.NativeSymbol;
-import jdk.tools.jaotc.binformat.macho.MachO;
import jdk.tools.jaotc.binformat.macho.MachO.nlist_64;
import jdk.tools.jaotc.binformat.macho.MachOByteBuffer;
-public class MachOSymbol extends NativeSymbol {
- ByteBuffer sym;
+final class MachOSymbol extends NativeSymbol {
+ private final ByteBuffer sym;
- public MachOSymbol(int symbolindex, int strindex, byte type, byte sectindex, long offset) {
+ MachOSymbol(int symbolindex, int strindex, byte type, byte sectindex, long offset) {
super(symbolindex);
sym = MachOByteBuffer.allocate(nlist_64.totalsize);
@@ -42,13 +40,12 @@
sym.put(nlist_64.n_type.off, type);
// Section indexes start at 1 but we manage the index internally
// as 0 relative
- sym.put(nlist_64.n_sect.off, (byte)(sectindex+1));
- sym.putChar(nlist_64.n_desc.off, (char )0);
+ sym.put(nlist_64.n_sect.off, (byte) (sectindex + 1));
+ sym.putChar(nlist_64.n_desc.off, (char) 0);
sym.putLong(nlist_64.n_value.off, offset);
}
- public byte[] getArray() {
+ byte[] getArray() {
return sym.array();
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymtab.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOSymtab.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,50 +24,42 @@
package jdk.tools.jaotc.binformat.macho;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
import java.util.ArrayList;
-import jdk.tools.jaotc.binformat.macho.MachO;
import jdk.tools.jaotc.binformat.macho.MachO.symtab_command;
import jdk.tools.jaotc.binformat.macho.MachO.nlist_64;
import jdk.tools.jaotc.binformat.macho.MachOSymbol;
import jdk.tools.jaotc.binformat.macho.MachOByteBuffer;
-public class MachOSymtab {
+final class MachOSymtab {
/**
* ByteBuffer holding the LC_SYMTAB command contents
*/
- ByteBuffer symtabCmd;
+ private final ByteBuffer symtabCmd;
+
+ private int symtabDataSize;
- /**
- * ByteBuffer holding the symbol table entries and strings
- */
- ByteBuffer symtabData;
-
- int symtabDataSize;
-
- ArrayList<MachOSymbol>localSymbols = new ArrayList<MachOSymbol>();
- ArrayList<MachOSymbol>globalSymbols = new ArrayList<MachOSymbol>();
- ArrayList<MachOSymbol>undefSymbols = new ArrayList<MachOSymbol>();
+ private final ArrayList<MachOSymbol> localSymbols = new ArrayList<>();
+ private final ArrayList<MachOSymbol> globalSymbols = new ArrayList<>();
+ private final ArrayList<MachOSymbol> undefSymbols = new ArrayList<>();
/**
* number of symbols added
*/
- int symbolCount;
+ private int symbolCount;
/**
* String holding symbol table strings
*/
- private StringBuilder strTabContent = new StringBuilder();
+ private final StringBuilder strTabContent = new StringBuilder();
/**
- * Keeps track of bytes in string table since strTabContent.length()
- * is number of chars, not bytes.
+ * Keeps track of bytes in string table since strTabContent.length() is number of chars, not bytes.
*/
private int strTabNrOfBytes = 0;
- public MachOSymtab() {
+ MachOSymtab() {
symtabCmd = MachOByteBuffer.allocate(symtab_command.totalsize);
symtabCmd.putInt(symtab_command.cmd.off, symtab_command.LC_SYMTAB);
@@ -77,11 +69,11 @@
}
- public int getAlign() {
+ static int getAlign() {
return (4);
}
- public MachOSymbol addSymbolEntry(String name, byte type, byte secHdrIndex, long offset) {
+ MachOSymbol addSymbolEntry(String name, byte type, byte secHdrIndex, long offset) {
// Get the current symbol index and append symbol name to string table.
int index;
MachOSymbol sym;
@@ -109,7 +101,7 @@
case nlist_64.N_UNDF: // null symbol
localSymbols.add(sym);
break;
- case nlist_64.N_SECT|nlist_64.N_EXT:
+ case nlist_64.N_SECT | nlist_64.N_EXT:
globalSymbols.add(sym);
break;
default:
@@ -121,30 +113,30 @@
return (sym);
}
- public void setOffset(int symoff) {
+ void setOffset(int symoff) {
symtabCmd.putInt(symtab_command.symoff.off, symoff);
}
// Update the symbol indexes once all symbols have been added.
// This is required since we'll be reordering the symbols in the
// file to be in the order of Local, global and Undefined.
- public void updateIndexes() {
+ void updateIndexes() {
int index = 0;
// Update the local symbol indexes
- for (int i = 0; i < localSymbols.size(); i++ ) {
+ for (int i = 0; i < localSymbols.size(); i++) {
MachOSymbol sym = localSymbols.get(i);
sym.setIndex(index++);
}
// Update the global symbol indexes
- for (int i = 0; i < globalSymbols.size(); i++ ) {
+ for (int i = 0; i < globalSymbols.size(); i++) {
MachOSymbol sym = globalSymbols.get(i);
sym.setIndex(index++);
}
// Update the undefined symbol indexes
- for (int i = index; i < undefSymbols.size(); i++ ) {
+ for (int i = index; i < undefSymbols.size(); i++) {
MachOSymbol sym = undefSymbols.get(i);
sym.setIndex(index++);
}
@@ -152,7 +144,7 @@
// Update LC_SYMTAB command fields based on the number of symbols added
// return the file size taken up by symbol table entries and strings
- public int calcSizes() {
+ int calcSizes() {
int stroff;
stroff = symtabCmd.getInt(symtab_command.symoff.off) + (nlist_64.totalsize * symbolCount);
@@ -164,42 +156,49 @@
return (symtabDataSize);
}
- public int getNumLocalSyms() { return localSymbols.size(); }
- public int getNumGlobalSyms() { return globalSymbols.size(); }
- public int getNumUndefSyms() { return undefSymbols.size(); }
+ int getNumLocalSyms() {
+ return localSymbols.size();
+ }
- public byte[] getCmdArray() {
+ int getNumGlobalSyms() {
+ return globalSymbols.size();
+ }
+
+ int getNumUndefSyms() {
+ return undefSymbols.size();
+ }
+
+ byte[] getCmdArray() {
return symtabCmd.array();
}
// Create a single byte array that contains the symbol table entries
// and string table
- public byte[] getDataArray() {
- int index = 0;
- symtabData = MachOByteBuffer.allocate(symtabDataSize);
- byte [] retarray;
+ byte[] getDataArray() {
+ ByteBuffer symtabData = MachOByteBuffer.allocate(symtabDataSize);
+ byte[] retarray;
// Add the local symbols
- for (int i = 0; i < localSymbols.size(); i++ ) {
+ for (int i = 0; i < localSymbols.size(); i++) {
MachOSymbol sym = localSymbols.get(i);
- byte [] arr = sym.getArray();
+ byte[] arr = sym.getArray();
symtabData.put(arr);
}
// Add the global symbols
- for (int i = 0; i < globalSymbols.size(); i++ ) {
+ for (int i = 0; i < globalSymbols.size(); i++) {
MachOSymbol sym = globalSymbols.get(i);
- byte [] arr = sym.getArray();
+ byte[] arr = sym.getArray();
symtabData.put(arr);
}
// Add the undefined symbols
- for (int i = 0; i < undefSymbols.size(); i++ ) {
+ for (int i = 0; i < undefSymbols.size(); i++) {
MachOSymbol sym = undefSymbols.get(i);
- byte [] arr = sym.getArray();
+ byte[] arr = sym.getArray();
symtabData.put(arr);
}
// Add the stringtable
- byte [] strs = strTabContent.toString().getBytes();
+ byte[] strs = strTabContent.toString().getBytes();
symtabData.put(strs);
retarray = symtabData.array();
@@ -207,5 +206,3 @@
return (retarray);
}
}
-
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOTargetInfo.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOTargetInfo.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,14 +24,13 @@
package jdk.tools.jaotc.binformat.macho;
import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.macho.MachO;
import jdk.tools.jaotc.binformat.macho.MachO.mach_header_64;
/**
* Class that abstracts MACH-O target details.
*
*/
-public class MachOTargetInfo {
+final class MachOTargetInfo {
/**
* Target architecture and subtype.
*/
@@ -68,20 +67,19 @@
osName = System.getProperty("os.name").toLowerCase();
}
- public static int getMachOArch() {
+ static int getMachOArch() {
return arch;
}
- public static int getMachOSubArch() {
+ static int getMachOSubArch() {
return subarch;
}
- public static int getMachOEndian() {
+ static int getMachOEndian() {
return endian;
}
- public static String getOsName() {
+ static String getOsName() {
return osName;
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOVersion.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/macho/MachOVersion.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,16 +24,14 @@
package jdk.tools.jaotc.binformat.macho;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.macho.MachO;
import jdk.tools.jaotc.binformat.macho.MachO.version_min_command;
import jdk.tools.jaotc.binformat.macho.MachOByteBuffer;
-public class MachOVersion {
- ByteBuffer version;
+final class MachOVersion {
+ private final ByteBuffer version;
- public MachOVersion() {
+ MachOVersion() {
version = MachOByteBuffer.allocate(version_min_command.totalsize);
version.putInt(version_min_command.cmd.off, version_min_command.LC_VERSION_MIN_MACOSX);
@@ -42,8 +40,7 @@
version.putInt(version_min_command.sdk.off, 0); /* N/A SDK */
}
- public byte[] getArray() {
+ byte[] getArray() {
return version.array();
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/JPECoffRelocObject.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/JPECoffRelocObject.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,13 +24,11 @@
package jdk.tools.jaotc.binformat.pecoff;
import java.io.IOException;
-import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
-import jdk.tools.jaotc.binformat.Container;
import jdk.tools.jaotc.binformat.BinaryContainer;
import jdk.tools.jaotc.binformat.ByteContainer;
import jdk.tools.jaotc.binformat.CodeContainer;
@@ -38,11 +36,9 @@
import jdk.tools.jaotc.binformat.Relocation;
import jdk.tools.jaotc.binformat.Relocation.RelocType;
import jdk.tools.jaotc.binformat.Symbol;
-import jdk.tools.jaotc.binformat.NativeSymbol;
import jdk.tools.jaotc.binformat.Symbol.Binding;
import jdk.tools.jaotc.binformat.Symbol.Kind;
-import jdk.tools.jaotc.binformat.pecoff.PECoff;
import jdk.tools.jaotc.binformat.pecoff.PECoffSymbol;
import jdk.tools.jaotc.binformat.pecoff.PECoffTargetInfo;
import jdk.tools.jaotc.binformat.pecoff.PECoff.IMAGE_FILE_HEADER;
@@ -56,71 +52,53 @@
private final PECoffContainer pecoffContainer;
- private final int segmentSize;
+ private final int sectionAlignment;
- public JPECoffRelocObject(BinaryContainer binContainer, String outputFileName, String aotVersion) {
+ public JPECoffRelocObject(BinaryContainer binContainer, String outputFileName) {
this.binContainer = binContainer;
- this.pecoffContainer = new PECoffContainer(outputFileName, aotVersion);
- this.segmentSize = binContainer.getCodeSegmentSize();
- if (segmentSize != 64) {
- System.out.println("binContainer alignment size not 64 bytes, update JPECoffRelocObject");
- }
+ this.pecoffContainer = new PECoffContainer(outputFileName);
+ this.sectionAlignment = binContainer.getCodeSegmentSize();
}
- private PECoffSection createByteSection(ArrayList<PECoffSection>sections,
- String sectName,
- byte [] scnData,
- boolean hasRelocs,
- int scnFlags) {
+ private static PECoffSection createByteSection(ArrayList<PECoffSection> sections, String sectName, byte[] scnData,
+ boolean hasRelocs, int scnFlags, int sectAlign) {
- PECoffSection sect = new PECoffSection(sectName,
- scnData,
- scnFlags,
- hasRelocs,
- sections.size());
+ PECoffSection sect = new PECoffSection(sectName, scnData, scnFlags, sectAlign, hasRelocs, sections.size());
// Add this section to our list
sections.add(sect);
return (sect);
}
- private void createByteSection(ArrayList<PECoffSection>sections,
- ByteContainer c, int scnFlags) {
+ private static void createByteSection(ArrayList<PECoffSection> sections, ByteContainer c, int scnFlags, int sectAlign) {
PECoffSection sect;
boolean hasRelocs = c.hasRelocations();
byte[] scnData = c.getByteArray();
- sect = createByteSection(sections, c.getContainerName(),
- scnData, hasRelocs,
- scnFlags);
+ sect = createByteSection(sections, c.getContainerName(), scnData, hasRelocs, scnFlags, sectAlign);
c.setSectionId(sect.getSectionId());
}
- private void createCodeSection(ArrayList<PECoffSection>sections, CodeContainer c) {
- createByteSection(sections, c, IMAGE_SECTION_HEADER.IMAGE_SCN_MEM_READ |
- IMAGE_SECTION_HEADER.IMAGE_SCN_MEM_EXECUTE |
- IMAGE_SECTION_HEADER.IMAGE_SCN_ALIGN_64BYTES |
- IMAGE_SECTION_HEADER.IMAGE_SCN_CNT_CODE);
+ private void createCodeSection(ArrayList<PECoffSection> sections, CodeContainer c) {
+ int scnFlags = IMAGE_SECTION_HEADER.IMAGE_SCN_MEM_READ | IMAGE_SECTION_HEADER.IMAGE_SCN_MEM_EXECUTE | IMAGE_SECTION_HEADER.IMAGE_SCN_CNT_CODE;
+ createByteSection(sections, c, scnFlags, sectionAlignment);
+ }
+
+ private void createReadOnlySection(ArrayList<PECoffSection> sections, ReadOnlyDataContainer c) {
+ int scnFlags = IMAGE_SECTION_HEADER.IMAGE_SCN_MEM_READ | IMAGE_SECTION_HEADER.IMAGE_SCN_CNT_INITIALIZED_DATA;
+ createByteSection(sections, c, scnFlags, sectionAlignment);
}
- private void createReadOnlySection(ArrayList<PECoffSection>sections, ReadOnlyDataContainer c) {
- createByteSection(sections, c, IMAGE_SECTION_HEADER.IMAGE_SCN_MEM_READ |
- IMAGE_SECTION_HEADER.IMAGE_SCN_ALIGN_64BYTES |
- IMAGE_SECTION_HEADER.IMAGE_SCN_CNT_INITIALIZED_DATA);
- }
+ private void createReadWriteSection(ArrayList<PECoffSection> sections, ByteContainer c) {
+ int scnFlags = IMAGE_SECTION_HEADER.IMAGE_SCN_MEM_READ | IMAGE_SECTION_HEADER.IMAGE_SCN_MEM_WRITE;
- private void createReadWriteSection(ArrayList<PECoffSection>sections, ByteContainer c) {
- int scnFlags = IMAGE_SECTION_HEADER.IMAGE_SCN_MEM_READ |
- IMAGE_SECTION_HEADER.IMAGE_SCN_MEM_WRITE |
- IMAGE_SECTION_HEADER.IMAGE_SCN_ALIGN_64BYTES;
-
- if (c.getByteArray().length > 0)
+ if (c.getByteArray().length > 0) {
scnFlags |= IMAGE_SECTION_HEADER.IMAGE_SCN_CNT_INITIALIZED_DATA;
- else
+ } else {
scnFlags |= IMAGE_SECTION_HEADER.IMAGE_SCN_CNT_UNINITIALIZED_DATA;
-
- createByteSection(sections, c, scnFlags);
+ }
+ createByteSection(sections, c, scnFlags, sectionAlignment);
}
/**
@@ -131,7 +109,7 @@
* @throws IOException throws {@code IOException} as a result of file system access failures.
*/
public void createPECoffRelocObject(Map<Symbol, List<Relocation>> relocationTable, Collection<Symbol> symbols) throws IOException {
- ArrayList<PECoffSection> sections = new ArrayList<PECoffSection>();
+ ArrayList<PECoffSection> sections = new ArrayList<>();
// Create text section
createCodeSection(sections, binContainer.getCodeContainer());
@@ -139,51 +117,45 @@
createReadOnlySection(sections, binContainer.getKlassesOffsetsContainer());
createReadOnlySection(sections, binContainer.getMethodsOffsetsContainer());
createReadOnlySection(sections, binContainer.getKlassesDependenciesContainer());
- createReadWriteSection(sections, binContainer.getMetaspaceGotContainer());
- createReadWriteSection(sections, binContainer.getMetadataGotContainer());
- createReadWriteSection(sections, binContainer.getMethodStateContainer());
- createReadWriteSection(sections, binContainer.getOopGotContainer());
- createReadWriteSection(sections, binContainer.getMethodMetadataContainer());
+ createReadOnlySection(sections, binContainer.getMethodMetadataContainer());
createReadOnlySection(sections, binContainer.getStubsOffsetsContainer());
createReadOnlySection(sections, binContainer.getHeaderContainer().getContainer());
createReadOnlySection(sections, binContainer.getCodeSegmentsContainer());
createReadOnlySection(sections, binContainer.getConstantDataContainer());
createReadOnlySection(sections, binContainer.getConfigContainer());
-
- // createExternalLinkage();
-
- createCodeSection(sections, binContainer.getExtLinkageContainer());
+ createReadWriteSection(sections, binContainer.getKlassesGotContainer());
+ createReadWriteSection(sections, binContainer.getCountersGotContainer());
+ createReadWriteSection(sections, binContainer.getMetadataGotContainer());
+ createReadWriteSection(sections, binContainer.getMethodStateContainer());
+ createReadWriteSection(sections, binContainer.getOopGotContainer());
createReadWriteSection(sections, binContainer.getExtLinkageGOTContainer());
// Allocate PECoff Header
PECoffHeader header = new PECoffHeader();
// Get PECoff symbol data from BinaryContainer object's symbol tables
- PECoffSymtab symtab = createPECoffSymbolTables(sections, symbols);
+ PECoffSymtab symtab = createPECoffSymbolTables(symbols);
// Add Linker Directives Section
- createByteSection(sections, ".drectve",
- symtab.getDirectiveArray(), false,
- IMAGE_SECTION_HEADER.IMAGE_SCN_LNK_INFO |
- IMAGE_SECTION_HEADER.IMAGE_SCN_LNK_REMOVE |
- IMAGE_SECTION_HEADER.IMAGE_SCN_ALIGN_1BYTES);
+ int scnFlags = IMAGE_SECTION_HEADER.IMAGE_SCN_LNK_INFO | IMAGE_SECTION_HEADER.IMAGE_SCN_LNK_REMOVE;
+ createByteSection(sections, ".drectve", symtab.getDirectiveArray(), false, scnFlags, 1 /* 1 byte alignment */);
// Create the Relocation Tables
PECoffRelocTable pecoffRelocs = createPECoffRelocTable(sections, relocationTable);
// File Output Order
//
- // HEADER (Need address of Symbol Table + symbol count)
- // SECTIONS (Need pointer to Section Data, Relocation Table)
- // DIRECTIVES
- // SYMBOL TABLE
- // SYMBOLS
- // SECTION DATA
- // RELOCATION TABLE
+ // HEADER (Need address of Symbol Table + symbol count)
+ // SECTIONS (Need pointer to Section Data, Relocation Table)
+ // DIRECTIVES
+ // SYMBOL TABLE
+ // SYMBOLS
+ // SECTION DATA
+ // RELOCATION TABLE
// Calculate Offset for Symbol table
int file_offset = IMAGE_FILE_HEADER.totalsize +
- (IMAGE_SECTION_HEADER.totalsize*sections.size());
+ (IMAGE_SECTION_HEADER.totalsize * sections.size());
// Update Header fields
header.setSectionCount(sections.size());
@@ -194,14 +166,14 @@
file_offset += ((symtab.getSymtabCount() * IMAGE_SYMBOL.totalsize) +
symtab.getStrtabSize());
// And round it up
- file_offset = (file_offset + (sections.get(0).getDataAlign()-1)) &
- ~((sections.get(0).getDataAlign()-1));
+ file_offset = (file_offset + (sections.get(0).getDataAlign() - 1)) &
+ ~((sections.get(0).getDataAlign() - 1));
// Calc file offsets for section data
for (int i = 0; i < sections.size(); i++) {
PECoffSection sect = sections.get(i);
- file_offset = (file_offset + (sect.getDataAlign()-1)) &
- ~((sect.getDataAlign()-1));
+ file_offset = (file_offset + (sect.getDataAlign() - 1)) &
+ ~((sect.getDataAlign() - 1));
sect.setOffset(file_offset);
file_offset += sect.getSize();
}
@@ -214,7 +186,9 @@
sect.setReloff(file_offset);
sect.setRelcount(nreloc);
// extended relocations add an addition entry
- if (nreloc > 0xFFFF) nreloc++;
+ if (nreloc > 0xFFFF) {
+ nreloc++;
+ }
file_offset += (nreloc * IMAGE_RELOCATION.totalsize);
}
}
@@ -253,7 +227,7 @@
*
* @param symbols
*/
- private PECoffSymtab createPECoffSymbolTables(ArrayList<PECoffSection> sections, Collection<Symbol> symbols) {
+ private static PECoffSymtab createPECoffSymbolTables(Collection<Symbol> symbols) {
PECoffSymtab symtab = new PECoffSymtab();
// First, create the initial null symbol. This is a local symbol.
@@ -263,8 +237,8 @@
for (Symbol symbol : symbols) {
// Get the index of section this symbol is defined in.
int secHdrIndex = symbol.getSection().getSectionId();
- PECoffSymbol pecoffSymbol = symtab.addSymbolEntry(symbol.getName(), getPECoffTypeOf(symbol), getPECoffClassOf(symbol), (byte)secHdrIndex, symbol.getOffset(), symbol.getSize());
- symbol.setNativeSymbol((NativeSymbol)pecoffSymbol);
+ PECoffSymbol pecoffSymbol = symtab.addSymbolEntry(symbol.getName(), getPECoffTypeOf(symbol), getPECoffClassOf(symbol), (byte) secHdrIndex, symbol.getOffset());
+ symbol.setNativeSymbol(pecoffSymbol);
}
return (symtab);
}
@@ -291,13 +265,11 @@
* @param sections
* @param relocationTable
*/
- private PECoffRelocTable createPECoffRelocTable(ArrayList<PECoffSection> sections,
- Map<Symbol, List<Relocation>> relocationTable) {
+ private PECoffRelocTable createPECoffRelocTable(ArrayList<PECoffSection> sections, Map<Symbol, List<Relocation>> relocationTable) {
PECoffRelocTable pecoffRelocTable = new PECoffRelocTable(sections.size());
/*
- * For each of the symbols with associated relocation records, create a PECoff relocation
- * entry.
+ * For each of the symbols with associated relocation records, create a PECoff relocation entry.
*/
for (Map.Entry<Symbol, List<Relocation>> entry : relocationTable.entrySet()) {
List<Relocation> relocs = entry.getValue();
@@ -315,18 +287,17 @@
return (pecoffRelocTable);
}
- private void createRelocation(Symbol symbol, Relocation reloc, PECoffRelocTable pecoffRelocTable) {
+ private static void createRelocation(Symbol symbol, Relocation reloc, PECoffRelocTable pecoffRelocTable) {
RelocType relocType = reloc.getType();
int pecoffRelocType = getPECoffRelocationType(relocType);
- PECoffSymbol sym = (PECoffSymbol)symbol.getNativeSymbol();
+ PECoffSymbol sym = (PECoffSymbol) symbol.getNativeSymbol();
int symno = sym.getIndex();
int sectindex = reloc.getSection().getSectionId();
int offset = reloc.getOffset();
int addend = 0;
switch (relocType) {
- case FOREIGN_CALL_DIRECT:
case JAVA_CALL_DIRECT:
case STUB_CALL_DIRECT:
case FOREIGN_CALL_INDIRECT_GOT: {
@@ -336,47 +307,22 @@
offset = offset + reloc.getSize() + addend;
break;
}
- case FOREIGN_CALL_DIRECT_FAR: {
- // Create relocation entry
- addend = -8; // Size in bytes of the patch location
- // Relocation should be applied at the location after call operand
- // 10 = 2 (jmp [r]) + 8 (imm64)
- offset = offset + reloc.getSize() + addend - 2;
- break;
- }
- case FOREIGN_CALL_INDIRECT:
- case JAVA_CALL_INDIRECT:
- case STUB_CALL_INDIRECT: {
+ case JAVA_CALL_INDIRECT: {
// Do nothing.
return;
}
- case EXTERNAL_DATA_REFERENCE_FAR: {
- // Create relocation entry
+ case METASPACE_GOT_REFERENCE:
+ case EXTERNAL_PLT_TO_GOT: {
addend = -4; // Size of 32-bit address of the GOT
/*
* Relocation should be applied before the test instruction to the move instruction.
- * offset points to the test instruction after the instruction that loads
- * the address of polling page. So set the offset appropriately.
+ * reloc.getOffset() points to the test instruction after the instruction that loads the address of
+ * polling page. So set the offset appropriately.
*/
offset = offset + addend;
break;
}
- case METASPACE_GOT_REFERENCE:
- case EXTERNAL_PLT_TO_GOT:
- case STATIC_STUB_TO_STATIC_METHOD:
- case STATIC_STUB_TO_HOTSPOT_LINKAGE_GOT: {
- addend = -4; // Size of 32-bit address of the GOT
- /*
- * Relocation should be applied before the test instruction to
- * the move instruction. reloc.getOffset() points to the
- * test instruction after the instruction that loads the
- * address of polling page. So set the offset appropriately.
- */
- offset = offset + addend;
- break;
- }
- case EXTERNAL_GOT_TO_PLT:
- case LOADTIME_ADDRESS: {
+ case EXTERNAL_GOT_TO_PLT: {
// this is load time relocations
break;
}
@@ -391,27 +337,17 @@
int pecoffRelocType = 0; // R_<ARCH>_NONE if #define'd to 0 for all values of ARCH
switch (PECoffTargetInfo.getPECoffArch()) {
case IMAGE_FILE_HEADER.IMAGE_FILE_MACHINE_AMD64:
- if (relocType == RelocType.FOREIGN_CALL_DIRECT ||
- relocType == RelocType.JAVA_CALL_DIRECT ||
+ if (relocType == RelocType.JAVA_CALL_DIRECT ||
relocType == RelocType.FOREIGN_CALL_INDIRECT_GOT) {
pecoffRelocType = IMAGE_RELOCATION.IMAGE_REL_AMD64_REL32;
} else if (relocType == RelocType.STUB_CALL_DIRECT) {
pecoffRelocType = IMAGE_RELOCATION.IMAGE_REL_AMD64_REL32;
- } else if (relocType == RelocType.FOREIGN_CALL_DIRECT_FAR) {
- pecoffRelocType = IMAGE_RELOCATION.IMAGE_REL_AMD64_ADDR64;
- } else if (relocType == RelocType.FOREIGN_CALL_INDIRECT ||
- relocType == RelocType.JAVA_CALL_INDIRECT ||
- relocType == RelocType.STUB_CALL_INDIRECT) {
+ } else if (relocType == RelocType.JAVA_CALL_INDIRECT) {
pecoffRelocType = IMAGE_RELOCATION.IMAGE_REL_AMD64_ABSOLUTE;
- } else if ((relocType == RelocType.EXTERNAL_DATA_REFERENCE_FAR)) {
+ } else if (relocType == RelocType.METASPACE_GOT_REFERENCE ||
+ relocType == RelocType.EXTERNAL_PLT_TO_GOT) {
pecoffRelocType = IMAGE_RELOCATION.IMAGE_REL_AMD64_REL32;
- } else if (relocType == RelocType.METASPACE_GOT_REFERENCE ||
- relocType == RelocType.EXTERNAL_PLT_TO_GOT ||
- relocType == RelocType.STATIC_STUB_TO_STATIC_METHOD ||
- relocType == RelocType.STATIC_STUB_TO_HOTSPOT_LINKAGE_GOT) {
- pecoffRelocType = IMAGE_RELOCATION.IMAGE_REL_AMD64_REL32;
- } else if (relocType == RelocType.EXTERNAL_GOT_TO_PLT ||
- relocType == RelocType.LOADTIME_ADDRESS) {
+ } else if (relocType == RelocType.EXTERNAL_GOT_TO_PLT) {
pecoffRelocType = IMAGE_RELOCATION.IMAGE_REL_AMD64_ADDR64;
} else {
assert false : "Unhandled relocation type: " + relocType;
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoff.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoff.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,17 +25,16 @@
/**
*
- * Support for the creation of Coff files.
- * Current support is limited to 64 bit x86_64.
+ * Support for the creation of Coff files. Current support is limited to 64 bit x86_64.
*
*/
-public class PECoff {
-
+final class PECoff {
+ //@formatter:off
/**
* IMAGE_FILE_HEADER structure defines
*/
- public enum IMAGE_FILE_HEADER {
+ enum IMAGE_FILE_HEADER {
Machine( 0, 2),
NumberOfSections( 2, 2),
TimeDateStamp( 4, 4),
@@ -44,15 +43,15 @@
SizeOfOptionalHeader(16, 2),
Characteristics(18, 2);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
IMAGE_FILE_HEADER(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 20;
+ static int totalsize = 20;
/**
* IMAGE_FILE_HEADER defines
@@ -61,15 +60,15 @@
/**
* Machine
*/
- public static final char IMAGE_FILE_MACHINE_UNKNOWN = 0x0;
- public static final char IMAGE_FILE_MACHINE_AMD64 = 0x8664;
+ static final char IMAGE_FILE_MACHINE_UNKNOWN = 0x0;
+ static final char IMAGE_FILE_MACHINE_AMD64 = 0x8664;
}
/**
* IMAGE_SECTION_HEADER structure defines
*/
- public enum IMAGE_SECTION_HEADER {
+ enum IMAGE_SECTION_HEADER {
Name( 0, 8),
PhysicalAddress( 8, 4),
VirtualSize( 8, 4),
@@ -82,15 +81,15 @@
NumberOfLinenumbers(34, 2),
Characteristics(36, 4);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
IMAGE_SECTION_HEADER(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 40;
+ static int totalsize = 40;
/**
* IMAGE_SECTION_HEADER defines
@@ -99,29 +98,33 @@
/**
* Characteristics
*/
- public static final int IMAGE_SCN_CNT_CODE = 0x20;
- public static final int IMAGE_SCN_CNT_INITIALIZED_DATA = 0x40;
- public static final int IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x80;
- public static final int IMAGE_SCN_LNK_COMDAT = 0x1000;
- public static final int IMAGE_SCN_LNK_INFO = 0x200;
- public static final int IMAGE_SCN_LNK_REMOVE = 0x800;
+ static final int IMAGE_SCN_CNT_CODE = 0x20;
+ static final int IMAGE_SCN_CNT_INITIALIZED_DATA = 0x40;
+ static final int IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x80;
+ static final int IMAGE_SCN_LNK_COMDAT = 0x1000;
+ static final int IMAGE_SCN_LNK_INFO = 0x200;
+ static final int IMAGE_SCN_LNK_REMOVE = 0x800;
- public static final int IMAGE_SCN_ALIGN_1BYTES = 0x100000;
- public static final int IMAGE_SCN_ALIGN_2BYTES = 0x200000;
- public static final int IMAGE_SCN_ALIGN_4BYTES = 0x300000;
- public static final int IMAGE_SCN_ALIGN_8BYTES = 0x400000;
- public static final int IMAGE_SCN_ALIGN_16BYTES = 0x500000;
- public static final int IMAGE_SCN_ALIGN_32BYTES = 0x600000;
- public static final int IMAGE_SCN_ALIGN_64BYTES = 0x700000;
- public static final int IMAGE_SCN_ALIGN_MASK = 0xf00000;
- public static final int IMAGE_SCN_ALIGN_SHIFT = 20;
+ static final int IMAGE_SCN_ALIGN_1BYTES = 0x100000;
+ static final int IMAGE_SCN_ALIGN_2BYTES = 0x200000;
+ static final int IMAGE_SCN_ALIGN_4BYTES = 0x300000;
+ static final int IMAGE_SCN_ALIGN_8BYTES = 0x400000;
+ static final int IMAGE_SCN_ALIGN_16BYTES = 0x500000;
+ static final int IMAGE_SCN_ALIGN_32BYTES = 0x600000;
+ static final int IMAGE_SCN_ALIGN_64BYTES = 0x700000;
+ static final int IMAGE_SCN_ALIGN_128BYTES = 0x800000;
+ static final int IMAGE_SCN_ALIGN_256BYTES = 0x900000;
+ static final int IMAGE_SCN_ALIGN_512BYTES = 0xa00000;
+ static final int IMAGE_SCN_ALIGN_1024BYTES = 0xb00000;
+ static final int IMAGE_SCN_ALIGN_MASK = 0xf00000;
+ static final int IMAGE_SCN_ALIGN_SHIFT = 20;
- public static final int IMAGE_SCN_LNK_NRELOC_OVFL = 0x01000000;
+ static final int IMAGE_SCN_LNK_NRELOC_OVFL = 0x01000000;
- public static final int IMAGE_SCN_MEM_SHARED = 0x10000000;
- public static final int IMAGE_SCN_MEM_EXECUTE = 0x20000000;
- public static final int IMAGE_SCN_MEM_READ = 0x40000000;
- public static final int IMAGE_SCN_MEM_WRITE = 0x80000000;
+ static final int IMAGE_SCN_MEM_SHARED = 0x10000000;
+ static final int IMAGE_SCN_MEM_EXECUTE = 0x20000000;
+ static final int IMAGE_SCN_MEM_READ = 0x40000000;
+ static final int IMAGE_SCN_MEM_WRITE = 0x80000000;
}
@@ -130,7 +133,7 @@
*
* IMAGE_SYMBOL structure defines
*/
- public enum IMAGE_SYMBOL {
+ enum IMAGE_SYMBOL {
ShortName( 0, 8),
Short( 0, 4),
Long( 4, 4),
@@ -140,63 +143,63 @@
StorageClass(16, 1),
NumberOfAuxSymbols(17, 1);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
IMAGE_SYMBOL(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 18;
+ static int totalsize = 18;
/**
* Type
*/
- public static final int IMAGE_SYM_DTYPE_NONE = 0x0;
- public static final int IMAGE_SYM_DTYPE_FUNCTION = 0x20;
+ static final int IMAGE_SYM_DTYPE_NONE = 0x0;
+ static final int IMAGE_SYM_DTYPE_FUNCTION = 0x20;
/**
* StorageClass
*/
- public static final int IMAGE_SYM_CLASS_NULL = 0x0;
- public static final int IMAGE_SYM_CLASS_EXTERNAL = 0x2;
- public static final int IMAGE_SYM_CLASS_STATIC = 0x3;
- public static final int IMAGE_SYM_CLASS_LABEL = 0x6;
+ static final int IMAGE_SYM_CLASS_NULL = 0x0;
+ static final int IMAGE_SYM_CLASS_EXTERNAL = 0x2;
+ static final int IMAGE_SYM_CLASS_STATIC = 0x3;
+ static final int IMAGE_SYM_CLASS_LABEL = 0x6;
}
/**
* IMAGE_RELOCATION structure defines
*/
- public enum IMAGE_RELOCATION {
+ enum IMAGE_RELOCATION {
VirtualAddress( 0, 4),
SymbolTableIndex( 4, 4),
Type( 8, 2);
- public final int off;
- public final int sz;
+ final int off;
+ final int sz;
IMAGE_RELOCATION(int offset, int size) {
this.off = offset;
this.sz = size;
}
- public static int totalsize = 10;
+ static int totalsize = 10;
/**
* Relocation types
*/
- public static final int IMAGE_REL_AMD64_ABSOLUTE = 0x0;
- public static final int IMAGE_REL_AMD64_ADDR32 = 0x2;
- public static final int IMAGE_REL_AMD64_ADDR64 = 0x1;
- public static final int IMAGE_REL_AMD64_REL32 = 0x4;
- public static final int IMAGE_REL_AMD64_REL32_1 = 0x5;
- public static final int IMAGE_REL_AMD64_REL32_2 = 0x6;
- public static final int IMAGE_REL_AMD64_REL32_3 = 0x7;
- public static final int IMAGE_REL_AMD64_REL32_4 = 0x8;
- public static final int IMAGE_REL_AMD64_REL32_5 = 0x9;
+ static final int IMAGE_REL_AMD64_ABSOLUTE = 0x0;
+ static final int IMAGE_REL_AMD64_ADDR32 = 0x2;
+ static final int IMAGE_REL_AMD64_ADDR64 = 0x1;
+ static final int IMAGE_REL_AMD64_REL32 = 0x4;
+ static final int IMAGE_REL_AMD64_REL32_1 = 0x5;
+ static final int IMAGE_REL_AMD64_REL32_2 = 0x6;
+ static final int IMAGE_REL_AMD64_REL32_3 = 0x7;
+ static final int IMAGE_REL_AMD64_REL32_4 = 0x8;
+ static final int IMAGE_REL_AMD64_REL32_5 = 0x9;
}
-
+ //@formatter:on
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffByteBuffer.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffByteBuffer.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,9 +26,9 @@
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
-public class PECoffByteBuffer {
+final class PECoffByteBuffer {
- public static ByteBuffer allocate(int size) {
+ static ByteBuffer allocate(int size) {
ByteBuffer buf = ByteBuffer.allocate(size);
// Only support Little Endian on Windows
buf.order(ByteOrder.LITTLE_ENDIAN);
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffContainer.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffContainer.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,14 +26,13 @@
import java.io.File;
import java.io.FileOutputStream;
-public class PECoffContainer {
+final class PECoffContainer {
- File outputFile;
- FileOutputStream outputStream;
- long fileOffset;
+ private final File outputFile;
+ private FileOutputStream outputStream;
+ private long fileOffset;
- public PECoffContainer(String fileName, String aotVersion) {
- String baseName;
+ PECoffContainer(String fileName) {
outputFile = new File(fileName);
if (outputFile.exists()) {
@@ -48,7 +47,7 @@
fileOffset = 0;
}
- public void close() {
+ void close() {
try {
outputStream.close();
} catch (Exception e) {
@@ -56,8 +55,10 @@
}
}
- public void writeBytes(byte [] bytes) {
- if (bytes == null) return;
+ void writeBytes(byte[] bytes) {
+ if (bytes == null) {
+ return;
+ }
try {
outputStream.write(bytes);
} catch (Exception e) {
@@ -67,11 +68,13 @@
}
// Write bytes to output file with up front alignment padding
- public void writeBytes(byte [] bytes, int alignment) {
- if (bytes == null) return;
+ void writeBytes(byte[] bytes, int alignment) {
+ if (bytes == null) {
+ return;
+ }
try {
// Pad to alignment
- while ((fileOffset & (long)(alignment-1)) != 0) {
+ while ((fileOffset & (alignment - 1)) != 0) {
outputStream.write(0);
fileOffset++;
}
@@ -82,4 +85,3 @@
fileOffset += bytes.length;
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffHeader.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffHeader.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,45 +24,41 @@
package jdk.tools.jaotc.binformat.pecoff;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.pecoff.PECoff;
import jdk.tools.jaotc.binformat.pecoff.PECoff.IMAGE_FILE_HEADER;
-import jdk.tools.jaotc.binformat.pecoff.PECoffTargetInfo;
import jdk.tools.jaotc.binformat.pecoff.PECoffByteBuffer;
-public class PECoffHeader {
- ByteBuffer header;
+final class PECoffHeader {
+ private final ByteBuffer header;
- public PECoffHeader() {
+ PECoffHeader() {
header = PECoffByteBuffer.allocate(IMAGE_FILE_HEADER.totalsize);
header.putChar(IMAGE_FILE_HEADER.Machine.off, IMAGE_FILE_HEADER.IMAGE_FILE_MACHINE_AMD64);
- header.putInt(IMAGE_FILE_HEADER.TimeDateStamp.off, (int)(System.currentTimeMillis()/1000));
+ header.putInt(IMAGE_FILE_HEADER.TimeDateStamp.off, (int) (System.currentTimeMillis() / 1000));
header.putInt(IMAGE_FILE_HEADER.PointerToSymbolTable.off, 0);
header.putInt(IMAGE_FILE_HEADER.NumberOfSymbols.off, 0);
- header.putChar(IMAGE_FILE_HEADER.SizeOfOptionalHeader.off, (char)0);
- header.putChar(IMAGE_FILE_HEADER.Characteristics.off, (char)0);
+ header.putChar(IMAGE_FILE_HEADER.SizeOfOptionalHeader.off, (char) 0);
+ header.putChar(IMAGE_FILE_HEADER.Characteristics.off, (char) 0);
}
// Update header with the number of total sections
- public void setSectionCount(int count) {
- header.putChar(IMAGE_FILE_HEADER.NumberOfSections.off, (char)count);
+ void setSectionCount(int count) {
+ header.putChar(IMAGE_FILE_HEADER.NumberOfSections.off, (char) count);
}
// Update header with the number of total symbols
- public void setSymbolCount(int count) {
+ void setSymbolCount(int count) {
header.putInt(IMAGE_FILE_HEADER.NumberOfSymbols.off, count);
}
// Update header with the offset of symbol table
- public void setSymbolOff(int offset) {
+ void setSymbolOff(int offset) {
header.putInt(IMAGE_FILE_HEADER.PointerToSymbolTable.off, offset);
}
- public byte[] getArray() {
+ byte[] getArray() {
return header.array();
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffRelocEntry.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffRelocEntry.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,26 +24,23 @@
package jdk.tools.jaotc.binformat.pecoff;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.pecoff.PECoff;
import jdk.tools.jaotc.binformat.pecoff.PECoff.IMAGE_RELOCATION;
import jdk.tools.jaotc.binformat.pecoff.PECoffByteBuffer;
-public class PECoffRelocEntry {
- ByteBuffer entry;
+final class PECoffRelocEntry {
+ private final ByteBuffer entry;
- public PECoffRelocEntry(int offset, int symno, int type) {
+ PECoffRelocEntry(int offset, int symno, int type) {
entry = PECoffByteBuffer.allocate(IMAGE_RELOCATION.totalsize);
entry.putInt(IMAGE_RELOCATION.VirtualAddress.off, offset);
entry.putInt(IMAGE_RELOCATION.SymbolTableIndex.off, symno);
- entry.putChar(IMAGE_RELOCATION.Type.off, (char)type);
+ entry.putChar(IMAGE_RELOCATION.Type.off, (char) type);
}
- public byte[] getArray() {
+ byte[] getArray() {
return entry.array();
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffRelocTable.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffRelocTable.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,52 +25,47 @@
import java.util.ArrayList;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.pecoff.PECoff;
import jdk.tools.jaotc.binformat.pecoff.PECoff.IMAGE_RELOCATION;
import jdk.tools.jaotc.binformat.pecoff.PECoffRelocEntry;
import jdk.tools.jaotc.binformat.pecoff.PECoffByteBuffer;
-public class PECoffRelocTable {
+final class PECoffRelocTable {
ArrayList<ArrayList<PECoffRelocEntry>> relocEntries;
- public PECoffRelocTable(int numsects) {
- relocEntries = new ArrayList<ArrayList<PECoffRelocEntry>>(numsects);
- for (int i = 0; i < numsects; i++)
+ PECoffRelocTable(int numsects) {
+ relocEntries = new ArrayList<>(numsects);
+ for (int i = 0; i < numsects; i++) {
relocEntries.add(new ArrayList<PECoffRelocEntry>());
+ }
}
- public void createRelocationEntry(int sectindex,
- int offset,
- int symno,
- int type) {
-
- PECoffRelocEntry entry = new PECoffRelocEntry(offset,
- symno,
- type);
+ void createRelocationEntry(int sectindex, int offset, int symno, int type) {
+ PECoffRelocEntry entry = new PECoffRelocEntry(offset, symno, type);
relocEntries.get(sectindex).add(entry);
}
- public int getAlign() { return (4); }
+ static int getAlign() {
+ return (4);
+ }
- public int getNumRelocs(int section_index) {
+ int getNumRelocs(int section_index) {
return relocEntries.get(section_index).size();
}
// Return the relocation entries for a single section
- // or null if no entries added to section
- public byte [] getRelocData(int section_index) {
+ // or null if no entries added to section
+ byte[] getRelocData(int section_index) {
ArrayList<PECoffRelocEntry> entryList = relocEntries.get(section_index);
int entryCount = entryList.size();
int allocCount = entryCount;
- if (entryCount == 0)
+ if (entryCount == 0) {
return null;
-
- if (entryCount > 0xFFFF)
+ }
+ if (entryCount > 0xFFFF) {
allocCount++;
-
+ }
ByteBuffer relocData = PECoffByteBuffer.allocate(allocCount * IMAGE_RELOCATION.totalsize);
// If number of relocs exceeds 65K, add the real size
@@ -89,4 +84,3 @@
return (relocData.array());
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSection.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSection.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,32 +24,39 @@
package jdk.tools.jaotc.binformat.pecoff;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.pecoff.PECoff;
import jdk.tools.jaotc.binformat.pecoff.PECoff.IMAGE_SECTION_HEADER;
import jdk.tools.jaotc.binformat.pecoff.PECoffByteBuffer;
-public class PECoffSection {
- ByteBuffer section;
- byte [] data;
- boolean hasrelocations;
- int sectionIndex;
- int align;
+final class PECoffSection {
+ private final ByteBuffer section;
+ private final byte[] data;
+ private final boolean hasrelocations;
+ private final int sectionIndex;
+ private final int align;
- public PECoffSection(String sectName, byte [] sectData, int sectFlags,
- boolean hasRelocations, int sectIndex) {
+ PECoffSection(String sectName, byte[] sectData0, int sectFlags0, int sectAlign, boolean hasRelocations, int sectIndex) {
section = PECoffByteBuffer.allocate(IMAGE_SECTION_HEADER.totalsize);
- // bug: If JVM.oop.got section is empty, VM exits since JVM.oop.got
- // symbol ends up as external forwarded reference.
- if (sectData.length == 0) sectData = new byte[8];
+ // If .oop.got section is empty, VM exits since .oop.got
+ // symbol ends up as external forwarded reference.
+ byte[] sectData = sectData0;
+ if (sectData0.length == 0) {
+ sectData = new byte[8];
+ }
// Copy only Max allowed bytes to Section Entry
- byte [] Name = sectName.getBytes();
- int max = Name.length <= IMAGE_SECTION_HEADER.Name.sz ?
- Name.length : IMAGE_SECTION_HEADER.Name.sz;
+ byte[] Name = sectName.getBytes();
+ int max = Name.length <= IMAGE_SECTION_HEADER.Name.sz ? Name.length : IMAGE_SECTION_HEADER.Name.sz;
+
+ assert (sectAlign < 1 || sectAlign > 1024 || (sectAlign & (sectAlign - 1)) != 0) : "section alignment is not valid: " + sectAlign;
+ align = sectAlign;
+
+ // Using 32 because IMAGE_SCN_ALIGN_*BYTES is value + 1
+ int sectAlignBits = (32 - Integer.numberOfLeadingZeros(align)) << IMAGE_SECTION_HEADER.IMAGE_SCN_ALIGN_SHIFT;
+ // Clear and set alignment bits
+ int sectFlags = (sectFlags0 & ~IMAGE_SECTION_HEADER.IMAGE_SCN_ALIGN_MASK) | (sectAlignBits & IMAGE_SECTION_HEADER.IMAGE_SCN_ALIGN_MASK);
section.put(Name, IMAGE_SECTION_HEADER.Name.off, max);
@@ -57,84 +64,69 @@
section.putInt(IMAGE_SECTION_HEADER.VirtualAddress.off, 0);
section.putInt(IMAGE_SECTION_HEADER.SizeOfRawData.off, sectData.length);
section.putInt(IMAGE_SECTION_HEADER.PointerToLinenumbers.off, 0);
- section.putChar(IMAGE_SECTION_HEADER.NumberOfLinenumbers.off, (char)0);
+ section.putChar(IMAGE_SECTION_HEADER.NumberOfLinenumbers.off, (char) 0);
section.putInt(IMAGE_SECTION_HEADER.Characteristics.off, sectFlags);
- // Extract alignment from Characteristics field
- int alignshift = (sectFlags & IMAGE_SECTION_HEADER.IMAGE_SCN_ALIGN_MASK) >>
- IMAGE_SECTION_HEADER.IMAGE_SCN_ALIGN_SHIFT;
-
- // Use 8 byte alignment if not specified
- if (alignshift == 0)
- alignshift = 3;
- else
- --alignshift;
-
- align = 1 << alignshift;
-
data = sectData;
hasrelocations = hasRelocations;
sectionIndex = sectIndex;
}
- public long getSize() {
+ long getSize() {
return section.getInt(IMAGE_SECTION_HEADER.SizeOfRawData.off);
}
- public int getDataAlign() {
+ int getDataAlign() {
return (align);
}
// Alignment requirements for the IMAGE_SECTION_HEADER structures
- public static int getShdrAlign() {
+ static int getShdrAlign() {
return (4);
}
- public byte[] getArray() {
+ byte[] getArray() {
return section.array();
}
- public byte[] getDataArray() {
+ byte[] getDataArray() {
return data;
}
- public void setOffset(long offset) {
- section.putInt(IMAGE_SECTION_HEADER.PointerToRawData.off, (int)offset);
+ void setOffset(long offset) {
+ section.putInt(IMAGE_SECTION_HEADER.PointerToRawData.off, (int) offset);
}
- public long getOffset() {
+ long getOffset() {
return (section.getInt(IMAGE_SECTION_HEADER.PointerToRawData.off));
}
- public void setReloff(int offset) {
+ void setReloff(int offset) {
section.putInt(IMAGE_SECTION_HEADER.PointerToRelocations.off, offset);
}
- public void setRelcount(int count) {
+ void setRelcount(int count) {
// If the number of relocs is larger than 65K, then set
- // the overflow bit. The real count will be written to
+ // the overflow bit. The real count will be written to
// the first reloc entry for this section.
if (count > 0xFFFF) {
int flags;
- section.putChar(IMAGE_SECTION_HEADER.NumberOfRelocations.off, (char)0xFFFF);
+ section.putChar(IMAGE_SECTION_HEADER.NumberOfRelocations.off, (char) 0xFFFF);
flags = section.getInt(IMAGE_SECTION_HEADER.Characteristics.off);
flags |= IMAGE_SECTION_HEADER.IMAGE_SCN_LNK_NRELOC_OVFL;
section.putInt(IMAGE_SECTION_HEADER.Characteristics.off, flags);
- }
- else {
- section.putChar(IMAGE_SECTION_HEADER.NumberOfRelocations.off, (char)count);
+ } else {
+ section.putChar(IMAGE_SECTION_HEADER.NumberOfRelocations.off, (char) count);
}
}
- public boolean hasRelocations() {
+ boolean hasRelocations() {
return hasrelocations;
}
- public int getSectionId() {
+ int getSectionId() {
return sectionIndex;
}
}
-
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSymbol.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSymbol.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,18 +24,15 @@
package jdk.tools.jaotc.binformat.pecoff;
import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
import jdk.tools.jaotc.binformat.NativeSymbol;
-import jdk.tools.jaotc.binformat.pecoff.PECoff;
import jdk.tools.jaotc.binformat.pecoff.PECoff.IMAGE_SYMBOL;
import jdk.tools.jaotc.binformat.pecoff.PECoffByteBuffer;
-public class PECoffSymbol extends NativeSymbol {
- ByteBuffer sym;
+final class PECoffSymbol extends NativeSymbol {
+ private final ByteBuffer sym;
- public PECoffSymbol(int symbolindex, int strindex, byte type, byte storageclass,
- byte sectindex, long offset, long size) {
+ PECoffSymbol(int symbolindex, int strindex, byte type, byte storageclass, byte sectindex, long offset) {
super(symbolindex);
sym = PECoffByteBuffer.allocate(IMAGE_SYMBOL.totalsize);
@@ -43,19 +40,18 @@
sym.putInt(IMAGE_SYMBOL.Short.off, 0);
sym.putInt(IMAGE_SYMBOL.Long.off, strindex);
- sym.putInt(IMAGE_SYMBOL.Value.off, (int)offset);
+ sym.putInt(IMAGE_SYMBOL.Value.off, (int) offset);
// Section indexes start at 1 but we manage the index internally
// as 0 relative except in this structure
- sym.putChar(IMAGE_SYMBOL.SectionNumber.off, (char)(sectindex+1));
+ sym.putChar(IMAGE_SYMBOL.SectionNumber.off, (char) (sectindex + 1));
- sym.putChar(IMAGE_SYMBOL.Type.off, (char)type);
+ sym.putChar(IMAGE_SYMBOL.Type.off, (char) type);
sym.put(IMAGE_SYMBOL.StorageClass.off, storageclass);
- sym.put(IMAGE_SYMBOL.NumberOfAuxSymbols.off, (byte)0);
+ sym.put(IMAGE_SYMBOL.NumberOfAuxSymbols.off, (byte) 0);
}
- public byte[] getArray() {
+ byte[] getArray() {
return sym.array();
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSymtab.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffSymtab.java Wed Aug 23 12:39:55 2017 +0000
@@ -27,36 +27,35 @@
import java.nio.ByteOrder;
import java.util.ArrayList;
-import jdk.tools.jaotc.binformat.pecoff.PECoff;
import jdk.tools.jaotc.binformat.pecoff.PECoff.IMAGE_SYMBOL;
import jdk.tools.jaotc.binformat.pecoff.PECoffSymbol;
import jdk.tools.jaotc.binformat.pecoff.PECoffByteBuffer;
-public class PECoffSymtab {
- ArrayList<PECoffSymbol>symbols = new ArrayList<PECoffSymbol>();
+final class PECoffSymtab {
+ ArrayList<PECoffSymbol> symbols = new ArrayList<>();
/**
* number of symbols added
*/
- int symbolCount;
+ private int symbolCount;
/**
* String holding symbol table strings
*/
- private StringBuilder strTabContent;
+ private final StringBuilder strTabContent;
/**
- * Keeps track of bytes in string table since strTabContent.length()
- * is number of chars, not bytes.
+ * Keeps track of bytes in string table since strTabContent.length() is number of chars, not
+ * bytes.
*/
private int strTabNrOfBytes;
/**
* String holding Linker Directives
*/
- private StringBuilder directives;
+ private final StringBuilder directives;
- public PECoffSymtab() {
+ PECoffSymtab() {
symbolCount = 0;
strTabContent = new StringBuilder();
directives = new StringBuilder();
@@ -72,8 +71,7 @@
directives.append(" ");
}
- public PECoffSymbol addSymbolEntry(String name, byte type, byte storageclass,
- byte secHdrIndex, long offset, long size) {
+ PECoffSymbol addSymbolEntry(String name, byte type, byte storageclass, byte secHdrIndex, long offset) {
// Get the current symbol index and append symbol name to string table.
int index;
PECoffSymbol sym;
@@ -82,7 +80,7 @@
index = 0;
strTabContent.append('\0');
strTabNrOfBytes += 1;
- sym = new PECoffSymbol(symbolCount, index, type, storageclass, secHdrIndex, offset, size);
+ sym = new PECoffSymbol(symbolCount, index, type, storageclass, secHdrIndex, offset);
symbols.add(sym);
} else {
int nameSize = name.getBytes().length;
@@ -94,10 +92,11 @@
strTabContent.append(name).append('\0');
strTabNrOfBytes += (nameSize + 1);
- sym = new PECoffSymbol(symbolCount, index, type, storageclass, secHdrIndex, offset, size);
+ sym = new PECoffSymbol(symbolCount, index, type, storageclass, secHdrIndex, offset);
symbols.add(sym);
- if (storageclass == IMAGE_SYMBOL.IMAGE_SYM_CLASS_EXTERNAL)
+ if (storageclass == IMAGE_SYMBOL.IMAGE_SYM_CLASS_EXTERNAL) {
addDirective(name, type);
+ }
}
symbolCount++;
return (sym);
@@ -105,37 +104,37 @@
private void addDirective(String name, byte type) {
directives.append("/EXPORT:" + name);
- if(type != IMAGE_SYMBOL.IMAGE_SYM_DTYPE_FUNCTION) {
+ if (type != IMAGE_SYMBOL.IMAGE_SYM_DTYPE_FUNCTION) {
directives.append(",DATA");
}
directives.append(" ");
}
- public int getSymtabCount() {
+ int getSymtabCount() {
return symbolCount;
}
- public int getStrtabSize() {
+ int getStrtabSize() {
return strTabNrOfBytes;
}
// Return a byte array that contains the symbol table entries
- public byte[] getSymtabArray() {
- ByteBuffer symtabData = PECoffByteBuffer.allocate(symbolCount*IMAGE_SYMBOL.totalsize);
+ byte[] getSymtabArray() {
+ ByteBuffer symtabData = PECoffByteBuffer.allocate(symbolCount * IMAGE_SYMBOL.totalsize);
symtabData.order(ByteOrder.LITTLE_ENDIAN);
// copy all symbols
- for (int i = 0; i < symbolCount; i++ ) {
+ for (int i = 0; i < symbolCount; i++) {
PECoffSymbol sym = symbols.get(i);
- byte [] arr = sym.getArray();
+ byte[] arr = sym.getArray();
symtabData.put(arr);
}
return (symtabData.array());
}
// Return the string table array
- public byte[] getStrtabArray() {
- byte [] strs = strTabContent.toString().getBytes();
+ byte[] getStrtabArray() {
+ byte[] strs = strTabContent.toString().getBytes();
// Update the size of the string table
ByteBuffer buff = ByteBuffer.wrap(strs);
@@ -145,7 +144,7 @@
return (strs);
}
- public byte[] getDirectiveArray() {
+ byte[] getDirectiveArray() {
return (directives.toString().getBytes());
}
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffTargetInfo.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc.binformat/src/jdk/tools/jaotc/binformat/pecoff/PECoffTargetInfo.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,14 +24,13 @@
package jdk.tools.jaotc.binformat.pecoff;
import java.nio.ByteOrder;
-import jdk.tools.jaotc.binformat.pecoff.PECoff;
import jdk.tools.jaotc.binformat.pecoff.PECoff.IMAGE_FILE_HEADER;
/**
* Class that abstracts MACH-O target details.
*
*/
-public class PECoffTargetInfo {
+final class PECoffTargetInfo {
/**
* Target architecture.
*/
@@ -63,12 +62,11 @@
}
}
- public static char getPECoffArch() {
+ static char getPECoffArch() {
return arch;
}
- public static String getOsName() {
+ static String getOsName() {
return osName;
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTBackend.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTBackend.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -52,7 +52,7 @@
import jdk.vm.ci.meta.ResolvedJavaMethod;
import jdk.vm.ci.meta.TriState;
-public class AOTBackend {
+final class AOTBackend {
private final Main main;
private final OptionValues graalOptions;
private final HotSpotBackend backend;
@@ -60,28 +60,26 @@
private final HotSpotCodeCacheProvider codeCache;
private final PhaseSuite<HighTierContext> graphBuilderSuite;
private final HighTierContext highTierContext;
- private final GraalFilters filters;
- public AOTBackend(Main main, OptionValues graalOptions, HotSpotBackend backend, GraalFilters filters) {
+ AOTBackend(Main main, OptionValues graalOptions, HotSpotBackend backend) {
this.main = main;
this.graalOptions = graalOptions;
this.backend = backend;
- this.filters = filters;
providers = backend.getProviders();
codeCache = providers.getCodeCache();
graphBuilderSuite = initGraphBuilderSuite(backend, main.options.compileWithAssertions);
highTierContext = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.ALL);
}
- public PhaseSuite<HighTierContext> getGraphBuilderSuite() {
+ PhaseSuite<HighTierContext> getGraphBuilderSuite() {
return graphBuilderSuite;
}
- public HotSpotBackend getBackend() {
+ HotSpotBackend getBackend() {
return backend;
}
- public HotSpotProviders getProviders() {
+ HotSpotProviders getProviders() {
return providers;
}
@@ -96,7 +94,7 @@
}
@SuppressWarnings("try")
- public CompilationResult compileMethod(ResolvedJavaMethod resolvedMethod, DebugContext debug) {
+ CompilationResult compileMethod(ResolvedJavaMethod resolvedMethod, DebugContext debug) {
StructuredGraph graph = buildStructuredGraph(resolvedMethod, debug);
if (graph != null) {
return compileGraph(resolvedMethod, graph, debug);
@@ -118,7 +116,7 @@
graphBuilderSuite.apply(graph, highTierContext);
return graph;
} catch (Throwable e) {
- handleError(javaMethod, e, " (building graph)");
+ main.handleError(javaMethod, e, " (building graph)");
}
return null;
}
@@ -135,20 +133,11 @@
compilationResult, CompilationResultBuilderFactory.Default);
} catch (Throwable e) {
- handleError(resolvedMethod, e, " (compiling graph)");
+ main.handleError(resolvedMethod, e, " (compiling graph)");
}
return null;
}
- /**
- * Returns whether the VM is a debug build.
- *
- * @return true is debug VM, false otherwise
- */
- public boolean isDebugVM() {
- return backend.getRuntime().getVMConfig().cAssertions;
- }
-
private static PhaseSuite<HighTierContext> initGraphBuilderSuite(HotSpotBackend backend, boolean compileWithAssertions) {
PhaseSuite<HighTierContext> graphBuilderSuite = backend.getSuites().getDefaultGraphBuilderSuite().copy();
ListIterator<BasePhase<? super HighTierContext>> iterator = graphBuilderSuite.findPhase(GraphBuilderPhase.class);
@@ -165,39 +154,12 @@
return graphBuilderSuite;
}
- private void handleError(ResolvedJavaMethod resolvedMethod, Throwable e, String message) {
- String methodName = MiscUtils.uniqueMethodName(resolvedMethod);
-
- if (main.options.debug) {
- main.printError("Failed compilation: " + methodName + ": " + e);
- }
-
- // Ignore some exceptions when meta-compiling Graal.
- if (filters.shouldIgnoreException(e)) {
- return;
- }
-
- Main.writeLog("Failed compilation of method " + methodName + message);
-
- if (!main.options.debug) {
- main.printError("Failed compilation: " + methodName + ": " + e);
- }
-
- if (main.options.verbose) {
- e.printStackTrace(main.log);
- }
-
- if (main.options.exitOnError) {
- System.exit(1);
- }
- }
-
- public void printCompiledMethod(HotSpotResolvedJavaMethod resolvedMethod, CompilationResult compResult) {
+ void printCompiledMethod(HotSpotResolvedJavaMethod resolvedMethod, CompilationResult compResult) {
// This is really not installing the method.
InstalledCode installedCode = codeCache.addCode(resolvedMethod, HotSpotCompiledCodeBuilder.createCompiledCode(codeCache, null, null, compResult), null, null);
String disassembly = codeCache.disassemble(installedCode);
if (disassembly != null) {
- main.printlnDebug(disassembly);
+ main.printer.printlnDebug(disassembly);
}
}
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompilationTask.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompilationTask.java Wed Aug 23 12:39:55 2017 +0000
@@ -48,7 +48,7 @@
* compilation of classes. It also defines methods that parse compilation result of Graal to create
* target-independent representation {@code BinaryContainer} of the intended target binary.
*/
-public class AOTCompilationTask implements Runnable, Comparable<Object> {
+final class AOTCompilationTask implements Runnable, Comparable<Object> {
private static final AtomicInteger ids = new AtomicInteger();
@@ -77,7 +77,7 @@
*/
private CompiledMethodInfo result;
- public AOTCompilationTask(Main main, OptionValues graalOptions, AOTCompiledClass holder, ResolvedJavaMethod method, AOTBackend aotBackend) {
+ AOTCompilationTask(Main main, OptionValues graalOptions, AOTCompiledClass holder, ResolvedJavaMethod method, AOTBackend aotBackend) {
this.main = main;
this.graalOptions = graalOptions;
this.id = ids.incrementAndGet();
@@ -95,7 +95,7 @@
// may include processing command line options used by the latter.
HotSpotJVMCIRuntime.runtime();
- AOTCompiler.logCompilation(MiscUtils.uniqueMethodName(method), "Compiling");
+ AOTCompiler.logCompilation(JavaMethodInfo.uniqueMethodName(method), "Compiling");
final long threadId = Thread.currentThread().getId();
@@ -137,7 +137,7 @@
}
// For now precision to the nearest second is sufficient.
- Main.writeLog(" Compile Time: " + TimeUnit.MILLISECONDS.toSeconds(endTime - startTime) + "secs");
+ LogPrinter.writeLog(" Compile Time: " + TimeUnit.MILLISECONDS.toSeconds(endTime - startTime) + "secs");
if (main.options.debug) {
aotBackend.printCompiledMethod((HotSpotResolvedJavaMethod) method, compResult);
}
@@ -146,7 +146,7 @@
}
private String getMethodDescription() {
- return String.format("%-6d aot %s %s", getId(), MiscUtils.uniqueMethodName(method),
+ return String.format("%-6d aot %s %s", getId(), JavaMethodInfo.uniqueMethodName(method),
getEntryBCI() == JVMCICompiler.INVOCATION_ENTRY_BCI ? "" : "(OSR@" + getEntryBCI() + ") ");
}
@@ -154,11 +154,11 @@
return id;
}
- public int getEntryBCI() {
+ private static int getEntryBCI() {
return JVMCICompiler.INVOCATION_ENTRY_BCI;
}
- public ResolvedJavaMethod getMethod() {
+ ResolvedJavaMethod getMethod() {
return method;
}
@@ -167,7 +167,7 @@
*
* @return the holder of this method
*/
- public AOTCompiledClass getHolder() {
+ AOTCompiledClass getHolder() {
return holder;
}
@@ -176,7 +176,7 @@
*
* @return result of this compilation task
*/
- public CompiledMethodInfo getResult() {
+ CompiledMethodInfo getResult() {
return result;
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiledClass.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiledClass.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -41,16 +41,16 @@
* Class encapsulating Graal-compiled output of a Java class. The compilation result of all methods
* of a class {@code className} are maintained in an array list.
*/
-public class AOTCompiledClass {
+final class AOTCompiledClass {
- public static class AOTKlassData {
- int gotIndex; // Index (offset/8) to the got in the .metaspace.got section
- int classId; // Unique ID
+ static class AOTKlassData {
+ private int gotIndex; // Index (offset/8) to the got in the .metaspace.got section
+ private int classId; // Unique ID
// Offset to compiled methods data in the .methods.offsets section.
- int compiledMethodsOffset;
+ private int compiledMethodsOffset;
// Offset to dependent methods data.
- int dependentMethodsOffset;
- long fingerprint; // Class fingerprint
+ private int dependentMethodsOffset;
+ private long fingerprint; // Class fingerprint
private final String name;
private boolean isArray;
@@ -60,25 +60,25 @@
*/
private ArrayList<CompiledMethodInfo> dependentMethods;
- public AOTKlassData(BinaryContainer binaryContainer, String name, long fingerprint, int classId) {
+ AOTKlassData(BinaryContainer binaryContainer, String name, long fingerprint, int classId) {
this.dependentMethods = new ArrayList<>();
this.classId = classId;
this.fingerprint = fingerprint;
- this.gotIndex = binaryContainer.addTwoSlotMetaspaceSymbol(name);
+ this.gotIndex = binaryContainer.addTwoSlotKlassSymbol(name);
this.compiledMethodsOffset = -1; // Not compiled classes do not have compiled methods.
this.dependentMethodsOffset = -1;
this.name = name;
this.isArray = name.length() > 0 && name.charAt(0) == '[';
}
- public long getFingerprint() {
+ long getFingerprint() {
return fingerprint;
}
/**
* Add a method to the list of dependent methods.
*/
- public synchronized boolean addDependentMethod(CompiledMethodInfo cm) {
+ synchronized boolean addDependentMethod(CompiledMethodInfo cm) {
return dependentMethods.add(cm);
}
@@ -87,7 +87,7 @@
*
* @return array list of dependent methods
*/
- public ArrayList<CompiledMethodInfo> getDependentMethods() {
+ ArrayList<CompiledMethodInfo> getDependentMethods() {
return dependentMethods;
}
@@ -96,11 +96,11 @@
*
* @return true if dependent methods exist, false otherwise
*/
- public boolean hasDependentMethods() {
+ boolean hasDependentMethods() {
return !dependentMethods.isEmpty();
}
- public void setCompiledMethodsOffset(int offset) {
+ void setCompiledMethodsOffset(int offset) {
compiledMethodsOffset = offset;
}
@@ -108,7 +108,7 @@
int cntDepMethods = dependentMethods.size();
// Create array of dependent methods IDs. First word is count.
ReadOnlyDataContainer dependenciesContainer = binaryContainer.getKlassesDependenciesContainer();
- this.dependentMethodsOffset = binaryContainer.addMethodsCount(cntDepMethods, dependenciesContainer);
+ this.dependentMethodsOffset = BinaryContainer.addMethodsCount(cntDepMethods, dependenciesContainer);
for (CompiledMethodInfo methodInfo : dependentMethods) {
dependenciesContainer.appendInt(methodInfo.getCodeId());
}
@@ -176,7 +176,7 @@
*
* @param compiledMethods AOT compiled methods
*/
- public AOTCompiledClass(ArrayList<CompiledMethodInfo> compiledMethods) {
+ AOTCompiledClass(ArrayList<CompiledMethodInfo> compiledMethods) {
this.resolvedJavaType = null;
this.compiledMethods = compiledMethods;
this.representsStubs = true;
@@ -185,7 +185,7 @@
/**
* Construct an object with compiled versions of the named class.
*/
- public AOTCompiledClass(ResolvedJavaType resolvedJavaType) {
+ AOTCompiledClass(ResolvedJavaType resolvedJavaType) {
this.resolvedJavaType = (HotSpotResolvedObjectType) resolvedJavaType;
this.compiledMethods = new ArrayList<>();
this.representsStubs = false;
@@ -194,14 +194,14 @@
/**
* @return the ResolvedJavaType of this class
*/
- public ResolvedJavaType getResolvedJavaType() {
+ ResolvedJavaType getResolvedJavaType() {
return resolvedJavaType;
}
/**
* Get the list of methods which should be compiled.
*/
- public ArrayList<ResolvedJavaMethod> getMethods() {
+ ArrayList<ResolvedJavaMethod> getMethods() {
ArrayList<ResolvedJavaMethod> m = methods;
methods = null; // Free - it is not used after that.
return m;
@@ -210,7 +210,7 @@
/**
* Get the number of all AOT classes.
*/
- public static int getClassesCount() {
+ static int getClassesCount() {
return classesCount;
}
@@ -219,14 +219,14 @@
*
* @return number of methods which should be compiled
*/
- public int getMethodCount() {
+ int getMethodCount() {
return methods.size();
}
/**
* Add a method to the list of methods to be compiled.
*/
- public void addMethod(ResolvedJavaMethod method) {
+ void addMethod(ResolvedJavaMethod method) {
methods.add(method);
}
@@ -235,14 +235,14 @@
*
* @return true if this class contains methods which should be compiled, false otherwise
*/
- public boolean hasMethods() {
+ boolean hasMethods() {
return !methods.isEmpty();
}
/**
* Add a method to the list of compiled methods. This method needs to be thread-safe.
*/
- public synchronized boolean addCompiledMethod(CompiledMethodInfo cm) {
+ synchronized boolean addCompiledMethod(CompiledMethodInfo cm) {
return compiledMethods.add(cm);
}
@@ -251,7 +251,7 @@
*
* @return array list of compiled methods
*/
- public ArrayList<CompiledMethodInfo> getCompiledMethods() {
+ ArrayList<CompiledMethodInfo> getCompiledMethods() {
return compiledMethods;
}
@@ -260,14 +260,14 @@
*
* @return true if methods were compiled, false otherwise
*/
- public boolean hasCompiledMethods() {
+ boolean hasCompiledMethods() {
return !compiledMethods.isEmpty();
}
/**
* Add a klass data.
*/
- public synchronized static AOTKlassData addAOTKlassData(BinaryContainer binaryContainer, HotSpotResolvedObjectType type) {
+ synchronized static AOTKlassData addAOTKlassData(BinaryContainer binaryContainer, HotSpotResolvedObjectType type) {
String name = type.getName();
long fingerprint = type.getFingerprint();
AOTKlassData data = klassData.get(name);
@@ -280,15 +280,15 @@
return data;
}
- public synchronized static AOTKlassData getAOTKlassData(String name) {
+ synchronized static AOTKlassData getAOTKlassData(String name) {
return klassData.get(name);
}
- public synchronized static AOTKlassData getAOTKlassData(HotSpotResolvedObjectType type) {
+ synchronized static AOTKlassData getAOTKlassData(HotSpotResolvedObjectType type) {
return getAOTKlassData(type.getName());
}
- public void addAOTKlassData(BinaryContainer binaryContainer) {
+ void addAOTKlassData(BinaryContainer binaryContainer) {
for (CompiledMethodInfo methodInfo : compiledMethods) {
// Record methods holder
methodInfo.addDependentKlassData(binaryContainer, resolvedJavaType);
@@ -309,7 +309,7 @@
}
}
- public synchronized static AOTKlassData addFingerprintKlassData(BinaryContainer binaryContainer, HotSpotResolvedObjectType type) {
+ synchronized static AOTKlassData addFingerprintKlassData(BinaryContainer binaryContainer, HotSpotResolvedObjectType type) {
if (type.isArray()) {
return addAOTKlassData(binaryContainer, type);
}
@@ -317,14 +317,15 @@
AOTKlassData old = getAOTKlassData(type);
if (old != null) {
boolean assertsEnabled = false;
+ // Next assignment will be executed when asserts are enabled.
assert assertsEnabled = true;
if (assertsEnabled) {
HotSpotResolvedObjectType s = type.getSuperclass();
if (s != null) {
- assert getAOTKlassData(s) != null : "fingerprint super " + s.getName() + " needed for " + type.getName();
+ assert getAOTKlassData(s) != null : "fingerprint for super " + s.getName() + " needed for " + type.getName();
}
for (HotSpotResolvedObjectType i : type.getInterfaces()) {
- assert getAOTKlassData(i) != null : "fingerprint super " + i.getName() + " needed for " + type.getName();
+ assert getAOTKlassData(i) != null : "fingerprint for interface " + i.getName() + " needed for " + type.getName();
}
}
return old;
@@ -345,10 +346,10 @@
/*
* Put methods data to contained.
*/
- public void putMethodsData(BinaryContainer binaryContainer) {
+ void putMethodsData(BinaryContainer binaryContainer) {
ReadOnlyDataContainer container = binaryContainer.getMethodsOffsetsContainer();
int cntMethods = compiledMethods.size();
- int startMethods = binaryContainer.addMethodsCount(cntMethods, container);
+ int startMethods = BinaryContainer.addMethodsCount(cntMethods, container);
for (CompiledMethodInfo methodInfo : compiledMethods) {
methodInfo.addMethodOffsets(binaryContainer, container);
}
@@ -361,18 +362,18 @@
data.setCompiledMethodsOffset(startMethods);
}
- public static void putAOTKlassData(BinaryContainer binaryContainer) {
+ static void putAOTKlassData(BinaryContainer binaryContainer) {
ReadOnlyDataContainer container = binaryContainer.getKlassesOffsetsContainer();
for (AOTKlassData data : klassData.values()) {
data.putAOTKlassData(binaryContainer, container);
}
}
- public boolean representsStubs() {
+ boolean representsStubs() {
return representsStubs;
}
- public void clear() {
+ void clear() {
for (CompiledMethodInfo c : compiledMethods) {
c.clear();
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiler.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTCompiler.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -35,7 +35,7 @@
import jdk.vm.ci.meta.ResolvedJavaMethod;
-public class AOTCompiler {
+final class AOTCompiler {
private final Main main;
@@ -68,7 +68,7 @@
/**
* Create a compile queue with the given number of threads.
*/
- public CompileQueue(final int threads) {
+ CompileQueue(final int threads) {
super(threads, threads, 0L, TimeUnit.MILLISECONDS, new PriorityBlockingQueue<>());
startTime = System.currentTimeMillis();
}
@@ -79,7 +79,7 @@
if (task.getResult() != null) {
final int count = successfulMethodCount.incrementAndGet();
if (count % 100 == 0) {
- main.printInfo(".");
+ main.printer.printInfo(".");
}
CompiledMethodInfo result = task.getResult();
if (result != null) {
@@ -87,9 +87,9 @@
}
} else {
failedMethodCount.incrementAndGet();
- main.printlnVerbose("");
+ main.printer.printlnVerbose("");
ResolvedJavaMethod method = task.getMethod();
- main.printlnVerbose(" failed " + method.getName() + method.getSignature().toMethodDescriptor());
+ main.printer.printlnVerbose(" failed " + method.getName() + method.getSignature().toMethodDescriptor());
}
}
@@ -98,8 +98,8 @@
final long endTime = System.currentTimeMillis();
final int success = successfulMethodCount.get();
final int failed = failedMethodCount.get();
- main.printlnInfo("");
- main.printlnInfo(success + " methods compiled, " + failed + " methods failed (" + (endTime - startTime) + " ms)");
+ main.printer.printlnInfo("");
+ main.printer.printlnInfo(success + " methods compiled, " + failed + " methods failed (" + (endTime - startTime) + " ms)");
}
}
@@ -110,7 +110,7 @@
* @param aotBackend
* @param threads number of compilation threads
*/
- public AOTCompiler(Main main, OptionValues graalOptions, AOTBackend aotBackend, final int threads) {
+ AOTCompiler(Main main, OptionValues graalOptions, AOTBackend aotBackend, final int threads) {
this.main = main;
this.graalOptions = graalOptions;
this.compileQueue = new CompileQueue(threads);
@@ -123,9 +123,9 @@
* @param classes a list of class to compile
* @throws InterruptedException
*/
- public List<AOTCompiledClass> compileClasses(List<AOTCompiledClass> classes) throws InterruptedException {
- main.printlnInfo("Compiling with " + compileQueue.getCorePoolSize() + " threads");
- main.printInfo("."); // Compilation progress indication.
+ List<AOTCompiledClass> compileClasses(List<AOTCompiledClass> classes) throws InterruptedException {
+ main.printer.printlnInfo("Compiling with " + compileQueue.getCorePoolSize() + " threads");
+ main.printer.printInfo("."); // Compilation progress indication.
for (AOTCompiledClass c : classes) {
for (ResolvedJavaMethod m : c.getMethods()) {
@@ -160,8 +160,8 @@
}
}
- public static void logCompilation(String methodName, String message) {
- Main.writeLog(message + " " + methodName);
+ static void logCompilation(String methodName, String message) {
+ LogPrinter.writeLog(message + " " + methodName);
}
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTHotSpotResolvedJavaMethod.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTHotSpotResolvedJavaMethod.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -29,18 +29,18 @@
import jdk.vm.ci.hotspot.HotSpotCompiledCode;
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
-public class AOTHotSpotResolvedJavaMethod implements JavaMethodInfo {
+final class AOTHotSpotResolvedJavaMethod implements JavaMethodInfo {
private final HotSpotResolvedJavaMethod method;
private final Backend backend;
- public AOTHotSpotResolvedJavaMethod(HotSpotResolvedJavaMethod method, Backend backend) {
+ AOTHotSpotResolvedJavaMethod(HotSpotResolvedJavaMethod method, Backend backend) {
this.method = method;
this.backend = backend;
}
public String getSymbolName() {
- return MiscUtils.uniqueMethodName(method);
+ return JavaMethodInfo.uniqueMethodName(method);
}
public String getNameAndSignature() {
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTStub.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/AOTStub.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -30,12 +30,12 @@
import jdk.vm.ci.hotspot.HotSpotCompiledCode;
-public class AOTStub implements JavaMethodInfo {
+final class AOTStub implements JavaMethodInfo {
private final Stub stub;
private final Backend backend;
- public AOTStub(Stub stub, Backend backend) {
+ AOTStub(Stub stub, Backend backend) {
this.stub = stub;
this.backend = backend;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallInfo.java Wed Aug 23 12:39:55 2017 +0000
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2016, 2017, 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 jdk.tools.jaotc;
+
+import org.graalvm.compiler.bytecode.Bytecodes;
+
+import jdk.vm.ci.code.BytecodePosition;
+import jdk.vm.ci.code.site.Call;
+import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
+import jdk.vm.ci.meta.ResolvedJavaMethod;
+
+final class CallInfo {
+
+ static boolean isStaticCall(Call call) {
+ if (isJavaCall(call)) {
+ return ((getByteCode(call) & 0xFF) == Bytecodes.INVOKESTATIC);
+ }
+ return false;
+ }
+
+ static boolean isSpecialCall(Call call) {
+ if (isJavaCall(call)) {
+ return ((getByteCode(call) & 0xFF) == Bytecodes.INVOKESPECIAL);
+ }
+ return false;
+ }
+
+ private static boolean isInvokeVirtual(Call call) {
+ if (isJavaCall(call)) {
+ return ((getByteCode(call) & 0xFF) == Bytecodes.INVOKEVIRTUAL) || ((getByteCode(call) & 0xFF) == Bytecodes.INVOKEINTERFACE);
+ }
+ return false;
+ }
+
+ static boolean isVirtualCall(CompiledMethodInfo methodInfo, Call call) {
+ return isInvokeVirtual(call) && !methodInfo.hasMark(call, MarkId.INVOKESPECIAL);
+ }
+
+ static boolean isOptVirtualCall(CompiledMethodInfo methodInfo, Call call) {
+ return isInvokeVirtual(call) && methodInfo.hasMark(call, MarkId.INVOKESPECIAL);
+ }
+
+ private static boolean isJavaCall(Call call) {
+ // If there is no associated debug info return false
+ if (call.debugInfo == null) {
+ return false;
+ }
+ BytecodePosition bcpos = call.debugInfo.getBytecodePosition();
+ ResolvedJavaMethod method = bcpos.getMethod();
+ // If bytecode position indicates a special value (negative value) it is
+ // not a normal java call
+ if (bcpos.getBCI() < 0) {
+ return false;
+ }
+ // If there is no method associated with the debuginfo, return false
+ if (method == null) {
+ return false;
+ }
+ assert (method instanceof HotSpotResolvedJavaMethod) : "Not a resolved Java call";
+ return true;
+ }
+
+ private static byte getByteCode(Call call) {
+ ResolvedJavaMethod m = call.debugInfo.getBytecodePosition().getMethod();
+ int callPosition = call.debugInfo.getBytecodePosition().getBCI();
+ byte[] code = m.getCode();
+ return code[callPosition];
+ }
+
+}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallSiteRelocationInfo.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallSiteRelocationInfo.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -31,10 +31,10 @@
*/
abstract class CallSiteRelocationInfo {
- public final String targetSymbol;
- public final RelocType type;
+ final String targetSymbol;
+ final RelocType type;
- public CallSiteRelocationInfo(String targetSymbol, RelocType type) {
+ CallSiteRelocationInfo(String targetSymbol, RelocType type) {
this.targetSymbol = targetSymbol;
this.type = type;
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallSiteRelocationSymbol.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CallSiteRelocationSymbol.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -37,9 +37,9 @@
*/
abstract class CallSiteRelocationSymbol {
- public final Symbol symbol;
+ final Symbol symbol;
- public CallSiteRelocationSymbol(Symbol symbol) {
+ CallSiteRelocationSymbol(Symbol symbol) {
assert symbol != null;
this.symbol = symbol;
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CodeOffsets.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CodeOffsets.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -27,7 +27,7 @@
import jdk.vm.ci.code.site.Mark;
-public final class CodeOffsets {
+final class CodeOffsets {
private final int entry;
private final int verifiedEntry;
private final int exceptionHandler;
@@ -40,7 +40,7 @@
this.deoptHandler = deoptHandler;
}
- public static CodeOffsets buildFrom(List<Mark> marks) {
+ static CodeOffsets buildFrom(List<Mark> marks) {
int entry = 0;
int verifiedEntry = 0;
int exceptionHandler = -1;
@@ -73,19 +73,19 @@
return new CodeOffsets(entry, verifiedEntry, exceptionHandler, deoptHandler);
}
- public int entry() {
+ int entry() {
return entry;
}
- public int verifiedEntry() {
+ int verifiedEntry() {
return verifiedEntry;
}
- public int exceptionHandler() {
+ int exceptionHandler() {
return exceptionHandler;
}
- public int deoptHandler() {
+ int deoptHandler() {
return deoptHandler;
}
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CodeSectionProcessor.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CodeSectionProcessor.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -28,7 +28,7 @@
import jdk.tools.jaotc.binformat.BinaryContainer;
import jdk.tools.jaotc.binformat.CodeContainer;
import jdk.tools.jaotc.binformat.Symbol;
-import jdk.tools.jaotc.CompiledMethodInfo.StubInformation;
+import jdk.tools.jaotc.StubInformation;
import org.graalvm.compiler.code.CompilationResult;
import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
@@ -38,7 +38,7 @@
import jdk.vm.ci.code.site.InfopointReason;
import jdk.vm.ci.meta.ResolvedJavaMethod;
-class CodeSectionProcessor {
+final class CodeSectionProcessor {
private final TargetDescription target;
@@ -89,11 +89,11 @@
// Align and pad method entry
CodeContainer codeSection = binaryContainer.getCodeContainer();
- int codeIdOffset = binaryContainer.alignUp(codeSection, binaryContainer.getCodeSegmentSize());
+ int codeIdOffset = BinaryContainer.alignUp(codeSection, binaryContainer.getCodeSegmentSize());
// Store CodeId into code. It will be use by find_aot() using code.segments
methodInfo.setCodeId();
binaryContainer.appendIntToCode(methodInfo.getCodeId());
- int textBaseOffset = binaryContainer.alignUp(codeSection, binaryContainer.getCodeEntryAlignment());
+ int textBaseOffset = BinaryContainer.alignUp(codeSection, binaryContainer.getCodeEntryAlignment());
codeSection.createSymbol(textBaseOffset, Symbol.Kind.JAVA_FUNCTION, Symbol.Binding.LOCAL, targetCodeSize, entry);
@@ -102,7 +102,7 @@
// Write code bytes of the current method into byte stream
binaryContainer.appendCodeBytes(targetCode, 0, targetCodeSize);
- int currentStubOffset = binaryContainer.alignUp(codeSection, 8);
+ int currentStubOffset = BinaryContainer.alignUp(codeSection, 8);
// Set the offset at which stubs of this method would be laid out
methodInfo.setStubsOffset(currentStubOffset - textBaseOffset);
// step through all calls, for every call, add a stub
@@ -111,10 +111,10 @@
final Call callInfopoint = (Call) infopoint;
if (callInfopoint.target instanceof ResolvedJavaMethod) {
ResolvedJavaMethod call = (ResolvedJavaMethod) callInfopoint.target;
- StubInformation stub = addCallStub(MiscUtils.isVirtualCall(methodInfo, callInfopoint));
+ StubInformation stub = addCallStub(CallInfo.isVirtualCall(methodInfo, callInfopoint));
// Get the targetSymbol. A symbol for this will be created later during plt
// creation
- String targetSymbol = MiscUtils.uniqueMethodName(call) + ".at." + infopoint.pcOffset;
+ String targetSymbol = JavaMethodInfo.uniqueMethodName(call) + ".at." + infopoint.pcOffset;
methodInfo.addStubCode(targetSymbol, stub);
currentStubOffset += stub.getSize();
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Collector.java Wed Aug 23 12:39:55 2017 +0000
@@ -0,0 +1,218 @@
+/*
+ * Copyright (c) 2017, 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 jdk.tools.jaotc;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import jdk.tools.jaotc.collect.ClassSearch;
+import jdk.tools.jaotc.collect.FileSupport;
+import jdk.tools.jaotc.collect.classname.ClassNameSourceProvider;
+import jdk.tools.jaotc.collect.directory.DirectorySourceProvider;
+import jdk.tools.jaotc.collect.jar.JarSourceProvider;
+import jdk.tools.jaotc.collect.module.ModuleSourceProvider;
+import jdk.vm.ci.meta.MetaAccessProvider;
+import jdk.vm.ci.meta.ResolvedJavaMethod;
+import jdk.vm.ci.meta.ResolvedJavaType;
+
+final class Collector {
+
+ private final Main main;
+
+ Collector(Main main) {
+ this.main = main;
+ }
+
+ Set<Class<?>> collectClassesToCompile() {
+ Set<Class<?>> classesToCompile = new HashSet<>();
+ FileSupport fileSupport = new FileSupport();
+ ClassSearch lookup = new ClassSearch();
+ lookup.addProvider(new ModuleSourceProvider());
+ lookup.addProvider(new ClassNameSourceProvider(fileSupport));
+ lookup.addProvider(new JarSourceProvider());
+ lookup.addProvider(new DirectorySourceProvider(fileSupport));
+
+ List<LoadedClass> foundClasses = null;
+ try {
+ foundClasses = lookup.search(main.options.files, main.options.searchPath);
+ } catch (InternalError e) {
+ main.printer.reportError(e);
+ return null;
+ }
+
+ for (LoadedClass loadedClass : foundClasses) {
+ classesToCompile.add(loadedClass.getLoadedClass());
+ }
+ return classesToCompile;
+ }
+
+ private void addMethods(AOTCompiledClass aotClass, ResolvedJavaMethod[] methods, CompilationSpec compilationRestrictions) {
+ for (ResolvedJavaMethod m : methods) {
+ addMethod(aotClass, m, compilationRestrictions);
+ }
+ }
+
+ private void addMethod(AOTCompiledClass aotClass, ResolvedJavaMethod method, CompilationSpec compilationRestrictions) {
+ // Don't compile native or abstract methods.
+ if (!method.hasBytecodes()) {
+ return;
+ }
+ if (!compilationRestrictions.shouldCompileMethod(method)) {
+ return;
+ }
+ if (!main.filters.shouldCompileMethod(method)) {
+ return;
+ }
+
+ aotClass.addMethod(method);
+ main.printer.printlnVerbose(" added " + method.getName() + method.getSignature().toMethodDescriptor());
+ }
+
+ /**
+ * Collect all method we should compile.
+ *
+ * @return array list of AOT classes which have compiled methods.
+ */
+ List<AOTCompiledClass> collectMethodsToCompile(Set<Class<?>> classesToCompile, MetaAccessProvider metaAccess) {
+ int total = 0;
+ int count = 0;
+ List<AOTCompiledClass> classes = new ArrayList<>();
+ CompilationSpec compilationRestrictions = collectSpecifiedMethods();
+
+ for (Class<?> c : classesToCompile) {
+ ResolvedJavaType resolvedJavaType = metaAccess.lookupJavaType(c);
+ if (main.filters.shouldCompileAnyMethodInClass(resolvedJavaType)) {
+ AOTCompiledClass aotClass = new AOTCompiledClass(resolvedJavaType);
+ main.printer.printlnVerbose(" Scanning " + c.getName());
+
+ // Constructors
+ try {
+ ResolvedJavaMethod[] ctors = resolvedJavaType.getDeclaredConstructors();
+ addMethods(aotClass, ctors, compilationRestrictions);
+ total += ctors.length;
+ } catch (Throwable e) {
+ // If we are running in JCK mode we ignore all exceptions.
+ if (main.options.ignoreClassLoadingErrors) {
+ main.printer.printError(c.getName() + ": " + e);
+ } else {
+ throw new InternalError(e);
+ }
+ }
+
+ // Methods
+ try {
+ ResolvedJavaMethod[] methods = resolvedJavaType.getDeclaredMethods();
+ addMethods(aotClass, methods, compilationRestrictions);
+ total += methods.length;
+ } catch (Throwable e) {
+ // If we are running in JCK mode we ignore all exceptions.
+ if (main.options.ignoreClassLoadingErrors) {
+ main.printer.printError(c.getName() + ": " + e);
+ } else {
+ throw new InternalError(e);
+ }
+ }
+
+ // Class initializer
+ try {
+ ResolvedJavaMethod clinit = resolvedJavaType.getClassInitializer();
+ if (clinit != null) {
+ addMethod(aotClass, clinit, compilationRestrictions);
+ total++;
+ }
+ } catch (Throwable e) {
+ // If we are running in JCK mode we ignore all exceptions.
+ if (main.options.ignoreClassLoadingErrors) {
+ main.printer.printError(c.getName() + ": " + e);
+ } else {
+ throw new InternalError(e);
+ }
+ }
+
+ // Found any methods to compile? Add the class.
+ if (aotClass.hasMethods()) {
+ classes.add(aotClass);
+ count += aotClass.getMethodCount();
+ }
+ }
+ }
+ main.printer.printInfo(total + " methods total, " + count + " methods to compile");
+ return classes;
+ }
+
+ /**
+ * If a file with compilation limitations is specified using flag --compile-commands, read the
+ * file's contents and collect the restrictions.
+ */
+ private CompilationSpec collectSpecifiedMethods() {
+ CompilationSpec compilationRestrictions = new CompilationSpec();
+ String methodListFileName = main.options.methodList;
+
+ if (methodListFileName != null && !methodListFileName.equals("")) {
+ try {
+ FileReader methListFile = new FileReader(methodListFileName);
+ BufferedReader readBuf = new BufferedReader(methListFile);
+ String line = null;
+ while ((line = readBuf.readLine()) != null) {
+ String trimmedLine = line.trim();
+ if (!trimmedLine.startsWith("#")) {
+ String[] components = trimmedLine.split(" ");
+ if (components.length == 2) {
+ String directive = components[0];
+ String pattern = components[1];
+ switch (directive) {
+ case "compileOnly":
+ compilationRestrictions.addCompileOnlyPattern(pattern);
+ break;
+ case "exclude":
+ compilationRestrictions.addExcludePattern(pattern);
+ break;
+ default:
+ System.out.println("Unrecognized command " + directive + ". Ignoring\n\t" + line + "\n encountered in " + methodListFileName);
+ }
+ } else {
+ if (!trimmedLine.equals("")) {
+ System.out.println("Ignoring malformed line:\n\t " + line + "\n");
+ }
+ }
+ }
+ }
+ readBuf.close();
+ } catch (FileNotFoundException e) {
+ throw new InternalError("Unable to open method list file: " + methodListFileName, e);
+ } catch (IOException e) {
+ throw new InternalError("Unable to read method list file: " + methodListFileName, e);
+ }
+ }
+
+ return compilationRestrictions;
+ }
+
+}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CompilationSpec.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CompilationSpec.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -32,7 +32,7 @@
/**
* A class encapsulating any user-specified compilation restrictions.
*/
-public class CompilationSpec {
+final class CompilationSpec {
/**
* Set of method names to restrict compilation to.
@@ -51,7 +51,7 @@
*
* @param pattern regex or non-regex pattern string
*/
- public void addCompileOnlyPattern(String pattern) {
+ void addCompileOnlyPattern(String pattern) {
if (pattern.contains("*")) {
compileOnlyPatterns.add(Pattern.compile(pattern));
} else {
@@ -64,7 +64,7 @@
*
* @param pattern regex or non-regex pattern string
*/
- public void addExcludePattern(String pattern) {
+ void addExcludePattern(String pattern) {
if (pattern.contains("*")) {
excludePatterns.add(Pattern.compile(pattern));
} else {
@@ -78,14 +78,14 @@
* @param method method to be checked
* @return true or false
*/
- public boolean shouldCompileMethod(ResolvedJavaMethod method) {
+ boolean shouldCompileMethod(ResolvedJavaMethod method) {
if (compileWithRestrictions()) {
// If there are user-specified compileOnly patterns, default action
// is not to compile the method.
boolean compileMethod = compileOnlyStrings.isEmpty() && compileOnlyPatterns.isEmpty();
// Check if the method matches with any of the specified compileOnly patterns.
- String methodName = MiscUtils.uniqueMethodName(method);
+ String methodName = JavaMethodInfo.uniqueMethodName(method);
// compileOnly
if (!compileMethod) {
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CompiledMethodInfo.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/CompiledMethodInfo.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -37,104 +37,7 @@
import jdk.vm.ci.hotspot.HotSpotCompiledCode;
import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
-public class CompiledMethodInfo {
-
- public static class StubInformation {
- int stubOffset; // the offset inside the code (text + stubOffset)
- int stubSize; // the stub size
- int dispatchJumpOffset; // offset after main dispatch jump instruction
- int resolveJumpOffset; // offset after jump instruction to runtime call resolution
- // function.
- int resolveJumpStart; // offset of jump instruction to VM runtime call resolution
- // function.
- int c2iJumpOffset; // offset after jump instruction to c2i adapter for static calls.
- int movOffset; // offset after move instruction which loads from got cell:
- // - Method* for static call
- // - Klass* for virtual call
-
- boolean isVirtual; // virtual call stub
-
- // maybe add type of stub as well, right now we only have static stubs
-
- public StubInformation(int stubOffset, boolean isVirtual) {
- this.stubOffset = stubOffset;
- this.isVirtual = isVirtual;
- this.stubSize = -1;
- this.movOffset = -1;
- this.c2iJumpOffset = -1;
- this.resolveJumpOffset = -1;
- this.resolveJumpStart = -1;
- this.dispatchJumpOffset = -1;
- }
-
- public int getOffset() {
- return stubOffset;
- }
-
- public boolean isVirtual() {
- return isVirtual;
- }
-
- public void setSize(int stubSize) {
- this.stubSize = stubSize;
- }
-
- public int getSize() {
- return stubSize;
- }
-
- public void setMovOffset(int movOffset) {
- this.movOffset = movOffset + stubOffset;
- }
-
- public int getMovOffset() {
- return movOffset;
- }
-
- public void setC2IJumpOffset(int c2iJumpOffset) {
- this.c2iJumpOffset = c2iJumpOffset + stubOffset;
- }
-
- public int getC2IJumpOffset() {
- return c2iJumpOffset;
- }
-
- public void setResolveJumpOffset(int resolveJumpOffset) {
- this.resolveJumpOffset = resolveJumpOffset + stubOffset;
- }
-
- public int getResolveJumpOffset() {
- return resolveJumpOffset;
- }
-
- public void setResolveJumpStart(int resolveJumpStart) {
- this.resolveJumpStart = resolveJumpStart + stubOffset;
- }
-
- public int getResolveJumpStart() {
- return resolveJumpStart;
- }
-
- public void setDispatchJumpOffset(int dispatchJumpOffset) {
- this.dispatchJumpOffset = dispatchJumpOffset + stubOffset;
- }
-
- public int getDispatchJumpOffset() {
- return dispatchJumpOffset;
- }
-
- public void verify() {
- assert stubOffset > 0 : "incorrect stubOffset: " + stubOffset;
- assert stubSize > 0 : "incorrect stubSize: " + stubSize;
- assert movOffset > 0 : "incorrect movOffset: " + movOffset;
- assert dispatchJumpOffset > 0 : "incorrect dispatchJumpOffset: " + dispatchJumpOffset;
- assert resolveJumpStart > 0 : "incorrect resolveJumpStart: " + resolveJumpStart;
- assert resolveJumpOffset > 0 : "incorrect resolveJumpOffset: " + resolveJumpOffset;
- if (!isVirtual) {
- assert c2iJumpOffset > 0 : "incorrect c2iJumpOffset: " + c2iJumpOffset;
- }
- }
- }
+final class CompiledMethodInfo {
private static final int UNINITIALIZED_OFFSET = -1;
@@ -169,7 +72,7 @@
*/
private int codeId;
- public AOTMethodOffsets() {
+ AOTMethodOffsets() {
this.nameOffset = UNINITIALIZED_OFFSET;
this.textSectionOffset = UNINITIALIZED_OFFSET;
this.metadataOffset = UNINITIALIZED_OFFSET;
@@ -178,7 +81,7 @@
this.codeId = -1;
}
- protected void addMethodOffsets(ReadOnlyDataContainer container, String name) {
+ void addMethodOffsets(ReadOnlyDataContainer container, String name) {
verify(name);
// @formatter:off
/*
@@ -291,7 +194,7 @@
*/
private static final AtomicInteger methodsCount = new AtomicInteger();
- public CompiledMethodInfo(CompilationResult compilationResult, JavaMethodInfo methodInfo) {
+ CompiledMethodInfo(CompilationResult compilationResult, JavaMethodInfo methodInfo) {
this.name = methodInfo.getNameAndSignature();
this.compilationResult = compilationResult;
this.methodInfo = methodInfo;
@@ -299,11 +202,11 @@
this.methodOffsets = new AOTMethodOffsets();
}
- public String name() {
+ String name() {
return name;
}
- public void addMethodOffsets(BinaryContainer binaryContainer, ReadOnlyDataContainer container) {
+ void addMethodOffsets(BinaryContainer binaryContainer, ReadOnlyDataContainer container) {
this.methodOffsets.setNameOffset(binaryContainer.addMetaspaceName(name));
this.methodOffsets.addMethodOffsets(container, name);
for (AOTKlassData data : dependentKlasses.values()) {
@@ -311,15 +214,15 @@
}
}
- public CompilationResult getCompilationResult() {
+ CompilationResult getCompilationResult() {
return compilationResult;
}
- public JavaMethodInfo getMethodInfo() {
+ JavaMethodInfo getMethodInfo() {
return methodInfo;
}
- public void setTextSectionOffset(int textSectionOffset) {
+ void setTextSectionOffset(int textSectionOffset) {
methodOffsets.setTextSectionOffset(textSectionOffset);
}
@@ -327,66 +230,66 @@
return methodOffsets.getTextSectionOffset();
}
- public void setCodeId() {
+ void setCodeId() {
methodOffsets.setCodeId(CompiledMethodInfo.getNextCodeId());
}
- public int getCodeId() {
+ int getCodeId() {
return this.methodOffsets.getCodeId();
}
- public static int getMethodsCount() {
+ static int getMethodsCount() {
return methodsCount.get();
}
- public static int getNextCodeId() {
+ static int getNextCodeId() {
return methodsCount.getAndIncrement();
}
- public int getCodeSize() {
+ int getCodeSize() {
return stubsOffset + getStubCodeSize();
}
- public int getStubCodeSize() {
+ int getStubCodeSize() {
return totalStubSize;
}
- public void setMetadataOffset(int offset) {
+ void setMetadataOffset(int offset) {
this.methodOffsets.setMetadataOffset(offset);
}
/**
* Offset into the code of this method where the stub section starts.
*/
- public void setStubsOffset(int offset) {
+ void setStubsOffset(int offset) {
stubsOffset = offset;
}
- public int getStubsOffset() {
+ int getStubsOffset() {
return stubsOffset;
}
- public void setMetadataGotOffset(int metadataGotOffset) {
+ void setMetadataGotOffset(int metadataGotOffset) {
this.methodOffsets.setMetadataGotOffset(metadataGotOffset);
}
- public void setMetadataGotSize(int length) {
+ void setMetadataGotSize(int length) {
this.methodOffsets.setMetadataGotSize(length);
}
- public void addStubCode(String call, StubInformation stub) {
+ void addStubCode(String call, StubInformation stub) {
stubs.put(call, stub);
totalStubSize += stub.getSize();
}
- public StubInformation getStubFor(String call) {
+ StubInformation getStubFor(String call) {
StubInformation stub = stubs.get(call);
assert stub != null : "missing stub for call " + call;
stub.verify();
return stub;
}
- public void addDependentKlassData(BinaryContainer binaryContainer, HotSpotResolvedObjectType type) {
+ void addDependentKlassData(BinaryContainer binaryContainer, HotSpotResolvedObjectType type) {
AOTKlassData klassData = AOTCompiledClass.addFingerprintKlassData(binaryContainer, type);
String klassName = type.getName();
@@ -397,11 +300,11 @@
}
}
- public AOTKlassData getDependentKlassData(String klassName) {
+ AOTKlassData getDependentKlassData(String klassName) {
return dependentKlasses.get(klassName);
}
- public boolean hasMark(Site call, MarkId id) {
+ boolean hasMark(Site call, MarkId id) {
for (Mark m : compilationResult.getMarks()) {
// TODO: X64-specific code.
// Call instructions are aligned to 8
@@ -415,11 +318,11 @@
return false;
}
- public String asTag() {
+ String asTag() {
return "[" + methodInfo.getSymbolName() + "]";
}
- public HotSpotCompiledCode compiledCode() {
+ HotSpotCompiledCode compiledCode() {
if (code == null) {
code = methodInfo.compiledCode(compilationResult);
}
@@ -427,12 +330,12 @@
}
// Free memory
- public void clear() {
+ void clear() {
this.dependentKlasses = null;
this.name = null;
}
- public void clearCompileData() {
+ void clearCompileData() {
this.code = null;
this.stubs = null;
this.compilationResult = null;
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/DataBuilder.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/DataBuilder.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -31,7 +31,7 @@
import jdk.tools.jaotc.binformat.BinaryContainer;
import jdk.tools.jaotc.binformat.ByteContainer;
import jdk.tools.jaotc.binformat.HeaderContainer;
-import jdk.tools.jaotc.utils.Timer;
+
import org.graalvm.compiler.code.CompilationResult;
import org.graalvm.compiler.debug.DebugContext;
import org.graalvm.compiler.hotspot.HotSpotHostBackend;
@@ -42,7 +42,7 @@
import jdk.vm.ci.hotspot.HotSpotVMConfigStore;
import jdk.vm.ci.hotspot.VMField;
-class DataBuilder {
+final class DataBuilder {
private final Main main;
@@ -55,9 +55,9 @@
*/
private final BinaryContainer binaryContainer;
- private final HashMap<Long, String> vmAddresses = new HashMap<>();
+ private static final HashMap<Long, String> vmAddresses = new HashMap<>();
- public DataBuilder(Main main, HotSpotHostBackend backend, List<AOTCompiledClass> classes, BinaryContainer binaryContainer) {
+ DataBuilder(Main main, HotSpotHostBackend backend, List<AOTCompiledClass> classes, BinaryContainer binaryContainer) {
this.main = main;
this.backend = backend;
this.classes = classes;
@@ -68,7 +68,7 @@
/**
* Returns a value-name map of all {@link VMField} fields.
*/
- private void fillVMAddresses(HotSpotVMConfigStore config) {
+ private static void fillVMAddresses(HotSpotVMConfigStore config) {
for (VMField vmField : config.getFields().values()) {
if (vmField.value != null && vmField.value instanceof Long) {
final long address = (Long) vmField.value;
@@ -98,7 +98,7 @@
* @param address native address
* @return C/C++ functio name associated with the native address
*/
- public String getVMFunctionNameForAddress(long address) {
+ static String getVMFunctionNameForAddress(long address) {
return vmAddresses.get(address);
}
@@ -107,7 +107,7 @@
*
* @return host backend
*/
- public HotSpotHostBackend getBackend() {
+ HotSpotHostBackend getBackend() {
return backend;
}
@@ -116,7 +116,7 @@
*
* @return binary container
*/
- public BinaryContainer getBinaryContainer() {
+ BinaryContainer getBinaryContainer() {
return binaryContainer;
}
@@ -128,7 +128,7 @@
* @throws Exception
*/
@SuppressWarnings("try")
- public void prepareData(DebugContext debug) throws Exception {
+ void prepareData(DebugContext debug) throws Exception {
try (Timer t = new Timer(main, "Parsing compiled code")) {
/*
* Copy compiled code into code section container and calls stubs (PLT trampoline).
@@ -147,7 +147,7 @@
// Free memory!
try (Timer t = main.options.verbose ? new Timer(main, "Freeing memory") : null) {
- main.printMemoryUsage();
+ main.printer.printMemoryUsage();
System.gc();
}
@@ -163,7 +163,7 @@
// Free memory!
try (Timer t = main.options.verbose ? new Timer(main, "Freeing memory") : null) {
- main.printMemoryUsage();
+ main.printer.printMemoryUsage();
System.gc();
}
@@ -172,7 +172,7 @@
}
try (Timer t = new Timer(main, "Preparing compiled binary")) {
// Should be called after Stubs because they can set dependent klasses.
- prepareCompiledBinary(metadataBuilder);
+ prepareCompiledBinary();
}
}
@@ -203,7 +203,7 @@
/**
* Prepare metaspace.offsets section.
*/
- private void prepareCompiledBinary(MetadataBuilder metadataBuilder) {
+ private void prepareCompiledBinary() {
for (AOTCompiledClass c : classes) {
// Create records for compiled AOT methods.
c.putMethodsData(binaryContainer);
@@ -216,8 +216,8 @@
header.setClassesCount(AOTCompiledClass.getClassesCount());
header.setMethodsCount(CompiledMethodInfo.getMethodsCount());
// Record size of got sections
- ByteContainer bc = binaryContainer.getMetaspaceGotContainer();
- header.setMetaspaceGotSize((bc.getByteStreamSize() / 8));
+ ByteContainer bc = binaryContainer.getKlassesGotContainer();
+ header.setKlassesGotSize((bc.getByteStreamSize() / 8));
bc = binaryContainer.getMetadataGotContainer();
header.setMetadataGotSize((bc.getByteStreamSize() / 8));
bc = binaryContainer.getOopGotContainer();
@@ -232,7 +232,7 @@
// them.
ArrayList<CompiledMethodInfo> compiledStubs = compiledClass.getCompiledMethods();
int cntStubs = compiledStubs.size();
- binaryContainer.addMethodsCount(cntStubs, binaryContainer.getStubsOffsetsContainer());
+ BinaryContainer.addMethodsCount(cntStubs, binaryContainer.getStubsOffsetsContainer());
for (CompiledMethodInfo methodInfo : compiledStubs) {
// Note, stubs have different offsets container.
methodInfo.addMethodOffsets(binaryContainer, binaryContainer.getStubsOffsetsContainer());
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/DataPatchProcessor.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/DataPatchProcessor.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -32,7 +32,6 @@
import jdk.tools.jaotc.binformat.Symbol;
import jdk.tools.jaotc.binformat.Symbol.Binding;
import jdk.tools.jaotc.binformat.Symbol.Kind;
-import jdk.tools.jaotc.AOTCompiledClass.AOTKlassData;
import org.graalvm.compiler.code.DataSection;
import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
@@ -47,7 +46,7 @@
import jdk.vm.ci.hotspot.HotSpotSentinelConstant;
import jdk.vm.ci.meta.VMConstant;
-class DataPatchProcessor {
+final class DataPatchProcessor {
private final TargetDescription target;
@@ -89,9 +88,9 @@
gotName = ((action == HotSpotConstantLoadAction.INITIALIZE) ? "got.init." : "got.") + targetSymbol;
methodInfo.addDependentKlassData(binaryContainer, type);
} else if (metaspaceConstant.asResolvedJavaMethod() != null && action == HotSpotConstantLoadAction.LOAD_COUNTERS) {
- targetSymbol = "counters." + MiscUtils.uniqueMethodName(metaspaceConstant.asResolvedJavaMethod());
+ targetSymbol = "counters." + JavaMethodInfo.uniqueMethodName(metaspaceConstant.asResolvedJavaMethod());
gotName = "got." + targetSymbol;
- binaryContainer.addMetaspaceSymbol(targetSymbol);
+ binaryContainer.addCountersSymbol(targetSymbol);
}
} else if (constant instanceof HotSpotObjectConstant) {
// String constant.
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ELFMacroAssembler.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ELFMacroAssembler.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -23,7 +23,7 @@
package jdk.tools.jaotc;
-import jdk.tools.jaotc.CompiledMethodInfo.StubInformation;
+import jdk.tools.jaotc.StubInformation;
import jdk.tools.jaotc.amd64.AMD64ELFMacroAssembler;
import jdk.vm.ci.amd64.AMD64;
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignCallSiteRelocationInfo.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignCallSiteRelocationInfo.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -37,21 +37,20 @@
*/
final class ForeignCallSiteRelocationInfo extends CallSiteRelocationInfo {
- ForeignCallSiteRelocationInfo(Call call, HotSpotForeignCallLinkage callTarget, DataBuilder dataBuilder) {
- super(getTargetSymbol(call, callTarget, dataBuilder), getRelocType(callTarget));
+ ForeignCallSiteRelocationInfo(Call call, HotSpotForeignCallLinkage callTarget) {
+ super(getTargetSymbol(call, callTarget), getRelocType(callTarget));
}
- private static String getTargetSymbol(Call call, HotSpotForeignCallLinkage callTarget, DataBuilder dataBuilder) {
+ private static String getTargetSymbol(Call call, HotSpotForeignCallLinkage callTarget) {
// If it specifies a foreign call linkage, find the symbol corresponding to the address in
// HotSpotVMConfig's fields.
final long foreignCallTargetAddress = callTarget.getAddress();
// Get the C/C++ function name associated with the foreign call target address.
- String functionName = dataBuilder.getVMFunctionNameForAddress(foreignCallTargetAddress);
+ String functionName = DataBuilder.getVMFunctionNameForAddress(foreignCallTargetAddress);
if (functionName != null) {
// Use the known global AOT symbol associated with function name, if one exists
- BinaryContainer binaryContainer = dataBuilder.getBinaryContainer();
- String aotSymbol = binaryContainer.getAOTSymbolForVMFunctionName(functionName);
+ String aotSymbol = BinaryContainer.getAOTSymbolForVMFunctionName(functionName);
if (aotSymbol == null) {
throw new InternalError("no global symbol found for: " + functionName);
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignCallSiteRelocationSymbol.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignCallSiteRelocationSymbol.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -32,7 +32,7 @@
*/
final class ForeignCallSiteRelocationSymbol extends CallSiteRelocationSymbol {
- public ForeignCallSiteRelocationSymbol(CallSiteRelocationInfo callSiteRelocation, BinaryContainer binaryContainer) {
+ ForeignCallSiteRelocationSymbol(CallSiteRelocationInfo callSiteRelocation, BinaryContainer binaryContainer) {
super(binaryContainer.createSymbol(0, Kind.NATIVE_FUNCTION, Binding.GLOBAL, 0, callSiteRelocation.targetSymbol));
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignGotCallSiteRelocationSymbol.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/ForeignGotCallSiteRelocationSymbol.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -30,7 +30,7 @@
final class ForeignGotCallSiteRelocationSymbol extends CallSiteRelocationSymbol {
- public ForeignGotCallSiteRelocationSymbol(CompiledMethodInfo mi, Call call, CallSiteRelocationInfo callSiteRelocation, DataBuilder dataBuilder) {
+ ForeignGotCallSiteRelocationSymbol(CompiledMethodInfo mi, Call call, CallSiteRelocationInfo callSiteRelocation, DataBuilder dataBuilder) {
super(createPltSymbol(dataBuilder, mi, call, callSiteRelocation));
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/GraalFilters.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/GraalFilters.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -45,7 +45,7 @@
import org.graalvm.compiler.replacements.Snippets;
import org.graalvm.word.WordBase;
-public class GraalFilters {
+final class GraalFilters {
private List<ResolvedJavaType> specialClasses;
private List<ResolvedJavaType> specialArgumentAndReturnTypes;
@@ -57,7 +57,7 @@
skipAnnotations.add(MethodSubstitution.class);
}
- public boolean shouldCompileMethod(ResolvedJavaMethod method) {
+ boolean shouldCompileMethod(ResolvedJavaMethod method) {
// NodeIntrinsics cannot be compiled.
if (hasExcludedAnnotation(method)) {
return false;
@@ -83,7 +83,7 @@
return false;
}
- public boolean shouldCompileAnyMethodInClass(ResolvedJavaType klass) {
+ boolean shouldCompileAnyMethodInClass(ResolvedJavaType klass) {
if (specialClasses.stream().filter(s -> s.isAssignableFrom(klass)).findAny().isPresent()) {
return false;
}
@@ -113,7 +113,7 @@
specialArgumentAndReturnTypes = getSpecialArgumentAndReturnTypes(metaAccess);
}
- public boolean shouldIgnoreException(Throwable e) {
+ static boolean shouldIgnoreException(Throwable e) {
if (e instanceof GraalError) {
String m = e.getMessage();
if (m.contains("ArrayKlass::_component_mirror")) {
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/InfopointProcessor.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/InfopointProcessor.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -28,16 +28,14 @@
import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
import jdk.vm.ci.code.BytecodePosition;
-import jdk.vm.ci.code.DebugInfo;
import jdk.vm.ci.code.VirtualObject;
import jdk.vm.ci.code.site.Call;
import jdk.vm.ci.code.site.Infopoint;
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
-import jdk.vm.ci.hotspot.HotSpotResolvedJavaType;
import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
import jdk.vm.ci.meta.InvokeTarget;
-class InfopointProcessor {
+final class InfopointProcessor {
private final DataBuilder dataBuilder;
@@ -70,9 +68,13 @@
default:
throw new InternalError("Unknown info point reason: " + info.reason);
}
- if (info.debugInfo == null) return;
+ if (info.debugInfo == null) {
+ return;
+ }
BytecodePosition bcp = info.debugInfo.getBytecodePosition();
- if (bcp == null) return;
+ if (bcp == null) {
+ return;
+ }
recordScopeKlasses(methodInfo, bcp, info.debugInfo.getVirtualObjectMapping());
}
@@ -82,14 +84,15 @@
recordScopeKlasses(methodInfo, caller, vos);
}
- HotSpotResolvedJavaMethod m = (HotSpotResolvedJavaMethod)bcp.getMethod();
+ HotSpotResolvedJavaMethod m = (HotSpotResolvedJavaMethod) bcp.getMethod();
HotSpotResolvedObjectType klass = m.getDeclaringClass();
methodInfo.addDependentKlassData(binaryContainer, klass);
- if (vos == null) return;
-
+ if (vos == null) {
+ return;
+ }
for (VirtualObject vo : vos) {
- HotSpotResolvedObjectType vk = (HotSpotResolvedObjectType)vo.getType();
+ HotSpotResolvedObjectType vk = (HotSpotResolvedObjectType) vo.getType();
methodInfo.addDependentKlassData(binaryContainer, vk);
}
@@ -116,12 +119,12 @@
/**
* Get information about the call site. Name of the callee and relocation call type.
*/
- private CallSiteRelocationInfo getCallSiteRelocationInfo(Call call) {
+ private static CallSiteRelocationInfo getCallSiteRelocationInfo(Call call) {
InvokeTarget callTarget = call.target;
if (callTarget instanceof HotSpotResolvedJavaMethod) {
return new JavaCallSiteRelocationInfo(call, (HotSpotResolvedJavaMethod) callTarget);
} else if (callTarget instanceof HotSpotForeignCallLinkage) {
- return new ForeignCallSiteRelocationInfo(call, (HotSpotForeignCallLinkage) callTarget, dataBuilder);
+ return new ForeignCallSiteRelocationInfo(call, (HotSpotForeignCallLinkage) callTarget);
} else {
throw new InternalError("Unhandled call type found in infopoint: " + callTarget);
}
@@ -136,10 +139,6 @@
return new StubDirectCallSiteRelocationSymbol(callSiteRelocation, binaryContainer);
case FOREIGN_CALL_INDIRECT_GOT:
return new ForeignGotCallSiteRelocationSymbol(mi, call, callSiteRelocation, dataBuilder);
- case FOREIGN_CALL_DIRECT:
- case FOREIGN_CALL_DIRECT_FAR:
- case FOREIGN_CALL_INDIRECT:
- return new ForeignCallSiteRelocationSymbol(callSiteRelocation, binaryContainer);
default:
return new JavaCallSiteRelocationSymbol(mi, call, callSiteRelocation, binaryContainer);
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaCallSiteRelocationInfo.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaCallSiteRelocationInfo.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -34,8 +34,8 @@
*/
final class JavaCallSiteRelocationInfo extends CallSiteRelocationInfo {
- public JavaCallSiteRelocationInfo(Call call, HotSpotResolvedJavaMethod callTarget) {
- super(MiscUtils.uniqueMethodName(callTarget), call.direct ? RelocType.JAVA_CALL_DIRECT : RelocType.JAVA_CALL_INDIRECT);
+ JavaCallSiteRelocationInfo(Call call, HotSpotResolvedJavaMethod callTarget) {
+ super(JavaMethodInfo.uniqueMethodName(callTarget), call.direct ? RelocType.JAVA_CALL_DIRECT : RelocType.JAVA_CALL_INDIRECT);
}
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaCallSiteRelocationSymbol.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaCallSiteRelocationSymbol.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -25,7 +25,7 @@
import jdk.tools.jaotc.binformat.BinaryContainer;
import jdk.tools.jaotc.binformat.Symbol;
-import jdk.tools.jaotc.CompiledMethodInfo.StubInformation;
+import jdk.tools.jaotc.StubInformation;
import jdk.vm.ci.code.site.Call;
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
@@ -40,7 +40,7 @@
// -1 represents Universe::non_oop_word() value
private static final byte[] minusOneSlot = {-1, -1, -1, -1, -1, -1, -1, -1};
- public JavaCallSiteRelocationSymbol(CompiledMethodInfo mi, Call call, CallSiteRelocationInfo callSiteRelocation, BinaryContainer binaryContainer) {
+ JavaCallSiteRelocationSymbol(CompiledMethodInfo mi, Call call, CallSiteRelocationInfo callSiteRelocation, BinaryContainer binaryContainer) {
super(createPltEntrySymbol(binaryContainer, mi, call, callSiteRelocation));
StubInformation stub = getStub(mi, call);
addRelocations(mi, stub, binaryContainer, call, callSiteRelocation);
@@ -61,7 +61,7 @@
private static StubInformation getStub(CompiledMethodInfo mi, Call call) {
HotSpotResolvedJavaMethod callTarget = (HotSpotResolvedJavaMethod) call.target;
- String callTargetSymbol = MiscUtils.uniqueMethodName(callTarget) + ".at." + call.pcOffset;
+ String callTargetSymbol = JavaMethodInfo.uniqueMethodName(callTarget) + ".at." + call.pcOffset;
return mi.getStubFor(callTargetSymbol);
}
@@ -69,7 +69,7 @@
* Add all the required relocations.
*/
private static void addRelocations(CompiledMethodInfo mi, StubInformation stub, BinaryContainer binaryContainer, Call call, CallSiteRelocationInfo callSiteRelocation) {
- final boolean isVirtualCall = MiscUtils.isVirtualCall(mi, call);
+ final boolean isVirtualCall = CallInfo.isVirtualCall(mi, call);
final int gotStartOffset = binaryContainer.appendExtLinkageGotBytes(zeroSlot, 0, zeroSlot.length);
if (isVirtualCall) {
@@ -82,7 +82,7 @@
// Add relocation to GOT cell for call resolution jump.
// This GOT cell will be initialized during JVM startup with address
// of JVM runtime call resolution function.
- String gotSymbolName = "got." + getResolveSymbolName(binaryContainer, mi, call);
+ String gotSymbolName = "got." + getResolveSymbolName(mi, call);
Symbol gotSymbol = binaryContainer.getGotSymbol(gotSymbolName);
addExternalPltToGotRelocation(binaryContainer, gotSymbol, stub.getResolveJumpOffset());
@@ -121,16 +121,16 @@
/**
* Returns the name of the resolve method for this particular call.
*/
- private static String getResolveSymbolName(BinaryContainer binaryContainer, CompiledMethodInfo mi, Call call) {
+ private static String getResolveSymbolName(CompiledMethodInfo mi, Call call) {
String resolveSymbolName;
- if (MiscUtils.isStaticCall(call)) {
- resolveSymbolName = binaryContainer.getResolveStaticEntrySymbolName();
- } else if (MiscUtils.isSpecialCall(call)) {
- resolveSymbolName = binaryContainer.getResolveOptVirtualEntrySymbolName();
- } else if (MiscUtils.isOptVirtualCall(mi, call)) {
- resolveSymbolName = binaryContainer.getResolveOptVirtualEntrySymbolName();
- } else if (MiscUtils.isVirtualCall(mi, call)) {
- resolveSymbolName = binaryContainer.getResolveVirtualEntrySymbolName();
+ if (CallInfo.isStaticCall(call)) {
+ resolveSymbolName = BinaryContainer.getResolveStaticEntrySymbolName();
+ } else if (CallInfo.isSpecialCall(call)) {
+ resolveSymbolName = BinaryContainer.getResolveOptVirtualEntrySymbolName();
+ } else if (CallInfo.isOptVirtualCall(mi, call)) {
+ resolveSymbolName = BinaryContainer.getResolveOptVirtualEntrySymbolName();
+ } else if (CallInfo.isVirtualCall(mi, call)) {
+ resolveSymbolName = BinaryContainer.getResolveVirtualEntrySymbolName();
} else {
throw new InternalError("Unknown call type in " + mi.asTag() + " @ " + call.pcOffset + " for call" + call.target);
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaMethodInfo.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/JavaMethodInfo.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -24,9 +24,11 @@
package jdk.tools.jaotc;
import org.graalvm.compiler.code.CompilationResult;
-import jdk.vm.ci.hotspot.HotSpotCompiledCode;
-public interface JavaMethodInfo {
+import jdk.vm.ci.hotspot.HotSpotCompiledCode;
+import jdk.vm.ci.meta.ResolvedJavaMethod;
+
+interface JavaMethodInfo {
/**
* @return unique symbol name for this method.
@@ -42,4 +44,16 @@
HotSpotCompiledCode compiledCode(CompilationResult result);
+ /**
+ * Name a java method with class and signature to make it unique.
+ *
+ * @param method to generate unique identifier for
+ * @return Unique name for this method including class and signature
+ **/
+ static String uniqueMethodName(ResolvedJavaMethod method) {
+ String className = method.getDeclaringClass().toClassName();
+ String name = className + "." + method.getName() + method.getSignature().toMethodDescriptor();
+ return name;
+ }
+
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Linker.java Wed Aug 23 12:39:55 2017 +0000
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 2017, 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 jdk.tools.jaotc;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.stream.Stream;
+
+final class Linker {
+
+ private final Options options;
+ private String objectFileName;
+ private String libraryFileName;
+ private String linkerCmd;
+
+ String objFile() {
+ return objectFileName;
+ }
+
+ String libFile() {
+ return libraryFileName;
+ }
+
+ Linker(Main main) throws Exception {
+ this.options = main.options;
+ String name = options.outputName;
+ objectFileName = name;
+ libraryFileName = name;
+
+ if (options.linkerpath != null && !(new File(options.linkerpath).exists())) {
+ throw new InternalError("Invalid linker path: " + options.linkerpath);
+ }
+ String linkerPath;
+ String linkerCheck;
+
+ switch (options.osName) {
+ case "Linux":
+ if (name.endsWith(".so")) {
+ objectFileName = name.substring(0, name.length() - ".so".length());
+ }
+ linkerPath = (options.linkerpath != null) ? options.linkerpath : "ld";
+ linkerCmd = linkerPath + " -shared -z noexecstack -o " + libraryFileName + " " + objectFileName;
+ linkerCheck = linkerPath + " -v";
+ break;
+ case "SunOS":
+ if (name.endsWith(".so")) {
+ objectFileName = name.substring(0, name.length() - ".so".length());
+ }
+ objectFileName = objectFileName + ".o";
+ linkerPath = (options.linkerpath != null) ? options.linkerpath : "ld";
+ linkerCmd = linkerPath + " -shared -o " + libraryFileName + " " + objectFileName;
+ linkerCheck = linkerPath + " -V";
+ break;
+ case "Mac OS X":
+ if (name.endsWith(".dylib")) {
+ objectFileName = name.substring(0, name.length() - ".dylib".length());
+ }
+ objectFileName = objectFileName + ".o";
+ linkerPath = (options.linkerpath != null) ? options.linkerpath : "ld";
+ linkerCmd = linkerPath + " -dylib -o " + libraryFileName + " " + objectFileName;
+ linkerCheck = linkerPath + " -v";
+ break;
+ default:
+ if (options.osName.startsWith("Windows")) {
+ if (name.endsWith(".dll")) {
+ objectFileName = name.substring(0, name.length() - ".dll".length());
+ }
+ objectFileName = objectFileName + ".obj";
+ linkerPath = (options.linkerpath != null) ? options.linkerpath : getWindowsLinkPath();
+ if (linkerPath == null) {
+ throw new InternalError("Can't locate Microsoft Visual Studio amd64 link.exe");
+ }
+ linkerCmd = linkerPath + " /DLL /OPT:NOREF /NOLOGO /NOENTRY" + " /OUT:" + libraryFileName + " " + objectFileName;
+ linkerCheck = null; // link.exe presence is verified already
+ break;
+ } else {
+ throw new InternalError("Unsupported platform: " + options.osName);
+ }
+ }
+
+ // Check linker presence on platforms by printing its version
+ if (linkerCheck != null) {
+ Process p = Runtime.getRuntime().exec(linkerCheck);
+ final int exitCode = p.waitFor();
+ if (exitCode != 0) {
+ InputStream stderr = p.getErrorStream();
+ BufferedReader br = new BufferedReader(new InputStreamReader(stderr));
+ Stream<String> lines = br.lines();
+ StringBuilder sb = new StringBuilder();
+ lines.iterator().forEachRemaining(e -> sb.append(e));
+ throw new InternalError(sb.toString());
+ }
+ }
+ }
+
+ void link() throws Exception {
+ Process p = Runtime.getRuntime().exec(linkerCmd);
+ final int exitCode = p.waitFor();
+ if (exitCode != 0) {
+ InputStream stderr = p.getErrorStream();
+ if (stderr.read() == -1) {
+ stderr = p.getInputStream();
+ }
+ BufferedReader br = new BufferedReader(new InputStreamReader(stderr));
+ Stream<String> lines = br.lines();
+ StringBuilder sb = new StringBuilder();
+ lines.iterator().forEachRemaining(e -> sb.append(e));
+ throw new InternalError(sb.toString());
+ }
+ File objFile = new File(objectFileName);
+ if (objFile.exists()) {
+ if (!objFile.delete()) {
+ throw new InternalError("Failed to delete " + objectFileName + " file");
+ }
+ }
+ // Make non-executable for all.
+ File libFile = new File(libraryFileName);
+ if (libFile.exists() && !options.osName.startsWith("Windows")) {
+ if (!libFile.setExecutable(false, false)) {
+ throw new InternalError("Failed to change attribute for " + libraryFileName + " file");
+ }
+ }
+
+ }
+
+ /**
+ * Visual Studio supported versions Search Order is: VS2013, VS2015, VS2012
+ */
+ public enum VSVERSIONS {
+ VS2013("VS120COMNTOOLS", "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\amd64\\link.exe"),
+ VS2015("VS140COMNTOOLS", "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin\\amd64\\link.exe"),
+ VS2012("VS110COMNTOOLS", "C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\bin\\amd64\\link.exe");
+
+ private final String envvariable;
+ private final String wkp;
+
+ VSVERSIONS(String envvariable, String wellknownpath) {
+ this.envvariable = envvariable;
+ this.wkp = wellknownpath;
+ }
+
+ String EnvVariable() {
+ return envvariable;
+ }
+
+ String WellKnownPath() {
+ return wkp;
+ }
+ }
+
+ /**
+ * Search for Visual Studio link.exe Search Order is: VS2013, VS2015, VS2012
+ */
+ private static String getWindowsLinkPath() {
+ String link = "\\VC\\bin\\amd64\\link.exe";
+
+ /**
+ * First try searching the paths pointed to by the VS environment variables.
+ */
+ for (VSVERSIONS vs : VSVERSIONS.values()) {
+ String vspath = System.getenv(vs.EnvVariable());
+ if (vspath != null) {
+ File commonTools = new File(vspath);
+ File vsRoot = commonTools.getParentFile().getParentFile();
+ File linkPath = new File(vsRoot, link);
+ if (linkPath.exists()) {
+ return linkPath.getPath();
+ }
+ }
+ }
+
+ /**
+ * If we didn't find via the VS environment variables, try the well known paths
+ */
+ for (VSVERSIONS vs : VSVERSIONS.values()) {
+ String wkp = vs.WellKnownPath();
+ if (new File(wkp).exists()) {
+ return wkp;
+ }
+ }
+
+ return null;
+ }
+
+}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/LoadedClass.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/LoadedClass.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,4 +1,4 @@
-package jdk.tools.jaotc;/*
+/*
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -21,6 +21,8 @@
* questions.
*/
+package jdk.tools.jaotc;
+
public class LoadedClass {
private final String name;
private final Class<?> clz;
@@ -45,12 +47,17 @@
@Override
public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof LoadedClass)) return false;
-
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof LoadedClass)) {
+ return false;
+ }
LoadedClass that = (LoadedClass) o;
- if (name != null ? !name.equals(that.name) : that.name != null) return false;
+ if (name != null ? !name.equals(that.name) : that.name != null) {
+ return false;
+ }
return clz != null ? clz.equals(that.clz) : that.clz == null;
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/LogPrinter.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/LogPrinter.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -23,12 +23,174 @@
package jdk.tools.jaotc;
-public interface LogPrinter {
- void printInfo(String s);
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryUsage;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.MessageFormat;
+import java.util.Date;
+
+import jdk.tools.jaotc.binformat.ByteContainer;
+import jdk.tools.jaotc.binformat.BinaryContainer;
+
+final class LogPrinter {
+
+ private static FileWriter logFile = null;
+ private final Options options;
+ private final PrintWriter log;
+
+ LogPrinter(Main main, PrintWriter log) {
+ this.options = main.options;
+ this.log = log;
+ }
+
+ void printInfo(String message) {
+ if (options.info) {
+ log.print(message);
+ log.flush();
+ }
+ }
+
+ void printlnInfo(String message) {
+ if (options.info) {
+ log.println(message);
+ log.flush();
+ }
+ }
- void printlnVerbose(String s);
+ void printVerbose(String message) {
+ if (options.verbose) {
+ log.print(message);
+ log.flush();
+ }
+ }
+
+ void printlnVerbose(String message) {
+ if (options.verbose) {
+ log.println(message);
+ log.flush();
+ }
+ }
+
+ void printDebug(String message) {
+ if (options.debug) {
+ log.print(message);
+ log.flush();
+ }
+ }
+
+ void printlnDebug(String message) {
+ if (options.debug) {
+ log.println(message);
+ log.flush();
+ }
+ }
+
+ void printError(String message) {
+ log.println("Error: " + message);
+ log.flush();
+ }
+
+ void reportError(Throwable e) {
+ log.println("Error: " + e.getMessage());
+ if (options.info) {
+ e.printStackTrace(log);
+ }
+ log.flush();
+ }
+
+ void reportError(String key, Object... args) {
+ printError(MessageFormat.format(key, args));
+ }
+
+ private static String humanReadableByteCount(long bytes) {
+ int unit = 1024;
- void printlnInfo(String s);
+ if (bytes < unit) {
+ return bytes + " B";
+ }
+
+ int exp = (int) (Math.log(bytes) / Math.log(unit));
+ char pre = "KMGTPE".charAt(exp - 1);
+ return String.format("%.1f %cB", bytes / Math.pow(unit, exp), pre);
+ }
+
+ void printMemoryUsage() {
+ if (options.verbose) {
+ MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
+ float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted();
+ log.format(" [used: %-7s, comm: %-7s, freeRatio ~= %.1f%%]",
+ humanReadableByteCount(memusage.getUsed()),
+ humanReadableByteCount(memusage.getCommitted()),
+ freeratio * 100);
+ }
+ }
+
+ private void printContainerInfo(ByteContainer container) {
+ printlnVerbose(container.getContainerName() + ": " + container.getByteStreamSize() + " bytes");
+ }
+
+ void containersInfo(BinaryContainer binaryContainer) {
+ printContainerInfo(binaryContainer.getHeaderContainer().getContainer());
+ printContainerInfo(binaryContainer.getConfigContainer());
+ printContainerInfo(binaryContainer.getKlassesOffsetsContainer());
+ printContainerInfo(binaryContainer.getMethodsOffsetsContainer());
+ printContainerInfo(binaryContainer.getKlassesDependenciesContainer());
+ printContainerInfo(binaryContainer.getStubsOffsetsContainer());
+ printContainerInfo(binaryContainer.getMethodMetadataContainer());
+ printContainerInfo(binaryContainer.getCodeContainer());
+ printContainerInfo(binaryContainer.getCodeSegmentsContainer());
+ printContainerInfo(binaryContainer.getConstantDataContainer());
+ printContainerInfo(binaryContainer.getKlassesGotContainer());
+ printContainerInfo(binaryContainer.getCountersGotContainer());
+ printContainerInfo(binaryContainer.getMetadataGotContainer());
+ printContainerInfo(binaryContainer.getMethodStateContainer());
+ printContainerInfo(binaryContainer.getOopGotContainer());
+ printContainerInfo(binaryContainer.getMetaspaceNamesContainer());
+ }
- void printError(String s);
+ static void openLog() {
+ int v = Integer.getInteger("jdk.tools.jaotc.logCompilation", 0);
+ if (v == 0) {
+ logFile = null;
+ return;
+ }
+ // Create log file in current directory
+ String fileName = "aot_compilation" + new Date().getTime() + ".log";
+ Path logFilePath = Paths.get("./", fileName);
+ String logFileName = logFilePath.toString();
+ try {
+ // Create file to which we do not append
+ logFile = new FileWriter(logFileName, false);
+ } catch (IOException e) {
+ System.out.println("Unable to open logfile :" + logFileName + "\nNo logs will be created");
+ logFile = null;
+ }
+ }
+
+ static void writeLog(String str) {
+ if (logFile != null) {
+ try {
+ logFile.write(str + "\n");
+ logFile.flush();
+ } catch (IOException e) {
+ // Print to console
+ System.out.println(str + "\n");
+ }
+ }
+ }
+
+ static void closeLog() {
+ if (logFile != null) {
+ try {
+ logFile.close();
+ } catch (IOException e) {
+ // Do nothing
+ }
+ }
+ }
+
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Main.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Main.java Wed Aug 23 12:39:55 2017 +0000
@@ -27,37 +27,14 @@
import static org.graalvm.compiler.core.common.GraalOptions.ImmutableCode;
import static org.graalvm.compiler.hotspot.meta.HotSpotAOTProfilingPlugin.Options.TieredAOT;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
import java.io.PrintWriter;
-import java.lang.management.ManagementFactory;
-import java.lang.management.MemoryUsage;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Set;
-import java.util.stream.Stream;
import jdk.tools.jaotc.binformat.BinaryContainer;
-import jdk.tools.jaotc.binformat.ByteContainer;
-import jdk.tools.jaotc.collect.*;
-import jdk.tools.jaotc.collect.classname.ClassNameSourceProvider;
-import jdk.tools.jaotc.collect.directory.DirectorySourceProvider;
-import jdk.tools.jaotc.collect.jar.JarSourceProvider;
-import jdk.tools.jaotc.collect.module.ModuleSourceProvider;
-import jdk.tools.jaotc.utils.Timer;
+import jdk.tools.jaotc.Options.Option;
import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
import org.graalvm.compiler.api.runtime.GraalJVMCICompiler;
@@ -80,227 +57,14 @@
import jdk.vm.ci.meta.MetaAccessProvider;
import jdk.vm.ci.meta.ResolvedJavaMethod;
-import jdk.vm.ci.meta.ResolvedJavaType;
import jdk.vm.ci.runtime.JVMCI;
-public class Main implements LogPrinter {
- static class BadArgs extends Exception {
- private static final long serialVersionUID = 1L;
- final String key;
- final Object[] args;
- boolean showUsage;
-
- BadArgs(String key, Object... args) {
- super(MessageFormat.format(key, args));
- this.key = key;
- this.args = args;
- }
-
- BadArgs showUsage(boolean b) {
- showUsage = b;
- return this;
- }
- }
-
- abstract static class Option {
- final String help;
- final boolean hasArg;
- final String[] aliases;
-
- Option(String help, boolean hasArg, String... aliases) {
- this.help = help;
- this.hasArg = hasArg;
- this.aliases = aliases;
- }
-
- boolean isHidden() {
- return false;
- }
-
- boolean matches(String opt) {
- for (String a : aliases) {
- if (a.equals(opt)) {
- return true;
- } else if (opt.startsWith("--") && hasArg && opt.startsWith(a + "=")) {
- return true;
- }
- }
- return false;
- }
-
- boolean ignoreRest() {
- return false;
- }
-
- abstract void process(Main task, String opt, String arg) throws BadArgs;
- }
+public final class Main {
- static Option[] recognizedOptions = {new Option(" --output <file> Output file name", true, "--output") {
- @Override
- void process(Main task, String opt, String arg) {
- String name = arg;
- task.options.outputName = name;
- }
- }, new Option(" --class-name <class names> List of classes to compile", true, "--class-name", "--classname") {
- @Override
- void process(Main task, String opt, String arg) {
- task.options.files.addAll(ClassSearch.makeList(ClassNameSourceProvider.TYPE, arg));
- }
- }, new Option(" --jar <jarfiles> List of jar files to compile", true, "--jar") {
- @Override
- void process(Main task, String opt, String arg) {
- task.options.files.addAll(ClassSearch.makeList(JarSourceProvider.TYPE, arg));
- }
- }, new Option(" --module <modules> List of modules to compile", true, "--module") {
- @Override
- void process(Main task, String opt, String arg) {
- task.options.files.addAll(ClassSearch.makeList(ModuleSourceProvider.TYPE, arg));
- }
- }, new Option(" --directory <dirs> List of directories where to search for files to compile", true, "--directory") {
- @Override
- void process(Main task, String opt, String arg) {
- task.options.files.addAll(ClassSearch.makeList(DirectorySourceProvider.TYPE, arg));
- }
- }, new Option(" --search-path <dirs> List of directories where to search for specified files", true, "--search-path") {
- @Override
- void process(Main task, String opt, String arg) {
- String[] elements = arg.split(":");
- task.options.searchPath.add(elements);
- }
- }, new Option(" --compile-commands <file> Name of file with compile commands", true, "--compile-commands") {
- @Override
- void process(Main task, String opt, String arg) {
- task.options.methodList = arg;
- }
- }, new Option(" --compile-for-tiered Generate profiling code for tiered compilation", false, "--compile-for-tiered") {
- @Override
- void process(Main task, String opt, String arg) {
- task.options.tiered = true;
- }
- }, new Option(" --compile-with-assertions Compile with java assertions", false, "--compile-with-assertions") {
- @Override
- void process(Main task, String opt, String arg) {
- task.options.compileWithAssertions = true;
- }
- }, new Option(" --compile-threads <number> Number of compilation threads to be used", true, "--compile-threads", "--threads") {
- @Override
- void process(Main task, String opt, String arg) {
- int threads = Integer.parseInt(arg);
- final int available = Runtime.getRuntime().availableProcessors();
- if (threads <= 0) {
- task.warning("invalid number of threads specified: {0}, using: {1}", threads, available);
- threads = available;
- }
- if (threads > available) {
- task.warning("too many threads specified: {0}, limiting to: {1}", threads, available);
- }
- task.options.threads = Integer.min(threads, available);
- }
- }, new Option(" --ignore-errors Ignores all exceptions thrown during class loading", false, "--ignore-errors") {
- @Override
- void process(Main task, String opt, String arg) {
- task.options.ignoreClassLoadingErrors = true;
- }
- }, new Option(" --exit-on-error Exit on compilation errors", false, "--exit-on-error") {
- @Override
- void process(Main task, String opt, String arg) {
- task.options.exitOnError = true;
- }
- }, new Option(" --info Print information during compilation", false, "--info") {
- @Override
- void process(Main task, String opt, String arg) throws BadArgs {
- task.options.info = true;
- }
- }, new Option(" --verbose Print verbose information", false, "--verbose") {
- @Override
- void process(Main task, String opt, String arg) throws BadArgs {
- task.options.info = true;
- task.options.verbose = true;
- }
- }, new Option(" --debug Print debug information", false, "--debug") {
- @Override
- void process(Main task, String opt, String arg) throws BadArgs {
- task.options.info = true;
- task.options.verbose = true;
- task.options.debug = true;
- }
- }, new Option(" --help Print this usage message", false, "--help") {
- @Override
- void process(Main task, String opt, String arg) {
- task.options.help = true;
- }
- }, new Option(" --version Version information", false, "--version") {
- @Override
- void process(Main task, String opt, String arg) {
- task.options.version = true;
- }
- }, new Option(" --linker-path Full path to linker executable", true, "--linker-path") {
- @Override
- void process(Main task, String opt, String arg) {
- task.options.linkerpath = arg;
- }
- }, new Option(" -J<flag> Pass <flag> directly to the runtime system", false, "-J") {
- @Override
- void process(Main task, String opt, String arg) {
- }
- }};
-
- public static class Options {
- public List<SearchFor> files = new LinkedList<>();
- public String outputName = defaultOutputName();
- public String methodList;
- public List<ClassSource> sources = new ArrayList<>();
- public String linkerpath = null;
- public SearchPath searchPath = new SearchPath();
-
- /**
- * We don't see scaling beyond 16 threads.
- */
- private static final int COMPILER_THREADS = 16;
-
- public int threads = Integer.min(COMPILER_THREADS, Runtime.getRuntime().availableProcessors());
-
- public boolean ignoreClassLoadingErrors;
- public boolean exitOnError;
- public boolean info;
- public boolean verbose;
- public boolean debug;
- public boolean help;
- public boolean version;
- public boolean compileWithAssertions;
- public boolean tiered;
-
- private static String defaultOutputName() {
- String osName = System.getProperty("os.name");
- String name = "unnamed.";
- String ext;
-
- switch (osName) {
- case "Linux":
- case "SunOS":
- ext = "so";
- break;
- case "Mac OS X":
- ext = "dylib";
- break;
- default:
- if (osName.startsWith("Windows")) {
- ext = "dll";
- } else {
- ext = "so";
- }
- }
-
- return name + ext;
- }
- }
-
- /* package */final Options options = new Options();
-
- /**
- * Logfile.
- */
- private static FileWriter logFile = null;
+ final Options options = new Options();
+ private PrintWriter log;
+ LogPrinter printer;
+ GraalFilters filters;
private static final int EXIT_OK = 0; // No errors.
private static final int EXIT_CMDERR = 2; // Bad command-line arguments and/or switches.
@@ -317,12 +81,11 @@
}
private int run(String[] args) {
- if (log == null) {
- log = new PrintWriter(System.out);
- }
+ log = new PrintWriter(System.out);
+ printer = new LogPrinter(this, log);
try {
- handleOptions(args);
+ Options.handleOptions(this, args);
if (options.help) {
showHelp();
return EXIT_OK;
@@ -332,17 +95,17 @@
return EXIT_OK;
}
- printlnInfo("Compiling " + options.outputName + "...");
+ printer.printlnInfo("Compiling " + options.outputName + "...");
final long start = System.currentTimeMillis();
if (!run()) {
return EXIT_ABNORMAL;
}
final long end = System.currentTimeMillis();
- printlnInfo("Total time: " + (end - start) + " ms");
+ printer.printlnInfo("Total time: " + (end - start) + " ms");
return EXIT_OK;
- } catch (BadArgs e) {
- reportError(e.key, e.args);
+ } catch (Options.BadArgs e) {
+ printer.reportError(e.key, e.args);
if (e.showUsage) {
showUsage();
}
@@ -355,117 +118,20 @@
}
}
- private static String humanReadableByteCount(long bytes) {
- int unit = 1024;
-
- if (bytes < unit) {
- return bytes + " B";
- }
-
- int exp = (int) (Math.log(bytes) / Math.log(unit));
- char pre = "KMGTPE".charAt(exp - 1);
- return String.format("%.1f %cB", bytes / Math.pow(unit, exp), pre);
- }
-
- void printMemoryUsage() {
- if (options.verbose) {
- MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
- float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted();
- log.format(" [used: %-7s, comm: %-7s, freeRatio ~= %.1f%%]",
- humanReadableByteCount(memusage.getUsed()),
- humanReadableByteCount(memusage.getCommitted()),
- freeratio * 100);
- }
- }
-
- /**
- * Visual Studio supported versions Search Order is: VS2013, VS2015, VS2012
- */
- public enum VSVERSIONS {
- VS2013("VS120COMNTOOLS", "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\amd64\\link.exe"),
- VS2015("VS140COMNTOOLS", "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin\\amd64\\link.exe"),
- VS2012("VS110COMNTOOLS", "C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\bin\\amd64\\link.exe");
-
- private final String envvariable;
- private final String wkp;
-
- VSVERSIONS(String envvariable, String wellknownpath) {
- this.envvariable = envvariable;
- this.wkp = wellknownpath;
- }
-
- String EnvVariable() {
- return envvariable;
- }
-
- String WellKnownPath() {
- return wkp;
- }
- }
-
- /**
- * Search for Visual Studio link.exe Search Order is: VS2013, VS2015, VS2012
- */
- private static String getWindowsLinkPath() {
- String link = "\\VC\\bin\\amd64\\link.exe";
-
- /**
- * First try searching the paths pointed to by the VS environment variables.
- */
- for (VSVERSIONS vs : VSVERSIONS.values()) {
- String vspath = System.getenv(vs.EnvVariable());
- if (vspath != null) {
- File commonTools = new File(vspath);
- File vsRoot = commonTools.getParentFile().getParentFile();
- File linkPath = new File(vsRoot, link);
- if (linkPath.exists())
- return linkPath.getPath();
- }
- }
-
- /**
- * If we didn't find via the VS environment variables, try the well known paths
- */
- for (VSVERSIONS vs : VSVERSIONS.values()) {
- String wkp = vs.WellKnownPath();
- if (new File(wkp).exists()) {
- return wkp;
- }
- }
-
- return null;
- }
-
@SuppressWarnings("try")
private boolean run() throws Exception {
- openLog();
+ LogPrinter.openLog();
try {
- CompilationSpec compilationRestrictions = collectSpecifiedMethods();
- Set<Class<?>> classesToCompile = new HashSet<>();
+ final Linker linker = new Linker(this);
+ final String objectFileName = linker.objFile();
+ final Collector collector = new Collector(this);
+ Set<Class<?>> classesToCompile;
try (Timer t = new Timer(this, "")) {
- FileSupport fileSupport = new FileSupport();
- ClassSearch lookup = new ClassSearch();
- lookup.addProvider(new ModuleSourceProvider());
- lookup.addProvider(new ClassNameSourceProvider(fileSupport));
- lookup.addProvider(new JarSourceProvider());
- lookup.addProvider(new DirectorySourceProvider(fileSupport));
-
- List<LoadedClass> found = null;
- try {
- found = lookup.search(options.files, options.searchPath);
- } catch (InternalError e) {
- reportError(e);
- return false;
- }
-
- for (LoadedClass loadedClass : found) {
- classesToCompile.add(loadedClass.getLoadedClass());
- }
-
- printInfo(classesToCompile.size() + " classes found");
+ classesToCompile = collector.collectClassesToCompile();
+ printer.printInfo(classesToCompile.size() + " classes found");
}
OptionValues graalOptions = HotSpotGraalOptionValues.HOTSPOT_OPTIONS;
@@ -478,23 +144,22 @@
HotSpotGraalRuntimeProvider runtime = (HotSpotGraalRuntimeProvider) graalCompiler.getGraalRuntime();
HotSpotHostBackend backend = (HotSpotHostBackend) runtime.getCapability(RuntimeProvider.class).getHostBackend();
MetaAccessProvider metaAccess = backend.getProviders().getMetaAccess();
- GraalFilters filters = new GraalFilters(metaAccess);
+ filters = new GraalFilters(metaAccess);
List<AOTCompiledClass> classes;
try (Timer t = new Timer(this, "")) {
- classes = collectMethodsToCompile(classesToCompile, compilationRestrictions, filters, metaAccess);
+ classes = collector.collectMethodsToCompile(classesToCompile, metaAccess);
}
// Free memory!
try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) {
- printMemoryUsage();
- compilationRestrictions = null;
+ printer.printMemoryUsage();
classesToCompile = null;
System.gc();
}
- AOTBackend aotBackend = new AOTBackend(this, graalOptions, backend, filters);
+ AOTBackend aotBackend = new AOTBackend(this, graalOptions, backend);
SnippetReflectionProvider snippetReflection = aotBackend.getProviders().getSnippetReflection();
AOTCompiler compiler = new AOTCompiler(this, graalOptions, aotBackend, options.threads);
classes = compiler.compileClasses(classes);
@@ -506,7 +171,7 @@
// Free memory!
try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) {
- printMemoryUsage();
+ printer.printMemoryUsage();
aotBackend = null;
compiler = null;
System.gc();
@@ -520,25 +185,11 @@
}
// Print information about section sizes
- printContainerInfo(binaryContainer.getHeaderContainer().getContainer());
- printContainerInfo(binaryContainer.getConfigContainer());
- printContainerInfo(binaryContainer.getKlassesOffsetsContainer());
- printContainerInfo(binaryContainer.getMethodsOffsetsContainer());
- printContainerInfo(binaryContainer.getKlassesDependenciesContainer());
- printContainerInfo(binaryContainer.getStubsOffsetsContainer());
- printContainerInfo(binaryContainer.getMethodMetadataContainer());
- printContainerInfo(binaryContainer.getCodeContainer());
- printContainerInfo(binaryContainer.getCodeSegmentsContainer());
- printContainerInfo(binaryContainer.getConstantDataContainer());
- printContainerInfo(binaryContainer.getMetaspaceGotContainer());
- printContainerInfo(binaryContainer.getMetadataGotContainer());
- printContainerInfo(binaryContainer.getMethodStateContainer());
- printContainerInfo(binaryContainer.getOopGotContainer());
- printContainerInfo(binaryContainer.getMetaspaceNamesContainer());
+ printer.containersInfo(binaryContainer);
// Free memory!
try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) {
- printMemoryUsage();
+ printer.printMemoryUsage();
backend = null;
for (AOTCompiledClass aotCompClass : classes) {
aotCompClass.clear();
@@ -550,238 +201,59 @@
System.gc();
}
- String name = options.outputName;
- String objectFileName = name;
-
- String libraryFileName = name;
-
- String linkerCmd;
- String linkerPath;
- String osName = System.getProperty("os.name");
-
- switch (osName) {
- case "Linux":
- if (name.endsWith(".so")) {
- objectFileName = name.substring(0, name.length() - ".so".length());
- }
- linkerPath = (options.linkerpath != null) ? options.linkerpath : "ld";
- linkerCmd = linkerPath + " -shared -z noexecstack -o " + libraryFileName + " " + objectFileName;
- break;
- case "SunOS":
- if (name.endsWith(".so")) {
- objectFileName = name.substring(0, name.length() - ".so".length());
- }
- objectFileName = objectFileName + ".o";
- linkerPath = (options.linkerpath != null) ? options.linkerpath : "ld";
- linkerCmd = linkerPath + " -shared -o " + libraryFileName + " " + objectFileName;
- break;
- case "Mac OS X":
- if (name.endsWith(".dylib")) {
- objectFileName = name.substring(0, name.length() - ".dylib".length());
- }
- objectFileName = objectFileName + ".o";
- linkerPath = (options.linkerpath != null) ? options.linkerpath : "ld";
- linkerCmd = linkerPath + " -dylib -o " + libraryFileName + " " + objectFileName;
- break;
- default:
- if (osName.startsWith("Windows")) {
- if (name.endsWith(".dll")) {
- objectFileName = name.substring(0, name.length() - ".dll".length());
- }
- objectFileName = objectFileName + ".obj";
- linkerPath = (options.linkerpath != null) ? options.linkerpath : getWindowsLinkPath();
- if (linkerPath == null) {
- throw new InternalError("Can't locate Microsoft Visual Studio amd64 link.exe");
- }
- linkerCmd = linkerPath + " /DLL /OPT:NOREF /NOLOGO /NOENTRY" + " /OUT:" + libraryFileName + " " + objectFileName;
- break;
- } else {
- throw new InternalError("Unsupported platform: " + osName);
- }
- }
-
try (Timer t = new Timer(this, "Creating binary: " + objectFileName)) {
- binaryContainer.createBinary(objectFileName, JVM_VERSION);
+ binaryContainer.createBinary(objectFileName);
}
// Free memory!
try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) {
- printMemoryUsage();
+ printer.printMemoryUsage();
binaryContainer = null;
System.gc();
}
- try (Timer t = new Timer(this, "Creating shared library: " + libraryFileName)) {
- Process p = Runtime.getRuntime().exec(linkerCmd);
- final int exitCode = p.waitFor();
- if (exitCode != 0) {
- InputStream stderr = p.getErrorStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(stderr));
- Stream<String> lines = br.lines();
- StringBuilder sb = new StringBuilder();
- lines.iterator().forEachRemaining(e -> sb.append(e));
- throw new InternalError(sb.toString());
- }
- File objFile = new File(objectFileName);
- if (objFile.exists()) {
- if (!objFile.delete()) {
- throw new InternalError("Failed to delete " + objectFileName + " file");
- }
- }
- // Make non-executable for all.
- File libFile = new File(libraryFileName);
- if (libFile.exists() && !osName.startsWith("Windows")) {
- if (!libFile.setExecutable(false, false)) {
- throw new InternalError("Failed to change attribute for " + libraryFileName + " file");
- }
- }
+ try (Timer t = new Timer(this, "Creating shared library: " + linker.libFile())) {
+ linker.link();
}
- printVerbose("Final memory ");
- printMemoryUsage();
- printlnVerbose("");
+ printer.printVerbose("Final memory ");
+ printer.printMemoryUsage();
+ printer.printlnVerbose("");
} finally {
- closeLog();
+ LogPrinter.closeLog();
}
return true;
}
- private void addMethods(AOTCompiledClass aotClass, ResolvedJavaMethod[] methods, CompilationSpec compilationRestrictions, GraalFilters filters) {
- for (ResolvedJavaMethod m : methods) {
- addMethod(aotClass, m, compilationRestrictions, filters);
- }
- }
+ void handleError(ResolvedJavaMethod resolvedMethod, Throwable e, String message) {
+ String methodName = JavaMethodInfo.uniqueMethodName(resolvedMethod);
- private void addMethod(AOTCompiledClass aotClass, ResolvedJavaMethod method, CompilationSpec compilationRestrictions, GraalFilters filters) {
- // Don't compile native or abstract methods.
- if (!method.hasBytecodes()) {
- return;
+ if (options.debug) {
+ printer.printError("Failed compilation: " + methodName + ": " + e);
}
- if (!compilationRestrictions.shouldCompileMethod(method)) {
- return;
- }
- if (!filters.shouldCompileMethod(method)) {
+
+ // Ignore some exceptions when meta-compiling Graal.
+ if (GraalFilters.shouldIgnoreException(e)) {
return;
}
- aotClass.addMethod(method);
- printlnVerbose(" added " + method.getName() + method.getSignature().toMethodDescriptor());
- }
+ LogPrinter.writeLog("Failed compilation of method " + methodName + message);
- private void printContainerInfo(ByteContainer container) {
- printlnVerbose(container.getContainerName() + ": " + container.getByteStreamSize() + " bytes");
- }
-
- PrintWriter log;
-
- private void handleOptions(String[] args) throws BadArgs {
- if (args.length == 0) {
- options.help = true;
- return;
+ if (!options.debug) {
+ printer.printError("Failed compilation: " + methodName + ": " + e);
}
- // Make checkstyle happy.
- int i = 0;
- for (; i < args.length; i++) {
- String arg = args[i];
-
- if (arg.charAt(0) == '-') {
- Option option = getOption(arg);
- String param = null;
+ if (options.verbose) {
+ e.printStackTrace(log);
+ }
- if (option.hasArg) {
- if (arg.startsWith("--") && arg.indexOf('=') > 0) {
- param = arg.substring(arg.indexOf('=') + 1, arg.length());
- } else if (i + 1 < args.length) {
- param = args[++i];
- }
-
- if (param == null || param.isEmpty() || param.charAt(0) == '-') {
- throw new BadArgs("missing argument for option: {0}", arg).showUsage(true);
- }
- }
-
- option.process(this, arg, param);
-
- if (option.ignoreRest()) {
- break;
- }
- } else {
- options.files.add(new SearchFor(arg));
- }
+ if (options.exitOnError) {
+ System.exit(1);
}
}
- private static Option getOption(String name) throws BadArgs {
- for (Option o : recognizedOptions) {
- if (o.matches(name)) {
- return o;
- }
- }
- throw new BadArgs("unknown option: {0}", name).showUsage(true);
- }
-
- public void printInfo(String message) {
- if (options.info) {
- log.print(message);
- log.flush();
- }
- }
-
- public void printlnInfo(String message) {
- if (options.info) {
- log.println(message);
- log.flush();
- }
- }
-
- public void printVerbose(String message) {
- if (options.verbose) {
- log.print(message);
- log.flush();
- }
- }
-
- public void printlnVerbose(String message) {
- if (options.verbose) {
- log.println(message);
- log.flush();
- }
- }
-
- public void printDebug(String message) {
- if (options.debug) {
- log.print(message);
- log.flush();
- }
- }
-
- public void printlnDebug(String message) {
- if (options.debug) {
- log.println(message);
- log.flush();
- }
- }
-
- public void printError(String message) {
- log.println("Error: " + message);
- log.flush();
- }
-
- private void reportError(Throwable e) {
- log.println("Error: " + e.getMessage());
- if (options.info) {
- e.printStackTrace(log);
- }
- log.flush();
- }
-
- private void reportError(String key, Object... args) {
- printError(MessageFormat.format(key, args));
- }
-
- private void warning(String key, Object... args) {
+ void warning(String key, Object... args) {
log.println("Warning: " + MessageFormat.format(key, args));
log.flush();
}
@@ -789,6 +261,7 @@
private void showUsage() {
log.println("Usage: " + PROGNAME + " <options> list");
log.println("use --help for a list of possible options");
+ log.flush();
}
private void showHelp() {
@@ -798,7 +271,7 @@
log.println(" or directories which contain class files.");
log.println();
log.println("where options include:");
- for (Option o : recognizedOptions) {
+ for (Option o : Options.recognizedOptions) {
String name = o.aliases[0].substring(1); // there must always be at least one name
name = name.charAt(0) == '-' ? name.substring(1) : name;
if (o.isHidden() || name.equals("h")) {
@@ -806,169 +279,10 @@
}
log.println(o.help);
}
+ log.flush();
}
private void showVersion() {
log.println(PROGNAME + " " + JVM_VERSION);
}
-
- /**
- * Collect all method we should compile.
- *
- * @return array list of AOT classes which have compiled methods.
- */
- private List<AOTCompiledClass> collectMethodsToCompile(Set<Class<?>> classesToCompile, CompilationSpec compilationRestrictions, GraalFilters filters, MetaAccessProvider metaAccess) {
- int total = 0;
- int count = 0;
- List<AOTCompiledClass> classes = new ArrayList<>();
-
- for (Class<?> c : classesToCompile) {
- ResolvedJavaType resolvedJavaType = metaAccess.lookupJavaType(c);
- if (filters.shouldCompileAnyMethodInClass(resolvedJavaType)) {
- AOTCompiledClass aotClass = new AOTCompiledClass(resolvedJavaType);
- printlnVerbose(" Scanning " + c.getName());
-
- // Constructors
- try {
- ResolvedJavaMethod[] ctors = resolvedJavaType.getDeclaredConstructors();
- addMethods(aotClass, ctors, compilationRestrictions, filters);
- total += ctors.length;
- } catch (Throwable e) {
- // If we are running in JCK mode we ignore all exceptions.
- if (options.ignoreClassLoadingErrors) {
- printError(c.getName() + ": " + e);
- } else {
- throw new InternalError(e);
- }
- }
-
- // Methods
- try {
- ResolvedJavaMethod[] methods = resolvedJavaType.getDeclaredMethods();
- addMethods(aotClass, methods, compilationRestrictions, filters);
- total += methods.length;
- } catch (Throwable e) {
- // If we are running in JCK mode we ignore all exceptions.
- if (options.ignoreClassLoadingErrors) {
- printError(c.getName() + ": " + e);
- } else {
- throw new InternalError(e);
- }
- }
-
- // Class initializer
- try {
- ResolvedJavaMethod clinit = resolvedJavaType.getClassInitializer();
- if (clinit != null) {
- addMethod(aotClass, clinit, compilationRestrictions, filters);
- total++;
- }
- } catch (Throwable e) {
- // If we are running in JCK mode we ignore all exceptions.
- if (options.ignoreClassLoadingErrors) {
- printError(c.getName() + ": " + e);
- } else {
- throw new InternalError(e);
- }
- }
-
- // Found any methods to compile? Add the class.
- if (aotClass.hasMethods()) {
- classes.add(aotClass);
- count += aotClass.getMethodCount();
- }
- }
- }
- printInfo(total + " methods total, " + count + " methods to compile");
- return classes;
- }
-
- /**
- * If a file with compilation limitations is specified using the java property
- * jdk.tools.jaotc.compile.method.list, read the file's contents and collect the restrictions.
- */
- private CompilationSpec collectSpecifiedMethods() {
- CompilationSpec compilationRestrictions = new CompilationSpec();
- String methodListFileName = options.methodList;
-
- if (methodListFileName != null && !methodListFileName.equals("")) {
- try {
- FileReader methListFile = new FileReader(methodListFileName);
- BufferedReader readBuf = new BufferedReader(methListFile);
- String line = null;
- while ((line = readBuf.readLine()) != null) {
- String trimmedLine = line.trim();
- if (!trimmedLine.startsWith("#")) {
- String[] components = trimmedLine.split(" ");
- if (components.length == 2) {
- String directive = components[0];
- String pattern = components[1];
- switch (directive) {
- case "compileOnly":
- compilationRestrictions.addCompileOnlyPattern(pattern);
- break;
- case "exclude":
- compilationRestrictions.addExcludePattern(pattern);
- break;
- default:
- System.out.println("Unrecognized command " + directive + ". Ignoring\n\t" + line + "\n encountered in " + methodListFileName);
- }
- } else {
- if (!trimmedLine.equals("")) {
- System.out.println("Ignoring malformed line:\n\t " + line + "\n");
- }
- }
- }
- }
- readBuf.close();
- } catch (FileNotFoundException e) {
- throw new InternalError("Unable to open method list file: " + methodListFileName, e);
- } catch (IOException e) {
- throw new InternalError("Unable to read method list file: " + methodListFileName, e);
- }
- }
-
- return compilationRestrictions;
- }
-
- private static void openLog() {
- int v = Integer.getInteger("jdk.tools.jaotc.logCompilation", 0);
- if (v == 0) {
- logFile = null;
- return;
- }
- // Create log file in current directory
- String fileName = "aot_compilation" + new Date().getTime() + ".log";
- Path logFilePath = Paths.get("./", fileName);
- String logFileName = logFilePath.toString();
- try {
- // Create file to which we do not append
- logFile = new FileWriter(logFileName, false);
- } catch (IOException e) {
- System.out.println("Unable to open logfile :" + logFileName + "\nNo logs will be created");
- logFile = null;
- }
- }
-
- public static void writeLog(String str) {
- if (logFile != null) {
- try {
- logFile.write(str + "\n");
- logFile.flush();
- } catch (IOException e) {
- // Print to console
- System.out.println(str + "\n");
- }
- }
- }
-
- public static void closeLog() {
- if (logFile != null) {
- try {
- logFile.close();
- } catch (IOException e) {
- // Do nothing
- }
- }
- }
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MarkId.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MarkId.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -59,7 +59,7 @@
this.value = (int) (long) HotSpotJVMCIRuntime.runtime().getConfigStore().getConstants().get(name);
}
- public static MarkId getEnum(int value) {
+ static MarkId getEnum(int value) {
for (MarkId e : values()) {
if (e.value == value) {
return e;
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MarkProcessor.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MarkProcessor.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -30,7 +30,7 @@
import jdk.vm.ci.code.site.Mark;
-class MarkProcessor {
+final class MarkProcessor {
private final BinaryContainer binaryContainer;
@@ -65,31 +65,31 @@
switch (markId) {
case POLL_FAR:
case POLL_RETURN_FAR:
- vmSymbolName = binaryContainer.getPollingPageSymbolName();
+ vmSymbolName = BinaryContainer.getPollingPageSymbolName();
break;
case CARD_TABLE_ADDRESS:
- vmSymbolName = binaryContainer.getCardTableAddressSymbolName();
+ vmSymbolName = BinaryContainer.getCardTableAddressSymbolName();
break;
case HEAP_TOP_ADDRESS:
- vmSymbolName = binaryContainer.getHeapTopAddressSymbolName();
+ vmSymbolName = BinaryContainer.getHeapTopAddressSymbolName();
break;
case HEAP_END_ADDRESS:
- vmSymbolName = binaryContainer.getHeapEndAddressSymbolName();
+ vmSymbolName = BinaryContainer.getHeapEndAddressSymbolName();
break;
case NARROW_KLASS_BASE_ADDRESS:
- vmSymbolName = binaryContainer.getNarrowKlassBaseAddressSymbolName();
+ vmSymbolName = BinaryContainer.getNarrowKlassBaseAddressSymbolName();
break;
case NARROW_OOP_BASE_ADDRESS:
- vmSymbolName = binaryContainer.getNarrowOopBaseAddressSymbolName();
+ vmSymbolName = BinaryContainer.getNarrowOopBaseAddressSymbolName();
break;
case CRC_TABLE_ADDRESS:
- vmSymbolName = binaryContainer.getCrcTableAddressSymbolName();
+ vmSymbolName = BinaryContainer.getCrcTableAddressSymbolName();
break;
case LOG_OF_HEAP_REGION_GRAIN_BYTES:
- vmSymbolName = binaryContainer.getLogOfHeapRegionGrainBytesSymbolName();
+ vmSymbolName = BinaryContainer.getLogOfHeapRegionGrainBytesSymbolName();
break;
case INLINE_CONTIGUOUS_ALLOCATION_SUPPORTED:
- vmSymbolName = binaryContainer.getInlineContiguousAllocationSupportedSymbolName();
+ vmSymbolName = BinaryContainer.getInlineContiguousAllocationSupportedSymbolName();
break;
default:
throw new InternalError("Unhandled mark: " + mark);
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MetadataBuilder.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MetadataBuilder.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -28,10 +28,7 @@
import jdk.tools.jaotc.binformat.BinaryContainer;
import jdk.tools.jaotc.binformat.ByteContainer;
-import jdk.tools.jaotc.binformat.Symbol.Binding;
-import jdk.tools.jaotc.binformat.Symbol.Kind;
import jdk.tools.jaotc.binformat.GotSymbol;
-import jdk.tools.jaotc.AOTCompiledClass.AOTKlassData;
import jdk.tools.jaotc.utils.NativeOrderOutputStream;
import org.graalvm.compiler.code.CompilationResult;
import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
@@ -43,7 +40,7 @@
import jdk.vm.ci.hotspot.HotSpotCompiledCode;
import jdk.vm.ci.hotspot.HotSpotMetaData;
-class MetadataBuilder {
+final class MetadataBuilder {
private final DataBuilder dataBuilder;
@@ -58,8 +55,6 @@
* Process compiled methods and create method metadata.
*/
void processMetadata(List<AOTCompiledClass> classes, AOTCompiledClass stubCompiledCode) {
- binaryContainer.getMethodMetadataContainer().createSymbol(0, Kind.OBJECT, Binding.LOCAL, 0, "metaStart");
-
for (AOTCompiledClass c : classes) {
processMetadataClass(c);
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/MiscUtils.java Tue Aug 15 08:46:32 2017 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2016, 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 jdk.tools.jaotc;
-
-import org.graalvm.compiler.bytecode.Bytecodes;
-
-import jdk.vm.ci.code.BytecodePosition;
-import jdk.vm.ci.code.site.Call;
-import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
-import jdk.vm.ci.meta.ResolvedJavaMethod;
-
-public class MiscUtils {
-
- /**
- * Name a java method with class and signature to make it unique.
- *
- * @param method to generate unique identifier for
- * @return Unique name for this method including class and signature
- **/
- public static String uniqueMethodName(ResolvedJavaMethod method) {
- String className = method.getDeclaringClass().toClassName();
- String name = className + "." + method.getName() + method.getSignature().toMethodDescriptor();
- return name;
- }
-
- public static boolean isStaticCall(Call call) {
- if (isJavaCall(call)) {
- return ((getByteCode(call) & 0xFF) == Bytecodes.INVOKESTATIC);
- }
- return false;
- }
-
- public static boolean isSpecialCall(Call call) {
- if (isJavaCall(call)) {
- return ((getByteCode(call) & 0xFF) == Bytecodes.INVOKESPECIAL);
- }
- return false;
- }
-
- private static boolean isInvokeVirtual(Call call) {
- if (isJavaCall(call)) {
- return ((getByteCode(call) & 0xFF) == Bytecodes.INVOKEVIRTUAL) || ((getByteCode(call) & 0xFF) == Bytecodes.INVOKEINTERFACE);
- }
- return false;
- }
-
- public static boolean isVirtualCall(CompiledMethodInfo methodInfo, Call call) {
- return isInvokeVirtual(call) && !methodInfo.hasMark(call, MarkId.INVOKESPECIAL);
- }
-
- public static boolean isOptVirtualCall(CompiledMethodInfo methodInfo, Call call) {
- return isInvokeVirtual(call) && methodInfo.hasMark(call, MarkId.INVOKESPECIAL);
- }
-
- private static boolean isJavaCall(Call call) {
- // If there is no associated debug info return false
- if (call.debugInfo == null) {
- return false;
- }
- BytecodePosition bcpos = call.debugInfo.getBytecodePosition();
- ResolvedJavaMethod method = bcpos.getMethod();
- // If bytecode position indicates a special value (negative value) it is
- // not a normal java call
- if (bcpos.getBCI() < 0) {
- return false;
- }
- // If there is no method associated with the debuginfo, return false
- if (method == null) {
- return false;
- }
- assert (method instanceof HotSpotResolvedJavaMethod) : "Not a resolved Java call";
- return true;
- }
-
- private static byte getByteCode(Call call) {
- ResolvedJavaMethod m = call.debugInfo.getBytecodePosition().getMethod();
- int callPosition = call.debugInfo.getBytecodePosition().getBCI();
- byte[] code = m.getCode();
- return code[callPosition];
- }
-
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Options.java Wed Aug 23 12:39:55 2017 +0000
@@ -0,0 +1,297 @@
+/*
+ * Copyright (c) 2017, 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 jdk.tools.jaotc;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import jdk.tools.jaotc.collect.ClassSearch;
+import jdk.tools.jaotc.collect.ClassSource;
+import jdk.tools.jaotc.collect.SearchFor;
+import jdk.tools.jaotc.collect.SearchPath;
+import jdk.tools.jaotc.collect.classname.ClassNameSourceProvider;
+import jdk.tools.jaotc.collect.directory.DirectorySourceProvider;
+import jdk.tools.jaotc.collect.jar.JarSourceProvider;
+import jdk.tools.jaotc.collect.module.ModuleSourceProvider;
+
+final class Options {
+ List<SearchFor> files = new LinkedList<>();
+ String osName;
+ String outputName = defaultOutputName();
+ String methodList;
+ List<ClassSource> sources = new ArrayList<>();
+ String linkerpath = null;
+ SearchPath searchPath = new SearchPath();
+
+ /**
+ * We don't see scaling beyond 16 threads.
+ */
+ private static final int COMPILER_THREADS = 16;
+
+ int threads = Integer.min(COMPILER_THREADS, Runtime.getRuntime().availableProcessors());
+
+ boolean ignoreClassLoadingErrors;
+ boolean exitOnError;
+ boolean info;
+ boolean verbose;
+ boolean debug;
+ boolean help;
+ boolean version;
+ boolean compileWithAssertions;
+ boolean tiered;
+
+ private String defaultOutputName() {
+ osName = System.getProperty("os.name");
+ String name = "unnamed.";
+ String ext;
+
+ switch (osName) {
+ case "Linux":
+ case "SunOS":
+ ext = "so";
+ break;
+ case "Mac OS X":
+ ext = "dylib";
+ break;
+ default:
+ if (osName.startsWith("Windows")) {
+ ext = "dll";
+ } else {
+ ext = "so";
+ }
+ }
+
+ return name + ext;
+ }
+
+ static class BadArgs extends Exception {
+ private static final long serialVersionUID = 1L;
+ final String key;
+ final Object[] args;
+ boolean showUsage;
+
+ BadArgs(String key, Object... args) {
+ super(MessageFormat.format(key, args));
+ this.key = key;
+ this.args = args;
+ }
+
+ BadArgs showUsage(boolean b) {
+ showUsage = b;
+ return this;
+ }
+ }
+
+ abstract static class Option {
+ final String help;
+ final boolean hasArg;
+ final String[] aliases;
+
+ Option(String help, boolean hasArg, String... aliases) {
+ this.help = help;
+ this.hasArg = hasArg;
+ this.aliases = aliases;
+ }
+
+ boolean isHidden() {
+ return false;
+ }
+
+ boolean matches(String opt) {
+ for (String a : aliases) {
+ if (a.equals(opt)) {
+ return true;
+ } else if (opt.startsWith("--") && hasArg && opt.startsWith(a + "=")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ boolean ignoreRest() {
+ return false;
+ }
+
+ abstract void process(Main task, String opt, String arg) throws BadArgs;
+ }
+
+ static Option[] recognizedOptions = {new Option(" --output <file> Output file name", true, "--output") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ String name = arg;
+ task.options.outputName = name;
+ }
+ }, new Option(" --class-name <class names> List of classes to compile", true, "--class-name", "--classname") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ task.options.files.addAll(ClassSearch.makeList(ClassNameSourceProvider.TYPE, arg));
+ }
+ }, new Option(" --jar <jarfiles> List of jar files to compile", true, "--jar") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ task.options.files.addAll(ClassSearch.makeList(JarSourceProvider.TYPE, arg));
+ }
+ }, new Option(" --module <modules> List of modules to compile", true, "--module") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ task.options.files.addAll(ClassSearch.makeList(ModuleSourceProvider.TYPE, arg));
+ }
+ }, new Option(" --directory <dirs> List of directories where to search for files to compile", true, "--directory") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ task.options.files.addAll(ClassSearch.makeList(DirectorySourceProvider.TYPE, arg));
+ }
+ }, new Option(" --search-path <dirs> List of directories where to search for specified files", true, "--search-path") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ String[] elements = arg.split(":");
+ task.options.searchPath.add(elements);
+ }
+ }, new Option(" --compile-commands <file> Name of file with compile commands", true, "--compile-commands") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ task.options.methodList = arg;
+ }
+ }, new Option(" --compile-for-tiered Generate profiling code for tiered compilation", false, "--compile-for-tiered") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ task.options.tiered = true;
+ }
+ }, new Option(" --compile-with-assertions Compile with java assertions", false, "--compile-with-assertions") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ task.options.compileWithAssertions = true;
+ }
+ }, new Option(" --compile-threads <number> Number of compilation threads to be used", true, "--compile-threads", "--threads") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ int threads = Integer.parseInt(arg);
+ final int available = Runtime.getRuntime().availableProcessors();
+ if (threads <= 0) {
+ task.warning("invalid number of threads specified: {0}, using: {1}", threads, available);
+ threads = available;
+ }
+ if (threads > available) {
+ task.warning("too many threads specified: {0}, limiting to: {1}", threads, available);
+ }
+ task.options.threads = Integer.min(threads, available);
+ }
+ }, new Option(" --ignore-errors Ignores all exceptions thrown during class loading", false, "--ignore-errors") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ task.options.ignoreClassLoadingErrors = true;
+ }
+ }, new Option(" --exit-on-error Exit on compilation errors", false, "--exit-on-error") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ task.options.exitOnError = true;
+ }
+ }, new Option(" --info Print information during compilation", false, "--info") {
+ @Override
+ void process(Main task, String opt, String arg) throws BadArgs {
+ task.options.info = true;
+ }
+ }, new Option(" --verbose Print verbose information", false, "--verbose") {
+ @Override
+ void process(Main task, String opt, String arg) throws BadArgs {
+ task.options.info = true;
+ task.options.verbose = true;
+ }
+ }, new Option(" --debug Print debug information", false, "--debug") {
+ @Override
+ void process(Main task, String opt, String arg) throws BadArgs {
+ task.options.info = true;
+ task.options.verbose = true;
+ task.options.debug = true;
+ }
+ }, new Option(" --help Print this usage message", false, "--help") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ task.options.help = true;
+ }
+ }, new Option(" --version Version information", false, "--version") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ task.options.version = true;
+ }
+ }, new Option(" --linker-path Full path to linker executable", true, "--linker-path") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ task.options.linkerpath = arg;
+ }
+ }, new Option(" -J<flag> Pass <flag> directly to the runtime system", false, "-J") {
+ @Override
+ void process(Main task, String opt, String arg) {
+ }
+ }};
+
+ static void handleOptions(Main task, String[] args) throws BadArgs {
+ if (args.length == 0) {
+ task.options.help = true;
+ return;
+ }
+
+ // Make checkstyle happy.
+ for (int i = 0; i < args.length; i++) {
+ String arg = args[i];
+
+ if (arg.charAt(0) == '-') {
+ Option option = getOption(arg);
+ String param = null;
+
+ if (option.hasArg) {
+ if (arg.startsWith("--") && arg.indexOf('=') > 0) {
+ param = arg.substring(arg.indexOf('=') + 1, arg.length());
+ } else if (i + 1 < args.length) {
+ param = args[++i];
+ }
+
+ if (param == null || param.isEmpty() || param.charAt(0) == '-') {
+ throw new BadArgs("missing argument for option: {0}", arg).showUsage(true);
+ }
+ }
+
+ option.process(task, arg, param);
+
+ if (option.ignoreRest()) {
+ break;
+ }
+ } else {
+ task.options.files.add(new SearchFor(arg));
+ }
+ }
+ }
+
+ static Option getOption(String name) throws BadArgs {
+ for (Option o : recognizedOptions) {
+ if (o.matches(name)) {
+ return o;
+ }
+ }
+ throw new BadArgs("unknown option: {0}", name).showUsage(true);
+ }
+
+}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/StubDirectCallSiteRelocationSymbol.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/StubDirectCallSiteRelocationSymbol.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -31,7 +31,7 @@
*/
final class StubDirectCallSiteRelocationSymbol extends CallSiteRelocationSymbol {
- public StubDirectCallSiteRelocationSymbol(CallSiteRelocationInfo callSiteRelocation, BinaryContainer binaryContainer) {
+ StubDirectCallSiteRelocationSymbol(CallSiteRelocationInfo callSiteRelocation, BinaryContainer binaryContainer) {
super(binaryContainer.getSymbol(callSiteRelocation.targetSymbol));
assert symbol != null && symbol.getBinding() == Binding.LOCAL : "Stub symbol must exist and must be LOCAL";
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/StubInformation.java Wed Aug 23 12:39:55 2017 +0000
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2017, 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 jdk.tools.jaotc;
+
+public final class StubInformation {
+ private int stubOffset; // the offset inside the code (text + stubOffset)
+ private int stubSize; // the stub size
+ private int dispatchJumpOffset; // offset after main dispatch jump instruction
+ private int resolveJumpOffset; // offset after jump instruction to runtime call resolution function.
+ private int resolveJumpStart; // offset of jump instruction to VM runtime call resolution function.
+ private int c2iJumpOffset; // offset after jump instruction to c2i adapter for static calls.
+ private int movOffset; // offset after move instruction which loads from got cell:
+ // - Method* for static call
+ // - Klass* for virtual call
+
+ private boolean isVirtual; // virtual call stub
+
+ // maybe add type of stub as well, right now we only have static stubs
+
+ StubInformation(int stubOffset, boolean isVirtual) {
+ this.stubOffset = stubOffset;
+ this.isVirtual = isVirtual;
+ this.stubSize = -1;
+ this.movOffset = -1;
+ this.c2iJumpOffset = -1;
+ this.resolveJumpOffset = -1;
+ this.resolveJumpStart = -1;
+ this.dispatchJumpOffset = -1;
+ }
+
+ int getOffset() {
+ return stubOffset;
+ }
+
+ boolean isVirtual() {
+ return isVirtual;
+ }
+
+ public void setSize(int stubSize) {
+ this.stubSize = stubSize;
+ }
+
+ int getSize() {
+ return stubSize;
+ }
+
+ public void setMovOffset(int movOffset) {
+ this.movOffset = movOffset + stubOffset;
+ }
+
+ int getMovOffset() {
+ return movOffset;
+ }
+
+ public void setC2IJumpOffset(int c2iJumpOffset) {
+ this.c2iJumpOffset = c2iJumpOffset + stubOffset;
+ }
+
+ int getC2IJumpOffset() {
+ return c2iJumpOffset;
+ }
+
+ public void setResolveJumpOffset(int resolveJumpOffset) {
+ this.resolveJumpOffset = resolveJumpOffset + stubOffset;
+ }
+
+ int getResolveJumpOffset() {
+ return resolveJumpOffset;
+ }
+
+ public void setResolveJumpStart(int resolveJumpStart) {
+ this.resolveJumpStart = resolveJumpStart + stubOffset;
+ }
+
+ int getResolveJumpStart() {
+ return resolveJumpStart;
+ }
+
+ public void setDispatchJumpOffset(int dispatchJumpOffset) {
+ this.dispatchJumpOffset = dispatchJumpOffset + stubOffset;
+ }
+
+ int getDispatchJumpOffset() {
+ return dispatchJumpOffset;
+ }
+
+ void verify() {
+ assert stubOffset > 0 : "incorrect stubOffset: " + stubOffset;
+ assert stubSize > 0 : "incorrect stubSize: " + stubSize;
+ assert movOffset > 0 : "incorrect movOffset: " + movOffset;
+ assert dispatchJumpOffset > 0 : "incorrect dispatchJumpOffset: " + dispatchJumpOffset;
+ assert resolveJumpStart > 0 : "incorrect resolveJumpStart: " + resolveJumpStart;
+ assert resolveJumpOffset > 0 : "incorrect resolveJumpOffset: " + resolveJumpOffset;
+ if (!isVirtual) {
+ assert c2iJumpOffset > 0 : "incorrect c2iJumpOffset: " + c2iJumpOffset;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/Timer.java Wed Aug 23 12:39:55 2017 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2016, 2017, 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 jdk.tools.jaotc;
+
+final class Timer implements AutoCloseable {
+
+ private final Main main;
+ private final long start;
+
+ Timer(Main main, String message) {
+ this.main = main;
+ start = System.currentTimeMillis();
+ main.printer.printInfo(message);
+ }
+
+ public void close() {
+ final long end = System.currentTimeMillis();
+ main.printer.printlnInfo(" (" + (end - start) + " ms)");
+ }
+
+}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/amd64/AMD64ELFMacroAssembler.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/amd64/AMD64ELFMacroAssembler.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -27,7 +27,7 @@
import static jdk.vm.ci.amd64.AMD64.rbx;
import static jdk.vm.ci.amd64.AMD64.rip;
-import jdk.tools.jaotc.CompiledMethodInfo.StubInformation;
+import jdk.tools.jaotc.StubInformation;
import jdk.tools.jaotc.ELFMacroAssembler;
import org.graalvm.compiler.asm.amd64.AMD64Address;
import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler;
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/amd64/AMD64InstructionDecoder.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/amd64/AMD64InstructionDecoder.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -35,43 +35,43 @@
private static class Prefix {
// segment overrides
- public static final int CSSegment = 0x2e;
- public static final int SSSegment = 0x36;
- public static final int DSSegment = 0x3e;
- public static final int ESSegment = 0x26;
- public static final int FSSegment = 0x64;
- public static final int GSSegment = 0x65;
- public static final int REX = 0x40;
- public static final int REXB = 0x41;
- public static final int REXX = 0x42;
- public static final int REXXB = 0x43;
- public static final int REXR = 0x44;
- public static final int REXRB = 0x45;
- public static final int REXRX = 0x46;
- public static final int REXRXB = 0x47;
- public static final int REXW = 0x48;
- public static final int REXWB = 0x49;
- public static final int REXWX = 0x4A;
- public static final int REXWXB = 0x4B;
- public static final int REXWR = 0x4C;
- public static final int REXWRB = 0x4D;
- public static final int REXWRX = 0x4E;
- public static final int REXWRXB = 0x4F;
- public static final int VEX_3BYTES = 0xC4;
- public static final int VEX_2BYTES = 0xC5;
+ static final int CSSegment = 0x2e;
+ static final int SSSegment = 0x36;
+ static final int DSSegment = 0x3e;
+ static final int ESSegment = 0x26;
+ static final int FSSegment = 0x64;
+ static final int GSSegment = 0x65;
+ static final int REX = 0x40;
+ static final int REXB = 0x41;
+ static final int REXX = 0x42;
+ static final int REXXB = 0x43;
+ static final int REXR = 0x44;
+ static final int REXRB = 0x45;
+ static final int REXRX = 0x46;
+ static final int REXRXB = 0x47;
+ static final int REXW = 0x48;
+ static final int REXWB = 0x49;
+ static final int REXWX = 0x4A;
+ static final int REXWXB = 0x4B;
+ static final int REXWR = 0x4C;
+ static final int REXWRB = 0x4D;
+ static final int REXWRX = 0x4E;
+ static final int REXWRXB = 0x4F;
+ static final int VEX_3BYTES = 0xC4;
+ static final int VEX_2BYTES = 0xC5;
}
- public static class VexPrefix {
- public static final int VEX_R = 0x80;
- public static final int VEX_W = 0x80;
+ private static class VexPrefix {
+ static final int VEX_R = 0x80;
+ static final int VEX_W = 0x80;
}
- public static class VexOpcode {
- public static final int VEX_OPCODE_NONE = 0x0;
- public static final int VEX_OPCODE_0F = 0x1;
- public static final int VEX_OPCODE_0F_38 = 0x2;
- public static final int VEX_OPCODE_0F_3A = 0x3;
- public static final int VEX_OPCODE_MASK = 0x1F;
+ private static class VexOpcode {
+ static final int VEX_OPCODE_NONE = 0x0;
+ static final int VEX_OPCODE_0F = 0x1;
+ static final int VEX_OPCODE_0F_38 = 0x2;
+ static final int VEX_OPCODE_0F_3A = 0x3;
+ static final int VEX_OPCODE_MASK = 0x1F;
}
public AMD64InstructionDecoder(TargetDescription target) {
@@ -112,7 +112,7 @@
againAfterPrefix = false;
switch (0xFF & code[ip++]) {
- // These convenience macros generate groups of "case" labels for the switch.
+ // These convenience macros generate groups of "case" labels for the switch.
case Prefix.CSSegment:
case Prefix.SSSegment:
@@ -446,7 +446,7 @@
tailSize = 1; // the imm8
break;
default:
- ; // no imm8
+ break; // no imm8
}
break;
case VexOpcode.VEX_OPCODE_0F_3A:
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/ClassSearch.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/ClassSearch.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect;
import jdk.tools.jaotc.LoadedClass;
@@ -27,8 +28,8 @@
import java.util.ArrayList;
import java.util.List;
-public class ClassSearch {
- private List<SourceProvider> providers = new ArrayList<>();
+public final class ClassSearch {
+ private final List<SourceProvider> providers = new ArrayList<>();
public void addProvider(SourceProvider provider) {
providers.add(provider);
@@ -50,7 +51,7 @@
return loaded;
}
- private LoadedClass loadClass(String name, ClassLoader loader) {
+ private static LoadedClass loadClass(String name, ClassLoader loader) {
try {
Class<?> clzz = loader.loadClass(name);
return new LoadedClass(name, clzz);
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/ClassSource.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/ClassSource.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect;
import java.nio.file.Path;
@@ -32,17 +33,17 @@
}
static String stripRoot(Path path) {
- if (path.getRoot() != null) {
- String root = path.getRoot().toString();
- String filename = path.toString().substring(root.length());
- String separator = path.getFileSystem().getSeparator();
- while (filename.startsWith(separator)) {
- filename = filename.substring(separator.length());
+ if (path.getRoot() != null) {
+ String root = path.getRoot().toString();
+ String filename = path.toString().substring(root.length());
+ String separator = path.getFileSystem().getSeparator();
+ while (filename.startsWith(separator)) {
+ filename = filename.substring(separator.length());
+ }
+ return filename;
}
- return filename;
- }
- return path.toString();
+ return path.toString();
}
static String makeClassName(Path path) {
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/FileSupport.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/FileSupport.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect;
import java.io.IOException;
@@ -28,7 +29,7 @@
import java.util.HashMap;
public class FileSupport {
- public boolean exists(Path path) {
+ public boolean exists(Path path) {
return Files.exists(path);
}
@@ -36,7 +37,7 @@
return Files.isDirectory(path);
}
- private FileSystem makeJarFileSystem(Path path) {
+ private static FileSystem makeJarFileSystem(Path path) {
try {
return FileSystems.newFileSystem(makeJarFileURI(path), new HashMap<>());
} catch (IOException e) {
@@ -44,10 +45,10 @@
}
}
- private URI makeJarFileURI(Path path) {
+ private static URI makeJarFileURI(Path path) {
try {
String name = path.toAbsolutePath().toString();
- name = name.replace('\\','/');
+ name = name.replace('\\', '/');
return new URI("jar:file:///" + name + "!/");
} catch (URISyntaxException e) {
throw new InternalError(e);
@@ -66,8 +67,8 @@
return URLClassLoader.newInstance(buildUrls(path));
}
- private URL[] buildUrls(Path path) throws MalformedURLException {
- return new URL[] { path.toUri().toURL() };
+ private static URL[] buildUrls(Path path) throws MalformedURLException {
+ return new URL[]{path.toUri().toURL()};
}
public Path getJarFileSystemRoot(Path jarFile) {
@@ -80,7 +81,7 @@
}
public Path getSubDirectory(FileSystem fileSystem, Path root, Path path) throws IOException {
- DirectoryStream<Path> paths = fileSystem.provider().newDirectoryStream(root,null);
+ DirectoryStream<Path> paths = fileSystem.provider().newDirectoryStream(root, null);
for (Path entry : paths) {
Path relative = root.relativize(entry);
if (relative.equals(path)) {
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/FileSystemFinder.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/FileSystemFinder.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect;
import java.io.IOException;
@@ -33,7 +34,7 @@
/**
* {@link FileVisitor} implementation to find class files recursively.
*/
-public class FileSystemFinder extends SimpleFileVisitor<Path> implements Iterable<Path> {
+public final class FileSystemFinder extends SimpleFileVisitor<Path> implements Iterable<Path> {
private final ArrayList<Path> fileNames = new ArrayList<>();
private final PathMatcher filter;
@@ -68,7 +69,6 @@
return CONTINUE;
}
-
@Override
public Iterator<Path> iterator() {
return fileNames.iterator();
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SearchFor.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SearchFor.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,9 +20,10 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect;
-public class SearchFor {
+public final class SearchFor {
private final String name;
private final String type;
@@ -35,15 +36,15 @@
this.type = type;
}
- public boolean isUnknown() {
+ boolean isUnknown() {
return "".equals(type);
}
- public String getType() {
+ String getType() {
return this.type;
}
- public String getName() {
+ String getName() {
return this.name;
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SearchPath.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SearchPath.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect;
import java.nio.file.FileSystem;
@@ -84,4 +85,3 @@
}
}
}
-
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SourceProvider.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/SourceProvider.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect;
public interface SourceProvider {
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/classname/ClassNameSource.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/classname/ClassNameSource.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,17 +20,18 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect.classname;
import jdk.tools.jaotc.collect.ClassSource;
import java.util.function.BiConsumer;
-public class ClassNameSource implements ClassSource {
+public final class ClassNameSource implements ClassSource {
private final String name;
private final ClassLoader classLoader;
- public ClassNameSource(String name, ClassLoader classLoader) {
+ ClassNameSource(String name, ClassLoader classLoader) {
this.name = name;
this.classLoader = classLoader;
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/classname/ClassNameSourceProvider.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/classname/ClassNameSourceProvider.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect.classname;
import jdk.tools.jaotc.collect.ClassSource;
@@ -30,7 +31,7 @@
import java.nio.file.Path;
import java.nio.file.Paths;
-public class ClassNameSourceProvider implements SourceProvider {
+public final class ClassNameSourceProvider implements SourceProvider {
public final static String TYPE = "class";
private final ClassLoader classLoader;
@@ -46,7 +47,8 @@
}
@Override
- public ClassSource findSource(String name, SearchPath searchPath) {
+ public ClassSource findSource(String name0, SearchPath searchPath) {
+ String name = name0;
Path path = Paths.get(name);
if (ClassSource.pathIsClassFile(path)) {
name = ClassSource.makeClassName(path);
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/directory/DirectorySource.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/directory/DirectorySource.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect.directory;
import jdk.tools.jaotc.collect.ClassSource;
@@ -28,11 +29,11 @@
import java.nio.file.Path;
import java.util.function.BiConsumer;
-public class DirectorySource implements ClassSource {
+public final class DirectorySource implements ClassSource {
private final Path directoryPath;
private final ClassLoader classLoader;
- public DirectorySource(Path directoryPath, ClassLoader classLoader) {
+ DirectorySource(Path directoryPath, ClassLoader classLoader) {
this.directoryPath = directoryPath;
this.classLoader = classLoader;
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/directory/DirectorySourceProvider.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/directory/DirectorySourceProvider.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect.directory;
import jdk.tools.jaotc.collect.ClassSource;
@@ -32,7 +33,7 @@
import java.nio.file.FileSystems;
import java.nio.file.Path;
-public class DirectorySourceProvider implements SourceProvider {
+public final class DirectorySourceProvider implements SourceProvider {
private final FileSupport fileSupport;
private final FileSystem fileSystem;
public final static String TYPE = "directory";
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/jar/JarFileSource.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/jar/JarFileSource.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect.jar;
import jdk.tools.jaotc.collect.ClassSource;
@@ -28,18 +29,18 @@
import java.nio.file.Path;
import java.util.function.BiConsumer;
-public class JarFileSource implements ClassSource {
+public final class JarFileSource implements ClassSource {
private final Path jarFile;
private final Path jarRootPath;
private final ClassLoader classLoader;
-
- public JarFileSource(Path jarFile, Path jarRootPath, ClassLoader classLoader) {
+ JarFileSource(Path jarFile, Path jarRootPath, ClassLoader classLoader) {
this.jarFile = jarFile;
this.jarRootPath = jarRootPath;
this.classLoader = classLoader;
}
+ @Override
public void eachClass(BiConsumer<String, ClassLoader> consumer) {
FileSystemFinder finder = new FileSystemFinder(jarRootPath, ClassSource::pathIsClassFile);
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/jar/JarSourceProvider.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/jar/JarSourceProvider.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect.jar;
import jdk.tools.jaotc.collect.ClassSource;
@@ -33,7 +34,7 @@
import java.nio.file.Path;
import java.nio.file.ProviderNotFoundException;
-public class JarSourceProvider implements SourceProvider {
+public final class JarSourceProvider implements SourceProvider {
private final FileSystem fileSystem;
private final FileSupport fileSupport;
public final static String TYPE = "jar";
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/module/ModuleSource.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/module/ModuleSource.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect.module;
import jdk.tools.jaotc.collect.ClassSource;
@@ -28,15 +29,19 @@
import java.nio.file.Path;
import java.util.function.BiConsumer;
-public class ModuleSource implements ClassSource {
+public final class ModuleSource implements ClassSource {
private final Path modulePath;
private final ClassLoader classLoader;
- public ModuleSource(Path modulePath, ClassLoader classLoader) {
+ ModuleSource(Path modulePath, ClassLoader classLoader) {
this.modulePath = modulePath;
this.classLoader = classLoader;
}
+ public Path getModulePath() {
+ return modulePath;
+ }
+
@Override
public void eachClass(BiConsumer<String, ClassLoader> consumer) {
FileSystemFinder finder = new FileSystemFinder(modulePath, ClassSource::pathIsClassFile);
@@ -46,10 +51,6 @@
}
}
- public Path getModulePath() {
- return modulePath;
- }
-
@Override
public String toString() {
return "module:" + modulePath.toString();
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/module/ModuleSourceProvider.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/collect/module/ModuleSourceProvider.java Wed Aug 23 12:39:55 2017 +0000
@@ -20,6 +20,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package jdk.tools.jaotc.collect.module;
import jdk.tools.jaotc.collect.ClassSource;
@@ -33,7 +34,7 @@
import java.nio.file.FileSystems;
import java.nio.file.Path;
-public class ModuleSourceProvider implements SourceProvider {
+public final class ModuleSourceProvider implements SourceProvider {
private final FileSystem fileSystem;
private final ClassLoader classLoader;
private final FileSupport fileSupport;
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/utils/NativeOrderOutputStream.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/utils/NativeOrderOutputStream.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -29,7 +29,7 @@
import java.util.ArrayList;
import java.util.List;
-public class NativeOrderOutputStream {
+public final class NativeOrderOutputStream {
private final PatchableByteOutputStream os = new PatchableByteOutputStream();
private final byte[] backingArray = new byte[8];
private final ByteBuffer buffer;
@@ -181,7 +181,7 @@
private static class PatchableByteOutputStream extends ByteArrayOutputStream {
public void writeAt(byte[] data, int length, int position) {
- long end = (long)position + (long)length;
+ long end = (long) position + (long) length;
if (buf.length < end) {
throw new IllegalArgumentException("Array not properly sized");
}
--- a/hotspot/src/jdk.aot/share/classes/jdk.tools.jaotc/src/jdk/tools/jaotc/utils/Timer.java Tue Aug 15 08:46:32 2017 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2016, 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 jdk.tools.jaotc.utils;
-
-import jdk.tools.jaotc.Main;
-
-public class Timer implements AutoCloseable {
-
- private final Main main;
- private final long start;
-
- public Timer(Main main, String message) {
- this.main = main;
- start = System.currentTimeMillis();
- main.printInfo(message);
- }
-
- public void close() {
- final long end = System.currentTimeMillis();
- main.printlnInfo(" (" + (end - start) + " ms)");
- }
-
-}
--- a/hotspot/src/jdk.internal.vm.compiler/.mx.graal/suite.py Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/jdk.internal.vm.compiler/.mx.graal/suite.py Wed Aug 23 12:39:55 2017 +0000
@@ -1106,34 +1106,12 @@
"jdk.tools.jaotc.binformat" : {
"subDir" : "../jdk.aot/share/classes",
"sourceDirs" : ["src"],
- "dependencies" : [
- "jdk.tools.jaotc.jnilibelf",
- ],
"generatedDependencies" : [
"org.graalvm.compiler.hotspot",
],
"checkstyle" : "jdk.tools.jaotc",
"javaCompliance" : "1.8",
},
-
- "jdk.tools.jaotc.jnilibelf" : {
- "subDir" : "../jdk.aot/share/classes",
- "sourceDirs" : ["src"],
- "dependencies" : [],
- "checkstyle" : "jdk.tools.jaotc",
- "javaCompliance" : "1.8",
- },
-
- "jdk.tools.jaotc.jnilibelf.test" : {
- "subDir" : "../../test/compiler/aot",
- "sourceDirs" : ["src"],
- "dependencies" : [
- "jdk.tools.jaotc.jnilibelf",
- ],
- "checkstyle" : "jdk.tools.jaotc",
- "javaCompliance" : "1.8",
- },
-
},
"distributions" : {
--- a/hotspot/src/os/aix/vm/os_aix.cpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/os/aix/vm/os_aix.cpp Wed Aug 23 12:39:55 2017 +0000
@@ -863,20 +863,31 @@
// Calculate stack size if it's not specified by caller.
size_t stack_size = os::Posix::get_initial_stack_size(thr_type, req_stack_size);
- int status = pthread_attr_setstacksize(&attr, stack_size);
- assert_status(status == 0, status, "pthread_attr_setstacksize");
+
+ // On Aix, pthread_attr_setstacksize fails with huge values and leaves the
+ // thread size in attr unchanged. If this is the minimal stack size as set
+ // by pthread_attr_init this leads to crashes after thread creation. E.g. the
+ // guard pages might not fit on the tiny stack created.
+ int ret = pthread_attr_setstacksize(&attr, stack_size);
+ if (ret != 0) {
+ log_warning(os, thread)("The thread stack size specified is invalid: " SIZE_FORMAT "k",
+ stack_size / K);
+ }
// Configure libc guard page.
- pthread_attr_setguardsize(&attr, os::Aix::default_guard_size(thr_type));
-
- pthread_t tid;
- int ret = pthread_create(&tid, &attr, (void* (*)(void*)) thread_native_entry, thread);
-
- char buf[64];
+ ret = pthread_attr_setguardsize(&attr, os::Aix::default_guard_size(thr_type));
+
+ pthread_t tid = 0;
if (ret == 0) {
+ ret = pthread_create(&tid, &attr, (void* (*)(void*)) thread_native_entry, thread);
+ }
+
+ if (ret == 0) {
+ char buf[64];
log_info(os, thread)("Thread started (pthread id: " UINTX_FORMAT ", attributes: %s). ",
(uintx) tid, os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr));
} else {
+ char buf[64];
log_warning(os, thread)("Failed to start thread - pthread_create failed (%d=%s) for attributes: %s.",
ret, os::errno_name(ret), os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr));
}
--- a/hotspot/src/os_cpu/linux_s390/vm/atomic_linux_s390.hpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/os_cpu/linux_s390/vm/atomic_linux_s390.hpp Wed Aug 23 12:39:55 2017 +0000
@@ -105,7 +105,7 @@
//---< inputs >---
: [inc] "a" (inc) // read-only.
//---< clobbered >---
- : "cc", "r0", "r2", "r3"
+ : "cc", "r0", "r2", "r3", "memory"
);
} else {
__asm__ __volatile__ (
@@ -120,7 +120,7 @@
//---< inputs >---
: [inc] "a" (inc) // read-only.
//---< clobbered >---
- : "cc"
+ : "cc", "memory"
);
}
@@ -151,7 +151,7 @@
//---< inputs >---
: [inc] "a" (inc) // read-only.
//---< clobbered >---
- : "cc", "r0", "r2", "r3"
+ : "cc", "r0", "r2", "r3", "memory"
);
} else {
__asm__ __volatile__ (
@@ -166,7 +166,7 @@
//---< inputs >---
: [inc] "a" (inc) // read-only.
//---< clobbered >---
- : "cc"
+ : "cc", "memory"
);
}
@@ -214,7 +214,7 @@
:
// : [inc] "a" (inc) // read-only.
//---< clobbered >---
- : "cc", "r2", "r3"
+ : "cc", "r2", "r3", "memory"
);
} else {
__asm__ __volatile__ (
@@ -229,7 +229,7 @@
//---< inputs >---
:
//---< clobbered >---
- : "cc"
+ : "cc", "memory"
);
}
}
@@ -258,7 +258,7 @@
:
// : [inc] "a" (inc) // read-only.
//---< clobbered >---
- : "cc", "r2", "r3"
+ : "cc", "r2", "r3", "memory"
);
} else {
__asm__ __volatile__ (
@@ -273,7 +273,7 @@
//---< inputs >---
:
//---< clobbered >---
- : "cc"
+ : "cc", "memory"
);
}
}
@@ -317,7 +317,7 @@
:
// : [inc] "a" (inc) // read-only.
//---< clobbered >---
- : "cc", "r2", "r3"
+ : "cc", "r2", "r3", "memory"
);
} else {
__asm__ __volatile__ (
@@ -335,7 +335,7 @@
//---< inputs >---
:
//---< clobbered >---
- : "cc"
+ : "cc", "memory"
);
}
}
@@ -364,7 +364,7 @@
:
// : [inc] "a" (inc) // read-only.
//---< clobbered >---
- : "cc", "r2", "r3"
+ : "cc", "r2", "r3", "memory"
);
} else {
__asm__ __volatile__ (
@@ -382,7 +382,7 @@
//---< inputs >---
:
//---< clobbered >---
- : "cc"
+ : "cc", "memory"
);
}
}
@@ -420,7 +420,7 @@
//---< inputs >---
: [upd] "d" (xchg_val) // read-only, value to be written to memory
//---< clobbered >---
- : "cc"
+ : "cc", "memory"
);
return (jint)old;
@@ -439,7 +439,7 @@
//---< inputs >---
: [upd] "d" (xchg_val) // read-only, value to be written to memory
//---< clobbered >---
- : "cc"
+ : "cc", "memory"
);
return (intptr_t)old;
@@ -490,7 +490,7 @@
: [upd] "d" (xchg_val)
, "0" (cmp_val) // Read-only, initial value for [old] (operand #0).
// clobbered
- : "cc"
+ : "cc", "memory"
);
return (jint)old;
@@ -508,7 +508,7 @@
: [upd] "d" (xchg_val)
, "0" (cmp_val) // Read-only, initial value for [old] (operand #0).
// clobbered
- : "cc"
+ : "cc", "memory"
);
return (jlong)old;
--- a/hotspot/src/share/vm/aot/aotCodeHeap.cpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/share/vm/aot/aotCodeHeap.cpp Wed Aug 23 12:39:55 2017 +0000
@@ -51,7 +51,7 @@
Klass* AOTCodeHeap::get_klass_from_got(const char* klass_name, int klass_len, const Method* method) {
AOTKlassData* klass_data = (AOTKlassData*)_lib->load_symbol(klass_name);
- Klass* k = (Klass*)_metaspace_got[klass_data->_got_index];
+ Klass* k = (Klass*)_klasses_got[klass_data->_got_index];
if (k == NULL) {
Thread* thread = Thread::current();
k = lookup_klass(klass_name, klass_len, method, thread);
@@ -60,7 +60,7 @@
fatal("Shared file %s error: klass %s should be resolved already", _lib->name(), klass_name);
vm_exit(1);
}
- _metaspace_got[klass_data->_got_index] = k;
+ _klasses_got[klass_data->_got_index] = k;
}
return k;
}
@@ -202,8 +202,8 @@
_name = (const char*) strdup(name);
// Verify that VM runs with the same parameters as AOT tool.
- _config = (AOTConfiguration*) load_symbol("JVM.config");
- _header = (AOTHeader*) load_symbol("JVM.header");
+ _config = (AOTConfiguration*) load_symbol("A.config");
+ _header = (AOTHeader*) load_symbol("A.header");
verify_config();
@@ -224,31 +224,31 @@
_method_count = _lib->header()->_method_count;
// Collect metaspace info: names -> address in .got section
- _metaspace_names = (const char*) _lib->load_symbol("JVM.meta.names");
- _method_metadata = (address) _lib->load_symbol("JVM.meth.metadata");
- _methods_offsets = (address) _lib->load_symbol("JVM.methods.offsets");
- _klasses_offsets = (address) _lib->load_symbol("JVM.kls.offsets");
- _dependencies = (address) _lib->load_symbol("JVM.kls.dependencies");
- _code_space = (address) _lib->load_symbol("JVM.text");
+ _metaspace_names = (const char*) _lib->load_symbol("A.meta.names");
+ _method_metadata = (address) _lib->load_symbol("A.meth.metadata");
+ _methods_offsets = (address) _lib->load_symbol("A.meth.offsets");
+ _klasses_offsets = (address) _lib->load_symbol("A.kls.offsets");
+ _dependencies = (address) _lib->load_symbol("A.kls.dependencies");
+ _code_space = (address) _lib->load_symbol("A.text");
// First cell is number of elements.
- _metaspace_got = (Metadata**) _lib->load_symbol("JVM.meta.got");
- _metaspace_got_size = _lib->header()->_metaspace_got_size;
+ _klasses_got = (Metadata**) _lib->load_symbol("A.kls.got");
+ _klasses_got_size = _lib->header()->_klasses_got_size;
- _metadata_got = (Metadata**) _lib->load_symbol("JVM.metadata.got");
+ _metadata_got = (Metadata**) _lib->load_symbol("A.meta.got");
_metadata_got_size = _lib->header()->_metadata_got_size;
- _oop_got = (oop*) _lib->load_symbol("JVM.oop.got");
+ _oop_got = (oop*) _lib->load_symbol("A.oop.got");
_oop_got_size = _lib->header()->_oop_got_size;
// Collect stubs info
- _stubs_offsets = (int*) _lib->load_symbol("JVM.stubs.offsets");
+ _stubs_offsets = (int*) _lib->load_symbol("A.stubs.offsets");
// code segments table
- _code_segments = (address) _lib->load_symbol("JVM.code.segments");
+ _code_segments = (address) _lib->load_symbol("A.code.segments");
// method state
- _method_state = (jlong*) _lib->load_symbol("JVM.meth.state");
+ _method_state = (jlong*) _lib->load_symbol("A.meth.state");
// Create a table for mapping classes
_classes = NEW_C_HEAP_ARRAY(AOTClass, _class_count, mtCode);
@@ -342,8 +342,8 @@
if (klass_data != NULL) {
// Set both GOT cells, resolved and initialized klass pointers.
// _got_index points to second cell - resolved klass pointer.
- _metaspace_got[klass_data->_got_index-1] = (Metadata*)arr_klass; // Initialized
- _metaspace_got[klass_data->_got_index ] = (Metadata*)arr_klass; // Resolved
+ _klasses_got[klass_data->_got_index-1] = (Metadata*)arr_klass; // Initialized
+ _klasses_got[klass_data->_got_index ] = (Metadata*)arr_klass; // Resolved
if (PrintAOT) {
tty->print_cr("[Found %s in %s]", arr_klass->internal_name(), _lib->name());
}
@@ -680,16 +680,16 @@
if (!ik->has_passed_fingerprint_check()) {
NOT_PRODUCT( aot_klasses_fp_miss++; )
log_trace(aot, class, fingerprint)("class %s%s has bad fingerprint in %s tid=" INTPTR_FORMAT,
- ik->internal_name(), ik->is_shared() ? " (shared)" : "",
- _lib->name(), p2i(thread));
+ ik->internal_name(), ik->is_shared() ? " (shared)" : "",
+ _lib->name(), p2i(thread));
sweep_dependent_methods(klass_data);
return false;
}
if (ik->has_been_redefined()) {
log_trace(aot, class, load)("class %s%s in %s has been redefined tid=" INTPTR_FORMAT,
- ik->internal_name(), ik->is_shared() ? " (shared)" : "",
- _lib->name(), p2i(thread));
+ ik->internal_name(), ik->is_shared() ? " (shared)" : "",
+ _lib->name(), p2i(thread));
sweep_dependent_methods(klass_data);
return false;
}
@@ -698,7 +698,7 @@
AOTClass* aot_class = &_classes[klass_data->_class_id];
if (aot_class->_classloader != NULL && aot_class->_classloader != ik->class_loader_data()) {
log_trace(aot, class, load)("class %s in %s already loaded for classloader %p vs %p tid=" INTPTR_FORMAT,
- ik->internal_name(), _lib->name(), aot_class->_classloader, ik->class_loader_data(), p2i(thread));
+ ik->internal_name(), _lib->name(), aot_class->_classloader, ik->class_loader_data(), p2i(thread));
NOT_PRODUCT( aot_klasses_cl_miss++; )
return false;
}
@@ -715,7 +715,7 @@
aot_class->_classloader = ik->class_loader_data();
// Set klass's Resolve (second) got cell.
- _metaspace_got[klass_data->_got_index] = ik;
+ _klasses_got[klass_data->_got_index] = ik;
// Initialize global symbols of the DSO to the corresponding VM symbol values.
link_global_lib_symbols();
@@ -823,12 +823,12 @@
}
}
-// Scan only metaspace_got cells which should have only Klass*,
+// Scan only klasses_got cells which should have only Klass*,
// metadata_got cells are scanned only for alive AOT methods
// by AOTCompiledMethod::metadata_do().
void AOTCodeHeap::got_metadata_do(void f(Metadata*)) {
- for (int i = 1; i < _metaspace_got_size; i++) {
- Metadata** p = &_metaspace_got[i];
+ for (int i = 1; i < _klasses_got_size; i++) {
+ Metadata** p = &_klasses_got[i];
Metadata* md = *p;
if (md == NULL) continue; // skip non-oops
if (Metaspace::contains(md)) {
--- a/hotspot/src/share/vm/aot/aotCodeHeap.hpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/share/vm/aot/aotCodeHeap.hpp Wed Aug 23 12:39:55 2017 +0000
@@ -77,7 +77,7 @@
int _version;
int _class_count;
int _method_count;
- int _metaspace_got_size;
+ int _klasses_got_size;
int _metadata_got_size;
int _oop_got_size;
int _jvm_version_offset;
@@ -180,11 +180,11 @@
address _klasses_offsets;
address _dependencies;
- Metadata** _metaspace_got;
+ Metadata** _klasses_got;
Metadata** _metadata_got;
oop* _oop_got;
- int _metaspace_got_size;
+ int _klasses_got_size;
int _metadata_got_size;
int _oop_got_size;
@@ -251,7 +251,7 @@
#ifdef ASSERT
bool got_contains(Metadata **p) {
return (p >= &_metadata_got[0] && p < &_metadata_got[_metadata_got_size]) ||
- (p >= &_metaspace_got[0] && p < &_metaspace_got[_metaspace_got_size]);
+ (p >= &_klasses_got[0] && p < &_klasses_got[_klasses_got_size]);
}
#endif
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Wed Aug 23 12:39:55 2017 +0000
@@ -38,12 +38,12 @@
#include "gc/g1/g1CollectorPolicy.hpp"
#include "gc/g1/g1CollectorState.hpp"
#include "gc/g1/g1EvacStats.inline.hpp"
+#include "gc/g1/g1FullGCScope.hpp"
#include "gc/g1/g1GCPhaseTimes.hpp"
#include "gc/g1/g1HeapSizingPolicy.hpp"
#include "gc/g1/g1HeapTransition.hpp"
#include "gc/g1/g1HeapVerifier.hpp"
#include "gc/g1/g1HotCardCache.hpp"
-#include "gc/g1/g1MarkSweep.hpp"
#include "gc/g1/g1OopClosures.inline.hpp"
#include "gc/g1/g1ParScanThreadState.inline.hpp"
#include "gc/g1/g1Policy.hpp"
@@ -51,6 +51,7 @@
#include "gc/g1/g1RemSet.inline.hpp"
#include "gc/g1/g1RootClosures.hpp"
#include "gc/g1/g1RootProcessor.hpp"
+#include "gc/g1/g1SerialFullCollector.hpp"
#include "gc/g1/g1StringDedup.hpp"
#include "gc/g1/g1YCTypes.hpp"
#include "gc/g1/heapRegion.inline.hpp"
@@ -1062,73 +1063,6 @@
ShouldNotReachHere();
}
-class PostMCRemSetClearClosure: public HeapRegionClosure {
- G1CollectedHeap* _g1h;
- ModRefBarrierSet* _mr_bs;
-public:
- PostMCRemSetClearClosure(G1CollectedHeap* g1h, ModRefBarrierSet* mr_bs) :
- _g1h(g1h), _mr_bs(mr_bs) {}
-
- bool doHeapRegion(HeapRegion* r) {
- HeapRegionRemSet* hrrs = r->rem_set();
-
- _g1h->reset_gc_time_stamps(r);
-
- if (r->is_continues_humongous()) {
- // We'll assert that the strong code root list and RSet is empty
- assert(hrrs->strong_code_roots_list_length() == 0, "sanity");
- assert(hrrs->occupied() == 0, "RSet should be empty");
- } else {
- hrrs->clear();
- }
- // You might think here that we could clear just the cards
- // corresponding to the used region. But no: if we leave a dirty card
- // in a region we might allocate into, then it would prevent that card
- // from being enqueued, and cause it to be missed.
- // Re: the performance cost: we shouldn't be doing full GC anyway!
- _mr_bs->clear(MemRegion(r->bottom(), r->end()));
-
- return false;
- }
-};
-
-void G1CollectedHeap::clear_rsets_post_compaction() {
- PostMCRemSetClearClosure rs_clear(this, g1_barrier_set());
- heap_region_iterate(&rs_clear);
-}
-
-class RebuildRSOutOfRegionClosure: public HeapRegionClosure {
- G1CollectedHeap* _g1h;
- RebuildRSOopClosure _cl;
-public:
- RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, uint worker_i = 0) :
- _cl(g1->g1_rem_set(), worker_i),
- _g1h(g1)
- { }
-
- bool doHeapRegion(HeapRegion* r) {
- if (!r->is_continues_humongous()) {
- _cl.set_from(r);
- r->oop_iterate(&_cl);
- }
- return false;
- }
-};
-
-class ParRebuildRSTask: public AbstractGangTask {
- G1CollectedHeap* _g1;
- HeapRegionClaimer _hrclaimer;
-
-public:
- ParRebuildRSTask(G1CollectedHeap* g1) :
- AbstractGangTask("ParRebuildRSTask"), _g1(g1), _hrclaimer(g1->workers()->active_workers()) {}
-
- void work(uint worker_id) {
- RebuildRSOutOfRegionClosure rebuild_rs(_g1, worker_id);
- _g1->heap_region_par_iterate(&rebuild_rs, worker_id, &_hrclaimer);
- }
-};
-
class PostCompactionPrinterClosure: public HeapRegionClosure {
private:
G1HRPrinter* _hr_printer;
@@ -1151,252 +1085,183 @@
}
+void G1CollectedHeap::abort_concurrent_cycle() {
+ // Note: When we have a more flexible GC logging framework that
+ // allows us to add optional attributes to a GC log record we
+ // could consider timing and reporting how long we wait in the
+ // following two methods.
+ wait_while_free_regions_coming();
+ // If we start the compaction before the CM threads finish
+ // scanning the root regions we might trip them over as we'll
+ // be moving objects / updating references. So let's wait until
+ // they are done. By telling them to abort, they should complete
+ // early.
+ _cm->root_regions()->abort();
+ _cm->root_regions()->wait_until_scan_finished();
+ append_secondary_free_list_if_not_empty_with_lock();
+
+ // Disable discovery and empty the discovered lists
+ // for the CM ref processor.
+ ref_processor_cm()->disable_discovery();
+ ref_processor_cm()->abandon_partial_discovery();
+ ref_processor_cm()->verify_no_references_recorded();
+
+ // Abandon current iterations of concurrent marking and concurrent
+ // refinement, if any are in progress.
+ concurrent_mark()->abort();
+}
+
+void G1CollectedHeap::prepare_heap_for_full_collection() {
+ // Make sure we'll choose a new allocation region afterwards.
+ _allocator->release_mutator_alloc_region();
+ _allocator->abandon_gc_alloc_regions();
+ g1_rem_set()->cleanupHRRS();
+
+ // We may have added regions to the current incremental collection
+ // set between the last GC or pause and now. We need to clear the
+ // incremental collection set and then start rebuilding it afresh
+ // after this full GC.
+ abandon_collection_set(collection_set());
+
+ tear_down_region_sets(false /* free_list_only */);
+ collector_state()->set_gcs_are_young(true);
+}
+
+void G1CollectedHeap::verify_before_full_collection(bool explicit_gc) {
+ assert(!GCCause::is_user_requested_gc(gc_cause()) || explicit_gc, "invariant");
+ assert(used() == recalculate_used(), "Should be equal");
+ _verifier->verify_region_sets_optional();
+ _verifier->verify_before_gc();
+ _verifier->check_bitmaps("Full GC Start");
+}
+
+void G1CollectedHeap::prepare_heap_for_mutators() {
+ // Delete metaspaces for unloaded class loaders and clean up loader_data graph
+ ClassLoaderDataGraph::purge();
+ MetaspaceAux::verify_metrics();
+
+ // Prepare heap for normal collections.
+ assert(num_free_regions() == 0, "we should not have added any free regions");
+ rebuild_region_sets(false /* free_list_only */);
+ abort_refinement();
+ resize_if_necessary_after_full_collection();
+
+ // Rebuild the strong code root lists for each region
+ rebuild_strong_code_roots();
+
+ // Start a new incremental collection set for the next pause
+ start_new_collection_set();
+
+ _allocator->init_mutator_alloc_region();
+
+ // Post collection state updates.
+ MetaspaceGC::compute_new_size();
+}
+
+void G1CollectedHeap::abort_refinement() {
+ if (_hot_card_cache->use_cache()) {
+ _hot_card_cache->reset_card_counts();
+ _hot_card_cache->reset_hot_cache();
+ }
+
+ // Discard all remembered set updates.
+ JavaThread::dirty_card_queue_set().abandon_logs();
+ assert(dirty_card_queue_set().completed_buffers_num() == 0, "DCQS should be empty");
+}
+
+void G1CollectedHeap::verify_after_full_collection() {
+ check_gc_time_stamps();
+ _hrm.verify_optional();
+ _verifier->verify_region_sets_optional();
+ _verifier->verify_after_gc();
+ // Clear the previous marking bitmap, if needed for bitmap verification.
+ // Note we cannot do this when we clear the next marking bitmap in
+ // G1ConcurrentMark::abort() above since VerifyDuringGC verifies the
+ // objects marked during a full GC against the previous bitmap.
+ // But we need to clear it before calling check_bitmaps below since
+ // the full GC has compacted objects and updated TAMS but not updated
+ // the prev bitmap.
+ if (G1VerifyBitmaps) {
+ GCTraceTime(Debug, gc)("Clear Bitmap for Verification");
+ _cm->clear_prev_bitmap(workers());
+ }
+ _verifier->check_bitmaps("Full GC End");
+
+ // At this point there should be no regions in the
+ // entire heap tagged as young.
+ assert(check_young_list_empty(), "young list should be empty at this point");
+
+ // Note: since we've just done a full GC, concurrent
+ // marking is no longer active. Therefore we need not
+ // re-enable reference discovery for the CM ref processor.
+ // That will be done at the start of the next marking cycle.
+ // We also know that the STW processor should no longer
+ // discover any new references.
+ assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
+ assert(!ref_processor_cm()->discovery_enabled(), "Postcondition");
+ ref_processor_stw()->verify_no_references_recorded();
+ ref_processor_cm()->verify_no_references_recorded();
+}
+
+void G1CollectedHeap::print_heap_after_full_collection(G1HeapTransition* heap_transition) {
+ print_hrm_post_compaction();
+ heap_transition->print();
+ print_heap_after_gc();
+ print_heap_regions();
+#ifdef TRACESPINNING
+ ParallelTaskTerminator::print_termination_counts();
+#endif
+}
+
+void G1CollectedHeap::do_full_collection_inner(G1FullGCScope* scope) {
+ GCTraceTime(Info, gc) tm("Pause Full", NULL, gc_cause(), true);
+ g1_policy()->record_full_collection_start();
+
+ print_heap_before_gc();
+ print_heap_regions();
+
+ abort_concurrent_cycle();
+ verify_before_full_collection(scope->is_explicit_gc());
+
+ gc_prologue(true);
+ prepare_heap_for_full_collection();
+
+ G1SerialFullCollector serial(scope, ref_processor_stw());
+ serial.prepare_collection();
+ serial.collect();
+ serial.complete_collection();
+
+ prepare_heap_for_mutators();
+
+ g1_policy()->record_full_collection_end();
+ gc_epilogue(true);
+
+ // Post collection verification.
+ verify_after_full_collection();
+
+ // Post collection logging.
+ // We should do this after we potentially resize the heap so
+ // that all the COMMIT / UNCOMMIT events are generated before
+ // the compaction events.
+ print_heap_after_full_collection(scope->heap_transition());
+}
+
bool G1CollectedHeap::do_full_collection(bool explicit_gc,
bool clear_all_soft_refs) {
assert_at_safepoint(true /* should_be_vm_thread */);
if (GCLocker::check_active_before_gc()) {
+ // Full GC was not completed.
return false;
}
- STWGCTimer* gc_timer = G1MarkSweep::gc_timer();
- gc_timer->register_gc_start();
-
- SerialOldTracer* gc_tracer = G1MarkSweep::gc_tracer();
- GCIdMark gc_id_mark;
- gc_tracer->report_gc_start(gc_cause(), gc_timer->gc_start());
-
- SvcGCMarker sgcm(SvcGCMarker::FULL);
- ResourceMark rm;
-
- print_heap_before_gc();
- print_heap_regions();
- trace_heap_before_gc(gc_tracer);
-
- size_t metadata_prev_used = MetaspaceAux::used_bytes();
-
- _verifier->verify_region_sets_optional();
-
const bool do_clear_all_soft_refs = clear_all_soft_refs ||
- collector_policy()->should_clear_all_soft_refs();
-
- ClearedAllSoftRefs casr(do_clear_all_soft_refs, collector_policy());
-
- {
- IsGCActiveMark x;
-
- // Timing
- assert(!GCCause::is_user_requested_gc(gc_cause()) || explicit_gc, "invariant");
- GCTraceCPUTime tcpu;
-
- {
- GCTraceTime(Info, gc) tm("Pause Full", NULL, gc_cause(), true);
- TraceCollectorStats tcs(g1mm()->full_collection_counters());
- TraceMemoryManagerStats tms(true /* fullGC */, gc_cause());
-
- G1HeapTransition heap_transition(this);
- g1_policy()->record_full_collection_start();
-
- // Note: When we have a more flexible GC logging framework that
- // allows us to add optional attributes to a GC log record we
- // could consider timing and reporting how long we wait in the
- // following two methods.
- wait_while_free_regions_coming();
- // If we start the compaction before the CM threads finish
- // scanning the root regions we might trip them over as we'll
- // be moving objects / updating references. So let's wait until
- // they are done. By telling them to abort, they should complete
- // early.
- _cm->root_regions()->abort();
- _cm->root_regions()->wait_until_scan_finished();
- append_secondary_free_list_if_not_empty_with_lock();
-
- gc_prologue(true);
- increment_total_collections(true /* full gc */);
- increment_old_marking_cycles_started();
-
- assert(used() == recalculate_used(), "Should be equal");
-
- _verifier->verify_before_gc();
-
- _verifier->check_bitmaps("Full GC Start");
- pre_full_gc_dump(gc_timer);
-
-#if defined(COMPILER2) || INCLUDE_JVMCI
- DerivedPointerTable::clear();
-#endif
-
- // Disable discovery and empty the discovered lists
- // for the CM ref processor.
- ref_processor_cm()->disable_discovery();
- ref_processor_cm()->abandon_partial_discovery();
- ref_processor_cm()->verify_no_references_recorded();
-
- // Abandon current iterations of concurrent marking and concurrent
- // refinement, if any are in progress.
- concurrent_mark()->abort();
-
- // Make sure we'll choose a new allocation region afterwards.
- _allocator->release_mutator_alloc_region();
- _allocator->abandon_gc_alloc_regions();
- g1_rem_set()->cleanupHRRS();
-
- // We may have added regions to the current incremental collection
- // set between the last GC or pause and now. We need to clear the
- // incremental collection set and then start rebuilding it afresh
- // after this full GC.
- abandon_collection_set(collection_set());
-
- tear_down_region_sets(false /* free_list_only */);
- collector_state()->set_gcs_are_young(true);
-
- // See the comments in g1CollectedHeap.hpp and
- // G1CollectedHeap::ref_processing_init() about
- // how reference processing currently works in G1.
-
- // Temporarily make discovery by the STW ref processor single threaded (non-MT).
- ReferenceProcessorMTDiscoveryMutator stw_rp_disc_ser(ref_processor_stw(), false);
-
- // Temporarily clear the STW ref processor's _is_alive_non_header field.
- ReferenceProcessorIsAliveMutator stw_rp_is_alive_null(ref_processor_stw(), NULL);
-
- ref_processor_stw()->enable_discovery();
- ref_processor_stw()->setup_policy(do_clear_all_soft_refs);
-
- // Do collection work
- {
- HandleMark hm; // Discard invalid handles created during gc
- G1MarkSweep::invoke_at_safepoint(ref_processor_stw(), do_clear_all_soft_refs);
- }
-
- assert(num_free_regions() == 0, "we should not have added any free regions");
- rebuild_region_sets(false /* free_list_only */);
-
- ReferenceProcessorPhaseTimes pt(NULL, ref_processor_stw()->num_q());
-
- // Enqueue any discovered reference objects that have
- // not been removed from the discovered lists.
- ref_processor_stw()->enqueue_discovered_references(NULL, &pt);
-
- pt.print_enqueue_phase();
-
-#if defined(COMPILER2) || INCLUDE_JVMCI
- DerivedPointerTable::update_pointers();
-#endif
-
- MemoryService::track_memory_usage();
-
- assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
- ref_processor_stw()->verify_no_references_recorded();
-
- // Delete metaspaces for unloaded class loaders and clean up loader_data graph
- ClassLoaderDataGraph::purge();
- MetaspaceAux::verify_metrics();
-
- // Note: since we've just done a full GC, concurrent
- // marking is no longer active. Therefore we need not
- // re-enable reference discovery for the CM ref processor.
- // That will be done at the start of the next marking cycle.
- assert(!ref_processor_cm()->discovery_enabled(), "Postcondition");
- ref_processor_cm()->verify_no_references_recorded();
-
- reset_gc_time_stamp();
- // Since everything potentially moved, we will clear all remembered
- // sets, and clear all cards. Later we will rebuild remembered
- // sets. We will also reset the GC time stamps of the regions.
- clear_rsets_post_compaction();
- check_gc_time_stamps();
-
- resize_if_necessary_after_full_collection();
-
- // We should do this after we potentially resize the heap so
- // that all the COMMIT / UNCOMMIT events are generated before
- // the compaction events.
- print_hrm_post_compaction();
-
- if (_hot_card_cache->use_cache()) {
- _hot_card_cache->reset_card_counts();
- _hot_card_cache->reset_hot_cache();
- }
-
- // Rebuild remembered sets of all regions.
- uint n_workers =
- AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
- workers()->active_workers(),
- Threads::number_of_non_daemon_threads());
- workers()->update_active_workers(n_workers);
- log_info(gc,task)("Using %u workers of %u to rebuild remembered set", n_workers, workers()->total_workers());
-
- ParRebuildRSTask rebuild_rs_task(this);
- workers()->run_task(&rebuild_rs_task);
-
- // Rebuild the strong code root lists for each region
- rebuild_strong_code_roots();
-
- if (true) { // FIXME
- MetaspaceGC::compute_new_size();
- }
-
-#ifdef TRACESPINNING
- ParallelTaskTerminator::print_termination_counts();
-#endif
-
- // Discard all rset updates
- JavaThread::dirty_card_queue_set().abandon_logs();
- assert(dirty_card_queue_set().completed_buffers_num() == 0, "DCQS should be empty");
-
- // At this point there should be no regions in the
- // entire heap tagged as young.
- assert(check_young_list_empty(), "young list should be empty at this point");
-
- // Update the number of full collections that have been completed.
- increment_old_marking_cycles_completed(false /* concurrent */);
-
- _hrm.verify_optional();
- _verifier->verify_region_sets_optional();
-
- _verifier->verify_after_gc();
-
- // Clear the previous marking bitmap, if needed for bitmap verification.
- // Note we cannot do this when we clear the next marking bitmap in
- // G1ConcurrentMark::abort() above since VerifyDuringGC verifies the
- // objects marked during a full GC against the previous bitmap.
- // But we need to clear it before calling check_bitmaps below since
- // the full GC has compacted objects and updated TAMS but not updated
- // the prev bitmap.
- if (G1VerifyBitmaps) {
- GCTraceTime(Debug, gc)("Clear Bitmap for Verification");
- _cm->clear_prev_bitmap(workers());
- }
- _verifier->check_bitmaps("Full GC End");
-
- start_new_collection_set();
-
- _allocator->init_mutator_alloc_region();
-
- g1_policy()->record_full_collection_end();
-
- // We must call G1MonitoringSupport::update_sizes() in the same scoping level
- // as an active TraceMemoryManagerStats object (i.e. before the destructor for the
- // TraceMemoryManagerStats is called) so that the G1 memory pools are updated
- // before any GC notifications are raised.
- g1mm()->update_sizes();
-
- gc_epilogue(true);
-
- heap_transition.print();
-
- print_heap_after_gc();
- print_heap_regions();
- trace_heap_after_gc(gc_tracer);
-
- post_full_gc_dump(gc_timer);
- }
-
- gc_timer->register_gc_end();
- gc_tracer->report_gc_end(gc_timer->gc_end(), gc_timer->time_partitions());
- }
-
+ collector_policy()->should_clear_all_soft_refs();
+
+ G1FullGCScope scope(explicit_gc, do_clear_all_soft_refs);
+ do_full_collection_inner(&scope);
+
+ // Full collection was successfully completed.
return true;
}
@@ -2677,21 +2542,37 @@
return (G1CollectedHeap*)heap;
}
-void G1CollectedHeap::gc_prologue(bool full /* Ignored */) {
+void G1CollectedHeap::gc_prologue(bool full) {
// always_do_update_barrier = false;
assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
+ // This summary needs to be printed before incrementing total collections.
+ g1_rem_set()->print_periodic_summary_info("Before GC RS summary", total_collections());
+
+ // Update common counters.
+ increment_total_collections(full /* full gc */);
+ if (full) {
+ increment_old_marking_cycles_started();
+ reset_gc_time_stamp();
+ } else {
+ increment_gc_time_stamp();
+ }
+
+ // Fill TLAB's and such
double start = os::elapsedTime();
- // Fill TLAB's and such
accumulate_statistics_all_tlabs();
ensure_parsability(true);
g1_policy()->phase_times()->record_prepare_tlab_time_ms((os::elapsedTime() - start) * 1000.0);
-
- g1_rem_set()->print_periodic_summary_info("Before GC RS summary", total_collections());
}
void G1CollectedHeap::gc_epilogue(bool full) {
- // we are at the end of the GC. Total collections has already been increased.
+ // Update common counters.
+ if (full) {
+ // Update the number of full collections that have been completed.
+ increment_old_marking_cycles_completed(false /* concurrent */);
+ }
+
+ // We are at the end of the GC. Total collections has already been increased.
g1_rem_set()->print_periodic_summary_info("After GC RS summary", total_collections() - 1);
// FIXME: what is this about?
@@ -2708,6 +2589,7 @@
allocation_context_stats().update(full);
+ MemoryService::track_memory_usage();
// We have just completed a GC. Update the soft reference
// policy with the new heap occupancy
Universe::update_heap_info_at_gc();
@@ -3098,8 +2980,6 @@
IsGCActiveMark x;
gc_prologue(false);
- increment_total_collections(false /* full gc */);
- increment_gc_time_stamp();
if (VerifyRememberedSets) {
log_info(gc, verify)("[Verifying RemSets before GC]");
@@ -3261,8 +3141,6 @@
evacuation_info.set_collectionset_used_before(collection_set()->bytes_used_before());
evacuation_info.set_bytes_copied(g1_policy()->bytes_copied_during_gc());
- MemoryService::track_memory_usage();
-
if (VerifyRememberedSets) {
log_info(gc, verify)("[Verifying RemSets after GC]");
VerifyRegionRemSetClosure v_cl;
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp Wed Aug 23 12:39:55 2017 +0000
@@ -34,6 +34,7 @@
#include "gc/g1/g1EdenRegions.hpp"
#include "gc/g1/g1EvacFailure.hpp"
#include "gc/g1/g1EvacStats.hpp"
+#include "gc/g1/g1HeapTransition.hpp"
#include "gc/g1/g1HeapVerifier.hpp"
#include "gc/g1/g1HRPrinter.hpp"
#include "gc/g1/g1InCSetState.hpp"
@@ -86,6 +87,7 @@
class WorkGang;
class G1Allocator;
class G1ArchiveAllocator;
+class G1FullGCScope;
class G1HeapVerifier;
class G1HeapSizingPolicy;
class G1HeapSummary;
@@ -513,6 +515,17 @@
AllocationContext_t context,
bool* succeeded);
private:
+ // Internal helpers used during full GC to split it up to
+ // increase readability.
+ void do_full_collection_inner(G1FullGCScope* scope);
+ void abort_concurrent_cycle();
+ void verify_before_full_collection(bool explicit_gc);
+ void prepare_heap_for_full_collection();
+ void prepare_heap_for_mutators();
+ void abort_refinement();
+ void verify_after_full_collection();
+ void print_heap_after_full_collection(G1HeapTransition* heap_transition);
+
// Helper method for satisfy_failed_allocation()
HeapWord* satisfy_failed_allocation_helper(size_t word_size,
AllocationContext_t context,
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1FullGCScope.cpp Wed Aug 23 12:39:55 2017 +0000
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "gc/g1/g1FullGCScope.hpp"
+
+G1FullGCScope* G1FullGCScope::_instance = NULL;
+
+G1FullGCScope* G1FullGCScope::instance() {
+ assert(_instance != NULL, "Must be setup already");
+ return _instance;
+}
+
+G1FullGCScope::G1FullGCScope(bool explicit_gc, bool clear_soft) :
+ _rm(),
+ _explicit_gc(explicit_gc),
+ _g1h(G1CollectedHeap::heap()),
+ _gc_id(),
+ _svc_marker(SvcGCMarker::FULL),
+ _timer(),
+ _tracer(),
+ _active(),
+ _cpu_time(),
+ _soft_refs(clear_soft, _g1h->collector_policy()),
+ _memory_stats(true, _g1h->gc_cause()),
+ _collector_stats(_g1h->g1mm()->full_collection_counters()),
+ _heap_transition(_g1h) {
+ assert(_instance == NULL, "Only one scope at a time");
+ _timer.register_gc_start();
+ _tracer.report_gc_start(_g1h->gc_cause(), _timer.gc_start());
+ _g1h->pre_full_gc_dump(&_timer);
+ _g1h->trace_heap_before_gc(&_tracer);
+ _instance = this;
+}
+
+G1FullGCScope::~G1FullGCScope() {
+ // We must call G1MonitoringSupport::update_sizes() in the same scoping level
+ // as an active TraceMemoryManagerStats object (i.e. before the destructor for the
+ // TraceMemoryManagerStats is called) so that the G1 memory pools are updated
+ // before any GC notifications are raised.
+ _g1h->g1mm()->update_sizes();
+ _g1h->trace_heap_after_gc(&_tracer);
+ _g1h->post_full_gc_dump(&_timer);
+ _timer.register_gc_end();
+ _tracer.report_gc_end(_timer.gc_end(), _timer.time_partitions());
+ _instance = NULL;
+}
+
+bool G1FullGCScope::is_explicit_gc() {
+ return _explicit_gc;
+}
+
+bool G1FullGCScope::should_clear_soft_refs() {
+ return _soft_refs.should_clear();
+}
+
+STWGCTimer* G1FullGCScope::timer() {
+ return &_timer;
+}
+
+SerialOldTracer* G1FullGCScope::tracer() {
+ return &_tracer;
+}
+
+G1HeapTransition* G1FullGCScope::heap_transition() {
+ return &_heap_transition;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1FullGCScope.hpp Wed Aug 23 12:39:55 2017 +0000
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ */
+
+#ifndef SHARE_VM_GC_G1_G1FULLGCSCOPE_HPP
+#define SHARE_VM_GC_G1_G1FULLGCSCOPE_HPP
+
+#include "gc/g1/g1CollectedHeap.hpp"
+#include "gc/g1/g1HeapTransition.hpp"
+#include "gc/shared/collectorCounters.hpp"
+#include "gc/shared/gcId.hpp"
+#include "gc/shared/gcTrace.hpp"
+#include "gc/shared/gcTraceTime.hpp"
+#include "gc/shared/gcTimer.hpp"
+#include "gc/shared/isGCActiveMark.hpp"
+#include "gc/shared/vmGCOperations.hpp"
+#include "memory/allocation.hpp"
+#include "services/memoryService.hpp"
+
+// Class used to group scoped objects used in the Full GC together.
+class G1FullGCScope : public StackObj {
+ ResourceMark _rm;
+ bool _explicit_gc;
+ G1CollectedHeap* _g1h;
+ GCIdMark _gc_id;
+ SvcGCMarker _svc_marker;
+ STWGCTimer _timer;
+ SerialOldTracer _tracer;
+ IsGCActiveMark _active;
+ GCTraceCPUTime _cpu_time;
+ ClearedAllSoftRefs _soft_refs;
+ TraceCollectorStats _collector_stats;
+ TraceMemoryManagerStats _memory_stats;
+ G1HeapTransition _heap_transition;
+
+ // Singleton instance.
+ static G1FullGCScope* _instance;
+public:
+ static G1FullGCScope* instance();
+
+ G1FullGCScope(bool explicit_gc, bool clear_soft);
+ ~G1FullGCScope();
+
+ bool is_explicit_gc();
+ bool should_clear_soft_refs();
+
+ STWGCTimer* timer();
+ SerialOldTracer* tracer();
+ G1HeapTransition* heap_transition();
+};
+
+#endif //SHARE_VM_GC_G1_G1FULLGCSCOPE_HPP
--- a/hotspot/src/share/vm/gc/g1/g1MarkSweep.cpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/share/vm/gc/g1/g1MarkSweep.cpp Wed Aug 23 12:39:55 2017 +0000
@@ -29,6 +29,7 @@
#include "classfile/vmSymbols.hpp"
#include "code/codeCache.hpp"
#include "code/icBuffer.hpp"
+#include "gc/g1/g1FullGCScope.hpp"
#include "gc/g1/g1MarkSweep.hpp"
#include "gc/g1/g1RootProcessor.hpp"
#include "gc/g1/g1StringDedup.hpp"
@@ -59,7 +60,11 @@
void G1MarkSweep::invoke_at_safepoint(ReferenceProcessor* rp,
bool clear_all_softrefs) {
assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
+ HandleMark hm; // Discard invalid handles created during gc
+#if defined(COMPILER2) || INCLUDE_JVMCI
+ DerivedPointerTable::clear();
+#endif
#ifdef ASSERT
if (G1CollectedHeap::heap()->collector_policy()->should_clear_all_soft_refs()) {
assert(clear_all_softrefs, "Policy should have been checked earler");
@@ -85,8 +90,10 @@
// The marking doesn't preserve the marks of biased objects.
BiasedLocking::preserve_marks();
+ // Process roots and do the marking.
mark_sweep_phase1(marked_for_unloading, clear_all_softrefs);
+ // Prepare compaction.
mark_sweep_phase2();
#if defined(COMPILER2) || INCLUDE_JVMCI
@@ -94,14 +101,21 @@
DerivedPointerTable::set_active(false);
#endif
+ // Adjust all pointers.
mark_sweep_phase3();
+ // Do the actual compaction.
mark_sweep_phase4();
GenMarkSweep::restore_marks();
BiasedLocking::restore_marks();
GenMarkSweep::deallocate_stacks();
+#if defined(COMPILER2) || INCLUDE_JVMCI
+ // Now update the derived pointers.
+ DerivedPointerTable::update_pointers();
+#endif
+
CodeCache::gc_epilogue();
JvmtiExport::gc_epilogue();
@@ -109,6 +123,13 @@
GenMarkSweep::set_ref_processor(NULL);
}
+STWGCTimer* G1MarkSweep::gc_timer() {
+ return G1FullGCScope::instance()->timer();
+}
+
+SerialOldTracer* G1MarkSweep::gc_tracer() {
+ return G1FullGCScope::instance()->tracer();
+}
void G1MarkSweep::allocate_stacks() {
GenMarkSweep::_preserved_count_max = 0;
--- a/hotspot/src/share/vm/gc/g1/g1MarkSweep.hpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/share/vm/gc/g1/g1MarkSweep.hpp Wed Aug 23 12:39:55 2017 +0000
@@ -52,8 +52,8 @@
static void invoke_at_safepoint(ReferenceProcessor* rp,
bool clear_all_softrefs);
- static STWGCTimer* gc_timer() { return GenMarkSweep::_gc_timer; }
- static SerialOldTracer* gc_tracer() { return GenMarkSweep::_gc_tracer; }
+ static STWGCTimer* gc_timer();
+ static SerialOldTracer* gc_tracer();
private:
// Mark live objects
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1SerialFullCollector.cpp Wed Aug 23 12:39:55 2017 +0000
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "gc/g1/g1CollectedHeap.inline.hpp"
+#include "gc/g1/g1FullGCScope.hpp"
+#include "gc/g1/g1MarkSweep.hpp"
+#include "gc/g1/g1RemSet.inline.hpp"
+#include "gc/g1/g1SerialFullCollector.hpp"
+#include "gc/g1/heapRegionRemSet.hpp"
+#include "gc/shared/referenceProcessor.hpp"
+
+G1SerialFullCollector::G1SerialFullCollector(G1FullGCScope* scope,
+ ReferenceProcessor* reference_processor) :
+ _scope(scope),
+ _reference_processor(reference_processor),
+ _is_alive_mutator(_reference_processor, NULL),
+ _mt_discovery_mutator(_reference_processor, false) {
+ // Temporarily make discovery by the STW ref processor single threaded (non-MT)
+ // and clear the STW ref processor's _is_alive_non_header field.
+}
+
+void G1SerialFullCollector::prepare_collection() {
+ _reference_processor->enable_discovery();
+ _reference_processor->setup_policy(_scope->should_clear_soft_refs());
+}
+
+void G1SerialFullCollector::complete_collection() {
+ // Enqueue any discovered reference objects that have
+ // not been removed from the discovered lists.
+ ReferenceProcessorPhaseTimes pt(NULL, _reference_processor->num_q());
+ _reference_processor->enqueue_discovered_references(NULL, &pt);
+ pt.print_enqueue_phase();
+
+ // Iterate the heap and rebuild the remembered sets.
+ rebuild_remembered_sets();
+}
+
+void G1SerialFullCollector::collect() {
+ // Do the actual collection work.
+ G1MarkSweep::invoke_at_safepoint(_reference_processor, _scope->should_clear_soft_refs());
+}
+
+class PostMCRemSetClearClosure: public HeapRegionClosure {
+ G1CollectedHeap* _g1h;
+ ModRefBarrierSet* _mr_bs;
+public:
+ PostMCRemSetClearClosure(G1CollectedHeap* g1h, ModRefBarrierSet* mr_bs) :
+ _g1h(g1h), _mr_bs(mr_bs) {}
+
+ bool doHeapRegion(HeapRegion* r) {
+ HeapRegionRemSet* hrrs = r->rem_set();
+
+ _g1h->reset_gc_time_stamps(r);
+
+ if (r->is_continues_humongous()) {
+ // We'll assert that the strong code root list and RSet is empty
+ assert(hrrs->strong_code_roots_list_length() == 0, "sanity");
+ assert(hrrs->occupied() == 0, "RSet should be empty");
+ } else {
+ hrrs->clear();
+ }
+ // You might think here that we could clear just the cards
+ // corresponding to the used region. But no: if we leave a dirty card
+ // in a region we might allocate into, then it would prevent that card
+ // from being enqueued, and cause it to be missed.
+ // Re: the performance cost: we shouldn't be doing full GC anyway!
+ _mr_bs->clear(MemRegion(r->bottom(), r->end()));
+
+ return false;
+ }
+};
+
+
+class RebuildRSOutOfRegionClosure: public HeapRegionClosure {
+ G1CollectedHeap* _g1h;
+ RebuildRSOopClosure _cl;
+public:
+ RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, uint worker_i = 0) :
+ _cl(g1->g1_rem_set(), worker_i),
+ _g1h(g1)
+ { }
+
+ bool doHeapRegion(HeapRegion* r) {
+ if (!r->is_continues_humongous()) {
+ _cl.set_from(r);
+ r->oop_iterate(&_cl);
+ }
+ return false;
+ }
+};
+
+class ParRebuildRSTask: public AbstractGangTask {
+ G1CollectedHeap* _g1;
+ HeapRegionClaimer _hrclaimer;
+
+public:
+ ParRebuildRSTask(G1CollectedHeap* g1) :
+ AbstractGangTask("ParRebuildRSTask"), _g1(g1), _hrclaimer(g1->workers()->active_workers()) {}
+
+ void work(uint worker_id) {
+ RebuildRSOutOfRegionClosure rebuild_rs(_g1, worker_id);
+ _g1->heap_region_par_iterate(&rebuild_rs, worker_id, &_hrclaimer);
+ }
+};
+
+void G1SerialFullCollector::rebuild_remembered_sets() {
+ G1CollectedHeap* g1h = G1CollectedHeap::heap();
+ // First clear the stale remembered sets.
+ PostMCRemSetClearClosure rs_clear(g1h, g1h->g1_barrier_set());
+ g1h->heap_region_iterate(&rs_clear);
+
+ // Rebuild remembered sets of all regions.
+ uint n_workers = AdaptiveSizePolicy::calc_active_workers(g1h->workers()->total_workers(),
+ g1h->workers()->active_workers(),
+ Threads::number_of_non_daemon_threads());
+ g1h->workers()->update_active_workers(n_workers);
+ log_info(gc,task)("Using %u workers of %u to rebuild remembered set", n_workers, g1h->workers()->total_workers());
+
+ ParRebuildRSTask rebuild_rs_task(g1h);
+ g1h->workers()->run_task(&rebuild_rs_task);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1SerialFullCollector.hpp Wed Aug 23 12:39:55 2017 +0000
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2017, 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.
+ *
+ */
+
+#ifndef SHARE_VM_GC_G1_G1SERIALCOLLECTOR_HPP
+#define SHARE_VM_GC_G1_G1SERIALCOLLECTOR_HPP
+
+#include "memory/allocation.hpp"
+
+class G1FullGCScope;
+class ReferenceProcessor;
+
+class G1SerialFullCollector : StackObj {
+ G1FullGCScope* _scope;
+ ReferenceProcessor* _reference_processor;
+ ReferenceProcessorIsAliveMutator _is_alive_mutator;
+ ReferenceProcessorMTDiscoveryMutator _mt_discovery_mutator;
+
+ void rebuild_remembered_sets();
+
+public:
+ G1SerialFullCollector(G1FullGCScope* scope, ReferenceProcessor* reference_processor);
+
+ void prepare_collection();
+ void collect();
+ void complete_collection();
+};
+
+#endif // SHARE_VM_GC_G1_G1SERIALCOLLECTOR_HPP
--- a/hotspot/src/share/vm/gc/shared/collectorPolicy.hpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/share/vm/gc/shared/collectorPolicy.hpp Wed Aug 23 12:39:55 2017 +0000
@@ -151,6 +151,8 @@
_collector_policy->cleared_all_soft_refs();
}
}
+
+ bool should_clear() { return _clear_all_soft_refs; }
};
class GenCollectorPolicy : public CollectorPolicy {
--- a/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp Wed Aug 23 12:39:55 2017 +0000
@@ -765,7 +765,7 @@
C2V_VMENTRY(jboolean, hasNeverInlineDirective,(JNIEnv *, jobject, jobject jvmci_method))
methodHandle method = CompilerToVM::asMethod(jvmci_method);
- return CompilerOracle::should_not_inline(method) || method->dont_inline();
+ return !Inline || CompilerOracle::should_not_inline(method) || method->dont_inline();
C2V_END
C2V_VMENTRY(jboolean, shouldInlineMethod,(JNIEnv *, jobject, jobject jvmci_method))
--- a/hotspot/src/share/vm/runtime/vmStructs.hpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/src/share/vm/runtime/vmStructs.hpp Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, 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
@@ -26,6 +26,7 @@
#define SHARE_VM_RUNTIME_VMSTRUCTS_HPP
#include "utilities/debug.hpp"
+#include "utilities/globalDefinitions.hpp"
#ifdef COMPILER1
#include "c1/c1_Runtime1.hpp"
#endif
--- a/hotspot/test/ProblemList.txt Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/ProblemList.txt Wed Aug 23 12:39:55 2017 +0000
@@ -54,68 +54,6 @@
# aot test intermittently failing in jprt 8175791
compiler/aot/DeoptimizationTest.java 8175791 windows-all
-# aot missing tools (linker) on OS-X and Windows 8183337
-compiler/aot/calls/fromAot/AotInvokeDynamic2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeDynamic2CompiledTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeDynamic2InterpretedTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeDynamic2NativeTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeInterface2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeInterface2CompiledTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeInterface2InterpretedTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeInterface2NativeTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeSpecial2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeSpecial2CompiledTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeSpecial2InterpretedTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeSpecial2NativeTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeStatic2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeStatic2CompiledTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeStatic2InterpretedTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeStatic2NativeTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeVirtual2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeVirtual2CompiledTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeVirtual2InterpretedTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromAot/AotInvokeVirtual2NativeTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromCompiled/CompiledInvokeDynamic2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromCompiled/CompiledInvokeInterface2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromCompiled/CompiledInvokeSpecial2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromCompiled/CompiledInvokeStatic2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromCompiled/CompiledInvokeVirtual2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromInterpreted/InterpretedInvokeDynamic2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromInterpreted/InterpretedInvokeInterface2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromInterpreted/InterpretedInvokeSpecial2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromInterpreted/InterpretedInvokeStatic2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromInterpreted/InterpretedInvokeVirtual2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromNative/NativeInvokeSpecial2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromNative/NativeInvokeStatic2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/calls/fromNative/NativeInvokeVirtual2AotTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/DisabledAOTWithLibraryTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/IncorrectAOTLibraryTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/jaotc/ClasspathOptionUnknownClassTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/jaotc/CompileClassTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/jaotc/CompileDirectoryTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/jaotc/CompileJarTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/jaotc/CompileModuleTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/jaotc/ListOptionNotExistingTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/jaotc/ListOptionTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/jaotc/ListOptionWrongFileTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/MultipleAOTLibraryTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/NonExistingAOTLibraryTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/SingleAOTLibraryTest.java 8183337 windows-all,macosx-all
-compiler/aot/cli/SingleAOTOptionTest.java 8183337 windows-all,macosx-all
-compiler/aot/DeoptimizationTest.java 8183337 windows-all,macosx-all
-compiler/aot/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/ClassSearchTest.java 8183337 windows-all,macosx-all
-compiler/aot/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/ClassSourceTest.java 8183337 windows-all,macosx-all
-compiler/aot/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/directory/DirectorySourceProviderTest.java 8183337 windows-all,macosx-all
-compiler/aot/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/jar/JarSourceProviderTest.java 8183337 windows-all,macosx-all
-compiler/aot/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/module/ModuleSourceProviderTest.java 8183337 windows-all,macosx-all
-compiler/aot/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/collect/SearchPathTest.java 8183337 windows-all,macosx-all
-compiler/aot/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/NativeOrderOutputStreamTest.java 8183337 windows-all,macosx-all
-compiler/aot/RecompilationTest.java 8183337 windows-all,macosx-all
-compiler/aot/SharedUsageTest.java 8183337 windows-all,macosx-all
-compiler/aot/verification/ClassAndLibraryNotMatchTest.java 8183337 windows-all,macosx-all
-compiler/aot/verification/vmflags/NotTrackedFlagTest.java 8183337 windows-all,macosx-all
-compiler/aot/verification/vmflags/TrackedFlagTest.java 8183337 windows-all,macosx-all
-
#############################################################################
# :hotspot_gc
@@ -148,7 +86,7 @@
serviceability/sa/TestInstanceKlassSizeForInterface.java 8184042 macosx-all
serviceability/sa/TestPrintMdo.java 8184042 macosx-all
serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java 8184042 macosx-all
-
+serviceability/dcmd/jvmti/LoadAgentDcmdTest.java 8186540 windows-all
#############################################################################
# :hotspot_misc
--- a/hotspot/test/TEST.ROOT Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/TEST.ROOT Wed Aug 23 12:39:55 2017 +0000
@@ -54,8 +54,8 @@
vm.aot \
vm.cds
-# Tests using jtreg 4.2 b07 features
-requiredVersion=4.2 b07
+# Minimum jtreg version
+requiredVersion=4.2 b08
# Path to libraries in the topmost test directory. This is needed so @library
# does not need ../../ notation to reach them
--- a/hotspot/test/compiler/aot/AotCompiler.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/AotCompiler.java Wed Aug 23 12:39:55 2017 +0000
@@ -23,9 +23,14 @@
package compiler.aot;
+import jdk.test.lib.Platform;
+import jdk.test.lib.artifacts.Artifact;
+import jdk.test.lib.artifacts.ArtifactResolver;
import jdk.test.lib.process.OutputAnalyzer;
import java.io.File;
+import java.io.FileNotFoundException;
import java.io.IOException;
+import java.lang.annotation.Annotation;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -35,6 +40,7 @@
import java.util.List;
import jdk.test.lib.JDKToolLauncher;
import jdk.test.lib.Utils;
+import jdk.test.lib.process.ProcessTools;
/**
* A simple class calling AOT compiler over requested items
@@ -102,6 +108,11 @@
}
args.add("--class-name");
args.add(item);
+ String linker = resolveLinker();
+ if (linker != null) {
+ args.add("--linker-path");
+ args.add(linker);
+ }
return launchJaotc(args, extraopts);
}
@@ -119,8 +130,8 @@
launcher.addToolArg(arg);
}
try {
- return new OutputAnalyzer(new ProcessBuilder(launcher.getCommand()).inheritIO().start());
- } catch (IOException e) {
+ return ProcessTools.executeCommand(new ProcessBuilder(launcher.getCommand()).redirectErrorStream(true));
+ } catch (Throwable e) {
throw new Error("Can't start test process: " + e, e);
}
}
@@ -130,4 +141,142 @@
+ " -class <class> -libname <.so name>"
+ " [-compile <compileItems>]* [-extraopt <java option>]*");
}
+
+ public static String resolveLinker() {
+ Path linker = null;
+ // 1st, check if PATH has ld
+ for (String path : System.getenv("PATH").split(File.pathSeparator)) {
+ if (Files.exists(Paths.get(path).resolve("ld"))) {
+ // there is ld in PATH, jaotc is supposed to find it by its own
+ return null;
+ }
+ }
+ // there is no ld in PATH, will use ld from devkit
+ // artifacts are got from common/conf/jib-profiles.js
+ try {
+ if (Platform.isWindows()) {
+ if (Platform.isX64()) {
+ @Artifact(organization = "jpg.infra.builddeps",
+ name = "devkit-windows_x64",
+ revision = "VS2013SP4+1.0",
+ extension = "tar.gz")
+ class DevkitWindowsX64 { }
+ String artifactName = "jpg.infra.builddeps."
+ + "devkit-windows_x64-"
+ + "VS2013SP4+1.0";
+ Path devkit = ArtifactResolver.resolve(DevkitWindowsX64.class)
+ .get(artifactName);
+ linker = devkit.resolve("VC")
+ .resolve("bin")
+ .resolve("amd64")
+ .resolve("link.exe");
+ }
+ } else if (Platform.isOSX()) {
+ @Artifact(organization = "jpg.infra.builddeps",
+ name = "devkit-macosx_x64",
+ revision = "Xcode6.3-MacOSX10.9+1.0",
+ extension = "tar.gz")
+ class DevkitMacosx { }
+ String artifactName = "jpg.infra.builddeps."
+ + "devkit-macosx_x64-"
+ + "Xcode6.3-MacOSX10.9+1.0";
+ Path devkit = ArtifactResolver.resolve(DevkitMacosx.class)
+ .get(artifactName);
+ linker = devkit.resolve("Xcode.app")
+ .resolve("Contents")
+ .resolve("Developer")
+ .resolve("Toolchains")
+ .resolve("XcodeDefault.xctoolchain")
+ .resolve("usr")
+ .resolve("bin")
+ .resolve("ld");
+ } else if (Platform.isSolaris()) {
+ if (Platform.isSparc()) {
+ @Artifact(organization = "jpg.infra.builddeps",
+ name = "devkit-solaris_sparcv9",
+ revision = "SS12u4-Solaris11u1+1.0",
+ extension = "tar.gz")
+ class DevkitSolarisSparc { }
+
+ String artifactName = "jpg.infra.builddeps."
+ + "devkit-solaris_sparcv9-"
+ + "SS12u4-Solaris11u1+1.0";
+ Path devkit = ArtifactResolver.resolve(DevkitSolarisSparc.class)
+ .get(artifactName);
+ linker = devkit.resolve("SS12u4-Solaris11u1")
+ .resolve("gnu")
+ .resolve("bin")
+ .resolve("ld");
+ } else if (Platform.isX64()) {
+ @Artifact(organization = "jpg.infra.builddeps",
+ name = "devkit-solaris_x64",
+ revision = "SS12u4-Solaris11u1+1.0",
+ extension = "tar.gz")
+ class DevkitSolarisX64 { }
+
+ String artifactName = "jpg.infra.builddeps."
+ + "devkit-solaris_x64-"
+ + "SS12u4-Solaris11u1+1.0";
+ Path devkit = ArtifactResolver.resolve(DevkitSolarisX64.class)
+ .get(artifactName);
+ linker = devkit.resolve("SS12u4-Solaris11u1")
+ .resolve("bin")
+ .resolve("amd64")
+ .resolve("ld");
+ }
+ } else if (Platform.isLinux()) {
+ if (Platform.isAArch64()) {
+ @Artifact(organization = "jpg.infra.builddeps",
+ name = "devkit-linux_aarch64",
+ revision = "gcc-linaro-aarch64-linux-gnu-4.8-2013.11_linux+1.0",
+ extension = "tar.gz")
+ class DevkitLinuxAArch64 { }
+
+ String artifactName = "jpg.infra.builddeps."
+ + "devkit-linux_aarch64-"
+ + "gcc-linaro-aarch64-linux-gnu-4.8-2013.11_linux+1.0";
+ Path devkit = ArtifactResolver.resolve(DevkitLinuxAArch64.class)
+ .get(artifactName);
+ linker = devkit.resolve("aarch64-linux-gnu")
+ .resolve("bin")
+ .resolve("ld");
+ } else if (Platform.isARM()) {
+ @Artifact(organization = "jpg.infra.builddeps",
+ name = "devkit-linux_arm",
+ revision = "gcc-linaro-arm-linux-gnueabihf-raspbian-2012.09-20120921_linux+1.0",
+ extension = "tar.gz")
+ class DevkitLinuxARM { }
+
+ String artifactName = "jpg.infra.builddeps."
+ + "devkit-linux_arm-"
+ + "gcc-linaro-arm-linux-gnueabihf-raspbian-2012.09-20120921_linux+1.0";
+ Path devkit = ArtifactResolver.resolve(DevkitLinuxARM.class)
+ .get(artifactName);
+ linker = devkit.resolve("arm-linux-gnueabihf")
+ .resolve("bin")
+ .resolve("ld");
+ } else if (Platform.isX64()) {
+ @Artifact(organization = "jpg.infra.builddeps",
+ name = "devkit-linux_x64",
+ revision = "gcc4.9.2-OEL6.4+1.1",
+ extension = "tar.gz")
+ class DevkitLinuxX64 { }
+
+ String artifactName = "jpg.infra.builddeps."
+ + "devkit-linux_x64-"
+ + "gcc4.9.2-OEL6.4+1.1";
+ Path devkit = ArtifactResolver.resolve(DevkitLinuxX64.class)
+ .get(artifactName);
+ linker = devkit.resolve("bin")
+ .resolve("ld");
+ }
+ }
+ } catch (FileNotFoundException e) {
+ throw new Error("artifact resolution error: " + e, e);
+ }
+ if (linker != null) {
+ return linker.toAbsolutePath().toString();
+ }
+ return null;
+ }
}
--- a/hotspot/test/compiler/aot/DeoptimizationTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/DeoptimizationTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.aot.DeoptimizationTest
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/RecompilationTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/RecompilationTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.aot.RecompilationTest
* compiler.aot.AotCompiler
@@ -38,7 +37,7 @@
* -extraopt -XX:+UnlockDiagnosticVMOptions -extraopt -XX:+WhiteBoxAPI -extraopt -Xbootclasspath/a:.
* -extraopt -XX:-UseCompressedOops
* -extraopt -XX:CompileCommand=dontinline,compiler.whitebox.SimpleTestCaseHelper::*
- * @run main/othervm -Xmixed -Xbatch -XX:+UseAOT -XX:+TieredCompilation
+ * @run main/othervm -Xmixed -Xbatch -XX:+UseAOT -XX:+TieredCompilation -XX:CompilationPolicyChoice=2
* -XX:-UseCounterDecay -XX:-UseCompressedOops
* -XX:-Inline
* -XX:AOTLibrary=./libRecompilationTest1.so -Xbootclasspath/a:.
@@ -51,7 +50,7 @@
* -extraopt -XX:+UnlockDiagnosticVMOptions -extraopt -XX:+WhiteBoxAPI -extraopt -Xbootclasspath/a:.
* -extraopt -XX:-UseCompressedOops
* -extraopt -XX:CompileCommand=dontinline,compiler.whitebox.SimpleTestCaseHelper::*
- * @run main/othervm -Xmixed -Xbatch -XX:+UseAOT -XX:+TieredCompilation
+ * @run main/othervm -Xmixed -Xbatch -XX:+UseAOT -XX:+TieredCompilation -XX:CompilationPolicyChoice=2
* -XX:-UseCounterDecay -XX:-UseCompressedOops
* -XX:-Inline
* -XX:AOTLibrary=./libRecompilationTest2.so -Xbootclasspath/a:.
--- a/hotspot/test/compiler/aot/SharedUsageTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/SharedUsageTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library /test/lib /testlibrary /
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @build compiler.aot.SharedUsageTest
* compiler.aot.AotCompiler
* @run main compiler.aot.AotCompiler -libname libSharedUsageTest.so
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/aot/TEST.properties Wed Aug 23 12:39:55 2017 +0000
@@ -0,0 +1,3 @@
+# TODO: remove as soon as JIB supports concurrent installations
+exclusiveAccess.dirs=.
+
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeDynamic2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeDynamic2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library /test/lib /testlibrary /
* @ignore 8132547
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.org.objectweb.asm
* java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeDynamic
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeDynamic2CompiledTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeDynamic2CompiledTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library /test/lib /testlibrary /
* @ignore 8132547
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.org.objectweb.asm
* java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeDynamic
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeDynamic2InterpretedTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeDynamic2InterpretedTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library /test/lib /testlibrary /
* @ignore 8132547
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.org.objectweb.asm
* java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeDynamic
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeDynamic2NativeTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeDynamic2NativeTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library /test/lib /testlibrary /
* @ignore 8132547
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.org.objectweb.asm
* java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeDynamic
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeInterface2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeInterface2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeInterface
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeInterface2CompiledTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeInterface2CompiledTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeInterface
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeInterface2InterpretedTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeInterface2InterpretedTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeInterface
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeInterface2NativeTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeInterface2NativeTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeInterface
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeSpecial2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeSpecial2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeSpecial
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeSpecial2CompiledTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeSpecial2CompiledTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeSpecial
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeSpecial2InterpretedTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeSpecial2InterpretedTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeSpecial
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeSpecial2NativeTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeSpecial2NativeTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeSpecial
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeStatic2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeStatic2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeStatic
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeStatic2CompiledTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeStatic2CompiledTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeStatic
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeStatic2InterpretedTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeStatic2InterpretedTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeStatic
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeStatic2NativeTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeStatic2NativeTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeStatic
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeVirtual2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeVirtual2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeVirtual
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeVirtual2CompiledTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeVirtual2CompiledTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeVirtual
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeVirtual2InterpretedTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeVirtual2InterpretedTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeVirtual
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromAot/AotInvokeVirtual2NativeTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromAot/AotInvokeVirtual2NativeTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeVirtual
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromCompiled/CompiledInvokeDynamic2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromCompiled/CompiledInvokeDynamic2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.org.objectweb.asm
* java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeDynamic
--- a/hotspot/test/compiler/aot/calls/fromCompiled/CompiledInvokeInterface2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromCompiled/CompiledInvokeInterface2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeInterface
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromCompiled/CompiledInvokeSpecial2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromCompiled/CompiledInvokeSpecial2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeSpecial
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromCompiled/CompiledInvokeStatic2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromCompiled/CompiledInvokeStatic2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeStatic
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromCompiled/CompiledInvokeVirtual2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromCompiled/CompiledInvokeVirtual2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeVirtual
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromInterpreted/InterpretedInvokeDynamic2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromInterpreted/InterpretedInvokeDynamic2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.org.objectweb.asm
* java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeDynamic
--- a/hotspot/test/compiler/aot/calls/fromInterpreted/InterpretedInvokeInterface2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromInterpreted/InterpretedInvokeInterface2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeInterface
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromInterpreted/InterpretedInvokeSpecial2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromInterpreted/InterpretedInvokeSpecial2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeSpecial
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromInterpreted/InterpretedInvokeStatic2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromInterpreted/InterpretedInvokeStatic2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeStatic
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromInterpreted/InterpretedInvokeVirtual2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromInterpreted/InterpretedInvokeVirtual2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeVirtual
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromNative/NativeInvokeSpecial2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromNative/NativeInvokeSpecial2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeSpecial
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromNative/NativeInvokeStatic2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromNative/NativeInvokeStatic2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeStatic
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/calls/fromNative/NativeInvokeVirtual2AotTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/calls/fromNative/NativeInvokeVirtual2AotTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.calls.common.InvokeVirtual
* compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/cli/DisabledAOTWithLibraryTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/DisabledAOTWithLibraryTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /testlibrary /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @build compiler.aot.cli.DisabledAOTWithLibraryTest
* compiler.aot.AotCompiler
* @run driver compiler.aot.AotCompiler -libname libDisabledAOTWithLibraryTest.so
--- a/hotspot/test/compiler/aot/cli/IncorrectAOTLibraryTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/IncorrectAOTLibraryTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library /test/lib /testlibrary /
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @run driver ClassFileInstaller ClassFileInstaller
* @run driver compiler.aot.cli.IncorrectAOTLibraryTest
* @summary check if incorrect aot library is handled properly
--- a/hotspot/test/compiler/aot/cli/MultipleAOTLibraryTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/MultipleAOTLibraryTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library /test/lib /testlibrary /
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @build compiler.aot.cli.MultipleAOTLibraryTest
* compiler.aot.AotCompiler
* @run driver compiler.aot.AotCompiler
--- a/hotspot/test/compiler/aot/cli/NonExistingAOTLibraryTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/NonExistingAOTLibraryTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library /test/lib /testlibrary /
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @run driver compiler.aot.cli.NonExistingAOTLibraryTest
* @summary check if non-existing aot library is handled properly
*/
--- a/hotspot/test/compiler/aot/cli/SingleAOTLibraryTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/SingleAOTLibraryTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library /test/lib / /testlibrary
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @build compiler.aot.cli.SingleAOTLibraryTest
* compiler.aot.AotCompiler
* @run driver compiler.aot.AotCompiler -libname libSingleAOTLibraryTest.so
--- a/hotspot/test/compiler/aot/cli/SingleAOTOptionTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/SingleAOTOptionTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library /test/lib /testlibrary /
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @build compiler.aot.cli.SingleAOTOptionTest
* compiler.aot.AotCompiler
* @run driver compiler.aot.AotCompiler -libname libSingleAOTOptionTest.so
--- a/hotspot/test/compiler/aot/cli/jaotc/ClasspathOptionUnknownClassTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/jaotc/ClasspathOptionUnknownClassTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library / /testlibrary/ /test/lib
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @compile data/HelloWorldOne.java
* @run driver compiler.aot.cli.jaotc.ClasspathOptionUnknownClassTest
* @summary check jaotc can't compile class not from classpath
--- a/hotspot/test/compiler/aot/cli/jaotc/CompileClassTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/jaotc/CompileClassTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library / /test/lib /testlibrary
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @build compiler.aot.cli.jaotc.CompileClassTest
* @run driver ClassFileInstaller compiler.aot.cli.jaotc.data.HelloWorldOne
* @run driver compiler.aot.cli.jaotc.CompileClassTest
--- a/hotspot/test/compiler/aot/cli/jaotc/CompileDirectoryTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/jaotc/CompileDirectoryTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library / /test/lib /testlibrary
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @build compiler.aot.cli.jaotc.CompileDirectoryTest
* @run driver ClassFileInstaller compiler.aot.cli.jaotc.data.HelloWorldOne
* compiler.aot.cli.jaotc.data.HelloWorldTwo
--- a/hotspot/test/compiler/aot/cli/jaotc/CompileJarTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/jaotc/CompileJarTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library / /test/lib /testlibrary
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @build compiler.aot.cli.jaotc.CompileJarTest
* @run driver ClassFileInstaller compiler.aot.cli.jaotc.data.HelloWorldOne
* compiler.aot.cli.jaotc.data.HelloWorldTwo
--- a/hotspot/test/compiler/aot/cli/jaotc/CompileModuleTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/jaotc/CompileModuleTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library / /test/lib /testlibrary
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @run driver compiler.aot.cli.jaotc.CompileModuleTest
* @summary check jaotc can compile module
*/
--- a/hotspot/test/compiler/aot/cli/jaotc/JaotcTestHelper.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/jaotc/JaotcTestHelper.java Wed Aug 23 12:39:55 2017 +0000
@@ -23,14 +23,18 @@
package compiler.aot.cli.jaotc;
+import compiler.aot.AotCompiler;
+
import java.io.File;
import java.io.IOException;
+
import jdk.test.lib.process.ExitCode;
import jdk.test.lib.Platform;
import jdk.test.lib.JDKToolLauncher;
import jdk.test.lib.Utils;
import jdk.test.lib.cli.CommandLineOptionTest;
import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.process.ProcessTools;
public class JaotcTestHelper {
public static final String DEFAULT_LIB_PATH = "./unnamed." + Platform.sharedLibraryExt();
@@ -49,10 +53,15 @@
for (String arg : args) {
launcher.addToolArg(arg);
}
+ String linker = AotCompiler.resolveLinker();
+ if (linker != null) {
+ launcher.addToolArg("--linker-path");
+ launcher.addToolArg(linker);
+ }
String[] cmd = launcher.getCommand();
try {
- return new OutputAnalyzer(new ProcessBuilder(cmd).start());
- } catch (IOException e) {
+ return ProcessTools.executeCommand(cmd);
+ } catch (Throwable e) {
throw new Error("Can't start test process: " + e, e);
}
}
--- a/hotspot/test/compiler/aot/cli/jaotc/ListOptionNotExistingTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/jaotc/ListOptionNotExistingTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library / /test/lib /testlibrary
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @build compiler.aot.cli.jaotc.ListOptionNotExistingTest
* @run driver ClassFileInstaller compiler.aot.cli.jaotc.data.HelloWorldOne
* @run driver compiler.aot.cli.jaotc.ListOptionNotExistingTest
--- a/hotspot/test/compiler/aot/cli/jaotc/ListOptionTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/jaotc/ListOptionTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library / /test/lib /testlibrary
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @build compiler.aot.cli.jaotc.ListOptionTest
* @run driver ClassFileInstaller compiler.aot.cli.jaotc.data.HelloWorldOne
* @run driver compiler.aot.cli.jaotc.ListOptionTest
--- a/hotspot/test/compiler/aot/cli/jaotc/ListOptionWrongFileTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/cli/jaotc/ListOptionWrongFileTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -26,7 +26,6 @@
* @requires vm.aot
* @library / /test/lib /testlibrary
* @modules java.base/jdk.internal.misc
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @build compiler.aot.cli.jaotc.ListOptionWrongFileTest
* @run driver ClassFileInstaller compiler.aot.cli.jaotc.data.HelloWorldOne
* @run driver compiler.aot.cli.jaotc.ListOptionWrongFileTest
--- a/hotspot/test/compiler/aot/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/NativeOrderOutputStreamTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/jdk.tools.jaotc.test/src/jdk/tools/jaotc/test/NativeOrderOutputStreamTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -24,7 +24,6 @@
/**
* @test
* @requires vm.aot
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules jdk.aot/jdk.tools.jaotc.utils
* @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.tools.jaotc.test.NativeOrderOutputStreamTest
*/
--- a/hotspot/test/compiler/aot/verification/ClassAndLibraryNotMatchTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/verification/ClassAndLibraryNotMatchTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.aot.verification.ClassAndLibraryNotMatchTest
* @run driver compiler.aot.verification.ClassAndLibraryNotMatchTest
--- a/hotspot/test/compiler/aot/verification/vmflags/NotTrackedFlagTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/verification/vmflags/NotTrackedFlagTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.aot.verification.vmflags.BasicFlagsChange
* @run driver compiler.aot.verification.vmflags.BasicFlagsChange
--- a/hotspot/test/compiler/aot/verification/vmflags/TrackedFlagTest.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/compiler/aot/verification/vmflags/TrackedFlagTest.java Wed Aug 23 12:39:55 2017 +0000
@@ -25,7 +25,6 @@
* @test
* @requires vm.aot
* @library /test/lib /
- * @requires vm.bits == "64" & (os.arch == "amd64" | os.arch == "x86_64")
* @modules java.base/jdk.internal.misc
* @build compiler.aot.verification.vmflags.BasicFlagsChange
* @run driver compiler.aot.verification.vmflags.BasicFlagsChange
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/floatingpoint/TestRound.java Wed Aug 23 12:39:55 2017 +0000
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2002, 2017, 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 4755500
+ * @summary calling Math.round(NaN) can break subsequent calls to Math.round()
+ * @run main compiler.floatingpoint.TestRound
+ */
+
+package compiler.floatingpoint;
+
+public class TestRound {
+ public static void main(String[] args) {
+ // Note: it's really only necessary to run this loop 8 times to
+ // reproduce the bug, but the 10000-length loop causes compilation
+ // of Math.round() without any other command-line flags.
+ // A bug in the d2l NaN case was causing overflow of the FPU
+ // stack, yielding subsequent wrong results for flds.
+ for (int i = 0; i < 10_000; i++) {
+ Math.round(Double.NaN);
+ }
+ if (Math.round(1d) != 1) {
+ throw new AssertionError("TEST FAILED");
+ }
+ System.out.println("Test passed.");
+ }
+}
+
--- a/hotspot/test/gc/g1/humongousObjects/TestHumongousClassLoader.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/gc/g1/humongousObjects/TestHumongousClassLoader.java Wed Aug 23 12:39:55 2017 +0000
@@ -40,6 +40,8 @@
* @requires vm.gc.G1
* @requires vm.opt.G1HeapRegionSize == "null" | vm.opt.G1HeapRegionSize == "1M"
* @requires vm.opt.ExplicitGCInvokesConcurrent != true
+ * @requires vm.opt.ClassUnloading != false
+ * @requires vm.opt.ClassUnloadingWithConcurrentMark != false
* @library /test/lib /
* @modules java.base/jdk.internal.misc
* @modules java.management
--- a/hotspot/test/native/runtime/test_vmStructs.cpp Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/native/runtime/test_vmStructs.cpp Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -22,11 +22,12 @@
*/
#include "precompiled.hpp"
-#include "runtime/vmStructs.hpp"
#include "utilities/macros.hpp"
#include "unittest.hpp"
#if INCLUDE_VM_STRUCTS
+#include "runtime/vmStructs.hpp"
+
TEST(VMStructs, last_entries) {
// Make sure last entry in the each array is indeed the correct end marker.
// The reason why these are static is to make sure they are zero initialized.
--- a/hotspot/test/runtime/Metaspace/FragmentMetaspaceSimple.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/runtime/Metaspace/FragmentMetaspaceSimple.java Wed Aug 23 12:39:55 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2017, 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
@@ -21,10 +21,12 @@
* questions.
*/
+// ClassFileInstaller is needed to place test.Empty into well-known place
/**
* @test
- * @library classes
+ * @library /test/lib classes
* @build test.Empty
+ * @run driver ClassFileInstaller test.Empty
* @run main/othervm/timeout=200 FragmentMetaspaceSimple
*/
@@ -51,8 +53,8 @@
long startTime = System.currentTimeMillis();
ArrayList<ClassLoader> cls = new ArrayList<>();
char sep = File.separatorChar;
- String fileName = "classes" + sep + "test" + sep + "Empty.class";
- File file = new File(System.getProperty("test.classes",".") + sep + fileName);
+ String fileName = "test" + sep + "Empty.class";
+ File file = new File(fileName);
byte buff[] = read(file);
int i = 0;
--- a/hotspot/test/serviceability/tmtools/jstat/utils/JstatResults.java Tue Aug 15 08:46:32 2017 +0200
+++ b/hotspot/test/serviceability/tmtools/jstat/utils/JstatResults.java Wed Aug 23 12:39:55 2017 +0000
@@ -23,6 +23,9 @@
package utils;
import common.ToolResults;
+import java.text.NumberFormat;
+import java.text.ParseException;
+
/**
* Results of running the jstat tool Concrete subclasses will detail the jstat
@@ -55,7 +58,13 @@
*/
public float getFloatValue(String name) {
int valueNdx = new StringOfValues(getStdoutLine(0)).getIndex(name);
- return Float.valueOf(new StringOfValues(getStdoutLine(1)).getValue(valueNdx));
+ // Let the parsing use the current locale format.
+ try {
+ return NumberFormat.getInstance().parse(new StringOfValues(getStdoutLine(1)).getValue(valueNdx)).floatValue();
+ } catch (ParseException e) {
+ throw new NumberFormatException(e.getMessage());
+ }
+
}
/**
@@ -66,7 +75,11 @@
*/
public int getIntValue(String name) {
int valueNdx = new StringOfValues(getStdoutLine(0)).getIndex(name);
- return Integer.valueOf(new StringOfValues(getStdoutLine(1)).getValue(valueNdx));
+ try {
+ return NumberFormat.getInstance().parse(new StringOfValues(getStdoutLine(1)).getValue(valueNdx)).intValue();
+ } catch (ParseException e) {
+ throw new NumberFormatException(e.getMessage());
+ }
}
/**