xref: /aosp_15_r20/dalvik/dx/tests/135-invoke-custom/run (revision 055d459012065f78d96b68be8421640240ddf631)
1*055d4590SKeyi Gui#!/bin/bash
2*055d4590SKeyi Gui#
3*055d4590SKeyi Gui# Copyright (C) 2017 The Android Open Source Project
4*055d4590SKeyi Gui#
5*055d4590SKeyi Gui# Licensed under the Apache License, Version 2.0 (the "License");
6*055d4590SKeyi Gui# you may not use this file except in compliance with the License.
7*055d4590SKeyi Gui# You may obtain a copy of the License at
8*055d4590SKeyi Gui#
9*055d4590SKeyi Gui#     http://www.apache.org/licenses/LICENSE-2.0
10*055d4590SKeyi Gui#
11*055d4590SKeyi Gui# Unless required by applicable law or agreed to in writing, software
12*055d4590SKeyi Gui# distributed under the License is distributed on an "AS IS" BASIS,
13*055d4590SKeyi Gui# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*055d4590SKeyi Gui# See the License for the specific language governing permissions and
15*055d4590SKeyi Gui# limitations under the License.
16*055d4590SKeyi Gui
17*055d4590SKeyi GuiUNSUPPORTED_SDK_VERSION=25
18*055d4590SKeyi GuiSUPPORTED_SDK_VERSION=26
19*055d4590SKeyi Gui
20*055d4590SKeyi Gui# Expect failure with unsupported SDK version
21*055d4590SKeyi GuiEXPECTED_STATUS[${UNSUPPORTED_SDK_VERSION}]=1
22*055d4590SKeyi Gui
23*055d4590SKeyi Gui# Expect success with supported SDK version
24*055d4590SKeyi GuiEXPECTED_STATUS[${SUPPORTED_SDK_VERSION}]=0
25*055d4590SKeyi Gui
26*055d4590SKeyi GuiDX_OUTPUT=dx.log
27*055d4590SKeyi Guirm -f ${DX_OUTPUT} 2>/dev/null
28*055d4590SKeyi Gui
29*055d4590SKeyi Guifor SDK_VERSION in ${UNSUPPORTED_SDK_VERSION} ${SUPPORTED_SDK_VERSION}; do
30*055d4590SKeyi Gui  echo Trying SDK version ${SDK_VERSION} with invoke-custom.
31*055d4590SKeyi Gui  dx --min-sdk-version=${SDK_VERSION} --dex --output=invokecustom.dex \
32*055d4590SKeyi Gui     --verbose-dump --dump-to=- --dump-width=1000 invokecustom.jar 2>&1
33*055d4590SKeyi Gui  STATUS=$?
34*055d4590SKeyi Gui  if [[ ${STATUS} != ${EXPECTED_STATUS[$SDK_VERSION]} ]]; then
35*055d4590SKeyi Gui    echo Unexpected status ${STATUS} for SDK version ${SDK_VERSION}.
36*055d4590SKeyi Gui    exit 1
37*055d4590SKeyi Gui  fi
38*055d4590SKeyi Guidone | tee -a ${DX_OUTPUT}
39*055d4590SKeyi Gui
40*055d4590SKeyi GuiJAVAP_OUTPUT=invokecustom.InvokeCustom.txt
41*055d4590SKeyi Guijavap -c -v -cp invokecustom.jar invokecustom.InvokeCustom > ${JAVAP_OUTPUT}
42*055d4590SKeyi Gui
43*055d4590SKeyi Gui# Check each invokedynamic instruction produced one invoke-custom
44*055d4590SKeyi GuiINVOKEDYNAMIC_COUNT=$( grep "invokedynamic #" ${JAVAP_OUTPUT} | wc -l )
45*055d4590SKeyi GuiINVOKE_CUSTOM_COUNT=$( grep ": invoke-custom" ${DX_OUTPUT} | wc -l )
46*055d4590SKeyi Guiif [ "${INVOKEDYNAMIC_COUNT}" -ne "${INVOKE_CUSTOM_COUNT}" ]; then
47*055d4590SKeyi Gui    echo Found ${INVOKEDYNAMIC_COUNT} uses of invokedynamic but ${INVOKE_CUSTOM_COUNT} uses of invoke-custom.
48*055d4590SKeyi Gui    exit 1
49*055d4590SKeyi Guifi
50*055d4590SKeyi Gui
51*055d4590SKeyi Gui# Check there is a 1:1 correspondance between the number of call site ids and invoke-custom bytecodes.
52*055d4590SKeyi GuiCALL_SITE_ID_COUNT=$( sed -n -e '/call_site_off:/ p' ${DX_OUTPUT} | wc -l )
53*055d4590SKeyi Guiif [ ${CALL_SITE_ID_COUNT} -gt ${INVOKE_CUSTOM_COUNT} ]; then
54*055d4590SKeyi Gui    echo Found ${CALL_SITE_ID_COUNT} call sites but ${INVOKE_CUSTOM_COUNT} uses of invoke-custom.
55*055d4590SKeyi Gui    exit 1
56*055d4590SKeyi Guifi
57*055d4590SKeyi Gui
58*055d4590SKeyi Gui# Check number of invokedynamic constants matches the number of unique call sites
59*055d4590SKeyi GuiCST_INDY_COUNT=$( sed -n -e 's@.*: invokedynamic #\([0-9]*\),.*@\1@p' ${JAVAP_OUTPUT} | \
60*055d4590SKeyi Gui                  sort | \
61*055d4590SKeyi Gui                  uniq -c | \
62*055d4590SKeyi Gui                  wc -l )
63*055d4590SKeyi GuiCALL_SITE_COUNT=$( sed -n -e 's@.*call_site_off: \([0-9a-f]\+\)@\1@p' ${DX_OUTPUT} | \
64*055d4590SKeyi Gui                   uniq -c | \
65*055d4590SKeyi Gui                   wc -l )
66*055d4590SKeyi Guiif [ ${CST_INDY_COUNT} -ne ${CALL_SITE_COUNT} ]; then
67*055d4590SKeyi Gui    echo Found ${CST_INDY_COUNT} invokedynamic constants but ${CALL_SITE_COUNT} call sites.
68*055d4590SKeyi Gui    exit 1
69*055d4590SKeyi Guifi
70