make/gensrc/GensrcBuffer.gmk
author zgu
Tue, 31 Jul 2018 13:12:06 -0400
changeset 51267 2cd8bbccbd2d
parent 47217 72e3ae9a25eb
child 53110 50677f43ac3d
permissions -rw-r--r--
8199868: Support JNI critical functions in object pinning API Summary: Pin/unpin incoming array arguments of critical native JNI call Reviewed-by: shade, adinn

#
# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  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_DST := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/java/nio

GENSRC_BUFFER_SRC := $(TOPDIR)/src/java.base/share/classes/java/nio

###

$(GENSRC_BUFFER_DST)/_the.buffer.dir:
	$(call LogInfo, Generating buffer classes)
	$(call MakeDir, $(@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_streams  := streamableType
    $1_streamtype := int
    $1_Streamtype := Int
    $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)))
  $(foreach i,3 4 5 6 7 8 9 10 11 12 13 14 15,$(if $($i),$1_$(strip $($i)))$(NEWLINE))
  $(call LogSetupMacroEntry,SetupGenBuffer($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15))
  $(if $(16),$(error Internal makefile error: Too many arguments to SetupGenBuffer, please update GensrcBuffer.gmk))

  $(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.buffer.dir
	$(TOOL_SPP) < $$($1_SRC) > $$($1_OUT).tmp \
	    -K$$($1_type) \
	    -K$$($1_category) \
	    -K$$($1_streams) \
	    -Dtype=$$($1_type) \
	    -DType=$$($1_Type) \
	    -Dfulltype=$$($1_fulltype) \
	    -DFulltype=$$($1_Fulltype) \
	    -Dstreamtype=$$($1_streamtype) \
	    -DStreamtype=$$($1_Streamtype) \
	    -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).tmp $$($1_OUT)
        # Do the extra bin thing
        ifeq ($$($1_BIN), 1)
	  $(SED) -e '/#BIN/,$$$$d' < $$($1_OUT) > $$($1_DST).tmp
	  $(RM) $$($1_OUT)
	  $$($1_char_CMD) < $$($1_SRC_BIN) >> $$($1_DST).tmp
	  $$($1_short_CMD) < $$($1_SRC_BIN) >> $$($1_DST).tmp
	  $$($1_int_CMD) < $$($1_SRC_BIN) >> $$($1_DST).tmp
	  $$($1_long_CMD) < $$($1_SRC_BIN) >> $$($1_DST).tmp
	  $$($1_float_CMD) < $$($1_SRC_BIN) >> $$($1_DST).tmp
	  $$($1_double_CMD) < $$($1_SRC_BIN) >> $$($1_DST).tmp
	  $(PRINTF) "}\n" >> $$($1_DST).tmp
	  mv $$($1_DST).tmp $$($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_JDK)
GENSRC_JAVA_BASE += $(GENSRC_BUFFER)