7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
Summary: Cannot delete _buckets and HashtableEntries in shared space (CDS)
Reviewed-by: acorn, kvn, dlong, dcubed, kamg
#
# Copyright (c) 2011, 2012, 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. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# 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.
#
GENSRC_BUFFER :=
GENSRC_BUFFER_TMP := $(JDK_OUTPUTDIR)/gensrc_buffer
GENSRC_BUFFER_DST := $(JDK_OUTPUTDIR)/gensrc_buffer/java/nio
GENSRC_BUFFER_SRC := $(JDK_TOPDIR)/src/share/classes/java/nio
###
$(GENSRC_BUFFER_DST)/_the.dir :
$(ECHO) "Generating buffer classes"
$(MKDIR) -p $(@D)
$(TOUCH) $@
define fixRw
$1_RW := $2
$1_rwkey := rw
ifeq (R,$2)
$1_rwkey := ro
endif
endef
define typesAndBits
# param 1 target
# param 2 type
# param 3 BO
$1_a := a
$1_A := A
$1_type := $2
ifeq ($2, byte)
$1_x := b
$1_Type := Byte
$1_fulltype := byte
$1_Fulltype := Byte
$1_category := integralType
$1_LBPV := 0
endif
ifeq ($2, char)
$1_x := c
$1_Type := Char
$1_fulltype := character
$1_Fulltype := Character
$1_category := integralType
$1_LBPV := 1
endif
ifeq ($2, short)
$1_x := s
$1_Type := Short
$1_fulltype := short
$1_Fulltype := Short
$1_category := integralType
$1_LBPV := 1
endif
ifeq ($2, int)
$1_a := an
$1_A := An
$1_x := i
$1_Type := Int
$1_fulltype := integer
$1_Fulltype := Integer
$1_category := integralType
$1_LBPV := 2
endif
ifeq ($2, long)
$1_x := l
$1_Type := Long
$1_fulltype := long
$1_Fulltype := Long
$1_category := integralType
$1_LBPV := 3
endif
ifeq ($2, float)
$1_x := f
$1_Type := Float
$1_fulltype := float
$1_Fulltype := Float
$1_category := floatingPointType
$1_LBPV := 2
endif
ifeq ($2, double)
$1_x := d
$1_Type := Double
$1_fulltype := double
$1_Fulltype := Double
$1_category := floatingPointType
$1_LBPV := 3
endif
$1_Swaptype := $$($1_Type)
$1_memtype := $2
$1_Memtype := $$($1_Type)
ifeq ($2, float)
$1_memtype := int
$1_Memtype := Int
ifneq ($3,U)
$1_Swaptype := Int
$1_fromBits := Float.intBitsToFloat
$1_toBits := Float.floatToRawIntBits
endif
endif
ifeq ($2, double)
$1_memtype := long
$1_Memtype := Long
ifneq ($3,U)
$1_Swaptype := Long
$1_fromBits := Double.longBitsToDouble
$1_toBits := Double.doubleToRawLongBits
endif
endif
ifeq ($3, S)
$1_swap := Bits.swap
endif
endef
define genBinOps
# param 1 target
# param 2 type
# param 3 BO
# param 4 RW
# param 5 nbytes
# param 6 nbytesButOne
$(call typesAndBits,$1,$2,$3)
$(call fixRw,$1,$4)
$1_nbytes := $5
$1_nbytesButOne := $6
$1_CMD := $(TOOL_SPP) \
-Dtype=$$($1_type) \
-DType=$$($1_Type) \
-Dfulltype=$$($1_fulltype) \
-Dmemtype=$$($1_memtype) \
-DMemtype=$$($1_Memtype) \
-DfromBits=$$($1_fromBits) \
-DtoBits=$$($1_toBits) \
-DLG_BYTES_PER_VALUE=$$($1_LBPV) \
-DBYTES_PER_VALUE="(1 << $$($1_LBPV))" \
-Dnbytes=$$($1_nbytes) \
-DnbytesButOne=$$($1_nbytesButOne) \
-DRW=$$($1_RW) \
-K$$($1_rwkey) \
-Da=$$($1_a) \
-be
endef
define SetupGenBuffer
# param 1 is for output file
# param 2 is template dependency
# param 3-9 are named args.
# type :=
# BIN :=
# RW := Mutability (R)ead-only (W)ritable
# BO := (U)nswapped/(S)wapped/(L)ittle/(B)ig
#
$(if $3,$1_$(strip $3))
$(if $4,$1_$(strip $4))
$(if $5,$1_$(strip $5))
$(if $6,$1_$(strip $6))
$(if $7,$1_$(strip $7))
$(if $8,$1_$(strip $8))
$(if $9,$1_$(strip $9))
$(if $(10),$1_$(strip $(10)))
$(if $(11),$1_$(strip $(11)))
$(if $(12),$1_$(strip $(12)))
$(if $(13),$1_$(strip $(13)))
$(if $(14),$1_$(strip $(14)))
$(call fixRw,$1,$$($1_RW))
$(call typesAndBits,$1,$$($1_type),$$($1_BO))
$1_DST := $(GENSRC_BUFFER_DST)/$1.java
$1_SRC := $(GENSRC_BUFFER_SRC)/$(strip $2).java.template
$1_SRC_BIN := $(GENSRC_BUFFER_SRC)/$(strip $2)-bin.java.template
$1_DEP := $$($1_SRC)
ifneq ($$($1_BIN),1)
$1_DEP := $$($1_SRC)
$1_OUT := $$($1_DST)
else
$1_DEP += $$($1_SRC) $$($1_SRC_BIN)
$1_OUT := $(GENSRC_BUFFER_DST)/$1.binop.0.java
endif
ifeq ($$($1_BIN),1)
$(call genBinOps,$1_char,char,$$($1_BO),$$($1_RW),two,one)
$(call genBinOps,$1_short,short,$$($1_BO),$$($1_RW),two,one)
$(call genBinOps,$1_int,int,$$($1_BO),$$($1_RW),four,three)
$(call genBinOps,$1_long,long,$$($1_BO),$$($1_RW),eight,seven)
$(call genBinOps,$1_float,float,$$($1_BO),$$($1_RW),four,three)
$(call genBinOps,$1_double,double,$$($1_BO),$$($1_RW),eight,seven)
endif
$$($1_DST) : $$($1_DEP) $(GENSRC_BUFFER_DST)/_the.dir
$(TOOL_SPP) < $$($1_SRC) > $$($1_OUT).temp \
-K$$($1_type) \
-K$$($1_category) \
-Dtype=$$($1_type) \
-DType=$$($1_Type) \
-Dfulltype=$$($1_fulltype) \
-DFulltype=$$($1_Fulltype) \
-Dx=$$($1_x) \
-Dmemtype=$$($1_memtype) \
-DMemtype=$$($1_Memtype) \
-DSwaptype=$$($1_Swaptype) \
-DfromBits=$$($1_fromBits) \
-DtoBits=$$($1_toBits) \
-DLG_BYTES_PER_VALUE=$$($1_LBPV) \
-DBYTES_PER_VALUE="(1 << $$($1_LBPV))" \
-DBO=$$($1_BO) \
-Dswap=$$($1_swap) \
-DRW=$$($1_RW) \
-K$$($1_rwkey) \
-Da=$$($1_a) \
-DA=$$($1_A) \
-Kbo$$($1_BO)
$(MV) $$($1_OUT).temp $$($1_OUT)
# Do the extra bin thing
ifeq ($$($1_BIN),1)
$(SED) -e '/#BIN/,$$$$d' < $$($1_OUT) > $$($1_DST).temp
$(RM) $$($1_OUT)
$$($1_char_CMD) < $$($1_SRC_BIN) >> $$($1_DST).temp
$$($1_short_CMD) < $$($1_SRC_BIN) >> $$($1_DST).temp
$$($1_int_CMD) < $$($1_SRC_BIN) >> $$($1_DST).temp
$$($1_long_CMD) < $$($1_SRC_BIN) >> $$($1_DST).temp
$$($1_float_CMD) < $$($1_SRC_BIN) >> $$($1_DST).temp
$$($1_double_CMD) < $$($1_SRC_BIN) >> $$($1_DST).temp
$(PRINTF) "}\n" >> $$($1_DST).temp
mv $$($1_DST).temp $$($1_DST)
endif
GENSRC_BUFFER += $$($1_DST)
endef
###
X_BUF :=X-Buffer
$(eval $(call SetupGenBuffer,ByteBuffer, $(X_BUF),type:=byte,BIN:=1))
$(eval $(call SetupGenBuffer,CharBuffer, $(X_BUF),type:=char))
$(eval $(call SetupGenBuffer,ShortBuffer, $(X_BUF),type:=short))
$(eval $(call SetupGenBuffer,IntBuffer, $(X_BUF),type:=int))
$(eval $(call SetupGenBuffer,LongBuffer, $(X_BUF),type:=long))
$(eval $(call SetupGenBuffer,FloatBuffer, $(X_BUF),type:=float))
$(eval $(call SetupGenBuffer,DoubleBuffer,$(X_BUF),type:=double))
# Buffers whose contents are heap-allocated
#
HEAP_X_BUF := Heap-X-Buffer
$(eval $(call SetupGenBuffer,HeapByteBuffer, $(HEAP_X_BUF),type:=byte))
$(eval $(call SetupGenBuffer,HeapByteBufferR, $(HEAP_X_BUF),type:=byte,RW:=R))
$(eval $(call SetupGenBuffer,HeapCharBuffer, $(HEAP_X_BUF),type:=char))
$(eval $(call SetupGenBuffer,HeapCharBufferR, $(HEAP_X_BUF),type:=char,RW:=R))
$(eval $(call SetupGenBuffer,HeapShortBuffer, $(HEAP_X_BUF),type:=short))
$(eval $(call SetupGenBuffer,HeapShortBufferR, $(HEAP_X_BUF),type:=short,RW:=R))
$(eval $(call SetupGenBuffer,HeapIntBuffer, $(HEAP_X_BUF),type:=int))
$(eval $(call SetupGenBuffer,HeapIntBufferR, $(HEAP_X_BUF),type:=int,RW:=R))
$(eval $(call SetupGenBuffer,HeapLongBuffer, $(HEAP_X_BUF),type:=long))
$(eval $(call SetupGenBuffer,HeapLongBufferR, $(HEAP_X_BUF),type:=long,RW:=R))
$(eval $(call SetupGenBuffer,HeapFloatBuffer, $(HEAP_X_BUF),type:=float))
$(eval $(call SetupGenBuffer,HeapFloatBufferR, $(HEAP_X_BUF),type:=float,RW:=R))
$(eval $(call SetupGenBuffer,HeapDoubleBuffer, $(HEAP_X_BUF),type:=double))
$(eval $(call SetupGenBuffer,HeapDoubleBufferR,$(HEAP_X_BUF),type:=double,RW:=R))
# Direct byte buffer
#
DIRECT_X_BUF := Direct-X-Buffer
$(eval $(call SetupGenBuffer,DirectByteBuffer, $(DIRECT_X_BUF),type:=byte,BIN:=1))
$(eval $(call SetupGenBuffer,DirectByteBufferR,$(DIRECT_X_BUF),type:=byte,BIN:=1,RW:=R))
# Unswapped views of direct byte buffers
#
$(eval $(call SetupGenBuffer,DirectCharBufferU, $(DIRECT_X_BUF),type:=char,BO:=U))
$(eval $(call SetupGenBuffer,DirectCharBufferRU, $(DIRECT_X_BUF),type:=char,RW:=R,BO:=U))
$(eval $(call SetupGenBuffer,DirectShortBufferU, $(DIRECT_X_BUF),type:=short,BO:=U))
$(eval $(call SetupGenBuffer,DirectShortBufferRU, $(DIRECT_X_BUF),type:=short,RW:=R,BO:=U))
$(eval $(call SetupGenBuffer,DirectIntBufferU, $(DIRECT_X_BUF),type:=int,BO:=U))
$(eval $(call SetupGenBuffer,DirectIntBufferRU, $(DIRECT_X_BUF),type:=int,RW:=R,BO:=U))
$(eval $(call SetupGenBuffer,DirectLongBufferU, $(DIRECT_X_BUF),type:=long,BO:=U))
$(eval $(call SetupGenBuffer,DirectLongBufferRU, $(DIRECT_X_BUF),type:=long,RW:=R,BO:=U))
$(eval $(call SetupGenBuffer,DirectFloatBufferU, $(DIRECT_X_BUF),type:=float,BO:=U))
$(eval $(call SetupGenBuffer,DirectFloatBufferRU, $(DIRECT_X_BUF),type:=float,RW:=R,BO:=U))
$(eval $(call SetupGenBuffer,DirectDoubleBufferU, $(DIRECT_X_BUF),type:=double,BO:=U))
$(eval $(call SetupGenBuffer,DirectDoubleBufferRU,$(DIRECT_X_BUF),type:=double,RW:=R,BO:=U))
# Swapped views of direct byte buffers
#
$(eval $(call SetupGenBuffer,DirectCharBufferS, $(DIRECT_X_BUF),type:=char,BO:=S))
$(eval $(call SetupGenBuffer,DirectCharBufferRS, $(DIRECT_X_BUF),type:=char,RW:=R,BO:=S))
$(eval $(call SetupGenBuffer,DirectShortBufferS, $(DIRECT_X_BUF),type:=short,BO:=S))
$(eval $(call SetupGenBuffer,DirectShortBufferRS, $(DIRECT_X_BUF),type:=short,RW:=R,BO:=S))
$(eval $(call SetupGenBuffer,DirectIntBufferS, $(DIRECT_X_BUF),type:=int,BO:=S))
$(eval $(call SetupGenBuffer,DirectIntBufferRS, $(DIRECT_X_BUF),type:=int,RW:=R,BO:=S))
$(eval $(call SetupGenBuffer,DirectLongBufferS, $(DIRECT_X_BUF),type:=long,BO:=S))
$(eval $(call SetupGenBuffer,DirectLongBufferRS, $(DIRECT_X_BUF),type:=long,RW:=R,BO:=S))
$(eval $(call SetupGenBuffer,DirectFloatBufferS, $(DIRECT_X_BUF),type:=float,BO:=S))
$(eval $(call SetupGenBuffer,DirectFloatBufferRS, $(DIRECT_X_BUF),type:=float,RW:=R,BO:=S))
$(eval $(call SetupGenBuffer,DirectDoubleBufferS, $(DIRECT_X_BUF),type:=double,BO:=S))
$(eval $(call SetupGenBuffer,DirectDoubleBufferRS,$(DIRECT_X_BUF),type:=double,RW:=R,BO:=S))
# Big-endian views of byte buffers
#
BYTE_X_BUF := ByteBufferAs-X-Buffer
$(eval $(call SetupGenBuffer,ByteBufferAsCharBufferB, $(BYTE_X_BUF),type:=char,BO:=B))
$(eval $(call SetupGenBuffer,ByteBufferAsCharBufferRB, $(BYTE_X_BUF),type:=char,RW:=R,BO:=B))
$(eval $(call SetupGenBuffer,ByteBufferAsShortBufferB, $(BYTE_X_BUF),type:=short,BO:=B))
$(eval $(call SetupGenBuffer,ByteBufferAsShortBufferRB, $(BYTE_X_BUF),type:=short,RW:=R,BO:=B))
$(eval $(call SetupGenBuffer,ByteBufferAsIntBufferB, $(BYTE_X_BUF),type:=int,BO:=B))
$(eval $(call SetupGenBuffer,ByteBufferAsIntBufferRB, $(BYTE_X_BUF),type:=int,RW:=R,BO:=B))
$(eval $(call SetupGenBuffer,ByteBufferAsLongBufferB, $(BYTE_X_BUF),type:=long,BO:=B))
$(eval $(call SetupGenBuffer,ByteBufferAsLongBufferRB, $(BYTE_X_BUF),type:=long,RW:=R,BO:=B))
$(eval $(call SetupGenBuffer,ByteBufferAsFloatBufferB, $(BYTE_X_BUF),type:=float,BO:=B))
$(eval $(call SetupGenBuffer,ByteBufferAsFloatBufferRB, $(BYTE_X_BUF),type:=float,RW:=R,BO:=B))
$(eval $(call SetupGenBuffer,ByteBufferAsDoubleBufferB, $(BYTE_X_BUF),type:=double,BO:=B))
$(eval $(call SetupGenBuffer,ByteBufferAsDoubleBufferRB,$(BYTE_X_BUF),type:=double,RW:=R,BO:=B))
# Little-endian views of byte buffers
#
$(eval $(call SetupGenBuffer,ByteBufferAsCharBufferL, $(BYTE_X_BUF),type:=char,BO:=L))
$(eval $(call SetupGenBuffer,ByteBufferAsCharBufferRL, $(BYTE_X_BUF),type:=char,RW:=R,BO:=L))
$(eval $(call SetupGenBuffer,ByteBufferAsShortBufferL, $(BYTE_X_BUF),type:=short,BO:=L))
$(eval $(call SetupGenBuffer,ByteBufferAsShortBufferRL, $(BYTE_X_BUF),type:=short,RW:=R,BO:=L))
$(eval $(call SetupGenBuffer,ByteBufferAsIntBufferL, $(BYTE_X_BUF),type:=int,BO:=L))
$(eval $(call SetupGenBuffer,ByteBufferAsIntBufferRL, $(BYTE_X_BUF),type:=int,RW:=R,BO:=L))
$(eval $(call SetupGenBuffer,ByteBufferAsLongBufferL, $(BYTE_X_BUF),type:=long,BO:=L))
$(eval $(call SetupGenBuffer,ByteBufferAsLongBufferRL, $(BYTE_X_BUF),type:=long,RW:=R,BO:=L))
$(eval $(call SetupGenBuffer,ByteBufferAsFloatBufferL, $(BYTE_X_BUF),type:=float,BO:=L))
$(eval $(call SetupGenBuffer,ByteBufferAsFloatBufferRL, $(BYTE_X_BUF),type:=float,RW:=R,BO:=L))
$(eval $(call SetupGenBuffer,ByteBufferAsDoubleBufferL, $(BYTE_X_BUF),type:=double,BO:=L))
$(eval $(call SetupGenBuffer,ByteBufferAsDoubleBufferRL,$(BYTE_X_BUF),type:=double,RW:=R,BO:=L))
###
$(GENSRC_BUFFER) : $(BUILD_TOOLS)