This commit is contained in:
J. Duke 2017-07-05 17:36:30 +02:00
commit 9747901b91
289 changed files with 7473 additions and 3983 deletions

View File

@ -105,3 +105,4 @@ bd70f76b0309068f157ae759c36eac8f2c6d098e jdk7-b127
57d702105b23fb90e40beaf00f8f8aeae5e249e7 jdk7-b128
a6b015b59fbc2518762c17ccc35702f03ef7713a jdk7-b129
cc58c11af15411042719e9c82707fdbef60a9e0f jdk7-b130
5d86d951426aaf340b1ba84ae2d5ab5da65a71e2 jdk7-b131

View File

@ -105,3 +105,4 @@ d7532bcd3742f1576dd07ff9fbb535c9c9a276e9 jdk7-b126
9baa8f94a11d6c5cab3f9f0e5a20106326d0932e jdk7-b128
66fa0fcc779296c99746b09efce6109944f82f30 jdk7-b129
563a8f8b5be3940e9346cffac4eff9ed02b3c69f jdk7-b130
9d6dd2cdfcb92612dbd836ecded87770d52b49db jdk7-b131

View File

@ -149,3 +149,5 @@ d535bf4c12355a2897e918da9f8910c0aceec4fb hs20-b07
ae4b185f2ed14af7bab610738c333840598cdcc4 jdk7-b129
ae4b185f2ed14af7bab610738c333840598cdcc4 hs21-b01
e9aa2ca89ad6c53420623d579765f9706ec523d7 jdk7-b130
0aa3b49089112d5faa77902ad680c582ab53f651 jdk7-b131
e9aa2ca89ad6c53420623d579765f9706ec523d7 hs21-b02

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2011, 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,8 +31,7 @@ import sun.jvm.hotspot.types.*;
/** Very minimal port for now to get frames working */
public class StubRoutines {
private static AddressField callStubReturnAddressField;
private static AddressField callStubCompiledReturnAddressField;
private static AddressField callStubReturnAddressField;
static {
VM.registerVMInitializedObserver(new Observer() {
@ -44,20 +43,7 @@ public class StubRoutines {
private static synchronized void initialize(TypeDataBase db) {
Type type = db.lookupType("StubRoutines");
callStubReturnAddressField = type.getAddressField("_call_stub_return_address");
// Only some platforms have specific return from compiled to call_stub
try {
type = db.lookupType("StubRoutines::x86");
if (type != null) {
callStubCompiledReturnAddressField = type.getAddressField("_call_stub_compiled_return");
}
} catch (RuntimeException re) {
callStubCompiledReturnAddressField = null;
}
if (callStubCompiledReturnAddressField == null && VM.getVM().getCPU().equals("x86")) {
throw new InternalError("Missing definition for _call_stub_compiled_return");
}
}
public StubRoutines() {
@ -65,20 +51,10 @@ public class StubRoutines {
public boolean returnsToCallStub(Address returnPC) {
Address addr = callStubReturnAddressField.getValue();
boolean result = false;
if (addr == null) {
result = (addr == returnPC);
} else {
result = addr.equals(returnPC);
}
if (result || callStubCompiledReturnAddressField == null ) return result;
// Could be a return to compiled code return point
addr = callStubCompiledReturnAddressField.getValue();
if (addr == null) {
return (addr == returnPC);
} else {
return (addr.equals(returnPC));
}
}
}

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2005, 2011, 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
@ -43,6 +43,7 @@
# ALT_OUTPUTDIR Output directory to use for hotspot build
# ALT_EXPORT_PATH Directory to export hotspot build to
# ALT_JDK_IMPORT_PATH Current JDK build (only for create_jdk rules)
# ALT_JDK_TARGET_IMPORT_PATH Current JDK build when cross-compiling
# ALT_BUILD_WIN_SA Building SA on Windows is disabled by default.
# Set ALT_BUILD_WIN_SA=1 to enable building SA on
# Windows.

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2006, 2011, 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
@ -162,6 +162,13 @@ ifneq ($(ALT_JDK_IMPORT_PATH),)
JDK_IMPORT_PATH=$(ALT_JDK_IMPORT_PATH)
endif
# Other parts of JDK build may require an import JDK that can be executed
# on the build host. For cross-compile builds we also need an import JDK
# that matches the target arch, so for that we set ALT_JDK_TARGET_IMPORT_PATH
ifneq ($(ALT_JDK_TARGET_IMPORT_PATH),)
JDK_IMPORT_PATH=$(ALT_JDK_TARGET_IMPORT_PATH)
endif
# Find JDK used for javac compiles
BOOTDIR=$(SLASH_JAVA)/re/j2se/$(PREVIOUS_JDK_VERSION)/latest/binaries/$(PLATFORM)
ifneq ($(ALT_BOOTDIR),)

View File

@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2011
HS_MAJOR_VER=21
HS_MINOR_VER=0
HS_BUILD_NUMBER=02
HS_BUILD_NUMBER=03
JDK_MAJOR_VER=1
JDK_MINOR_VER=7

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2006, 2011, 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
@ -437,6 +437,7 @@ jprt.my.windows.x64.test.targets = \
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_ParallelGC, \
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_ParNewGC, \
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_CMS, \
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_G1, \
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_ParOldGC, \
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_default, \
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_SerialGC, \

View File

@ -1,6 +1,6 @@
@echo off
REM
REM Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
REM Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
REM DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
REM
REM This code is free software; you can redistribute it and/or modify it
@ -50,9 +50,7 @@ goto end
:testit
cl 2>&1 | grep "IA-64" >NUL
if %errorlevel% == 0 goto isia64
cl 2>&1 | grep "AMD64" >NUL
cl 2>&1 | grep "x64" >NUL
if %errorlevel% == 0 goto amd64
set ARCH=x86
set BUILDARCH=i486
@ -64,12 +62,6 @@ set ARCH=x86
set BUILDARCH=amd64
set Platform_arch=x86
set Platform_arch_model=x86_64
goto done
:isia64
set ARCH=ia64
set BUILDARCH=ia64
set Platform_arch=ia64
set Platform_arch_model=ia64
:done
setlocal
@ -81,7 +73,7 @@ if not "%2" == "" goto usage
REM Set HotSpotWorkSpace to the directy two steps above this script
for %%i in ("%~dp0..") do ( set HotSpotWorkSpace=%%~dpi)
set HotSpotBuildRoot=%HotSpotWorkSpace%build
set HotSpotBuildSpace=%HotSpotBuildRoot%\vs
set HotSpotBuildSpace=%HotSpotBuildRoot%\vs-%BUILDARCH%
set HotSpotJDKDist=%1
@ -89,9 +81,9 @@ REM figure out MSC version
for /F %%i in ('sh %HotSpotWorkSpace%/make/windows/get_msc_ver.sh') do set %%i
echo **************************************************************
set ProjectFile=jvm.vcproj
set ProjectFile=%HotSpotBuildSpace%\jvm.vcproj
if "%MSC_VER%" == "1200" (
set ProjectFile=jvm.dsp
set ProjectFile=%HotSpotBuildSpace%\jvm.dsp
echo Will generate VC6 project {unsupported}
) else (
if "%MSC_VER%" == "1400" (
@ -163,7 +155,7 @@ copy %HotSpotWorkSpace%\make\windows\projectfiles\%%i\* %HotSpotBuildSpace%\%%i\
)
REM force regneration of ProjectFile
if exist %HotSpotBuildSpace%\%ProjectFile% del %HotSpotBuildSpace%\%ProjectFile%
if exist %ProjectFile% del %ProjectFile%
for /D %%i in (compiler1, compiler2, tiered, core, kernel) do (
echo -- %%i --
@ -182,6 +174,7 @@ echo ARCH=%ARCH% >> %HotSpotBuildSpace%\%%i\local.m
echo BUILDARCH=%BUILDARCH% >> %HotSpotBuildSpace%\%%i\local.make
echo Platform_arch=%Platform_arch% >> %HotSpotBuildSpace%\%%i\local.make
echo Platform_arch_model=%Platform_arch_model% >> %HotSpotBuildSpace%\%%i\local.make
echo MSC_VER=%MSC_VER% >> %HotSpotBuildSpace%\%%i\local.make
for /D %%j in (debug, fastdebug, product) do (
if NOT EXIST %HotSpotBuildSpace%\%%i\%%j mkdir %HotSpotBuildSpace%\%%i\%%j
@ -196,7 +189,7 @@ popd
pushd %HotSpotBuildRoot%
REM It doesn't matter which variant we use here, "compiler1" is as good as any of the others - we need the common variables
nmake /nologo /F %HotSpotWorkSpace%/make/windows/projectfiles/common/Makefile LOCAL_MAKE=%HotSpotBuildSpace%\compiler1\local.make %HotSpotBuildRoot%/%ProjectFile%
nmake /nologo /F %HotSpotWorkSpace%/make/windows/projectfiles/common/Makefile LOCAL_MAKE=%HotSpotBuildSpace%\compiler1\local.make %ProjectFile%
popd

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 1997, 2011, 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
@ -141,9 +141,6 @@ COMPILER_NAME=VS2010
!endif
!endif
# Add what version of the compiler we think this is to the compile line
CPP_FLAGS=$(CPP_FLAGS) /D "MSC_VER=$(MSC_VER)"
# By default, we do not want to use the debug version of the msvcrt.dll file
# but if MFC_DEBUG is defined in the environment it will be used.
MS_RUNTIME_OPTION = /MD

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 1999, 2011, 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
@ -36,8 +36,6 @@ ProjectCreatorSources=\
$(WorkSpace)\src\share\tools\ProjectCreator\DirectoryTree.java \
$(WorkSpace)\src\share\tools\ProjectCreator\DirectoryTreeNode.java \
$(WorkSpace)\src\share\tools\ProjectCreator\FileFormatException.java \
$(WorkSpace)\src\share\tools\ProjectCreator\Macro.java \
$(WorkSpace)\src\share\tools\ProjectCreator\MacroDefinitions.java \
$(WorkSpace)\src\share\tools\ProjectCreator\ProjectCreator.java \
$(WorkSpace)\src\share\tools\ProjectCreator\WinGammaPlatform.java \
$(WorkSpace)\src\share\tools\ProjectCreator\WinGammaPlatformVC6.java \
@ -50,6 +48,10 @@ ProjectCreatorSources=\
# This is only used internally
ProjectCreatorIncludesPRIVATE=\
-relativeInclude src\closed\share\vm \
-relativeInclude src\closed\os\windows\vm \
-relativeInclude src\closed\os_cpu\windows_$(Platform_arch)\vm \
-relativeInclude src\closed\cpu\$(Platform_arch)\vm \
-relativeInclude src\share\vm \
-relativeInclude src\share\vm\prims \
-relativeInclude src\os\windows\vm \
@ -84,7 +86,7 @@ ProjectCreatorIDEOptions=\
-buildBase $(HOTSPOTBUILDSPACE)\%f\%b \
-startAt src \
-compiler $(VcVersion) \
-projectFileName $(HOTSPOTBUILDROOT)\$(ProjectFile) \
-projectFileName $(HOTSPOTBUILDSPACE)\$(ProjectFile) \
-jdkTargetRoot $(HOTSPOTJDKDIST) \
-define ALIGN_STACK_FRAMES \
-define VM_LITTLE_ENDIAN \
@ -106,13 +108,20 @@ ProjectCreatorIDEOptions=\
# Add in build-specific options
!if "$(BUILDARCH)" == "i486"
ProjectCreatorIDEOptions=$(ProjectCreatorIDEOptions) \
-platformName Win32 \
-define IA32 \
-ignorePath x86_64 \
-define TARGET_ARCH_MODEL_x86_32
!else
!if "$(BUILDARCH)" == "amd64"
ProjectCreatorIDEOptions=$(ProjectCreatorIDEOptions) \
-platformName x64 \
-define AMD64 \
-define _LP64 \
-ignorePath x86_32 \
-define TARGET_ARCH_MODEL_x86_64
-define TARGET_ARCH_MODEL_x86_64 \
-define TARGET_OS_ARCH_MODEL_windows_x86_64
!endif
!endif
ProjectCreatorIDEOptionsIgnoreCompiler1=\

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2003, 2011, 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
@ -53,7 +53,7 @@ ProjectFile=jvm.vcproj
!if "$(MSC_VER)" == "1200"
VcVersion=VC6
ProjectFile=vm.dsp
ProjectFile=jvm.dsp
!elseif "$(MSC_VER)" == "1400"

View File

@ -1,15 +0,0 @@
// Platform file for win32 NT platform
os_family = windows
arch = x86
arch_model = x86_64
os_arch = windows_x86
os_arch_model = windows_x86_64
lib_arch = amd64
compiler = visCPP

View File

@ -1,15 +0,0 @@
// Platform file for windows platform
os_family = windows
arch = x86
arch_model = x86_32
os_arch = windows_x86
os_arch_model = windows_x86_32
lib_arch = i386
compiler = visCPP

View File

@ -1,12 +0,0 @@
// Platform file for Itanium Windows platform $Revision: 1.0 $
os_family = win32
arch = ia64
os_arch = win32_ia64
compiler = visCPP
gnu_dis_arch = ia64

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 1999, 2011, 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
@ -54,8 +54,6 @@ BootStrapDir=$(HOTSPOTJDKDIST)
JvmtiOutDir=$(HOTSPOTBUILDSPACE)\$(Variant)\generated\jvmtifiles
!include $(HOTSPOTWORKSPACE)/make/windows/makefiles/jvmti.make
Platform=$(HOTSPOTWORKSPACE)/make/windows/platform_$(BUILDARCH)
!if "$(Variant)" == "compiler2"
# Pick up rules for building adlc
!include $(HOTSPOTWORKSPACE)/make/windows/makefiles/adlc.make
@ -105,17 +103,16 @@ HOTSPOT_VM_DISTRO="OpenJDK"
!endif
ProjectCreatorIDEOptions = $(ProjectCreatorIDEOptions) \
-platform $(Platform) \
-define HOTSPOT_RELEASE_VERSION=\\\"$(HOTSPOT_RELEASE_VERSION)\\\" \
-define JRE_RELEASE_VERSION=\\\"$(JRE_RELEASE_VERSION)\\\" \
-define HOTSPOT_VM_DISTRO=\\\"$(HOTSPOT_VM_DISTRO)\\\"
$(HOTSPOTBUILDROOT)/$(ProjectFile): $(HOTSPOTBUILDSPACE)/classes/ProjectCreator.class
$(HOTSPOTBUILDSPACE)/$(ProjectFile): $(HOTSPOTBUILDSPACE)/classes/ProjectCreator.class
@$(RUN_JAVA) -Djava.class.path=$(HOTSPOTBUILDSPACE)/classes ProjectCreator WinGammaPlatform$(VcVersion) $(ProjectCreatorIDEOptions)
clean:
@rm -rf $(HOTSPOTBUILDSPACE)/classes
@rm -r ../$(ProjectFile)
@rm -r $(HOTSPOTBUILDSPACE)/$(ProjectFile)
$(HOTSPOTBUILDSPACE)/classes/ProjectCreator.class: $(ProjectCreatorSources)
@if exist $(HOTSPOTBUILDSPACE)\classes rmdir /s /q $(HOTSPOTBUILDSPACE)\classes

View File

@ -2407,14 +2407,23 @@ void MacroAssembler::lcmp( Register Ra, Register Rb, Register Rresult) {
#endif
void MacroAssembler::load_sized_value(Address src, Register dst,
size_t size_in_bytes, bool is_signed) {
void MacroAssembler::load_sized_value(Address src, Register dst, size_t size_in_bytes, bool is_signed) {
switch (size_in_bytes) {
case 8: ldx(src, dst); break;
case 4: ld( src, dst); break;
case 2: is_signed ? ldsh(src, dst) : lduh(src, dst); break;
case 1: is_signed ? ldsb(src, dst) : ldub(src, dst); break;
default: ShouldNotReachHere();
case 8: ld_long(src, dst); break;
case 4: ld( src, dst); break;
case 2: is_signed ? ldsh(src, dst) : lduh(src, dst); break;
case 1: is_signed ? ldsb(src, dst) : ldub(src, dst); break;
default: ShouldNotReachHere();
}
}
void MacroAssembler::store_sized_value(Register src, Address dst, size_t size_in_bytes) {
switch (size_in_bytes) {
case 8: st_long(src, dst); break;
case 4: st( src, dst); break;
case 2: sth( src, dst); break;
case 1: stb( src, dst); break;
default: ShouldNotReachHere();
}
}

View File

@ -2330,8 +2330,9 @@ public:
void lcmp( Register Ra, Register Rb, Register Rresult);
#endif
// Loading values by size and signed-ness
void load_sized_value(Address src, Register dst, size_t size_in_bytes, bool is_signed);
// Load and store values by size and signed-ness
void load_sized_value( Address src, Register dst, size_t size_in_bytes, bool is_signed);
void store_sized_value(Register src, Address dst, size_t size_in_bytes);
void float_cmp( bool is_float, int unordered_result,
FloatRegister Fa, FloatRegister Fb,

View File

@ -596,16 +596,9 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
__ st_ptr(O1_scratch, Address(O0_argslot, 0));
} else {
Address prim_value_addr(O1_scratch, java_lang_boxing_object::value_offset_in_bytes(arg_type));
__ load_sized_value(prim_value_addr, O2_scratch, type2aelembytes(arg_type), is_signed_subword_type(arg_type));
if (arg_slots == 2) {
__ unimplemented("not yet tested");
#ifndef _LP64
__ signx(O2_scratch, O3_scratch); // Sign extend
#endif
__ st_long(O2_scratch, Address(O0_argslot, 0)); // Uses O2/O3 on !_LP64
} else {
__ st_ptr( O2_scratch, Address(O0_argslot, 0));
}
const int arg_size = type2aelembytes(arg_type);
__ load_sized_value(prim_value_addr, O2_scratch, arg_size, is_signed_subword_type(arg_type));
__ store_sized_value(O2_scratch, Address(O0_argslot, 0), arg_size); // long store uses O2/O3 on !_LP64
}
if (direct_to_method) {
@ -784,11 +777,9 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
switch (ek) {
case _adapter_opt_i2l:
{
__ ldsw(arg_lsw, O2_scratch); // Load LSW
#ifndef _LP64
__ signx(O2_scratch, O3_scratch); // Sign extend
#endif
__ st_long(O2_scratch, arg_msw); // Uses O2/O3 on !_LP64
__ ldsw(arg_lsw, O2_scratch); // Load LSW
NOT_LP64(__ srlx(O2_scratch, BitsPerInt, O3_scratch)); // Move high bits to lower bits for std
__ st_long(O2_scratch, arg_msw); // Uses O2/O3 on !_LP64
}
break;
case _adapter_opt_unboxl:

View File

@ -8125,6 +8125,17 @@ instruct convP2B( iRegI dst, iRegP src ) %{
%}
#endif
instruct cmpLTMask0( iRegI dst, iRegI src, immI0 zero, flagsReg ccr ) %{
match(Set dst (CmpLTMask src zero));
effect(KILL ccr);
size(4);
format %{ "SRA $src,#31,$dst\t# cmpLTMask0" %}
ins_encode %{
__ sra($src$$Register, 31, $dst$$Register);
%}
ins_pipe(ialu_reg_imm);
%}
instruct cmpLTMask_reg_reg( iRegI dst, iRegI p, iRegI q, flagsReg ccr ) %{
match(Set dst (CmpLTMask p q));
effect( KILL ccr );
@ -8144,19 +8155,7 @@ instruct cadd_cmpLTMask( iRegI p, iRegI q, iRegI y, iRegI tmp, flagsReg ccr ) %{
format %{ "SUBcc $p,$q,$p\t! p' = p-q\n\t"
"ADD $p,$y,$tmp\t! g3=p-q+y\n\t"
"MOVl $tmp,$p\t! p' < 0 ? p'+y : p'" %}
ins_encode( enc_cadd_cmpLTMask(p, q, y, tmp) );
ins_pipe( cadd_cmpltmask );
%}
instruct cadd_cmpLTMask2( iRegI p, iRegI q, iRegI y, iRegI tmp, flagsReg ccr ) %{
match(Set p (AddI (SubI p q) (AndI (CmpLTMask p q) y)));
effect( KILL ccr, TEMP tmp);
ins_cost(DEFAULT_COST*3);
format %{ "SUBcc $p,$q,$p\t! p' = p-q\n\t"
"ADD $p,$y,$tmp\t! g3=p-q+y\n\t"
"MOVl $tmp,$p\t! p' < 0 ? p'+y : p'" %}
"MOVlt $tmp,$p\t! p' < 0 ? p'+y : p'" %}
ins_encode( enc_cadd_cmpLTMask(p, q, y, tmp) );
ins_pipe( cadd_cmpltmask );
%}

View File

@ -2349,6 +2349,17 @@ void Assembler::prefix(Prefix p) {
a_byte(p);
}
void Assembler::por(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
emit_byte(0x66);
int encode = prefix_and_encode(dst->encoding(), src->encoding());
emit_byte(0x0F);
emit_byte(0xEB);
emit_byte(0xC0 | encode);
}
void Assembler::pshufd(XMMRegister dst, XMMRegister src, int mode) {
assert(isByte(mode), "invalid value");
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
@ -6528,20 +6539,39 @@ int MacroAssembler::load_unsigned_short(Register dst, Address src) {
return off;
}
void MacroAssembler::load_sized_value(Register dst, Address src,
size_t size_in_bytes, bool is_signed) {
void MacroAssembler::load_sized_value(Register dst, Address src, size_t size_in_bytes, bool is_signed, Register dst2) {
switch (size_in_bytes) {
#ifndef _LP64
// For case 8, caller is responsible for manually loading
// the second word into another register.
case 8: movl(dst, src); break;
case 8:
assert(dst2 != noreg, "second dest register required");
movl(dst, src);
movl(dst2, src.plus_disp(BytesPerInt));
break;
#else
case 8: movq(dst, src); break;
case 8: movq(dst, src); break;
#endif
case 4: movl(dst, src); break;
case 2: is_signed ? load_signed_short(dst, src) : load_unsigned_short(dst, src); break;
case 1: is_signed ? load_signed_byte( dst, src) : load_unsigned_byte( dst, src); break;
default: ShouldNotReachHere();
case 4: movl(dst, src); break;
case 2: is_signed ? load_signed_short(dst, src) : load_unsigned_short(dst, src); break;
case 1: is_signed ? load_signed_byte( dst, src) : load_unsigned_byte( dst, src); break;
default: ShouldNotReachHere();
}
}
void MacroAssembler::store_sized_value(Address dst, Register src, size_t size_in_bytes, Register src2) {
switch (size_in_bytes) {
#ifndef _LP64
case 8:
assert(src2 != noreg, "second source register required");
movl(dst, src);
movl(dst.plus_disp(BytesPerInt), src2);
break;
#else
case 8: movq(dst, src); break;
#endif
case 4: movl(dst, src); break;
case 2: movw(dst, src); break;
case 1: movb(dst, src); break;
default: ShouldNotReachHere();
}
}
@ -8636,7 +8666,7 @@ void MacroAssembler::string_indexof(Register str1, Register str2,
// Compare strings.
void MacroAssembler::string_compare(Register str1, Register str2,
Register cnt1, Register cnt2, Register result,
XMMRegister vec1, XMMRegister vec2) {
XMMRegister vec1) {
Label LENGTH_DIFF_LABEL, POP_LABEL, DONE_LABEL, WHILE_HEAD_LABEL;
// Compute the minimum of the string lengths and the
@ -8683,62 +8713,85 @@ void MacroAssembler::string_compare(Register str1, Register str2,
bind(LSkip2);
}
// Advance to next character
addptr(str1, 2);
addptr(str2, 2);
Address::ScaleFactor scale = Address::times_2;
int stride = 8;
// Advance to next element
addptr(str1, 16/stride);
addptr(str2, 16/stride);
if (UseSSE42Intrinsics) {
// With SSE4.2, use double quad vector compare
Label COMPARE_VECTORS, VECTOR_NOT_EQUAL, COMPARE_TAIL;
Label COMPARE_WIDE_VECTORS, VECTOR_NOT_EQUAL, COMPARE_TAIL;
int pcmpmask = 0x19;
// Setup to compare 16-byte vectors
movl(cnt1, cnt2);
andl(cnt2, 0xfffffff8); // cnt2 holds the vector count
andl(cnt1, 0x00000007); // cnt1 holds the tail count
testl(cnt2, cnt2);
movl(result, cnt2);
andl(cnt2, ~(stride - 1)); // cnt2 holds the vector count
jccb(Assembler::zero, COMPARE_TAIL);
lea(str2, Address(str2, cnt2, Address::times_2));
lea(str1, Address(str1, cnt2, Address::times_2));
negptr(cnt2);
lea(str1, Address(str1, result, scale));
lea(str2, Address(str2, result, scale));
negptr(result);
bind(COMPARE_VECTORS);
movdqu(vec1, Address(str1, cnt2, Address::times_2));
movdqu(vec2, Address(str2, cnt2, Address::times_2));
pxor(vec1, vec2);
ptest(vec1, vec1);
jccb(Assembler::notZero, VECTOR_NOT_EQUAL);
addptr(cnt2, 8);
jcc(Assembler::notZero, COMPARE_VECTORS);
jmpb(COMPARE_TAIL);
// pcmpestri
// inputs:
// vec1- substring
// rax - negative string length (elements count)
// mem - scaned string
// rdx - string length (elements count)
// pcmpmask - cmp mode: 11000 (string compare with negated result)
// + 00 (unsigned bytes) or + 01 (unsigned shorts)
// outputs:
// rcx - first mismatched element index
assert(result == rax && cnt2 == rdx && cnt1 == rcx, "pcmpestri");
bind(COMPARE_WIDE_VECTORS);
movdqu(vec1, Address(str1, result, scale));
pcmpestri(vec1, Address(str2, result, scale), pcmpmask);
// After pcmpestri cnt1(rcx) contains mismatched element index
jccb(Assembler::below, VECTOR_NOT_EQUAL); // CF==1
addptr(result, stride);
subptr(cnt2, stride);
jccb(Assembler::notZero, COMPARE_WIDE_VECTORS);
// compare wide vectors tail
testl(result, result);
jccb(Assembler::zero, LENGTH_DIFF_LABEL);
movl(cnt2, stride);
movl(result, stride);
negptr(result);
movdqu(vec1, Address(str1, result, scale));
pcmpestri(vec1, Address(str2, result, scale), pcmpmask);
jccb(Assembler::aboveEqual, LENGTH_DIFF_LABEL);
// Mismatched characters in the vectors
bind(VECTOR_NOT_EQUAL);
lea(str1, Address(str1, cnt2, Address::times_2));
lea(str2, Address(str2, cnt2, Address::times_2));
movl(cnt1, 8);
addptr(result, cnt1);
movptr(cnt2, result);
load_unsigned_short(result, Address(str1, cnt2, scale));
load_unsigned_short(cnt1, Address(str2, cnt2, scale));
subl(result, cnt1);
jmpb(POP_LABEL);
// Compare tail (< 8 chars), or rescan last vectors to
// find 1st mismatched characters
bind(COMPARE_TAIL);
testl(cnt1, cnt1);
jccb(Assembler::zero, LENGTH_DIFF_LABEL);
movl(cnt2, cnt1);
bind(COMPARE_TAIL); // limit is zero
movl(cnt2, result);
// Fallthru to tail compare
}
// Shift str2 and str1 to the end of the arrays, negate min
lea(str1, Address(str1, cnt2, Address::times_2, 0));
lea(str2, Address(str2, cnt2, Address::times_2, 0));
lea(str1, Address(str1, cnt2, scale, 0));
lea(str2, Address(str2, cnt2, scale, 0));
negptr(cnt2);
// Compare the rest of the characters
// Compare the rest of the elements
bind(WHILE_HEAD_LABEL);
load_unsigned_short(result, Address(str1, cnt2, Address::times_2, 0));
load_unsigned_short(cnt1, Address(str2, cnt2, Address::times_2, 0));
load_unsigned_short(result, Address(str1, cnt2, scale, 0));
load_unsigned_short(cnt1, Address(str2, cnt2, scale, 0));
subl(result, cnt1);
jccb(Assembler::notZero, POP_LABEL);
increment(cnt2);
jcc(Assembler::notZero, WHILE_HEAD_LABEL);
jccb(Assembler::notZero, WHILE_HEAD_LABEL);
// Strings are equal up to min length. Return the length difference.
bind(LENGTH_DIFF_LABEL);
@ -8747,7 +8800,7 @@ void MacroAssembler::string_compare(Register str1, Register str2,
// Discard the stored length difference
bind(POP_LABEL);
addptr(rsp, wordSize);
pop(cnt1);
// That's it
bind(DONE_LABEL);
@ -8795,6 +8848,7 @@ void MacroAssembler::char_arrays_equals(bool is_array_equ, Register ary1, Regist
if (UseSSE42Intrinsics) {
// With SSE4.2, use double quad vector compare
Label COMPARE_WIDE_VECTORS, COMPARE_TAIL;
// Compare 16-byte vectors
andl(result, 0x0000000e); // tail count (in bytes)
andl(limit, 0xfffffff0); // vector count (in bytes)
@ -8808,11 +8862,23 @@ void MacroAssembler::char_arrays_equals(bool is_array_equ, Register ary1, Regist
movdqu(vec1, Address(ary1, limit, Address::times_1));
movdqu(vec2, Address(ary2, limit, Address::times_1));
pxor(vec1, vec2);
ptest(vec1, vec1);
jccb(Assembler::notZero, FALSE_LABEL);
addptr(limit, 16);
jcc(Assembler::notZero, COMPARE_WIDE_VECTORS);
testl(result, result);
jccb(Assembler::zero, TRUE_LABEL);
movdqu(vec1, Address(ary1, result, Address::times_1, -16));
movdqu(vec2, Address(ary2, result, Address::times_1, -16));
pxor(vec1, vec2);
ptest(vec1, vec1);
jccb(Assembler::notZero, FALSE_LABEL);
jmpb(TRUE_LABEL);
bind(COMPARE_TAIL); // limit is zero
movl(limit, result);
// Fallthru to tail compare

View File

@ -1277,6 +1277,9 @@ private:
void prefetcht2(Address src);
void prefetchw(Address src);
// POR - Bitwise logical OR
void por(XMMRegister dst, XMMRegister src);
// Shuffle Packed Doublewords
void pshufd(XMMRegister dst, XMMRegister src, int mode);
void pshufd(XMMRegister dst, Address src, int mode);
@ -1522,8 +1525,9 @@ class MacroAssembler: public Assembler {
// Support for sign-extension (hi:lo = extend_sign(lo))
void extend_sign(Register hi, Register lo);
// Loading values by size and signed-ness
void load_sized_value(Register dst, Address src, size_t size_in_bytes, bool is_signed);
// Load and store values by size and signed-ness
void load_sized_value(Register dst, Address src, size_t size_in_bytes, bool is_signed, Register dst2 = noreg);
void store_sized_value(Address dst, Register src, size_t size_in_bytes, Register src2 = noreg);
// Support for inc/dec with optimal instruction selection depending on value
@ -2293,7 +2297,7 @@ public:
// Compare strings.
void string_compare(Register str1, Register str2,
Register cnt1, Register cnt2, Register result,
XMMRegister vec1, XMMRegister vec2);
XMMRegister vec1);
// Compare char[] arrays.
void char_arrays_equals(bool is_array_equ, Register ary1, Register ary2,

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2007, 2011, 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
@ -1899,8 +1899,6 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) {
Label do_double;
Label done_conv;
address compiled_entry = __ pc();
// The FPU stack is clean if UseSSE >= 2 but must be cleaned in other cases
if (UseSSE < 2) {
__ lea(state, Address(rbp, -(int)sizeof(BytecodeInterpreter)));
@ -1934,15 +1932,7 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) {
__ jmp(done_conv);
}
#if 0
// emit a sentinel we can test for when converting an interpreter
// entry point to a compiled entry point.
__ a_long(Interpreter::return_sentinel);
__ a_long((int)compiled_entry);
#endif
// Return point to interpreter from compiled/native method
InternalAddress return_from_native_method(__ pc());
__ bind(done_conv);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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,14 +26,6 @@
#define CPU_X86_VM_INTERPRETER_X86_HPP
public:
// Sentinel placed in the code for interpreter returns so
// that i2c adapters and osr code can recognize an interpreter
// return address and convert the return to a specialized
// block of code to handle compiedl return values and cleaning
// the fpu stack.
static const int return_sentinel;
static Address::ScaleFactor stackElementScale() { return Address::times_4; }
// Offset from rsp (which points to the last stack element)

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -51,9 +51,6 @@
#define __ _masm->
// Initialize the sentinel used to distinguish an interpreter return address.
const int Interpreter::return_sentinel = 0xfeedbeed;
//------------------------------------------------------------------------------------------------------------------------
address AbstractInterpreterGenerator::generate_slow_signature_handler() {

View File

@ -602,24 +602,18 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
// make room for the new argument:
__ movl(rax_argslot, rcx_bmh_vmargslot);
__ lea(rax_argslot, __ argument_address(rax_argslot));
insert_arg_slots(_masm, arg_slots * stack_move_unit(), arg_mask,
rax_argslot, rbx_temp, rdx_temp);
insert_arg_slots(_masm, arg_slots * stack_move_unit(), arg_mask, rax_argslot, rbx_temp, rdx_temp);
// store bound argument into the new stack slot:
__ load_heap_oop(rbx_temp, rcx_bmh_argument);
Address prim_value_addr(rbx_temp, java_lang_boxing_object::value_offset_in_bytes(arg_type));
if (arg_type == T_OBJECT) {
__ movptr(Address(rax_argslot, 0), rbx_temp);
} else {
__ load_sized_value(rdx_temp, prim_value_addr,
type2aelembytes(arg_type), is_signed_subword_type(arg_type));
__ movptr(Address(rax_argslot, 0), rdx_temp);
#ifndef _LP64
if (arg_slots == 2) {
__ movl(rdx_temp, prim_value_addr.plus_disp(wordSize));
__ movl(Address(rax_argslot, Interpreter::stackElementSize), rdx_temp);
}
#endif //_LP64
Address prim_value_addr(rbx_temp, java_lang_boxing_object::value_offset_in_bytes(arg_type));
const int arg_size = type2aelembytes(arg_type);
__ load_sized_value(rdx_temp, prim_value_addr, arg_size, is_signed_subword_type(arg_type), rbx_temp);
__ store_sized_value(Address(rax_argslot, 0), rdx_temp, arg_size, rbx_temp);
}
if (direct_to_method) {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2011, 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
@ -660,25 +660,6 @@ static void gen_i2c_adapter(MacroAssembler *masm,
int comp_args_on_stack,
const BasicType *sig_bt,
const VMRegPair *regs) {
// we're being called from the interpreter but need to find the
// compiled return entry point. The return address on the stack
// should point at it and we just need to pull the old value out.
// load up the pointer to the compiled return entry point and
// rewrite our return pc. The code is arranged like so:
//
// .word Interpreter::return_sentinel
// .word address_of_compiled_return_point
// return_entry_point: blah_blah_blah
//
// So we can find the appropriate return point by loading up the word
// just prior to the current return address we have on the stack.
//
// We will only enter here from an interpreted frame and never from after
// passing thru a c2i. Azul allowed this but we do not. If we lose the
// race and use a c2i we will remain interpreted for the race loser(s).
// This removes all sorts of headaches on the x86 side and also eliminates
// the possibility of having c2i -> i2c -> c2i -> ... endless transitions.
// Note: rsi contains the senderSP on entry. We must preserve it since
// we may do a i2c -> c2i transition if we lose a race where compiled
@ -687,40 +668,6 @@ static void gen_i2c_adapter(MacroAssembler *masm,
// Pick up the return address
__ movptr(rax, Address(rsp, 0));
// If UseSSE >= 2 then no cleanup is needed on the return to the
// interpreter so skip fixing up the return entry point unless
// VerifyFPU is enabled.
if (UseSSE < 2 || VerifyFPU) {
Label skip, chk_int;
// If we were called from the call stub we need to do a little bit different
// cleanup than if the interpreter returned to the call stub.
ExternalAddress stub_return_address(StubRoutines::_call_stub_return_address);
__ cmpptr(rax, stub_return_address.addr());
__ jcc(Assembler::notEqual, chk_int);
assert(StubRoutines::x86::get_call_stub_compiled_return() != NULL, "must be set");
__ lea(rax, ExternalAddress(StubRoutines::x86::get_call_stub_compiled_return()));
__ jmp(skip);
// It must be the interpreter since we never get here via a c2i (unlike Azul)
__ bind(chk_int);
#ifdef ASSERT
{
Label ok;
__ cmpl(Address(rax, -2*wordSize), Interpreter::return_sentinel);
__ jcc(Assembler::equal, ok);
__ int3();
__ bind(ok);
}
#endif // ASSERT
__ movptr(rax, Address(rax, -wordSize));
__ bind(skip);
}
// rax, now contains the compiled return entry point which will do an
// cleanup needed for the return from compiled to interpreted.
// Must preserve original SP for loading incoming arguments because
// we need to align the outgoing SP for compiled code.
__ movptr(rdi, rsp);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2011, 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
@ -610,14 +610,6 @@ static void gen_i2c_adapter(MacroAssembler *masm,
const BasicType *sig_bt,
const VMRegPair *regs) {
//
// We will only enter here from an interpreted frame and never from after
// passing thru a c2i. Azul allowed this but we do not. If we lose the
// race and use a c2i we will remain interpreted for the race loser(s).
// This removes all sorts of headaches on the x86 side and also eliminates
// the possibility of having c2i -> i2c -> c2i -> ... endless transitions.
// Note: r13 contains the senderSP on entry. We must preserve it since
// we may do a i2c -> c2i transition if we lose a race where compiled
// code goes non-entrant while we get args ready.
@ -627,6 +619,7 @@ static void gen_i2c_adapter(MacroAssembler *masm,
// save code can segv when fxsave instructions find improperly
// aligned stack pointer.
// Pick up the return address
__ movptr(rax, Address(rsp, 0));
// Must preserve original SP for loading incoming arguments because

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2011, 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
@ -240,9 +240,30 @@ class StubGenerator: public StubCodeGenerator {
BLOCK_COMMENT("call_stub_return_address:");
return_address = __ pc();
Label common_return;
#ifdef COMPILER2
{
Label L_skip;
if (UseSSE >= 2) {
__ verify_FPU(0, "call_stub_return");
} else {
for (int i = 1; i < 8; i++) {
__ ffree(i);
}
__ BIND(common_return);
// UseSSE <= 1 so double result should be left on TOS
__ movl(rsi, result_type);
__ cmpl(rsi, T_DOUBLE);
__ jcc(Assembler::equal, L_skip);
if (UseSSE == 0) {
// UseSSE == 0 so float result should be left on TOS
__ cmpl(rsi, T_FLOAT);
__ jcc(Assembler::equal, L_skip);
}
__ ffree(0);
}
__ BIND(L_skip);
}
#endif // COMPILER2
// store result depending on type
// (everything that is not T_LONG, T_FLOAT or T_DOUBLE is treated as T_INT)
@ -305,37 +326,6 @@ class StubGenerator: public StubCodeGenerator {
}
__ jmp(exit);
// If we call compiled code directly from the call stub we will
// need to adjust the return back to the call stub to a specialized
// piece of code that can handle compiled results and cleaning the fpu
// stack. compiled code will be set to return here instead of the
// return above that handles interpreter returns.
BLOCK_COMMENT("call_stub_compiled_return:");
StubRoutines::x86::set_call_stub_compiled_return( __ pc());
#ifdef COMPILER2
if (UseSSE >= 2) {
__ verify_FPU(0, "call_stub_compiled_return");
} else {
for (int i = 1; i < 8; i++) {
__ ffree(i);
}
// UseSSE <= 1 so double result should be left on TOS
__ movl(rsi, result_type);
__ cmpl(rsi, T_DOUBLE);
__ jcc(Assembler::equal, common_return);
if (UseSSE == 0) {
// UseSSE == 0 so float result should be left on TOS
__ cmpl(rsi, T_FLOAT);
__ jcc(Assembler::equal, common_return);
}
__ ffree(0);
}
#endif /* COMPILER2 */
__ jmp(common_return);
return start;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -39,6 +39,5 @@
// Implementation of the platform-specific part of StubRoutines - for
// a description of how to extend it, see the stubRoutines.hpp file.
address StubRoutines::x86::_verify_mxcsr_entry = NULL;
address StubRoutines::x86::_verify_fpu_cntrl_wrd_entry= NULL;
address StubRoutines::x86::_call_stub_compiled_return = NULL;
address StubRoutines::x86::_verify_mxcsr_entry = NULL;
address StubRoutines::x86::_verify_fpu_cntrl_wrd_entry = NULL;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -44,24 +44,14 @@ class x86 {
friend class VMStructs;
private:
// If we call compiled code directly from the call stub we will
// need to adjust the return back to the call stub to a specialized
// piece of code that can handle compiled results and cleaning the fpu
// stack. The variable holds that location.
static address _call_stub_compiled_return;
static address _verify_mxcsr_entry;
static address _verify_fpu_cntrl_wrd_entry;
static jint _mxcsr_std;
public:
static address verify_mxcsr_entry() { return _verify_mxcsr_entry; }
static address verify_fpu_cntrl_wrd_entry() { return _verify_fpu_cntrl_wrd_entry; }
static address get_call_stub_compiled_return() { return _call_stub_compiled_return; }
static void set_call_stub_compiled_return(address ret) { _call_stub_compiled_return = ret; }
};
static bool returns_to_call_stub(address return_pc) { return (return_pc == _call_stub_return_address) ||
return_pc == x86::get_call_stub_compiled_return(); }
static bool returns_to_call_stub(address return_pc) { return return_pc == _call_stub_return_address; }
#endif // CPU_X86_VM_STUBROUTINES_X86_32_HPP

View File

@ -177,9 +177,7 @@ address TemplateInterpreterGenerator::generate_continuation_for(TosState state)
address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step) {
TosState incoming_state = state;
Label interpreter_entry;
address compiled_entry = __ pc();
address entry = __ pc();
#ifdef COMPILER2
// The FPU stack is clean if UseSSE >= 2 but must be cleaned in other cases
@ -197,14 +195,6 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
__ MacroAssembler::verify_FPU(0, "generate_return_entry_for compiled");
}
__ jmp(interpreter_entry, relocInfo::none);
// emit a sentinel we can test for when converting an interpreter
// entry point to a compiled entry point.
__ a_long(Interpreter::return_sentinel);
__ a_long((int)compiled_entry);
address entry = __ pc();
__ bind(interpreter_entry);
// In SSE mode, interpreter returns FP results in xmm0 but they need
// to end up back on the FPU so it can operate on them.
if (incoming_state == ftos && UseSSE >= 1) {

View File

@ -190,13 +190,7 @@ address TemplateInterpreterGenerator::generate_continuation_for(TosState state)
}
address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
int step) {
// amd64 doesn't need to do anything special about compiled returns
// to the interpreter so the code that exists on x86 to place a sentinel
// here and the specialized cleanup code is not needed here.
address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step) {
address entry = __ pc();
// Restore stack bottom in case i2c adjusted stack

View File

@ -1710,39 +1710,6 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
__ pop(rdi); // get return address
__ mov(rsp, rdx); // set sp to sender sp
Label skip;
Label chkint;
// The interpreter frame we have removed may be returning to
// either the callstub or the interpreter. Since we will
// now be returning from a compiled (OSR) nmethod we must
// adjust the return to the return were it can handler compiled
// results and clean the fpu stack. This is very similar to
// what a i2c adapter must do.
// Are we returning to the call stub?
__ cmp32(rdi, ExternalAddress(StubRoutines::_call_stub_return_address));
__ jcc(Assembler::notEqual, chkint);
// yes adjust to the specialized call stub return.
assert(StubRoutines::x86::get_call_stub_compiled_return() != NULL, "must be set");
__ lea(rdi, ExternalAddress(StubRoutines::x86::get_call_stub_compiled_return()));
__ jmp(skip);
__ bind(chkint);
// Are we returning to the interpreter? Look for sentinel
__ cmpl(Address(rdi, -2*wordSize), Interpreter::return_sentinel);
__ jcc(Assembler::notEqual, skip);
// Adjust to compiled return back to interpreter
__ movptr(rdi, Address(rdi, -wordSize));
__ bind(skip);
// Align stack pointer for compiled code (note that caller is
// responsible for undoing this fixup by remembering the old SP
// in an rbp,-relative location)

View File

@ -12629,16 +12629,16 @@ instruct rep_stos(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlag
ins_pipe( pipe_slow );
%}
instruct string_compare(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eBXRegI cnt2,
eAXRegI result, regXD tmp1, regXD tmp2, eFlagsReg cr) %{
instruct string_compare(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI cnt2,
eAXRegI result, regXD tmp1, eFlagsReg cr) %{
match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
effect(TEMP tmp1, TEMP tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr);
effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr);
format %{ "String Compare $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1, $tmp2" %}
format %{ "String Compare $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %}
ins_encode %{
__ string_compare($str1$$Register, $str2$$Register,
$cnt1$$Register, $cnt2$$Register, $result$$Register,
$tmp1$$XMMRegister, $tmp2$$XMMRegister);
$tmp1$$XMMRegister);
%}
ins_pipe( pipe_slow );
%}

View File

@ -11583,17 +11583,17 @@ instruct rep_stos(rcx_RegL cnt, rdi_RegP base, rax_RegI zero, Universe dummy,
ins_pipe(pipe_slow);
%}
instruct string_compare(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rbx_RegI cnt2,
rax_RegI result, regD tmp1, regD tmp2, rFlagsReg cr)
instruct string_compare(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2,
rax_RegI result, regD tmp1, rFlagsReg cr)
%{
match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
effect(TEMP tmp1, TEMP tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr);
effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr);
format %{ "String Compare $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1, $tmp2" %}
format %{ "String Compare $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %}
ins_encode %{
__ string_compare($str1$$Register, $str2$$Register,
$cnt1$$Register, $cnt2$$Register, $result$$Register,
$tmp1$$XMMRegister, $tmp2$$XMMRegister);
$tmp1$$XMMRegister);
%}
ins_pipe( pipe_slow );
%}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright 2008, 2009 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@ -30,7 +30,3 @@
#ifdef TARGET_OS_FAMILY_linux
# include "thread_linux.inline.hpp"
#endif
#ifdef IA32
address StubRoutines::x86::_call_stub_compiled_return = NULL;
#endif // IA32

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright 2007, 2008, 2009, 2010 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@ -48,13 +48,4 @@
method_handles_adapters_code_size = 0
};
#ifdef IA32
class x86 {
friend class VMStructs;
private:
static address _call_stub_compiled_return;
};
#endif // IA32
#endif // CPU_ZERO_VM_STUBROUTINES_ZERO_HPP

View File

@ -1975,7 +1975,11 @@ bool os::dll_address_to_function_name(address addr, char *buf,
#ifndef RTLD_DL_SYMENT
#define RTLD_DL_SYMENT 1
#endif
Sym * info;
#ifdef _LP64
Elf64_Sym * info;
#else
Elf32_Sym * info;
#endif
if (dladdr1_func((void *)addr, &dlinfo, (void **)&info,
RTLD_DL_SYMENT)) {
if ((char *)dlinfo.dli_saddr + info->st_size > (char *)addr) {
@ -6424,4 +6428,3 @@ int os::bind(int fd, struct sockaddr *him, int len) {
INTERRUPTIBLE_RETURN_INT_NORESTART(::bind(fd, him, len),\
os::Solaris::clear_interrupted);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 2011, 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
@ -298,8 +298,8 @@ static char* get_user_name() {
static char* get_user_name_slow(int vmid) {
// directory search
char* oldest_user = NULL;
time_t oldest_ctime = 0;
char* latest_user = NULL;
time_t latest_ctime = 0;
const char* tmpdirname = os::get_temp_directory();
@ -375,18 +375,29 @@ static char* get_user_name_slow(int vmid) {
continue;
}
// compare and save filename with latest creation time
if (statbuf.st_size > 0 && statbuf.st_ctime > oldest_ctime) {
// If we found a matching file with a newer creation time, then
// save the user name. The newer creation time indicates that
// we found a newer incarnation of the process associated with
// vmid. Due to the way that Windows recycles pids and the fact
// that we can't delete the file from the file system namespace
// until last close, it is possible for there to be more than
// one hsperfdata file with a name matching vmid (diff users).
//
// We no longer ignore hsperfdata files where (st_size == 0).
// In this function, all we're trying to do is determine the
// name of the user that owns the process associated with vmid
// so the size doesn't matter. Very rarely, we have observed
// hsperfdata files where (st_size == 0) and the st_size field
// later becomes the expected value.
//
if (statbuf.st_ctime > latest_ctime) {
char* user = strchr(dentry->d_name, '_') + 1;
if (statbuf.st_ctime > oldest_ctime) {
char* user = strchr(dentry->d_name, '_') + 1;
if (latest_user != NULL) FREE_C_HEAP_ARRAY(char, latest_user);
latest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1);
if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user);
oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1);
strcpy(oldest_user, user);
oldest_ctime = statbuf.st_ctime;
}
strcpy(latest_user, user);
latest_ctime = statbuf.st_ctime;
}
FREE_C_HEAP_ARRAY(char, filename);
@ -399,7 +410,7 @@ static char* get_user_name_slow(int vmid) {
os::closedir(tmpdirp);
FREE_C_HEAP_ARRAY(char, tdbuf);
return(oldest_user);
return(latest_user);
}
// return the name of the user that owns the process identified by vmid.
@ -1339,6 +1350,38 @@ static HANDLE create_sharedmem_resources(const char* dirname, const char* filena
CloseHandle(fh);
fh = NULL;
return NULL;
} else {
// We created the file mapping, but rarely the size of the
// backing store file is reported as zero (0) which can cause
// failures when trying to use the hsperfdata file.
struct stat statbuf;
int ret_code = ::stat(filename, &statbuf);
if (ret_code == OS_ERR) {
if (PrintMiscellaneous && Verbose) {
warning("Could not get status information from file %s: %s\n",
filename, strerror(errno));
}
CloseHandle(fmh);
CloseHandle(fh);
fh = NULL;
fmh = NULL;
return NULL;
}
// We could always call FlushFileBuffers() but the Microsoft
// docs indicate that it is considered expensive so we only
// call it when we observe the size as zero (0).
if (statbuf.st_size == 0 && FlushFileBuffers(fh) != TRUE) {
DWORD lasterror = GetLastError();
if (PrintMiscellaneous && Verbose) {
warning("could not flush file %s: %d\n", filename, lasterror);
}
CloseHandle(fmh);
CloseHandle(fh);
fh = NULL;
fmh = NULL;
return NULL;
}
}
// the file has been successfully created and the file mapping

View File

@ -1,6 +1,6 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2007, 2008 Red Hat, Inc.
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright 2007, 2008, 2011 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -300,4 +300,18 @@ inline void* Atomic::cmpxchg_ptr(void* exchange_value,
(intptr_t) compare_value);
}
inline jlong Atomic::load(volatile jlong* src) {
volatile jlong dest;
os::atomic_copy64(src, &dest);
return dest;
}
inline void Atomic::store(jlong store_value, jlong* dest) {
os::atomic_copy64((volatile jlong*)&store_value, (volatile jlong*)dest);
}
inline void Atomic::store(jlong store_value, volatile jlong* dest) {
os::atomic_copy64((volatile jlong*)&store_value, dest);
}
#endif // OS_CPU_LINUX_ZERO_VM_ATOMIC_LINUX_ZERO_INLINE_HPP

View File

@ -67,7 +67,6 @@ extern "C" void _Atomic_move_long_v9(volatile jlong* src, volatile jlong* dst);
inline void Atomic_move_long(volatile jlong* src, volatile jlong* dst) {
#ifdef COMPILER2
// Compiler2 does not support v8, it is used only for v9.
assert (VM_Version::v9_instructions_work(), "only supported on v9");
_Atomic_move_long_v9(src, dst);
#else
// The branch is cheaper then emulated LDD.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2011, 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
@ -189,14 +189,22 @@ int VM_Version::platform_features(int features) {
tty->print_cr("cpu_info.implementation: %s", implementation);
}
#endif
if (strncmp(implementation, "SPARC64", 7) == 0) {
// Convert to UPPER case before compare.
char* impl = strdup(implementation);
for (int i = 0; impl[i] != 0; i++)
impl[i] = (char)toupper((uint)impl[i]);
if (strstr(impl, "SPARC64") != NULL) {
features |= sparc64_family_m;
} else if (strncmp(implementation, "UltraSPARC-T", 12) == 0) {
} else if (strstr(impl, "SPARC-T") != NULL) {
features |= T_family_m;
if (strncmp(implementation, "UltraSPARC-T1", 13) == 0) {
if (strstr(impl, "SPARC-T1") != NULL) {
features |= T1_model_m;
}
} else {
assert(strstr(impl, "SPARC") != NULL, "should be sparc");
}
free((void*)impl);
break;
}
} // for(

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2004, 2011, 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
@ -71,7 +71,7 @@ typedef struct _DISPATCHER_CONTEXT {
PVOID HandlerData;
} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
#if MSC_VER < 1500
#if _MSC_VER < 1500
/* Not needed for VS2008 compiler, comes from winnt.h. */
typedef EXCEPTION_DISPOSITION (*PEXCEPTION_ROUTINE) (

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2011, 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
@ -51,12 +51,14 @@ class BuildConfig {
if (vars == null) vars = new Hashtable();
String flavourBuild = flavour + "_" + build;
String platformName = getFieldString(null, "PlatformName");
System.out.println();
System.out.println(flavourBuild);
put("Name", getCI().makeCfgName(flavourBuild));
put("Name", getCI().makeCfgName(flavourBuild, platformName));
put("Flavour", flavour);
put("Build", build);
put("PlatformName", platformName);
// ones mentioned above were needed to expand format
String buildBase = expandFormat(getFieldString(null, "BuildBase"));
@ -93,7 +95,7 @@ class BuildConfig {
protected void initDefaultLinkerFlags() {
Vector linkerFlags = new Vector();
linkerFlags.addAll(getCI().getBaseLinkerFlags( get("OutputDir"), get("OutputDll")));
linkerFlags.addAll(getCI().getBaseLinkerFlags( get("OutputDir"), get("OutputDll"), get("PlatformName")));
put("LinkerFlags", linkerFlags);
}
@ -115,18 +117,15 @@ class BuildConfig {
}
Vector getPreferredPaths(MacroDefinitions macros) {
Vector getPreferredPaths() {
Vector preferredPaths = new Vector();
// In the case of multiple files with the same name in
// different subdirectories, prefer the versions specified in
// the platform file as the "os_family" and "arch" macros.
for (Iterator iter = macros.getMacros(); iter.hasNext(); ) {
Macro macro = (Macro) iter.next();
if (macro.name.equals("os_family") ||
macro.name.equals("arch")) {
preferredPaths.add(macro.contents);
}
}
// different subdirectories, prefer these versions
preferredPaths.add("windows");
preferredPaths.add("x86");
preferredPaths.add("closed");
// Also prefer "opto" over "adlc" for adlcVMDeps.hpp
preferredPaths.add("opto");
@ -137,18 +136,7 @@ class BuildConfig {
void handleDB() {
WinGammaPlatform platform = (WinGammaPlatform)getField(null, "PlatformObject");
File incls = new File(get("OutputDir")+Util.sep+"incls");
incls.mkdirs();
MacroDefinitions macros = new MacroDefinitions();
try {
macros.readFrom(getFieldString(null, "Platform"), false);
} catch (Exception e) {
throw new RuntimeException(e);
}
putSpecificField("AllFilesHash", computeAllFiles(platform, macros));
putSpecificField("AllFilesHash", computeAllFiles(platform));
}
@ -190,10 +178,10 @@ class BuildConfig {
ht.put(expandFormat(key), expandFormat(value));
}
Hashtable computeAllFiles(WinGammaPlatform platform, MacroDefinitions macros) {
Hashtable computeAllFiles(WinGammaPlatform platform) {
Hashtable rv = new Hashtable();
DirectoryTree tree = getSourceTree(get("SourceBase"), getFieldString(null, "StartAt"));
Vector preferredPaths = getPreferredPaths(macros);
Vector preferredPaths = getPreferredPaths();
// Hold errors until end
Vector filesNotFound = new Vector();
@ -228,8 +216,7 @@ class BuildConfig {
System.err.println("Error: some files were not found or " +
"appeared in multiple subdirectories of " +
"directory " + get("SourceBase") + " and could not " +
"be resolved with the os_family and arch " +
"macros in the platform file.");
"be resolved with os_family and arch.");
if (filesNotFound.size() != 0) {
System.err.println("Files not found:");
for (Iterator iter = filesNotFound.iterator();
@ -254,10 +241,14 @@ class BuildConfig {
Vector sysDefines = new Vector();
sysDefines.add("WIN32");
sysDefines.add("_WINDOWS");
sysDefines.add("HOTSPOT_BUILD_USER="+System.getProperty("user.name"));
sysDefines.add("HOTSPOT_BUILD_USER=\\\""+System.getProperty("user.name")+"\\\"");
sysDefines.add("HOTSPOT_BUILD_TARGET=\\\""+get("Build")+"\\\"");
sysDefines.add("_JNI_IMPLEMENTATION_");
sysDefines.add("HOTSPOT_LIB_ARCH=\\\"i386\\\"");
if (vars.get("PlatformName").equals("Win32")) {
sysDefines.add("HOTSPOT_LIB_ARCH=\\\"i386\\\"");
} else {
sysDefines.add("HOTSPOT_LIB_ARCH=\\\"amd64\\\"");
}
sysDefines.addAll(defines);
@ -710,7 +701,7 @@ class KernelProductConfig extends ProductConfig {
}
abstract class CompilerInterface {
abstract Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir);
abstract Vector getBaseLinkerFlags(String outDir, String outDll);
abstract Vector getBaseLinkerFlags(String outDir, String outDll, String platformName);
abstract Vector getDebugCompilerFlags(String opt);
abstract Vector getDebugLinkerFlags();
abstract void getAdditionalNonKernelLinkerFlags(Vector rv);
@ -718,7 +709,7 @@ abstract class CompilerInterface {
abstract Vector getProductLinkerFlags();
abstract String getOptFlag();
abstract String getNoOptFlag();
abstract String makeCfgName(String flavourBuild);
abstract String makeCfgName(String flavourBuild, String platformName);
void addAttr(Vector receiver, String attr, String value) {
receiver.add(attr); receiver.add(value);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2011, 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
@ -55,6 +55,9 @@ public class DirectoryTree {
private Vector nodes = new Vector();
public FileIterator(Node rootNode) {
if(rootNode == null) {
return;
}
nodes.add(rootNode);
prune();
}
@ -112,10 +115,7 @@ public class DirectoryTree {
throws IllegalArgumentException {
File root = new File(Util.normalize(baseDirectory));
if (!root.isDirectory()) {
throw new IllegalArgumentException("baseDirectory \"" +
baseDirectory +
"\" does not exist or " +
"is not a directory");
return;
}
try {
root = root.getCanonicalFile();

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2011, 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,7 +22,9 @@
*
*/
@SuppressWarnings("serial")
public class FileFormatException extends Exception {
public FileFormatException() {
super();
}

View File

@ -1,154 +0,0 @@
/*
* Copyright (c) 1999, 2010, 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.
*
*/
import java.io.*;
import java.util.*;
public class MacroDefinitions {
private Vector macros;
public MacroDefinitions() {
macros = new Vector();
}
public void addMacro(String name, String contents) {
Macro macro = new Macro();
macro.name = name;
macro.contents = contents;
macros.add(macro);
}
private boolean lineIsEmpty(String s) {
for (int i = 0; i < s.length(); i++) {
if (!Character.isWhitespace(s.charAt(i))) {
return false;
}
}
return true;
}
public void readFrom(String fileName, boolean missingOk)
throws FileNotFoundException, FileFormatException, IOException {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(fileName));
} catch (FileNotFoundException e) {
if (missingOk) {
return;
} else {
throw(e);
}
}
String line;
do {
line = reader.readLine();
if (line != null) {
// This had to be rewritten (compare to Database.java)
// because the Solaris platform file has been
// repurposed and now contains "macros" with spaces in
// them.
if ((!line.startsWith("//")) &&
(!lineIsEmpty(line))) {
int nameBegin = -1;
int nameEnd = -1;
boolean gotEquals = false;
int contentsBegin = -1;
int contentsEnd = -1;
int i = 0;
// Scan forward for beginning of name
while (i < line.length()) {
if (!Character.isWhitespace(line.charAt(i))) {
break;
}
i++;
}
nameBegin = i;
// Scan forward for end of name
while (i < line.length()) {
if (Character.isWhitespace(line.charAt(i))) {
break;
}
i++;
}
nameEnd = i;
// Scan forward for equals sign
while (i < line.length()) {
if (line.charAt(i) == '=') {
gotEquals = true;
break;
}
i++;
}
// Scan forward for start of contents
i++;
while (i < line.length()) {
if (!Character.isWhitespace(line.charAt(i))) {
break;
}
i++;
}
contentsBegin = i;
// Scan *backward* for end of contents
i = line.length() - 1;
while (i >= 0) {
if (!Character.isWhitespace(line.charAt(i))) {
break;
}
}
contentsEnd = i+1;
// Now do consistency check
if (!((nameBegin < nameEnd) &&
(nameEnd < contentsBegin) &&
(contentsBegin < contentsEnd) &&
(gotEquals == true))) {
throw new FileFormatException(
"Expected \"macroname = value\", " +
"but found: " + line
);
}
String name = line.substring(nameBegin, nameEnd);
String contents = line.substring(contentsBegin,
contentsEnd);
addMacro(name, contents);
}
}
} while (line != null);
reader.close();
}
/** This returns an Iterator of Macros. You should not mutate the
returned Macro objects or use the Iterator to remove
macros. */
public Iterator getMacros() {
return macros.iterator();
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2011, 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
@ -47,7 +47,7 @@ public class Util {
return sb.toString();
}
static String join(String padder, String v[]) {
static String join(String padder, String v[]) {
StringBuffer sb = new StringBuffer();
for (int i=0; i<v.length; i++) {
@ -80,9 +80,16 @@ public class Util {
static String normalize(String file) {
return file.replace('\\', '/');
file = file.replace('\\', '/');
if (file.length() > 2) {
if (file.charAt(1) == ':' && file.charAt(2) == '/') {
// convert drive letter to uppercase
String drive = file.substring(0, 1).toUpperCase();
return drive + file.substring(1);
}
}
return file;
}
static String sep = File.separator;
static String os = "Win32"; //System.getProperty("os.name");
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2011, 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
@ -235,13 +235,6 @@ public abstract class WinGammaPlatform {
(locationsInTree.size() == 0)) {
filesNotFound.add(fileName);
} else if (locationsInTree.size() > 1) {
// We shouldn't have duplicate file names in our workspace.
System.err.println();
System.err.println("There are multiple files named as: " + fileName);
System.exit(-1);
// The following code could be safely removed if we don't need duplicate
// file names.
// Iterate through them, trying to find one with a
// preferred path
search:
@ -336,7 +329,7 @@ public abstract class WinGammaPlatform {
String projectName = getProjectName(projectFileName, ext);
writeProjectFile(projectFileName, projectName, createAllConfigs());
writeProjectFile(projectFileName, projectName, createAllConfigs(BuildConfig.getFieldString(null, "PlatformName")));
}
protected void writePrologue(String[] args) {
@ -376,7 +369,13 @@ public abstract class WinGammaPlatform {
HsArgHandler.STRING
),
new HsArgRule("-projectFileName",
new HsArgRule("-platformName",
"PlatformName",
null,
HsArgHandler.STRING
),
new HsArgRule("-projectFileName",
"ProjectFileName",
null,
HsArgHandler.STRING
@ -394,12 +393,6 @@ public abstract class WinGammaPlatform {
HsArgHandler.STRING
),
new HsArgRule("-platform",
"Platform",
null,
HsArgHandler.STRING
),
new HsArgRule("-absoluteInclude",
"AbsoluteInclude",
null,
@ -590,28 +583,27 @@ public abstract class WinGammaPlatform {
BuildConfig.putField(null, "PlatformObject", this);
}
Vector createAllConfigs() {
Vector createAllConfigs(String platform) {
Vector allConfigs = new Vector();
allConfigs.add(new C1DebugConfig());
boolean b = true;
if (b) {
allConfigs.add(new C1FastDebugConfig());
allConfigs.add(new C1ProductConfig());
allConfigs.add(new C1FastDebugConfig());
allConfigs.add(new C1ProductConfig());
allConfigs.add(new C2DebugConfig());
allConfigs.add(new C2FastDebugConfig());
allConfigs.add(new C2ProductConfig());
allConfigs.add(new C2DebugConfig());
allConfigs.add(new C2FastDebugConfig());
allConfigs.add(new C2ProductConfig());
allConfigs.add(new TieredDebugConfig());
allConfigs.add(new TieredFastDebugConfig());
allConfigs.add(new TieredProductConfig());
allConfigs.add(new TieredDebugConfig());
allConfigs.add(new TieredFastDebugConfig());
allConfigs.add(new TieredProductConfig());
allConfigs.add(new CoreDebugConfig());
allConfigs.add(new CoreFastDebugConfig());
allConfigs.add(new CoreProductConfig());
allConfigs.add(new CoreDebugConfig());
allConfigs.add(new CoreFastDebugConfig());
allConfigs.add(new CoreProductConfig());
if (platform.equals("Win32")) {
allConfigs.add(new KernelDebugConfig());
allConfigs.add(new KernelFastDebugConfig());
allConfigs.add(new KernelProductConfig());

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2011, 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
@ -223,7 +223,7 @@ class CompilerInterfaceVC6 extends CompilerInterface {
return rv;
}
Vector getBaseLinkerFlags(String outDir, String outDll) {
Vector getBaseLinkerFlags(String outDir, String outDll, String platformName) {
Vector rv = new Vector();
rv.add("PROP Ignore_Export_Lib 0");
@ -231,8 +231,12 @@ class CompilerInterfaceVC6 extends CompilerInterface {
rv.add("ADD CPP /MD");
rv.add("ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib " +
" advapi32.lib shell32.lib ole32.lib oleaut32.lib winmm.lib");
String machine = "/machine:I386";
if (platformName.equals("x64")) {
machine = "/machine:X64";
}
rv.add("ADD LINK32 /out:\""+outDll+"\" "+
" /nologo /subsystem:windows /machine:I386" +
" /nologo /subsystem:windows /machine:" + machine +
" /nologo /base:\"0x8000000\" /subsystem:windows /dll" +
" /export:JNI_GetDefaultJavaVMInitArgs /export:JNI_CreateJavaVM /export:JNI_GetCreatedJavaVMs "+
" /export:jio_snprintf /export:jio_printf /export:jio_fprintf /export:jio_vfprintf "+
@ -287,7 +291,7 @@ class CompilerInterfaceVC6 extends CompilerInterface {
return "d";
}
String makeCfgName(String flavourBuild) {
return "vm - "+ Util.os + " " + flavourBuild;
String makeCfgName(String flavourBuild, String platform) {
return "vm - "+ platform + " " + flavourBuild;
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2011, 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,7 +37,7 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform {
public void writeProjectFile(String projectFileName, String projectName,
Vector allConfigs) throws IOException {
System.out.println();
System.out.println(" Writing .vcproj file...");
System.out.println(" Writing .vcproj file: "+projectFileName);
// If we got this far without an error, we're safe to actually
// write the .vcproj file
printWriter = new PrintWriter(new FileWriter(projectFileName));
@ -54,9 +54,8 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform {
"SccLocalPath", ""
}
);
startTag("Platforms", null);
tag("Platform", new String[] {"Name", Util.os});
tag("Platform", new String[] {"Name", (String) BuildConfig.getField(null, "PlatformName")});
endTag("Platforms");
startTag("Configurations", null);
@ -81,12 +80,47 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform {
abstract class NameFilter {
protected String fname;
protected String fname;
abstract boolean match(FileInfo fi);
String filterString() { return ""; }
String name() { return this.fname;}
@Override
// eclipse auto-generated
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + getOuterType().hashCode();
result = prime * result + ((fname == null) ? 0 : fname.hashCode());
return result;
}
@Override
// eclipse auto-generated
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
NameFilter other = (NameFilter) obj;
if (!getOuterType().equals(other.getOuterType()))
return false;
if (fname == null) {
if (other.fname != null)
return false;
} else if (!fname.equals(other.fname))
return false;
return true;
}
// eclipse auto-generated
private WinGammaPlatformVC7 getOuterType() {
return WinGammaPlatformVC7.this;
}
}
class DirectoryFilter extends NameFilter {
@ -109,9 +143,50 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform {
boolean match(FileInfo fi) {
int lastSlashIndex = fi.full.lastIndexOf('/');
String fullDir = fi.full.substring(0, lastSlashIndex);
return fullDir.endsWith(dir);
int lastSlashIndex = fi.full.lastIndexOf('/');
String fullDir = fi.full.substring(0, lastSlashIndex);
return fullDir.endsWith(dir);
}
@Override
// eclipse auto-generated
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + getOuterType().hashCode();
result = prime * result + baseLen;
result = prime * result + ((dir == null) ? 0 : dir.hashCode());
result = prime * result + dirLen;
return result;
}
@Override
// eclipse auto-generated
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
DirectoryFilter other = (DirectoryFilter) obj;
if (!getOuterType().equals(other.getOuterType()))
return false;
if (baseLen != other.baseLen)
return false;
if (dir == null) {
if (other.dir != null)
return false;
} else if (!dir.equals(other.dir))
return false;
if (dirLen != other.dirLen)
return false;
return true;
}
// eclipse auto-generated
private WinGammaPlatformVC7 getOuterType() {
return WinGammaPlatformVC7.this;
}
}
@ -232,32 +307,39 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform {
DirectoryFilter container = null;
for(FileInfo fileInfo : files) {
if (!fileInfo.full.startsWith(sbase)) {
continue;
}
if (!fileInfo.full.startsWith(sbase)) {
continue;
}
int lastSlash = fileInfo.full.lastIndexOf('/');
String dir = fileInfo.full.substring(sbase.length(), lastSlash);
if(dir.equals("share/vm")) {
// skip files directly in share/vm - should only be precompiled.hpp which is handled below
continue;
}
if (!dir.equals(currentDir)) {
currentDir = dir;
if (container != null) {
rv.add(container);
}
int lastSlash = fileInfo.full.lastIndexOf('/');
String dir = fileInfo.full.substring(sbase.length(), lastSlash);
if(dir.equals("share/vm")) {
// skip files directly in share/vm - should only be precompiled.hpp which is handled below
continue;
}
if (!dir.equals(currentDir)) {
currentDir = dir;
if (container != null && !rv.contains(container)) {
rv.add(container);
}
// remove "share/vm/" from names
String name = dir;
if (dir.startsWith("share/vm/")) {
name = dir.substring("share/vm/".length(), dir.length());
}
container = new DirectoryFilter(name, dir, sbase);
}
// remove "share/vm/" from names
String name = dir;
if (dir.startsWith("share/vm/")) {
name = dir.substring("share/vm/".length(), dir.length());
}
DirectoryFilter newfilter = new DirectoryFilter(name, dir, sbase);
int i = rv.indexOf(newfilter);
if(i == -1) {
container = newfilter;
} else {
// if the filter already exists, reuse it
container = (DirectoryFilter) rv.get(i);
}
}
}
if (container != null) {
rv.add(container);
if (container != null && !rv.contains(container)) {
rv.add(container);
}
ContainerFilter generated = new ContainerFilter("Generated");
@ -583,7 +665,7 @@ class CompilerInterfaceVC7 extends CompilerInterface {
return rv;
}
Vector getBaseLinkerFlags(String outDir, String outDll) {
Vector getBaseLinkerFlags(String outDir, String outDll, String platformName) {
Vector rv = new Vector();
addAttr(rv, "Name", "VCLinkerTool");
@ -610,8 +692,13 @@ class CompilerInterfaceVC7 extends CompilerInterface {
addAttr(rv, "SubSystem", "2");
addAttr(rv, "BaseAddress", "0x8000000");
addAttr(rv, "ImportLibrary", outDir+Util.sep+"jvm.lib");
// Set /MACHINE option. 1 is machineX86
addAttr(rv, "TargetMachine", "1");
if(platformName.equals("Win32")) {
// Set /MACHINE option. 1 is X86
addAttr(rv, "TargetMachine", "1");
} else {
// Set /MACHINE option. 17 is X64
addAttr(rv, "TargetMachine", "17");
}
return rv;
}
@ -656,12 +743,6 @@ class CompilerInterfaceVC7 extends CompilerInterface {
addAttr(rv, "Optimization", "2");
// Set /Oy- option
addAttr(rv, "OmitFramePointers", "FALSE");
}
Vector getProductCompilerFlags() {
Vector rv = new Vector();
getProductCompilerFlags_common(rv);
// Set /Ob option. 1 is expandOnlyInline
addAttr(rv, "InlineFunctionExpansion", "1");
// Set /GF option.
@ -670,6 +751,12 @@ class CompilerInterfaceVC7 extends CompilerInterface {
addAttr(rv, "RuntimeLibrary", "2");
// Set /Gy option
addAttr(rv, "EnableFunctionLevelLinking", "TRUE");
}
Vector getProductCompilerFlags() {
Vector rv = new Vector();
getProductCompilerFlags_common(rv);
return rv;
}
@ -693,7 +780,7 @@ class CompilerInterfaceVC7 extends CompilerInterface {
return "0";
}
String makeCfgName(String flavourBuild) {
return flavourBuild + "|" + Util.os;
String makeCfgName(String flavourBuild, String platform) {
return flavourBuild + "|" + platform;
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2011, 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
@ -42,11 +42,6 @@
using namespace std;
#endif
// make sure the MSC_VER and _MSC_VER settings make sense
#if _MSC_VER != MSC_VER && (_MSC_VER != 1400 || MSC_VER != 1399)
#error "Something is wrong with the detection of MSC_VER in the makefiles"
#endif
#if _MSC_VER >= 1400
#define strdup _strdup
#endif

View File

@ -1698,7 +1698,75 @@ void ArchDesc::defineExpand(FILE *fp, InstructForm *node) {
fprintf(fp,"\n");
} // done generating expand rule
else if( node->_matrule != NULL ) {
// Generate projections for instruction's additional DEFs and KILLs
if( ! node->expands() && (node->needs_projections() || node->has_temps())) {
// Get string representing the MachNode that projections point at
const char *machNode = "this";
// Generate the projections
fprintf(fp," // Add projection edges for additional defs or kills\n");
// Examine each component to see if it is a DEF or KILL
node->_components.reset();
// Skip the first component, if already handled as (SET dst (...))
Component *comp = NULL;
// For kills, the choice of projection numbers is arbitrary
int proj_no = 1;
bool declared_def = false;
bool declared_kill = false;
while( (comp = node->_components.iter()) != NULL ) {
// Lookup register class associated with operand type
Form *form = (Form*)_globalNames[comp->_type];
assert( form, "component type must be a defined form");
OperandForm *op = form->is_operand();
if (comp->is(Component::TEMP)) {
fprintf(fp, " // TEMP %s\n", comp->_name);
if (!declared_def) {
// Define the variable "def" to hold new MachProjNodes
fprintf(fp, " MachTempNode *def;\n");
declared_def = true;
}
if (op && op->_interface && op->_interface->is_RegInterface()) {
fprintf(fp," def = new (C) MachTempNode(state->MachOperGenerator( %s, C ));\n",
machOperEnum(op->_ident));
fprintf(fp," add_req(def);\n");
// The operand for TEMP is already constructed during
// this mach node construction, see buildMachNode().
//
// int idx = node->operand_position_format(comp->_name);
// fprintf(fp," set_opnd_array(%d, state->MachOperGenerator( %s, C ));\n",
// idx, machOperEnum(op->_ident));
} else {
assert(false, "can't have temps which aren't registers");
}
} else if (comp->isa(Component::KILL)) {
fprintf(fp, " // DEF/KILL %s\n", comp->_name);
if (!declared_kill) {
// Define the variable "kill" to hold new MachProjNodes
fprintf(fp, " MachProjNode *kill;\n");
declared_kill = true;
}
assert( op, "Support additional KILLS for base operands");
const char *regmask = reg_mask(*op);
const char *ideal_type = op->ideal_type(_globalNames, _register);
if (!op->is_bound_register()) {
syntax_err(node->_linenum, "In %s only bound registers can be killed: %s %s\n",
node->_ident, comp->_type, comp->_name);
}
fprintf(fp," kill = ");
fprintf(fp,"new (C, 1) MachProjNode( %s, %d, (%s), Op_%s );\n",
machNode, proj_no++, regmask, ideal_type);
fprintf(fp," proj_list.push(kill);\n");
}
}
}
if( !node->expands() && node->_matrule != NULL ) {
// Remove duplicated operands and inputs which use the same name.
// Seach through match operands for the same name usage.
uint cur_num_opnds = node->num_opnds();
@ -1752,72 +1820,6 @@ void ArchDesc::defineExpand(FILE *fp, InstructForm *node) {
}
}
// Generate projections for instruction's additional DEFs and KILLs
if( ! node->expands() && (node->needs_projections() || node->has_temps())) {
// Get string representing the MachNode that projections point at
const char *machNode = "this";
// Generate the projections
fprintf(fp," // Add projection edges for additional defs or kills\n");
// Examine each component to see if it is a DEF or KILL
node->_components.reset();
// Skip the first component, if already handled as (SET dst (...))
Component *comp = NULL;
// For kills, the choice of projection numbers is arbitrary
int proj_no = 1;
bool declared_def = false;
bool declared_kill = false;
while( (comp = node->_components.iter()) != NULL ) {
// Lookup register class associated with operand type
Form *form = (Form*)_globalNames[comp->_type];
assert( form, "component type must be a defined form");
OperandForm *op = form->is_operand();
if (comp->is(Component::TEMP)) {
fprintf(fp, " // TEMP %s\n", comp->_name);
if (!declared_def) {
// Define the variable "def" to hold new MachProjNodes
fprintf(fp, " MachTempNode *def;\n");
declared_def = true;
}
if (op && op->_interface && op->_interface->is_RegInterface()) {
fprintf(fp," def = new (C) MachTempNode(state->MachOperGenerator( %s, C ));\n",
machOperEnum(op->_ident));
fprintf(fp," add_req(def);\n");
int idx = node->operand_position_format(comp->_name);
fprintf(fp," set_opnd_array(%d, state->MachOperGenerator( %s, C ));\n",
idx, machOperEnum(op->_ident));
} else {
assert(false, "can't have temps which aren't registers");
}
} else if (comp->isa(Component::KILL)) {
fprintf(fp, " // DEF/KILL %s\n", comp->_name);
if (!declared_kill) {
// Define the variable "kill" to hold new MachProjNodes
fprintf(fp, " MachProjNode *kill;\n");
declared_kill = true;
}
assert( op, "Support additional KILLS for base operands");
const char *regmask = reg_mask(*op);
const char *ideal_type = op->ideal_type(_globalNames, _register);
if (!op->is_bound_register()) {
syntax_err(node->_linenum, "In %s only bound registers can be killed: %s %s\n",
node->_ident, comp->_type, comp->_name);
}
fprintf(fp," kill = ");
fprintf(fp,"new (C, 1) MachProjNode( %s, %d, (%s), Op_%s );\n",
machNode, proj_no++, regmask, ideal_type);
fprintf(fp," proj_list.push(kill);\n");
}
}
}
// If the node is a MachConstantNode, insert the MachConstantBaseNode edge.
// NOTE: this edge must be the last input (see MachConstantNode::mach_constant_base_node_input).
if (node->is_mach_constant()) {
@ -3776,12 +3778,10 @@ void ArchDesc::buildMachNode(FILE *fp_cpp, InstructForm *inst, const char *inden
}
dont_care = true;
// For each operand not in the match rule, call MachOperGenerator
// with the enum for the opcode that needs to be built
// and the node just built, the parent of the operand.
// with the enum for the opcode that needs to be built.
ComponentList clist = inst->_components;
int index = clist.operand_position(comp->_name, comp->_usedef);
const char *opcode = machOperEnum(comp->_type);
const char *parent = "node";
fprintf(fp_cpp, "%s node->set_opnd_array(%d, ", indent, index);
fprintf(fp_cpp, "MachOperGenerator(%s, C));\n", opcode);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2011, 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
@ -491,10 +491,11 @@ Compilation::Compilation(AbstractCompiler* compiler, ciEnv* env, ciMethod* metho
// to start profiling on its own.
_method->ensure_method_data();
}
} else if (is_profiling() && _would_profile) {
} else if (is_profiling()) {
ciMethodData *md = method->method_data_or_null();
assert(md != NULL, "Sanity");
md->set_would_profile(_would_profile);
if (md != NULL) {
md->set_would_profile(_would_profile);
}
}
}

View File

@ -412,13 +412,17 @@ ciKlass* ciEnv::get_klass_by_name_impl(ciKlass* accessing_klass,
fail_type = _unloaded_ciinstance_klass;
}
KlassHandle found_klass;
if (!require_local) {
klassOop kls = SystemDictionary::find_constrained_instance_or_array_klass(
sym, loader, KILL_COMPILE_ON_FATAL_(fail_type));
found_klass = KlassHandle(THREAD, kls);
} else {
klassOop kls = SystemDictionary::find_instance_or_array_klass(
sym, loader, domain, KILL_COMPILE_ON_FATAL_(fail_type));
{
ttyUnlocker ttyul; // release tty lock to avoid ordering problems
MutexLocker ml(Compile_lock);
klassOop kls;
if (!require_local) {
kls = SystemDictionary::find_constrained_instance_or_array_klass(sym, loader,
KILL_COMPILE_ON_FATAL_(fail_type));
} else {
kls = SystemDictionary::find_instance_or_array_klass(sym, loader, domain,
KILL_COMPILE_ON_FATAL_(fail_type));
}
found_klass = KlassHandle(THREAD, kls);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2011, 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
@ -212,9 +212,9 @@ void ciField::initialize_from(fieldDescriptor* fd) {
// may change. The three examples are java.lang.System.in,
// java.lang.System.out, and java.lang.System.err.
klassOop k = _holder->get_klassOop();
Handle k = _holder->get_klassOop();
assert( SystemDictionary::System_klass() != NULL, "Check once per vm");
if( k == SystemDictionary::System_klass() ) {
if( k() == SystemDictionary::System_klass() ) {
// Check offsets for case 2: System.in, System.out, or System.err
if( _offset == java_lang_System::in_offset_in_bytes() ||
_offset == java_lang_System::out_offset_in_bytes() ||

View File

@ -46,6 +46,7 @@ ciInstanceKlass::ciInstanceKlass(KlassHandle h_k) :
ciKlass(h_k), _non_static_fields(NULL)
{
assert(get_Klass()->oop_is_instance(), "wrong type");
assert(get_instanceKlass()->is_loaded(), "must be at least loaded");
instanceKlass* ik = get_instanceKlass();
AccessFlags access_flags = ik->access_flags();

View File

@ -331,7 +331,7 @@ constantPoolHandle ClassFileParser::parse_constant_pool(TRAPS) {
length, CHECK_(nullHandle));
constantPoolOop constant_pool =
oopFactory::new_constantPool(length,
methodOopDesc::IsSafeConc,
oopDesc::IsSafeConc,
CHECK_(nullHandle));
constantPoolHandle cp (THREAD, constant_pool);
@ -1929,10 +1929,9 @@ methodHandle ClassFileParser::parse_method(constantPoolHandle cp, bool is_interf
}
// All sizing information for a methodOop is finally available, now create it
methodOop m_oop = oopFactory::new_method(
code_length, access_flags, linenumber_table_length,
total_lvt_length, checked_exceptions_length,
methodOopDesc::IsSafeConc, CHECK_(nullHandle));
methodOop m_oop = oopFactory::new_method(code_length, access_flags, linenumber_table_length,
total_lvt_length, checked_exceptions_length,
oopDesc::IsSafeConc, CHECK_(nullHandle));
methodHandle m (THREAD, m_oop);
ClassLoadingService::add_class_method_size(m_oop->size()*HeapWordSize);

View File

@ -1290,6 +1290,15 @@ void ClassLoader::compile_the_world() {
int ClassLoader::_compile_the_world_counter = 0;
static int _codecache_sweep_counter = 0;
// Filter out all exceptions except OOMs
static void clear_pending_exception_if_not_oom(TRAPS) {
if (HAS_PENDING_EXCEPTION &&
!PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())) {
CLEAR_PENDING_EXCEPTION;
}
// The CHECK at the caller will propagate the exception out
}
void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
int len = (int)strlen(name);
if (len > 6 && strcmp(".class", name + len - 6) == 0) {
@ -1312,12 +1321,12 @@ void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
k->initialize(THREAD);
}
bool exception_occurred = HAS_PENDING_EXCEPTION;
CLEAR_PENDING_EXCEPTION;
clear_pending_exception_if_not_oom(CHECK);
if (CompileTheWorldPreloadClasses && k.not_null()) {
constantPoolKlass::preload_and_initialize_all_classes(k->constants(), THREAD);
if (HAS_PENDING_EXCEPTION) {
// If something went wrong in preloading we just ignore it
CLEAR_PENDING_EXCEPTION;
clear_pending_exception_if_not_oom(CHECK);
tty->print_cr("Preloading failed for (%d) %s", _compile_the_world_counter, buffer);
}
}
@ -1344,7 +1353,7 @@ void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
CompileBroker::compile_method(m, InvocationEntryBci, CompLevel_initial_compile,
methodHandle(), 0, "CTW", THREAD);
if (HAS_PENDING_EXCEPTION) {
CLEAR_PENDING_EXCEPTION;
clear_pending_exception_if_not_oom(CHECK);
tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_counter, m->name()->as_C_string());
}
if (TieredCompilation) {
@ -1358,7 +1367,7 @@ void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
CompileBroker::compile_method(m, InvocationEntryBci, CompLevel_full_optimization,
methodHandle(), 0, "CTW", THREAD);
if (HAS_PENDING_EXCEPTION) {
CLEAR_PENDING_EXCEPTION;
clear_pending_exception_if_not_oom(CHECK);
tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_counter, m->name()->as_C_string());
}
}

View File

@ -322,8 +322,14 @@ bool LoaderConstraintTable::check_or_update(instanceKlassHandle k,
klassOop LoaderConstraintTable::find_constrained_klass(Symbol* name,
Handle loader) {
LoaderConstraintEntry *p = *(find_loader_constraint(name, loader));
if (p != NULL && p->klass() != NULL)
if (p != NULL && p->klass() != NULL) {
if (Klass::cast(p->klass())->oop_is_instance() && !instanceKlass::cast(p->klass())->is_loaded()) {
// Only return fully loaded classes. Classes found through the
// constraints might still be in the process of loading.
return NULL;
}
return p->klass();
}
// No constraints, or else no klass loaded yet.
return NULL;

View File

@ -1690,6 +1690,8 @@ klassOop SystemDictionary::try_get_next_class() {
void SystemDictionary::add_to_hierarchy(instanceKlassHandle k, TRAPS) {
assert(k.not_null(), "just checking");
assert_locked_or_safepoint(Compile_lock);
// Link into hierachy. Make sure the vtables are initialized before linking into
k->append_to_sibling_list(); // add to superklass/sibling list
k->process_interfaces(THREAD); // handle all "implements" declarations
@ -2152,6 +2154,9 @@ void SystemDictionary::update_dictionary(int d_index, unsigned int d_hash,
}
// Try to find a class name using the loader constraints. The
// loader constraints might know about a class that isn't fully loaded
// yet and these will be ignored.
klassOop SystemDictionary::find_constrained_instance_or_array_klass(
Symbol* class_name, Handle class_loader, TRAPS) {

View File

@ -768,7 +768,9 @@ CompilerThread* CompileBroker::make_compiler_thread(const char* name, CompileQue
// Initialize the compilation queue
void CompileBroker::init_compiler_threads(int c1_compiler_count, int c2_compiler_count) {
EXCEPTION_MARK;
#ifndef ZERO
assert(c2_compiler_count > 0 || c1_compiler_count > 0, "No compilers?");
#endif // !ZERO
if (c2_compiler_count > 0) {
_c2_method_queue = new CompileQueue("C2MethodQueue", MethodCompileQueue_lock);
}

View File

@ -1040,9 +1040,10 @@ const {
} else {
// must read from what 'p' points to in each loop.
klassOop k = ((volatile oopDesc*)p)->klass_or_null();
if (k != NULL &&
((oopDesc*)p)->is_parsable() &&
((oopDesc*)p)->is_conc_safe()) {
// We trust the size of any object that has a non-NULL
// klass and (for those in the perm gen) is parsable
// -- irrespective of its conc_safe-ty.
if (k != NULL && ((oopDesc*)p)->is_parsable()) {
assert(k->is_oop(), "Should really be klass oop.");
oop o = (oop)p;
assert(o->is_oop(), "Should be an oop");
@ -1051,6 +1052,7 @@ const {
assert(res != 0, "Block size should not be 0");
return res;
} else {
// May return 0 if P-bits not present.
return c->block_size_if_printezis_bits(p);
}
}

View File

@ -6360,18 +6360,16 @@ size_t CMSCollector::block_size_using_printezis_bits(HeapWord* addr) const {
// A variant of the above (block_size_using_printezis_bits()) except
// that we return 0 if the P-bits are not yet set.
size_t CMSCollector::block_size_if_printezis_bits(HeapWord* addr) const {
if (_markBitMap.isMarked(addr)) {
assert(_markBitMap.isMarked(addr + 1), "Missing Printezis bit?");
if (_markBitMap.isMarked(addr + 1)) {
assert(_markBitMap.isMarked(addr), "P-bit can be set only for marked objects");
HeapWord* nextOneAddr = _markBitMap.getNextMarkedWordAddress(addr + 2);
size_t size = pointer_delta(nextOneAddr + 1, addr);
assert(size == CompactibleFreeListSpace::adjustObjectSize(size),
"alignment problem");
assert(size >= 3, "Necessary for Printezis marks to work");
return size;
} else {
assert(!_markBitMap.isMarked(addr + 1), "Bit map inconsistency?");
return 0;
}
return 0;
}
HeapWord* CMSCollector::next_card_start_after_block(HeapWord* addr) const {
@ -9212,7 +9210,6 @@ bool MarkRefsIntoAndScanClosure::take_from_overflow_list() {
size_t MarkDeadObjectsClosure::do_blk(HeapWord* addr) {
size_t res = _sp->block_size_no_stall(addr, _collector);
assert(res != 0, "Should always be able to compute a size");
if (_sp->block_is_obj(addr)) {
if (_live_bit_map->isMarked(addr)) {
// It can't have been dead in a previous cycle
@ -9221,6 +9218,7 @@ size_t MarkDeadObjectsClosure::do_blk(HeapWord* addr) {
_dead_bit_map->mark(addr); // mark the dead object
}
}
// Could be 0, if the block size could not be computed without stalling.
return res;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2011, 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
@ -132,8 +132,7 @@ class VM_GenCollectFullConcurrent: public VM_GC_Operation {
VM_GenCollectFullConcurrent(unsigned int gc_count_before,
unsigned int full_gc_count_before,
GCCause::Cause gc_cause)
: VM_GC_Operation(gc_count_before, full_gc_count_before, true /* full */) {
_gc_cause = gc_cause;
: VM_GC_Operation(gc_count_before, gc_cause, full_gc_count_before, true /* full */) {
assert(FullGCCount_lock != NULL, "Error");
assert(UseAsyncConcMarkSweepGC, "Else will hang caller");
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 2011, 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
@ -44,7 +44,7 @@ protected:
public:
VM_G1OperationWithAllocRequest(unsigned int gc_count_before,
size_t word_size)
: VM_GC_Operation(gc_count_before),
: VM_GC_Operation(gc_count_before, GCCause::_allocation_failure),
_word_size(word_size), _result(NULL), _pause_succeeded(false) { }
HeapWord* result() { return _result; }
bool pause_succeeded() { return _pause_succeeded; }
@ -55,9 +55,7 @@ public:
VM_G1CollectFull(unsigned int gc_count_before,
unsigned int full_gc_count_before,
GCCause::Cause cause)
: VM_GC_Operation(gc_count_before, full_gc_count_before) {
_gc_cause = cause;
}
: VM_GC_Operation(gc_count_before, cause, full_gc_count_before) { }
virtual VMOp_Type type() const { return VMOp_G1CollectFull; }
virtual void doit();
virtual const char* name() const {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 2011, 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
@ -112,9 +112,12 @@ jint ParallelScavengeHeap::initialize() {
yg_cur_size = MAX2(yg_cur_size, yg_min_size);
og_min_size = align_size_up(og_min_size, og_align);
og_max_size = align_size_up(og_max_size, og_align);
// Align old gen size down to preserve specified heap size.
assert(og_align == yg_align, "sanity");
og_max_size = align_size_down(og_max_size, og_align);
og_max_size = MAX2(og_max_size, og_min_size);
size_t og_cur_size =
align_size_up(_collector_policy->old_gen_size(), og_align);
align_size_down(_collector_policy->old_gen_size(), og_align);
og_cur_size = MAX2(og_cur_size, og_min_size);
pg_min_size = align_size_up(pg_min_size, pg_align);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2011, 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
@ -1196,11 +1196,6 @@ class PSParallelCompact : AllStatic {
static inline void adjust_pointer(oop* p) { adjust_pointer(p, false); }
static inline void adjust_pointer(narrowOop* p) { adjust_pointer(p, false); }
template <class T>
static inline void adjust_pointer(T* p,
HeapWord* beg_addr,
HeapWord* end_addr);
// Reference Processing
static ReferenceProcessor* const ref_processor() { return _ref_processor; }
@ -1408,15 +1403,6 @@ inline bool PSParallelCompact::should_update_klass(klassOop k) {
return ((HeapWord*) k) >= dense_prefix(perm_space_id);
}
template <class T>
inline void PSParallelCompact::adjust_pointer(T* p,
HeapWord* beg_addr,
HeapWord* end_addr) {
if (is_in((HeapWord*)p, beg_addr, end_addr)) {
adjust_pointer(p);
}
}
#ifdef ASSERT
inline void
PSParallelCompact::check_new_location(HeapWord* old_addr, HeapWord* new_addr)

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2007, 2011, 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,7 +34,7 @@
// The following methods are used by the parallel scavenge collector
VM_ParallelGCFailedAllocation::VM_ParallelGCFailedAllocation(size_t size,
bool is_tlab, unsigned int gc_count) :
VM_GC_Operation(gc_count),
VM_GC_Operation(gc_count, GCCause::_allocation_failure),
_size(size),
_is_tlab(is_tlab),
_result(NULL)
@ -57,7 +57,7 @@ void VM_ParallelGCFailedAllocation::doit() {
VM_ParallelGCFailedPermanentAllocation::VM_ParallelGCFailedPermanentAllocation(size_t size,
unsigned int gc_count, unsigned int full_gc_count) :
VM_GC_Operation(gc_count, full_gc_count, true /* full */),
VM_GC_Operation(gc_count, GCCause::_allocation_failure, full_gc_count, true /* full */),
_size(size),
_result(NULL)
{
@ -80,9 +80,8 @@ void VM_ParallelGCFailedPermanentAllocation::doit() {
VM_ParallelGCSystemGC::VM_ParallelGCSystemGC(unsigned int gc_count,
unsigned int full_gc_count,
GCCause::Cause gc_cause) :
VM_GC_Operation(gc_count, full_gc_count, true /* full */)
VM_GC_Operation(gc_count, gc_cause, full_gc_count, true /* full */)
{
_gc_cause = gc_cause;
}
void VM_ParallelGCSystemGC::doit() {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2011, 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
@ -87,6 +87,8 @@ bool VM_GC_Operation::skip_operation() const {
bool VM_GC_Operation::doit_prologue() {
assert(Thread::current()->is_Java_thread(), "just checking");
assert(((_gc_cause != GCCause::_no_gc) &&
(_gc_cause != GCCause::_no_cause_specified)), "Illegal GCCause");
acquire_pending_list_lock();
// If the GC count has changed someone beat us to the collection

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2011, 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
@ -85,6 +85,7 @@ class VM_GC_Operation: public VM_Operation {
public:
VM_GC_Operation(unsigned int gc_count_before,
GCCause::Cause _cause,
unsigned int full_gc_count_before = 0,
bool full = false) {
_full = full;
@ -92,7 +93,7 @@ class VM_GC_Operation: public VM_Operation {
_gc_count_before = gc_count_before;
// A subclass constructor will likely overwrite the following
_gc_cause = GCCause::_no_cause_specified;
_gc_cause = _cause;
_gc_locked = false;
@ -136,6 +137,7 @@ class VM_GC_HeapInspection: public VM_GC_Operation {
VM_GC_HeapInspection(outputStream* out, bool request_full_gc,
bool need_prologue) :
VM_GC_Operation(0 /* total collections, dummy, ignored */,
GCCause::_heap_inspection /* GC Cause */,
0 /* total full collections, dummy, ignored */,
request_full_gc) {
_out = out;
@ -160,7 +162,7 @@ class VM_GenCollectForAllocation: public VM_GC_Operation {
VM_GenCollectForAllocation(size_t size,
bool tlab,
unsigned int gc_count_before)
: VM_GC_Operation(gc_count_before),
: VM_GC_Operation(gc_count_before, GCCause::_allocation_failure),
_size(size),
_tlab(tlab) {
_res = NULL;
@ -182,9 +184,8 @@ class VM_GenCollectFull: public VM_GC_Operation {
unsigned int full_gc_count_before,
GCCause::Cause gc_cause,
int max_level)
: VM_GC_Operation(gc_count_before, full_gc_count_before, true /* full */),
_max_level(max_level)
{ _gc_cause = gc_cause; }
: VM_GC_Operation(gc_count_before, gc_cause, full_gc_count_before, true /* full */),
_max_level(max_level) { }
~VM_GenCollectFull() {}
virtual VMOp_Type type() const { return VMOp_GenCollectFull; }
virtual void doit();
@ -199,7 +200,7 @@ class VM_GenCollectForPermanentAllocation: public VM_GC_Operation {
unsigned int gc_count_before,
unsigned int full_gc_count_before,
GCCause::Cause gc_cause)
: VM_GC_Operation(gc_count_before, full_gc_count_before, true),
: VM_GC_Operation(gc_count_before, gc_cause, full_gc_count_before, true),
_size(size) {
_res = NULL;
_gc_cause = gc_cause;

View File

@ -100,8 +100,7 @@ void CollectedHeap::check_for_bad_heap_word_value(HeapWord* addr, size_t size) {
}
}
void CollectedHeap::check_for_non_bad_heap_word_value(HeapWord* addr, size_t size)
{
void CollectedHeap::check_for_non_bad_heap_word_value(HeapWord* addr, size_t size) {
if (CheckMemoryInitialization && ZapUnusedHeapArea) {
for (size_t slot = 0; slot < size; slot += 1) {
assert((*(intptr_t*) (addr + slot)) == ((intptr_t) badHeapWordVal),

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 2011, 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
@ -92,28 +92,3 @@ const char* GCCause::to_string(GCCause::Cause cause) {
}
ShouldNotReachHere();
}
#ifndef PRODUCT
bool GCCause::is_for_full_collection(GCCause::Cause cause) {
bool result;
// There are more GCCause::Cause types than listed here.
// For brevity, we list only those that cause full collections.
switch (cause) {
case _allocation_failure:
case _tenured_generation_full:
case _permanent_generation_full:
case _cms_generation_full:
case _last_ditch_collection:
result = true;
break;
default:
result = false;
break;
}
return result;
}
#endif // PRODUCT

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 2011, 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
@ -85,8 +85,6 @@ class GCCause : public AllStatic {
// Return a string describing the GCCause.
static const char* to_string(GCCause::Cause cause);
// Return true if the GCCause is for a full collection.
static bool is_for_full_collection(GCCause::Cause cause) PRODUCT_RETURN0;
};
#endif // SHARE_VM_GC_INTERFACE_GCCAUSE_HPP

View File

@ -1942,7 +1942,7 @@ run:
constantPoolOop constants = istate->method()->constants();
if (!constants->tag_at(index).is_unresolved_klass()) {
// Make sure klass is initialized and doesn't have a finalizer
oop entry = (klassOop) *constants->obj_at_addr(index);
oop entry = constants->slot_at(index).get_oop();
assert(entry->is_klass(), "Should be resolved klass");
klassOop k_entry = (klassOop) entry;
assert(k_entry->klass_part()->oop_is_instance(), "Should be instanceKlass");
@ -2032,7 +2032,7 @@ run:
if (METHOD->constants()->tag_at(index).is_unresolved_klass()) {
CALL_VM(InterpreterRuntime::quicken_io_cc(THREAD), handle_exception);
}
klassOop klassOf = (klassOop) *(METHOD->constants()->obj_at_addr(index));
klassOop klassOf = (klassOop) METHOD->constants()->slot_at(index).get_oop();
klassOop objKlassOop = STACK_OBJECT(-1)->klass(); //ebx
//
// Check for compatibilty. This check must not GC!!
@ -2067,7 +2067,7 @@ run:
if (METHOD->constants()->tag_at(index).is_unresolved_klass()) {
CALL_VM(InterpreterRuntime::quicken_io_cc(THREAD), handle_exception);
}
klassOop klassOf = (klassOop) *(METHOD->constants()->obj_at_addr(index));
klassOop klassOf = (klassOop) METHOD->constants()->slot_at(index).get_oop();
klassOop objKlassOop = STACK_OBJECT(-1)->klass();
//
// Check for compatibilty. This check must not GC!!

View File

@ -67,13 +67,11 @@ void Rewriter::compute_index_maps() {
// Creates a constant pool cache given a CPC map
// This creates the constant pool cache initially in a state
// that is unsafe for concurrent GC processing but sets it to
// a safe mode before the constant pool cache is returned.
void Rewriter::make_constant_pool_cache(TRAPS) {
const int length = _cp_cache_map.length();
constantPoolCacheOop cache =
oopFactory::new_constantPoolCache(length, methodOopDesc::IsUnsafeConc, CHECK);
oopFactory::new_constantPoolCache(length, CHECK);
No_Safepoint_Verifier nsv;
cache->initialize(_cp_cache_map);
// Don't bother with the next pass if there is no JVM_CONSTANT_InvokeDynamic.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -350,28 +350,11 @@ int VectorSet::hash() const
return (int)_xor;
}
//------------------------------iterate----------------------------------------
SetI_ *VectorSet::iterate(uint &elem) const
{
VSetI_ *foo = (new(ResourceObj::C_HEAP) VSetI_(this));
elem = foo->next();
return foo;
}
//=============================================================================
//------------------------------VSetI_-----------------------------------------
// Initialize the innards of a VectorSet iterator
VSetI_::VSetI_( const VectorSet *vset ) : s(vset)
{
i = (uint)-1L;
j = (uint)-1L;
mask = (unsigned)(1L<<31);
}
//------------------------------next-------------------------------------------
// Find and return the next element of a vector set, or return garbage and
// make "VSetI_::test()" fail.
uint VSetI_::next(void)
// make "VectorSetI::test()" fail.
uint VectorSetI::next(void)
{
j++; // Next element in word
mask = (mask & max_jint) << 1;// Next bit in word

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -98,6 +98,9 @@ public:
uint Size(void) const; // Number of elements in the Set.
void Sort(void); // Sort before iterating
int hash() const; // Hash function
void Reset(void) { // Reset a set
memset( data, 0, size*sizeof(uint32) );
}
/* Removed for MCC BUG
operator const VectorSet* (void) const { return this; } */
@ -148,8 +151,7 @@ public:
private:
friend class VSetI_;
SetI_ *iterate(uint&) const;
SetI_ *iterate(uint&) const { ShouldNotCallThis(); return NULL; } // Removed
};
//------------------------------Iteration--------------------------------------
@ -158,22 +160,26 @@ private:
// or may not be iterated over; untouched elements will be affected once.
// Usage: for( VectorSetI i(s); i.test(); i++ ) { body = i.elem; }
class VSetI_ : public SetI_ {
class VectorSetI : public StackObj {
friend class VectorSet;
friend class VectorSetI;
const VectorSet *s;
uint i, j;
uint32 mask;
VSetI_(const VectorSet *vset);
uint next(void);
public:
uint elem; // The publically accessible element
VectorSetI( const VectorSet *vset ) :
s(vset),
i((uint)-1L),
j((uint)-1L),
mask((unsigned)(1L<<31)) {
elem = next();
}
void operator ++(void) { elem = next(); }
int test(void) { return i < s->size; }
};
class VectorSetI : public SetI {
public:
VectorSetI( const VectorSet *s ) : SetI(s) { }
void operator ++(void) { elem = ((VSetI_*)impl)->next(); }
int test(void) { return ((VSetI_*)impl)->test(); }
};
#endif // SHARE_VM_LIBADT_VECTSET_HPP

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -157,7 +157,7 @@ ResourceObj::~ResourceObj() {
void trace_heap_malloc(size_t size, const char* name, void* p) {
// A lock is not needed here - tty uses a lock internally
tty->print_cr("Heap malloc " INTPTR_FORMAT " %7d %s", p, size, name == NULL ? "" : name);
tty->print_cr("Heap malloc " INTPTR_FORMAT " " SIZE_FORMAT " %s", p, size, name == NULL ? "" : name);
}
@ -573,22 +573,27 @@ void AllocatedObj::print_value_on(outputStream* st) const {
st->print("AllocatedObj(" INTPTR_FORMAT ")", this);
}
size_t Arena::_bytes_allocated = 0;
julong Arena::_bytes_allocated = 0;
void Arena::inc_bytes_allocated(size_t x) { inc_stat_counter(&_bytes_allocated, x); }
AllocStats::AllocStats() {
start_mallocs = os::num_mallocs;
start_frees = os::num_frees;
start_mallocs = os::num_mallocs;
start_frees = os::num_frees;
start_malloc_bytes = os::alloc_bytes;
start_res_bytes = Arena::_bytes_allocated;
start_mfree_bytes = os::free_bytes;
start_res_bytes = Arena::_bytes_allocated;
}
int AllocStats::num_mallocs() { return os::num_mallocs - start_mallocs; }
size_t AllocStats::alloc_bytes() { return os::alloc_bytes - start_malloc_bytes; }
size_t AllocStats::resource_bytes() { return Arena::_bytes_allocated - start_res_bytes; }
int AllocStats::num_frees() { return os::num_frees - start_frees; }
julong AllocStats::num_mallocs() { return os::num_mallocs - start_mallocs; }
julong AllocStats::alloc_bytes() { return os::alloc_bytes - start_malloc_bytes; }
julong AllocStats::num_frees() { return os::num_frees - start_frees; }
julong AllocStats::free_bytes() { return os::free_bytes - start_mfree_bytes; }
julong AllocStats::resource_bytes() { return Arena::_bytes_allocated - start_res_bytes; }
void AllocStats::print() {
tty->print("%d mallocs (%ldK), %d frees, %ldK resrc",
num_mallocs(), alloc_bytes()/K, num_frees(), resource_bytes()/K);
tty->print_cr(UINT64_FORMAT " mallocs (" UINT64_FORMAT "MB), "
UINT64_FORMAT" frees (" UINT64_FORMAT "MB), " UINT64_FORMAT "MB resrc",
num_mallocs(), alloc_bytes()/M, num_frees(), free_bytes()/M, resource_bytes()/M);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -202,10 +202,11 @@ protected:
char *_hwm, *_max; // High water mark and max in current chunk
void* grow(size_t x); // Get a new Chunk of at least size x
NOT_PRODUCT(size_t _size_in_bytes;) // Size of arena (used for memory usage tracing)
NOT_PRODUCT(static size_t _bytes_allocated;) // total #bytes allocated since start
NOT_PRODUCT(static julong _bytes_allocated;) // total #bytes allocated since start
friend class AllocStats;
debug_only(void* malloc(size_t size);)
debug_only(void* internal_malloc_4(size_t x);)
NOT_PRODUCT(void inc_bytes_allocated(size_t x);)
public:
Arena();
Arena(size_t init_size);
@ -219,7 +220,7 @@ protected:
assert(is_power_of_2(ARENA_AMALLOC_ALIGNMENT) , "should be a power of 2");
x = ARENA_ALIGN(x);
debug_only(if (UseMallocOnly) return malloc(x);)
NOT_PRODUCT(_bytes_allocated += x);
NOT_PRODUCT(inc_bytes_allocated(x);)
if (_hwm + x > _max) {
return grow(x);
} else {
@ -232,7 +233,7 @@ protected:
void *Amalloc_4(size_t x) {
assert( (x&(sizeof(char*)-1)) == 0, "misaligned size" );
debug_only(if (UseMallocOnly) return malloc(x);)
NOT_PRODUCT(_bytes_allocated += x);
NOT_PRODUCT(inc_bytes_allocated(x);)
if (_hwm + x > _max) {
return grow(x);
} else {
@ -252,7 +253,7 @@ protected:
size_t delta = (((size_t)_hwm + DALIGN_M1) & ~DALIGN_M1) - (size_t)_hwm;
x += delta;
#endif
NOT_PRODUCT(_bytes_allocated += x);
NOT_PRODUCT(inc_bytes_allocated(x);)
if (_hwm + x > _max) {
return grow(x); // grow() returns a result aligned >= 8 bytes.
} else {
@ -406,15 +407,16 @@ extern bool warn_new_operator;
// for statistics
#ifndef PRODUCT
class AllocStats : StackObj {
int start_mallocs, start_frees;
size_t start_malloc_bytes, start_res_bytes;
julong start_mallocs, start_frees;
julong start_malloc_bytes, start_mfree_bytes, start_res_bytes;
public:
AllocStats();
int num_mallocs(); // since creation of receiver
size_t alloc_bytes();
size_t resource_bytes();
int num_frees();
julong num_mallocs(); // since creation of receiver
julong alloc_bytes();
julong num_frees();
julong free_bytes();
julong resource_bytes();
void print();
};
#endif

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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,6 +32,20 @@
void trace_heap_malloc(size_t size, const char* name, void *p);
void trace_heap_free(void *p);
#ifndef PRODUCT
// Increments unsigned long value for statistics (not atomic on MP).
inline void inc_stat_counter(volatile julong* dest, julong add_value) {
#if defined(SPARC) || defined(X86)
// Sparc and X86 have atomic jlong (8 bytes) instructions
julong value = Atomic::load((volatile jlong*)dest);
value += add_value;
Atomic::store((jlong)value, (volatile jlong*)dest);
#else
// possible word-tearing during load/store
*dest += add_value;
#endif
}
#endif
// allocate using malloc; will fail if no memory available
inline char* AllocateHeap(size_t size, const char* name = NULL) {

View File

@ -111,10 +111,9 @@ constantPoolOop oopFactory::new_constantPool(int length,
constantPoolCacheOop oopFactory::new_constantPoolCache(int length,
bool is_conc_safe,
TRAPS) {
constantPoolCacheKlass* ck = constantPoolCacheKlass::cast(Universe::constantPoolCacheKlassObj());
return ck->allocate(length, is_conc_safe, CHECK_NULL);
return ck->allocate(length, CHECK_NULL);
}

View File

@ -69,7 +69,6 @@ class oopFactory: AllStatic {
bool is_conc_safe,
TRAPS);
static constantPoolCacheOop new_constantPoolCache(int length,
bool is_conc_safe,
TRAPS);
// Instance classes

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -128,27 +128,6 @@ int arrayKlassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
}
return klassKlass::oop_update_pointers(cm, obj);
}
int
arrayKlassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
HeapWord* beg_addr, HeapWord* end_addr) {
assert(obj->is_klass(), "must be klass");
arrayKlass* ak = arrayKlass::cast(klassOop(obj));
oop* p;
p = ak->adr_component_mirror();
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
p = ak->adr_lower_dimension();
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
p = ak->adr_higher_dimension();
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
{
HandleMark hm;
ak->vtable()->oop_update_pointers(cm, beg_addr, end_addr);
}
return klassKlass::oop_update_pointers(cm, obj, beg_addr, end_addr);
}
#endif // SERIALGC
// Printing

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2011, 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
@ -145,21 +145,6 @@ int compiledICHolderKlass::oop_update_pointers(ParCompactionManager* cm,
PSParallelCompact::adjust_pointer(c->adr_holder_klass());
return c->object_size();
}
int compiledICHolderKlass::oop_update_pointers(ParCompactionManager* cm,
oop obj,
HeapWord* beg_addr,
HeapWord* end_addr) {
assert(obj->is_compiledICHolder(), "must be compiledICHolder");
compiledICHolderOop c = compiledICHolderOop(obj);
oop* p;
p = c->adr_holder_method();
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
p = c->adr_holder_klass();
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
return c->object_size();
}
#endif // SERIALGC
// Printing

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2011, 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
@ -184,21 +184,6 @@ int constMethodKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
}
return cm_oop->object_size();
}
int constMethodKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
HeapWord* beg_addr,
HeapWord* end_addr) {
assert(obj->is_constMethod(), "should be constMethod");
constMethodOop cm_oop = constMethodOop(obj);
oop* const beg_oop = MAX2((oop*)beg_addr, cm_oop->oop_block_beg());
oop* const end_oop = MIN2((oop*)end_addr, cm_oop->oop_block_end());
for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) {
PSParallelCompact::adjust_pointer(cur_oop);
}
return cm_oop->object_size();
}
#endif // SERIALGC
// Printing

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -55,26 +55,35 @@
constantPoolOop constantPoolKlass::allocate(int length, bool is_conc_safe, TRAPS) {
int size = constantPoolOopDesc::object_size(length);
KlassHandle klass (THREAD, as_klassOop());
constantPoolOop c =
(constantPoolOop)CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL);
assert(klass()->is_oop(), "Can't be null, else handlizing of c below won't work");
constantPoolHandle pool;
{
constantPoolOop c =
(constantPoolOop)CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL);
assert(c->klass_or_null() != NULL, "Handlizing below won't work");
pool = constantPoolHandle(THREAD, c);
}
c->set_length(length);
c->set_tags(NULL);
c->set_cache(NULL);
c->set_operands(NULL);
c->set_pool_holder(NULL);
c->set_flags(0);
pool->set_length(length);
pool->set_tags(NULL);
pool->set_cache(NULL);
pool->set_operands(NULL);
pool->set_pool_holder(NULL);
pool->set_flags(0);
// only set to non-zero if constant pool is merged by RedefineClasses
c->set_orig_length(0);
pool->set_orig_length(0);
// if constant pool may change during RedefineClasses, it is created
// unsafe for GC concurrent processing.
c->set_is_conc_safe(is_conc_safe);
pool->set_is_conc_safe(is_conc_safe);
// all fields are initialized; needed for GC
// Note: because we may be in this "conc_unsafe" state when allocating
// t_oop below, which may in turn cause a GC, it is imperative that our
// size be correct, consistent and henceforth stable, at this stage.
assert(pool->is_oop() && pool->is_parsable(), "Else size() below is unreliable");
assert(size == pool->size(), "size() is wrong");
// initialize tag array
// Note: cannot introduce constant pool handle before since it is not
// completely initialized (no class) -> would cause assertion failure
constantPoolHandle pool (THREAD, c);
typeArrayOop t_oop = oopFactory::new_permanent_byteArray(length, CHECK_NULL);
typeArrayHandle tags (THREAD, t_oop);
for (int index = 0; index < length; index++) {
@ -82,6 +91,8 @@ constantPoolOop constantPoolKlass::allocate(int length, bool is_conc_safe, TRAPS
}
pool->set_tags(tags());
// Check that our size was stable at its old value.
assert(size == pool->size(), "size() changed");
return pool();
}
@ -271,40 +282,6 @@ int constantPoolKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
return cp->object_size();
}
int
constantPoolKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
HeapWord* beg_addr, HeapWord* end_addr) {
assert (obj->is_constantPool(), "obj must be constant pool");
constantPoolOop cp = (constantPoolOop) obj;
// If the tags array is null we are in the middle of allocating this constant
// pool.
if (cp->tags() != NULL) {
oop* base = (oop*)cp->base();
oop* const beg_oop = MAX2((oop*)beg_addr, base);
oop* const end_oop = MIN2((oop*)end_addr, base + cp->length());
const size_t beg_idx = pointer_delta(beg_oop, base, sizeof(oop*));
const size_t end_idx = pointer_delta(end_oop, base, sizeof(oop*));
for (size_t cur_idx = beg_idx; cur_idx < end_idx; ++cur_idx, ++base) {
if (cp->is_pointer_entry(int(cur_idx))) {
PSParallelCompact::adjust_pointer(base);
}
}
}
oop* p;
p = cp->tags_addr();
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
p = cp->cache_addr();
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
p = cp->operands_addr();
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
p = cp->pool_holder_addr();
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
return cp->object_size();
}
void constantPoolKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
assert(obj->is_constantPool(), "should be constant pool");
constantPoolOop cp = (constantPoolOop) obj;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2011, 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
@ -49,43 +49,31 @@ int constantPoolCacheKlass::oop_size(oop obj) const {
constantPoolCacheOop constantPoolCacheKlass::allocate(int length,
bool is_conc_safe,
TRAPS) {
// allocate memory
int size = constantPoolCacheOopDesc::object_size(length);
KlassHandle klass (THREAD, as_klassOop());
// This is the original code. The code from permanent_obj_allocate()
// was in-lined to allow the setting of is_conc_safe before the klass
// is installed.
// Commented out below is the original code. The code from
// permanent_obj_allocate() was in-lined so that we could
// set the _length field, necessary to correctly compute its
// size(), before setting its klass word further below.
// constantPoolCacheOop cache = (constantPoolCacheOop)
// CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL);
oop obj = CollectedHeap::permanent_obj_allocate_no_klass_install(klass, size, CHECK_NULL);
constantPoolCacheOop cache = (constantPoolCacheOop) obj;
cache->set_is_conc_safe(is_conc_safe);
// The store to is_conc_safe must be visible before the klass
// is set. This should be done safely because _is_conc_safe has
// been declared volatile. If there are any problems, consider adding
// OrderAccess::storestore();
CollectedHeap::post_allocation_install_obj_klass(klass, obj, size);
NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value((HeapWord*) obj,
size));
// The length field affects the size of the object. The allocation
// above allocates the correct size (see calculation of "size") but
// the size() method of the constant pool cache oop will not reflect
// that size until the correct length is set.
cache->set_length(length);
// The store of the length must be visible before is_conc_safe is
// set to a safe state.
// This should be done safely because _is_conc_safe has
// been declared volatile. If there are any problems, consider adding
// OrderAccess::storestore();
cache->set_is_conc_safe(methodOopDesc::IsSafeConc);
constantPoolCacheOop cache = (constantPoolCacheOop) obj;
assert(!UseConcMarkSweepGC || obj->klass_or_null() == NULL,
"klass should be NULL here when using CMS");
cache->set_length(length); // should become visible before klass is set below.
cache->set_constant_pool(NULL);
OrderAccess::storestore();
obj->set_klass(klass());
assert(cache->size() == size, "Incorrect cache->size()");
return cache;
}
@ -176,11 +164,6 @@ int constantPoolCacheKlass::oop_adjust_pointers(oop obj) {
return size;
}
bool constantPoolCacheKlass::oop_is_conc_safe(oop obj) const {
assert(obj->is_constantPoolCache(), "should be constant pool");
return constantPoolCacheOop(obj)->is_conc_safe();
}
#ifndef SERIALGC
void constantPoolCacheKlass::oop_push_contents(PSPromotionManager* pm,
oop obj) {
@ -220,25 +203,6 @@ constantPoolCacheKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
return cache->object_size();
}
int
constantPoolCacheKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
HeapWord* beg_addr,
HeapWord* end_addr) {
assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
constantPoolCacheOop cache = (constantPoolCacheOop)obj;
// Iteration over constant pool cache instance variables
oop* p;
p = (oop*)cache->constant_pool_addr();
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
// Iteration over constant pool cache entries
for (int i = 0; i < cache->length(); ++i) {
cache->entry_at(i)->update_pointers(beg_addr, end_addr);
}
return cache->object_size();
}
#endif // SERIALGC
void constantPoolCacheKlass::oop_print_on(oop obj, outputStream* st) {

View File

@ -39,7 +39,7 @@ class constantPoolCacheKlass: public Klass {
// Allocation
DEFINE_ALLOCATE_PERMANENT(constantPoolCacheKlass);
constantPoolCacheOop allocate(int length, bool is_conc_safe, TRAPS);
constantPoolCacheOop allocate(int length, TRAPS);
static klassOop create_klass(TRAPS);
// Casting from klassOop
@ -55,7 +55,6 @@ class constantPoolCacheKlass: public Klass {
// Garbage collection
void oop_follow_contents(oop obj);
int oop_adjust_pointers(oop obj);
virtual bool oop_is_conc_safe(oop obj) const;
// Parallel Scavenge and Parallel Old
PARALLEL_GC_DECLS

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2011, 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
@ -98,15 +98,15 @@ void ConstantPoolCacheEntry::set_bytecode_2(Bytecodes::Code code) {
// Atomically sets f1 if it is still NULL, otherwise it keeps the
// current value.
void ConstantPoolCacheEntry::set_f1_if_null_atomic(oop f1) {
// Use barriers as in oop_store
HeapWord* f1_addr = (HeapWord*) &_f1;
update_barrier_set_pre(f1_addr, f1);
void* result = Atomic::cmpxchg_ptr(f1, f1_addr, NULL);
bool success = (result == NULL);
if (success) {
update_barrier_set((void*) f1_addr, f1);
}
// Use barriers as in oop_store
oop* f1_addr = (oop*) &_f1;
update_barrier_set_pre(f1_addr, f1);
void* result = Atomic::cmpxchg_ptr(f1, f1_addr, NULL);
bool success = (result == NULL);
if (success) {
update_barrier_set(f1_addr, f1);
}
}
#ifdef ASSERT
// It is possible to have two different dummy methodOops created
@ -368,16 +368,6 @@ void ConstantPoolCacheEntry::update_pointers() {
PSParallelCompact::adjust_pointer((oop*)&_f2);
}
}
void ConstantPoolCacheEntry::update_pointers(HeapWord* beg_addr,
HeapWord* end_addr) {
assert(in_words(size()) == 4, "check code below - may need adjustment");
// field[1] is always oop or NULL
PSParallelCompact::adjust_pointer((oop*)&_f1, beg_addr, end_addr);
if (is_vfinal()) {
PSParallelCompact::adjust_pointer((oop*)&_f2, beg_addr, end_addr);
}
}
#endif // SERIALGC
// RedefineClasses() API support:

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2011, 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
@ -287,7 +287,6 @@ class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC {
#endif // SERIALGC
void update_pointers();
void update_pointers(HeapWord* beg_addr, HeapWord* end_addr);
// RedefineClasses() API support:
// If this constantPoolCacheEntry refers to old_method then update it
@ -321,9 +320,6 @@ class constantPoolCacheOopDesc: public oopDesc {
private:
int _length;
constantPoolOop _constant_pool; // the corresponding constant pool
// If true, safe for concurrent GC processing,
// Set unconditionally in constantPoolCacheKlass::allocate()
volatile bool _is_conc_safe;
// Sizing
debug_only(friend class ClassVerifier;)
@ -390,12 +386,6 @@ class constantPoolCacheOopDesc: public oopDesc {
return entry_at(primary_index);
}
// GC support
// If the _length field has not been set, the size of the
// constantPoolCache cannot be correctly calculated.
bool is_conc_safe() { return _is_conc_safe; }
void set_is_conc_safe(bool v) { _is_conc_safe = v; }
// Code generation
static ByteSize base_offset() { return in_ByteSize(sizeof(constantPoolCacheOopDesc)); }
static ByteSize entry_offset(int raw_index) {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -1736,14 +1736,6 @@ void instanceKlass::update_static_fields() {
PSParallelCompact::adjust_pointer(p), \
assert_nothing)
}
void instanceKlass::update_static_fields(HeapWord* beg_addr, HeapWord* end_addr) {
InstanceKlass_BOUNDED_OOP_ITERATE( \
start_of_static_fields(), static_oop_field_size(), \
beg_addr, end_addr, \
PSParallelCompact::adjust_pointer(p), \
assert_nothing )
}
#endif // SERIALGC
void instanceKlass::oop_follow_contents(oop obj) {
@ -1876,15 +1868,6 @@ int instanceKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
return size_helper();
}
int instanceKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
HeapWord* beg_addr, HeapWord* end_addr) {
InstanceKlass_BOUNDED_OOP_MAP_ITERATE( \
obj, beg_addr, end_addr, \
PSParallelCompact::adjust_pointer(p), \
assert_nothing)
return size_helper();
}
void instanceKlass::push_static_fields(PSPromotionManager* pm) {
InstanceKlass_OOP_ITERATE( \
start_of_static_fields(), static_oop_field_size(), \

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -740,7 +740,6 @@ class instanceKlass: public Klass {
void follow_static_fields(ParCompactionManager* cm);
void copy_static_fields(ParCompactionManager* cm);
void update_static_fields();
void update_static_fields(HeapWord* beg_addr, HeapWord* end_addr);
#endif // SERIALGC
// Naming

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -353,35 +353,6 @@ int instanceKlassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
return ik->object_size();
}
int instanceKlassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
HeapWord* beg_addr,
HeapWord* end_addr) {
assert(obj->is_klass(),"must be a klass");
assert(klassOop(obj)->klass_part()->oop_is_instance_slow(),
"must be instance klass");
instanceKlass* ik = instanceKlass::cast(klassOop(obj));
ik->update_static_fields(beg_addr, end_addr);
ik->vtable()->oop_update_pointers(cm, beg_addr, end_addr);
ik->itable()->oop_update_pointers(cm, beg_addr, end_addr);
oop* const beg_oop = MAX2((oop*)beg_addr, ik->oop_block_beg());
oop* const end_oop = MIN2((oop*)end_addr, ik->oop_block_end());
for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) {
PSParallelCompact::adjust_pointer(cur_oop);
}
// The oop_map_cache, jni_ids and jni_id_map are allocated from the C heap,
// and so don't lie within any 'Chunk' boundaries. Update them when the
// lowest addressed oop in the instanceKlass 'oop_block' is updated.
if (beg_oop == ik->oop_block_beg()) {
OopClosure* closure = PSParallelCompact::adjust_root_pointer_closure();
iterate_c_heap_oops(ik, closure);
}
klassKlass::oop_update_pointers(cm, obj, beg_addr, end_addr);
return ik->object_size();
}
#endif // SERIALGC
klassOop

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -344,33 +344,6 @@ int instanceRefKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
}
return size_helper();
}
template <class T> void
specialized_oop_update_pointers(ParCompactionManager* cm, oop obj,
HeapWord* beg_addr, HeapWord* end_addr) {
T* p;
T* referent_addr = p = (T*)java_lang_ref_Reference::referent_addr(obj);
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
T* next_addr = p = (T*)java_lang_ref_Reference::next_addr(obj);
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
T* discovered_addr = p = (T*)java_lang_ref_Reference::discovered_addr(obj);
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
debug_only(trace_reference_gc("instanceRefKlass::oop_update_ptrs", obj,
referent_addr, next_addr, discovered_addr);)
}
int
instanceRefKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
HeapWord* beg_addr, HeapWord* end_addr) {
instanceKlass::oop_update_pointers(cm, obj, beg_addr, end_addr);
if (UseCompressedOops) {
specialized_oop_update_pointers<narrowOop>(cm, obj, beg_addr, end_addr);
} else {
specialized_oop_update_pointers<oop>(cm, obj, beg_addr, end_addr);
}
return size_helper();
}
#endif // SERIALGC
void instanceRefKlass::update_nonstatic_oop_maps(klassOop k) {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -188,19 +188,6 @@ int klassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
return oop_size(obj);
}
int klassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
HeapWord* beg_addr, HeapWord* end_addr) {
Klass* k = Klass::cast(klassOop(obj));
oop* const beg_oop = MAX2((oop*)beg_addr, k->oop_block_beg());
oop* const end_oop = MIN2((oop*)end_addr, k->oop_block_end());
for (oop* cur_oop = beg_oop; cur_oop < end_oop; ++cur_oop) {
PSParallelCompact::adjust_pointer(cur_oop);
}
return oop_size(obj);
}
#endif // SERIALGC

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2007, 2011, 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,17 +37,13 @@
objects that do (or may) cross chunk boundaries; it updates only those \
oops that are in the region [beg_addr, end_addr). */ \
virtual void oop_follow_contents(ParCompactionManager* cm, oop obj); \
virtual int oop_update_pointers(ParCompactionManager* cm, oop obj); \
virtual int oop_update_pointers(ParCompactionManager* cm, oop obj, \
HeapWord* beg_addr, HeapWord* end_addr);
virtual int oop_update_pointers(ParCompactionManager* cm, oop obj);
// Pure virtual version for klass.hpp
#define PARALLEL_GC_DECLS_PV \
virtual void oop_push_contents(PSPromotionManager* pm, oop obj) = 0; \
virtual void oop_follow_contents(ParCompactionManager* cm, oop obj) = 0; \
virtual int oop_update_pointers(ParCompactionManager* cm, oop obj) = 0; \
virtual int oop_update_pointers(ParCompactionManager* cm, oop obj, \
HeapWord* beg_addr, HeapWord* end_addr) = 0;
virtual int oop_update_pointers(ParCompactionManager* cm, oop obj) = 0;
#else // SERIALGC
#define PARALLEL_GC_DECLS
#define PARALLEL_GC_DECLS_PV

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -677,25 +677,6 @@ void klassVtable::oop_update_pointers(ParCompactionManager* cm) {
PSParallelCompact::adjust_pointer(adr_method_at(i));
}
}
void klassVtable::oop_update_pointers(ParCompactionManager* cm,
HeapWord* beg_addr, HeapWord* end_addr) {
const int n = length();
const int entry_size = vtableEntry::size();
int beg_idx = 0;
HeapWord* const method_0 = (HeapWord*)adr_method_at(0);
if (beg_addr > method_0) {
// it's safe to use cast, as we have guarantees on vtable size to be sane
beg_idx = int((pointer_delta(beg_addr, method_0) + entry_size - 1) / entry_size);
}
oop* const beg_oop = adr_method_at(beg_idx);
oop* const end_oop = MIN2((oop*)end_addr, adr_method_at(n));
for (oop* cur_oop = beg_oop; cur_oop < end_oop; cur_oop += entry_size) {
PSParallelCompact::adjust_pointer(cur_oop);
}
}
#endif // SERIALGC
// Iterators
@ -820,25 +801,6 @@ void klassItable::oop_update_pointers(ParCompactionManager* cm) {
ime++;
}
}
void klassItable::oop_update_pointers(ParCompactionManager* cm,
HeapWord* beg_addr, HeapWord* end_addr) {
// offset table
itableOffsetEntry* ioe = offset_entry(0);
for(int i = 0; i < _size_offset_table; i++) {
oop* p = (oop*)&ioe->_interface;
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
ioe++;
}
// method table
itableMethodEntry* ime = method_entry(0);
for(int j = 0; j < _size_method_table; j++) {
oop* p = (oop*)&ime->_method;
PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
ime++;
}
}
#endif // SERIALGC
// Iterators

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2011, 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
@ -99,8 +99,6 @@ class klassVtable : public ResourceObj {
// Parallel Old
void oop_follow_contents(ParCompactionManager* cm);
void oop_update_pointers(ParCompactionManager* cm);
void oop_update_pointers(ParCompactionManager* cm,
HeapWord* beg_addr, HeapWord* end_addr);
#endif // SERIALGC
// Iterators
@ -295,8 +293,6 @@ class klassItable : public ResourceObj {
// Parallel Old
void oop_follow_contents(ParCompactionManager* cm);
void oop_update_pointers(ParCompactionManager* cm);
void oop_update_pointers(ParCompactionManager* cm,
HeapWord* beg_addr, HeapWord* end_addr);
#endif // SERIALGC
// Iterators

Some files were not shown because too many files have changed in this diff Show More