test_wamr.sh 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254
  1. #!/usr/bin/env bash
  2. #
  3. # Copyright (C) 2019 Intel Corporation. All rights reserved.
  4. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  5. #
  6. # Run script like DEBUG=1 ./test_wamr.sh ... to enable debug mode
  7. function DEBUG() {
  8. env | grep -q "\<DEBUG\>" && "$@"
  9. }
  10. DEBUG set -exv
  11. DEBUG set -o pipefail
  12. function help()
  13. {
  14. echo "test_wamr.sh [options]"
  15. echo "-c clean previous test results, not start test"
  16. echo "-s {suite_name} test only one suite (spec|standalone|malformed|wasi_certification|"
  17. echo " unit|wamr_compiler)"
  18. echo "-m set compile target of iwasm(x86_64|x86_32|armv7|armv7_vfp|thumbv7|thumbv7_vfp|"
  19. echo " riscv32|riscv32_ilp32f|riscv32_ilp32d|riscv64|"
  20. echo " riscv64_lp64f|riscv64_lp64d|aarch64|aarch64_vfp)"
  21. echo "-t set compile type of iwasm(classic-interp|fast-interp|jit|aot|fast-jit|multi-tier-jit)"
  22. echo "-M enable multi module feature"
  23. echo "-p enable multi thread feature"
  24. echo "-S enable SIMD feature"
  25. echo "-G enable GC feature"
  26. echo "-W enable memory64 feature"
  27. echo "-E enable multi memory feature"
  28. echo "-X enable XIP feature"
  29. echo "-e enable exception handling"
  30. echo "-x test SGX"
  31. echo "-w enable WASI threads"
  32. echo "-a test all runtimes in sightglass suite"
  33. echo "-b use the wabt binary release package instead of compiling from the source code"
  34. echo "-g build iwasm with debug version"
  35. echo "-v enable GC heap verification"
  36. echo "-P run the spec test parallelly"
  37. echo "-Q enable qemu"
  38. echo "-F set the firmware path used by qemu"
  39. echo "-C enable code coverage collect"
  40. echo "-j set the platform to test"
  41. echo "-T set the sanitizer(s) used during testing. It can be either a comma-separated list
  42. (e.g., ubsan, asan) or a single option
  43. (e.g., ubsan, tsan, asan, posan)."
  44. echo "-A use the specified wamrc command instead of building it"
  45. echo "-N enable extended const expression feature"
  46. echo "-r [requirement name] [N [N ...]] specify a requirement name followed by one or more"
  47. echo " subrequirement IDs, if no subrequirement is specificed,"
  48. echo " it will run all subrequirements. When this optin is used,"
  49. echo " only run requirement tests"
  50. }
  51. OPT_PARSED=""
  52. WABT_BINARY_RELEASE="NO"
  53. #default type
  54. TYPE=("classic-interp" "fast-interp" "jit" "aot" "fast-jit" "multi-tier-jit")
  55. #default target
  56. TARGET="X86_64"
  57. ENABLE_WASI_THREADS=0
  58. ENABLE_MULTI_MODULE=0
  59. ENABLE_MULTI_THREAD=0
  60. COLLECT_CODE_COVERAGE=0
  61. ENABLE_SIMD=0
  62. ENABLE_GC=0
  63. ENABLE_EXTENDED_CONST_EXPR=0
  64. ENABLE_MEMORY64=0
  65. ENABLE_MULTI_MEMORY=0
  66. ENABLE_XIP=0
  67. ENABLE_EH=0
  68. ENABLE_DEBUG_VERSION=0
  69. ENABLE_GC_HEAP_VERIFY=0
  70. #unit test case arrary
  71. TEST_CASE_ARR=()
  72. SGX_OPT=""
  73. if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
  74. PLATFORM=windows
  75. PYTHON_EXE=python
  76. else
  77. PLATFORM=$(uname -s | tr A-Z a-z)
  78. PYTHON_EXE=python3
  79. fi
  80. PARALLELISM=0
  81. ENABLE_QEMU=0
  82. QEMU_FIRMWARE=""
  83. WAMRC_CMD=""
  84. # prod/testsuite-all branch
  85. WASI_TESTSUITE_COMMIT="ee807fc551978490bf1c277059aabfa1e589a6c2"
  86. TARGET_LIST=("AARCH64" "AARCH64_VFP" "ARMV7" "ARMV7_VFP" "THUMBV7" "THUMBV7_VFP" \
  87. "RISCV32" "RISCV32_ILP32F" "RISCV32_ILP32D" "RISCV64" "RISCV64_LP64F" "RISCV64_LP64D" "XTENSA")
  88. REQUIREMENT_NAME=""
  89. # Initialize an empty array for subrequirement IDs
  90. SUBREQUIREMENT_IDS=()
  91. while getopts ":s:cabgvt:m:MCpSXexwWEPGQF:j:T:r:A:N" opt
  92. do
  93. OPT_PARSED="TRUE"
  94. case $opt in
  95. s)
  96. TEST_CASE_ARR+=($OPTARG)
  97. # get next suite if there are multiple vaule in -s
  98. eval "nxarg=\${$((OPTIND))}"
  99. # just get test cases, loop until the next symbol '-'
  100. # IN ====> -s spec unit -t fast-classic
  101. # GET ====> spec unit
  102. while [[ "${nxarg}" != -* && ${nxarg} ]];
  103. do
  104. TEST_CASE_ARR+=(${nxarg})
  105. OPTIND=$((OPTIND+1))
  106. eval "nxarg=\${$((OPTIND))}"
  107. done
  108. echo "test following cases: ${TEST_CASE_ARR[@]}"
  109. ;;
  110. c)
  111. read -t 5 -p "Are you sure to delete all reports. y/n " cmd
  112. if [[ $cmd == "y" && $(ls -A workspace/report) ]];then
  113. rm -fr workspace/report/*
  114. rm -fr /tmp/*.wasm /tmp/*.wast /tmp/*.aot
  115. echo "cleaned all reports and temp files"
  116. fi
  117. exit 0;;
  118. a)
  119. TEST_ALL_AOT_RUNTIME="all"
  120. echo "test all runtimes in sightglass_aot"
  121. ;;
  122. b)
  123. WABT_BINARY_RELEASE="YES"
  124. echo "use a WABT binary release instead of compiling from source code"
  125. ;;
  126. t)
  127. echo "set compile type of wamr " ${OPTARG}
  128. if [[ ${OPTARG} != "classic-interp" && ${OPTARG} != "fast-interp" \
  129. && ${OPTARG} != "jit" && ${OPTARG} != "aot"
  130. && ${OPTARG} != "fast-jit" && ${OPTARG} != "multi-tier-jit" ]]; then
  131. echo "*----- please varify a type of compile when using -t! -----*"
  132. help
  133. exit 1
  134. fi
  135. TYPE=(${OPTARG})
  136. ;;
  137. m)
  138. echo "set compile target of wamr" ${OPTARG}
  139. TARGET=$(echo "$OPTARG" | tr '[a-z]' '[A-Z]') # set target to uppercase if input x86_32 or x86_64 --> X86_32 and X86_64
  140. ;;
  141. w)
  142. echo "enable WASI threads"
  143. ENABLE_WASI_THREADS=1
  144. ;;
  145. M)
  146. echo "enable multi module feature"
  147. ENABLE_MULTI_MODULE=1
  148. ;;
  149. W)
  150. echo "enable wasm64(memory64) feature"
  151. ENABLE_MEMORY64=1
  152. ;;
  153. E)
  154. echo "enable multi memory feature(auto enable multi module)"
  155. ENABLE_MULTI_MEMORY=1
  156. ENABLE_MULTI_MODULE=1
  157. ;;
  158. C)
  159. echo "enable code coverage"
  160. COLLECT_CODE_COVERAGE=1
  161. ;;
  162. p)
  163. echo "enable multi thread feature"
  164. ENABLE_MULTI_THREAD=1
  165. ;;
  166. S)
  167. echo "enable SIMD feature"
  168. ENABLE_SIMD=1
  169. ;;
  170. X)
  171. echo "enable XIP feature"
  172. ENABLE_XIP=1
  173. ;;
  174. e)
  175. echo "enable exception handling feature"
  176. ENABLE_EH=1
  177. ;;
  178. x)
  179. echo "test SGX"
  180. SGX_OPT="--sgx"
  181. ;;
  182. g)
  183. echo "enable build iwasm with debug version"
  184. ENABLE_DEBUG_VERSION=1
  185. ;;
  186. v)
  187. echo "enable GC heap verification"
  188. ENABLE_GC_HEAP_VERIFY=1
  189. ;;
  190. G)
  191. echo "enable GC feature"
  192. ENABLE_GC=1
  193. ;;
  194. N)
  195. echo "enable extended const expression feature"
  196. ENABLE_EXTENDED_CONST_EXPR=1
  197. ;;
  198. P)
  199. PARALLELISM=1
  200. ;;
  201. Q)
  202. echo "enable QEMU"
  203. ENABLE_QEMU=1
  204. ;;
  205. F)
  206. echo "QEMU firmware" ${OPTARG}
  207. QEMU_FIRMWARE=${OPTARG}
  208. ;;
  209. j)
  210. echo "test platform " ${OPTARG}
  211. PLATFORM=${OPTARG}
  212. ;;
  213. T)
  214. echo "sanitizer is " ${OPTARG}
  215. WAMR_BUILD_SANITIZER=${OPTARG}
  216. ;;
  217. r)
  218. REQUIREMENT_NAME=$OPTARG
  219. # get next arg if there are multiple values after -r
  220. eval "nxarg=\${$((OPTIND))}"
  221. # loop until the next symbol '-' or the end of arguments
  222. while [[ "${nxarg}" =~ ^[0-9]+$ ]]; do
  223. SUBREQUIREMENT_IDS+=("$nxarg")
  224. OPTIND=$((OPTIND+1))
  225. eval "nxarg=\${$((OPTIND))}"
  226. done
  227. echo "Only Test requirement name: ${REQUIREMENT_NAME}"
  228. [[ ${#SUBREQUIREMENT_IDS[@]} -ne 0 ]] && echo "Choose subrequirement IDs: ${SUBREQUIREMENT_IDS[@]}"
  229. ;;
  230. A)
  231. echo "Using wamrc ${OPTARG}"
  232. WAMRC_CMD=${OPTARG}
  233. ;;
  234. ?)
  235. help
  236. exit 1
  237. ;;
  238. esac
  239. done
  240. # Parameters are not allowed, use options instead
  241. if [ -z "$OPT_PARSED" ];
  242. then
  243. if [ ! -z "$1" ];
  244. then
  245. help
  246. exit 1
  247. fi
  248. fi
  249. mkdir -p workspace
  250. cd workspace
  251. readonly WORK_DIR=$PWD
  252. readonly DATE=$(date +%Y-%m-%d_%H:%M:%S)
  253. readonly REPORT_DIR=${WORK_DIR}/report/${DATE}
  254. mkdir -p ${REPORT_DIR}
  255. readonly WAMR_DIR=${WORK_DIR}/../../..
  256. readonly REQUIREMENT_SCRIPT_DIR=${WORK_DIR}/../requirement-engineering-test-script
  257. if [[ ${SGX_OPT} == "--sgx" ]];then
  258. readonly IWASM_LINUX_ROOT_DIR="${WAMR_DIR}/product-mini/platforms/linux-sgx"
  259. readonly IWASM_CMD="${WAMR_DIR}/product-mini/platforms/linux-sgx/enclave-sample/iwasm"
  260. else
  261. readonly IWASM_LINUX_ROOT_DIR="${WAMR_DIR}/product-mini/platforms/${PLATFORM}"
  262. readonly IWASM_CMD="${WAMR_DIR}/product-mini/platforms/${PLATFORM}/build/iwasm"
  263. fi
  264. readonly WAMRC_CMD_DEFAULT="${WAMR_DIR}/wamr-compiler/build/wamrc"
  265. readonly CLASSIC_INTERP_COMPILE_FLAGS="\
  266. -DWAMR_BUILD_TARGET=${TARGET} \
  267. -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_INTERP=0 \
  268. -DWAMR_BUILD_JIT=0 -DWAMR_BUILD_AOT=0"
  269. readonly FAST_INTERP_COMPILE_FLAGS="\
  270. -DWAMR_BUILD_TARGET=${TARGET} \
  271. -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_INTERP=1 \
  272. -DWAMR_BUILD_JIT=0 -DWAMR_BUILD_AOT=0"
  273. # jit: report linking error if set COLLECT_CODE_COVERAGE,
  274. # now we don't collect code coverage of jit type
  275. readonly ORC_EAGER_JIT_COMPILE_FLAGS="\
  276. -DWAMR_BUILD_TARGET=${TARGET} \
  277. -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_FAST_INTERP=0 \
  278. -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_AOT=1 \
  279. -DWAMR_BUILD_LAZY_JIT=0"
  280. readonly ORC_LAZY_JIT_COMPILE_FLAGS="\
  281. -DWAMR_BUILD_TARGET=${TARGET} \
  282. -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_FAST_INTERP=0 \
  283. -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_AOT=1 \
  284. -DWAMR_BUILD_LAZY_JIT=1"
  285. readonly AOT_COMPILE_FLAGS="\
  286. -DWAMR_BUILD_TARGET=${TARGET} \
  287. -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_FAST_INTERP=0 \
  288. -DWAMR_BUILD_JIT=0 -DWAMR_BUILD_AOT=1"
  289. readonly FAST_JIT_COMPILE_FLAGS="\
  290. -DWAMR_BUILD_TARGET=${TARGET} \
  291. -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_INTERP=0 \
  292. -DWAMR_BUILD_JIT=0 -DWAMR_BUILD_AOT=0 \
  293. -DWAMR_BUILD_FAST_JIT=1"
  294. readonly MULTI_TIER_JIT_COMPILE_FLAGS="\
  295. -DWAMR_BUILD_TARGET=${TARGET} \
  296. -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_INTERP=0 \
  297. -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_JIT=1"
  298. readonly COMPILE_FLAGS=(
  299. "${CLASSIC_INTERP_COMPILE_FLAGS}"
  300. "${FAST_INTERP_COMPILE_FLAGS}"
  301. "${ORC_EAGER_JIT_COMPILE_FLAGS}"
  302. "${ORC_LAZY_JIT_COMPILE_FLAGS}"
  303. "${AOT_COMPILE_FLAGS}"
  304. "${FAST_JIT_COMPILE_FLAGS}"
  305. "${MULTI_TIER_JIT_COMPILE_FLAGS}"
  306. )
  307. function unit_test()
  308. {
  309. echo "Now start unit tests"
  310. cd ${WORK_DIR}
  311. rm -fr unittest-build
  312. echo "Build unit test"
  313. touch ${REPORT_DIR}/unit_test_report.txt
  314. cmake -S ${WORK_DIR}/../../unit -B unittest-build \
  315. -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE}
  316. cmake --build unittest-build
  317. ctest --test-dir unittest-build --output-on-failure | tee -a ${REPORT_DIR}/unit_test_report.txt
  318. echo "Finish unit tests"
  319. }
  320. function sightglass_test()
  321. {
  322. echo "Now start sightglass benchmark tests"
  323. cd ${WORK_DIR}/../sightglass/benchmarks
  324. # build iwasm first
  325. if [[ $1 == "classic-interp" || $1 == "fast-interp" ]];then
  326. ./test_interp.sh ${SGX_OPT}
  327. cp report.txt ${REPORT_DIR}/sightglass_$1_test_report.txt
  328. fi
  329. if [[ $1 == "aot" ]];then
  330. ./test_aot.sh ${SGX_OPT}
  331. cp report.txt ${REPORT_DIR}/sightglass_aot_test_report.txt
  332. fi
  333. if [[ $1 == "jit" ]];then
  334. [[ $TEST_ALL_AOT_RUNTIME ]] && ./test_aot.sh ${TEST_ALL_AOT_RUNTIME} ${SGX_OPT} \
  335. || ./test_aot.sh jit ${SGX_OPT}
  336. cp report.txt ${REPORT_DIR}/sightglass_jit_test_report.txt
  337. fi
  338. echo "Finish sightglass benchmark tests"
  339. }
  340. function setup_wabt()
  341. {
  342. # please sync with .github/actions/install-wasi-sdk-wabt/action.yml
  343. case ${PLATFORM} in
  344. cosmopolitan)
  345. ;;
  346. linux)
  347. WABT_URL=https://github.com/WebAssembly/wabt/releases/download/1.0.37/wabt-1.0.37-ubuntu-20.04.tar.gz
  348. WABT_VERSION=1.0.37
  349. ;;
  350. darwin)
  351. WABT_URL=https://github.com/WebAssembly/wabt/releases/download/1.0.36/wabt-1.0.36-macos-12.tar.gz
  352. WABT_VERSION=1.0.36
  353. ;;
  354. windows)
  355. WABT_URL=https://github.com/WebAssembly/wabt/releases/download/1.0.37/wabt-1.0.37-windows.tar.gz
  356. WABT_VERSION=1.0.37
  357. ;;
  358. *)
  359. echo "wabt platform for ${PLATFORM} in unknown"
  360. exit 1
  361. ;;
  362. esac
  363. if [ ${WABT_BINARY_RELEASE} == "YES" ]; then
  364. echo "download a binary release and install"
  365. local WAT2WASM=${WORK_DIR}/wabt/out/gcc/Release/wat2wasm
  366. if [ ! -f ${WAT2WASM} ]; then
  367. pushd /tmp
  368. wget -O wabt-tar.gz --progress=dot:giga ${WABT_URL}
  369. tar xf wabt-tar.gz
  370. popd
  371. mkdir -p ${WORK_DIR}/wabt/out/gcc/Release/
  372. cp /tmp/wabt-${WABT_VERSION}/bin/* ${WORK_DIR}/wabt/out/gcc/Release/
  373. fi
  374. else
  375. echo "download source code and compile and install"
  376. if [ ! -d "wabt" ];then
  377. echo "wabt not exist, clone it from github"
  378. git clone --recursive https://github.com/WebAssembly/wabt
  379. fi
  380. echo "upate wabt"
  381. cd wabt \
  382. && git fetch origin \
  383. && git reset --hard origin/main \
  384. && git checkout tags/${WABT_VERSION} -B ${WABT_VERSION} \
  385. && git submodule update --init \
  386. && cd .. \
  387. && make -C wabt gcc-release -j 4 || exit 1
  388. fi
  389. }
  390. function compile_reference_interpreter()
  391. {
  392. echo "compile the reference interpreter"
  393. pushd interpreter
  394. make
  395. if [ $? -ne 0 ]
  396. then
  397. echo "Failed to compile the reference interpreter"
  398. exit 1
  399. fi
  400. popd
  401. }
  402. # TODO: with iwasm only
  403. function spec_test()
  404. {
  405. local RUNNING_MODE="$1"
  406. echo "Now start spec tests"
  407. touch ${REPORT_DIR}/spec_test_report.txt
  408. cd ${WORK_DIR}
  409. # update basic test cases
  410. echo "downloading spec test cases..."
  411. rm -rf spec
  412. if [ ${ENABLE_MULTI_THREAD} == 1 ]; then
  413. echo "checkout spec from threads proposal"
  414. # check spec test cases for threads
  415. git clone -b main-legacy --single-branch https://github.com/WebAssembly/threads.git spec
  416. pushd spec
  417. # May 31, 2023 [interpreter] implement atomic.wait and atomic.notify (#194)
  418. git reset --hard 09f2831349bf409187abb6f7868482a8079f2264
  419. git apply --ignore-whitespace ../../spec-test-script/thread_proposal_ignore_cases.patch || exit 1
  420. git apply --ignore-whitespace ../../spec-test-script/thread_proposal_fix_atomic_case.patch || exit 1
  421. git apply --ignore-whitespace ../../spec-test-script/thread_proposal_remove_memory64_flag_case.patch
  422. elif [ ${ENABLE_EH} == 1 ]; then
  423. echo "checkout exception-handling test cases"
  424. git clone -b main --single-branch https://github.com/WebAssembly/exception-handling spec
  425. pushd spec
  426. # Jun 6, 2023 Merge branch 'upstream' into merge-upstream
  427. git reset --hard 51c721661b671bb7dc4b3a3acb9e079b49778d36
  428. git apply --ignore-whitespace ../../spec-test-script/exception_handling.patch || exit 1
  429. elif [[ ${ENABLE_GC} == 1 ]]; then
  430. echo "checkout spec for GC proposal"
  431. # check spec test cases for GC
  432. git clone -b main --single-branch https://github.com/WebAssembly/gc.git spec
  433. pushd spec
  434. # Dec 9, 2024. Merge branch 'funcref'
  435. git reset --hard 756060f5816c7e2159f4817fbdee76cf52f9c923
  436. git apply --ignore-whitespace ../../spec-test-script/gc_ignore_cases.patch || exit 1
  437. git apply --ignore-whitespace ../../spec-test-script/gc_array_fill_cases.patch || exit 1
  438. if [[ ${ENABLE_QEMU} == 1 ]]; then
  439. # Decrease the recursive count for tail call cases as nuttx qemu's
  440. # native stack size is much smaller
  441. git apply --ignore-whitespace ../../spec-test-script/gc_nuttx_tail_call.patch || exit 1
  442. fi
  443. # As of version 1.0.36, wabt is still unable to correctly handle the GC proposal.
  444. #
  445. # $ $ /opt/wabt-1.0.36/bin/wast2json --enable-all ../spec/test/core/br_if.wast
  446. #
  447. # ../spec/test/core/br_if.wast:670:26: error: unexpected token "null", expected a numeric index or a name (e.g. 12 or $foo).
  448. # (func $f (param (ref null $t)) (result funcref) (local.get 0))
  449. #
  450. compile_reference_interpreter
  451. elif [[ ${ENABLE_EXTENDED_CONST_EXPR} == 1 ]]; then
  452. echo "checkout spec for extended const expression proposal"
  453. git clone -b main --single-branch https://github.com/WebAssembly/extended-const.git spec
  454. pushd spec
  455. # Jan 14, 2025. README.md: Add note that this proposal is done (#20)
  456. git reset --hard 8d4f6aa2b00a8e7c0174410028625c6a176db8a1
  457. # ignore import table cases
  458. git apply --ignore-whitespace ../../spec-test-script/extended_const.patch || exit 1
  459. elif [[ ${ENABLE_MEMORY64} == 1 ]]; then
  460. echo "checkout spec for memory64 proposal"
  461. # check spec test cases for memory64
  462. git clone -b main --single-branch https://github.com/WebAssembly/memory64.git spec
  463. pushd spec
  464. # Reset to commit: "Merge remote-tracking branch 'upstream/main' into merge2"
  465. git reset --hard 48e69f394869c55b7bbe14ac963c09f4605490b6
  466. git checkout 044d0d2e77bdcbe891f7e0b9dd2ac01d56435f0b -- test/core/elem.wast test/core/data.wast
  467. # Patch table64 extension
  468. git checkout 940398cd4823522a9b36bec4984be4b153dedb81 -- test/core/call_indirect.wast test/core/table.wast test/core/table_copy.wast test/core/table_copy_mixed.wast test/core/table_fill.wast test/core/table_get.wast test/core/table_grow.wast test/core/table_init.wast test/core/table_set.wast test/core/table_size.wast
  469. git apply --ignore-whitespace ../../spec-test-script/memory64_ignore_cases.patch || exit 1
  470. elif [[ ${ENABLE_MULTI_MEMORY} == 1 ]]; then
  471. echo "checkout spec for multi memory proposal"
  472. # check spec test cases for multi memory
  473. git clone -b main --single-branch https://github.com/WebAssembly/multi-memory.git spec
  474. pushd spec
  475. # Reset to commit: "Merge pull request #48 from backes/specify-memcpy-immediate-order"
  476. git reset --hard fbc99efd7a788db300aec3dd62a14577ec404f1b
  477. git checkout 044d0d2e77bdcbe891f7e0b9dd2ac01d56435f0b -- test/core/elem.wast
  478. git apply --ignore-whitespace ../../spec-test-script/multi_memory_ignore_cases.patch || exit 1
  479. if [[ ${RUNNING_MODE} == "aot" ]]; then
  480. git apply --ignore-whitespace ../../spec-test-script/multi_module_aot_ignore_cases.patch || exit 1
  481. fi
  482. else
  483. echo "checkout spec for default proposal"
  484. git clone -b main --single-branch https://github.com/WebAssembly/spec
  485. pushd spec
  486. # Dec 20, 2024. Use WPT version of test harness for HTML core test conversion (#1859)
  487. git reset --hard f3a0e06235d2d84bb0f3b5014da4370613886965
  488. git apply --ignore-whitespace ../../spec-test-script/ignore_cases.patch || exit 1
  489. if [[ ${ENABLE_SIMD} == 1 ]]; then
  490. git apply --ignore-whitespace ../../spec-test-script/simd_ignore_cases.patch || exit 1
  491. fi
  492. if [[ ${ENABLE_MULTI_MODULE} == 1 ]]; then
  493. git apply --ignore-whitespace ../../spec-test-script/multi_module_ignore_cases.patch || exit 1
  494. if [[ ${RUNNING_MODE} == "aot" ]]; then
  495. git apply --ignore-whitespace ../../spec-test-script/multi_module_aot_ignore_cases.patch || exit 1
  496. fi
  497. fi
  498. fi
  499. popd
  500. echo $(pwd)
  501. #TODO: remove it when we can assume wabt is installed
  502. # especially for CI Or there is installation script in the project
  503. # that we can rely on
  504. setup_wabt
  505. ln -sf ${WORK_DIR}/../spec-test-script/all.py .
  506. ln -sf ${WORK_DIR}/../spec-test-script/runtest.py .
  507. local ARGS_FOR_SPEC_TEST=""
  508. if [[ 1 == ${ENABLE_MULTI_MODULE} ]]; then
  509. ARGS_FOR_SPEC_TEST+="-M "
  510. fi
  511. if [[ 1 == ${ENABLE_EH} ]]; then
  512. ARGS_FOR_SPEC_TEST+="-e "
  513. fi
  514. if [[ ${SGX_OPT} == "--sgx" ]];then
  515. ARGS_FOR_SPEC_TEST+="-x "
  516. fi
  517. if [[ ${ENABLE_SIMD} == 1 ]]; then
  518. ARGS_FOR_SPEC_TEST+="-S "
  519. fi
  520. if [[ ${ENABLE_MULTI_THREAD} == 1 ]]; then
  521. ARGS_FOR_SPEC_TEST+="-p "
  522. fi
  523. if [[ ${ENABLE_XIP} == 1 ]]; then
  524. ARGS_FOR_SPEC_TEST+="-X "
  525. fi
  526. # set the current running target
  527. ARGS_FOR_SPEC_TEST+="-m ${TARGET} "
  528. # require warmc only in aot mode
  529. if [[ $1 == 'aot' ]]; then
  530. ARGS_FOR_SPEC_TEST+="-t "
  531. ARGS_FOR_SPEC_TEST+="--aot-compiler ${WAMRC_CMD} "
  532. fi
  533. if [[ ${PARALLELISM} == 1 ]]; then
  534. ARGS_FOR_SPEC_TEST+="--parl "
  535. fi
  536. if [[ ${ENABLE_GC} == 1 ]]; then
  537. ARGS_FOR_SPEC_TEST+="--gc "
  538. fi
  539. if [[ ${ENABLE_EXTENDED_CONST_EXPR} == 1 ]]; then
  540. ARGS_FOR_SPEC_TEST+="--enable-extended-const "
  541. fi
  542. if [[ 1 == ${ENABLE_MEMORY64} ]]; then
  543. ARGS_FOR_SPEC_TEST+="--memory64 "
  544. fi
  545. # multi memory is only enabled in interp and aot mode
  546. if [[ 1 == ${ENABLE_MULTI_MEMORY} ]]; then
  547. if [[ $1 == 'classic-interp' || $1 == 'aot' ]]; then
  548. ARGS_FOR_SPEC_TEST+="--multi-memory "
  549. fi
  550. fi
  551. if [[ ${ENABLE_QEMU} == 1 ]]; then
  552. ARGS_FOR_SPEC_TEST+="--qemu "
  553. ARGS_FOR_SPEC_TEST+="--qemu-firmware ${QEMU_FIRMWARE} "
  554. fi
  555. if [[ ${PLATFORM} == "windows" ]]; then
  556. ARGS_FOR_SPEC_TEST+="--no-pty "
  557. fi
  558. # set log directory
  559. ARGS_FOR_SPEC_TEST+="--log ${REPORT_DIR}"
  560. cd ${WORK_DIR}
  561. echo "${PYTHON_EXE} ./all.py ${ARGS_FOR_SPEC_TEST} | tee -a ${REPORT_DIR}/spec_test_report.txt"
  562. ${PYTHON_EXE} ./all.py ${ARGS_FOR_SPEC_TEST} | tee -a ${REPORT_DIR}/spec_test_report.txt
  563. if [[ ${PIPESTATUS[0]} -ne 0 ]];then
  564. echo -e "\nspec tests FAILED" | tee -a ${REPORT_DIR}/spec_test_report.txt
  565. exit 1
  566. fi
  567. cd -
  568. echo -e "\nFinish spec tests" | tee -a ${REPORT_DIR}/spec_test_report.txt
  569. }
  570. function wamr_compiler_test()
  571. {
  572. if [[ $1 != "aot" ]]; then
  573. echo "WAMR compiler tests only support AOT mode, skip $1"
  574. return 0
  575. fi
  576. echo "Now start WAMR compiler tests"
  577. setup_wabt
  578. cd ${WORK_DIR}/../wamr-compiler-test-script
  579. ./run_wamr_compiler_tests.sh ${WORK_DIR}/wabt/out/gcc/Release/wat2wasm $WAMRC_CMD $IWASM_CMD \
  580. | tee -a ${REPORT_DIR}/wamr_compiler_test_report.txt
  581. ret=${PIPESTATUS[0]}
  582. if [[ ${ret} -ne 0 ]];then
  583. echo -e "\nWAMR compiler tests FAILED" | tee -a ${REPORT_DIR}/wamr_compiler_test_report.txt
  584. exit 1
  585. fi
  586. echo -e "\nFinish WAMR compiler tests" | tee -a ${REPORT_DIR}/wamr_compiler_test_report.txt
  587. }
  588. function wasi_certification_test()
  589. {
  590. echo "Now start wasi certification tests"
  591. cd ${WORK_DIR}
  592. if [ ! -d "wasi-testsuite" ]; then
  593. echo "wasi-testsuite not exist, clone it from github"
  594. git clone -b prod/testsuite-all \
  595. --single-branch https://github.com/WebAssembly/wasi-testsuite.git
  596. fi
  597. cd wasi-testsuite
  598. git reset --hard ${WASI_TESTSUITE_COMMIT}
  599. TSAN_OPTIONS=${TSAN_OPTIONS} bash ../../wasi-test-script/run_wasi_tests.sh $1 $TARGET $WASI_TEST_FILTER \
  600. | tee -a ${REPORT_DIR}/wasi_test_report.txt
  601. ret=${PIPESTATUS[0]}
  602. if [[ ${ret} -ne 0 ]];then
  603. echo -e "\nwasi tests FAILED" | tee -a ${REPORT_DIR}/wasi_test_report.txt
  604. exit 1
  605. fi
  606. echo -e "\nFinish wasi tests" | tee -a ${REPORT_DIR}/wasi_test_report.txt
  607. }
  608. function polybench_test()
  609. {
  610. echo "Now start polybench tests"
  611. cd ${WORK_DIR}/../polybench
  612. if [[ $1 == "aot" || $1 == "jit" ]];then
  613. ./build.sh AOT ${SGX_OPT}
  614. ./test_aot.sh $1 ${SGX_OPT}
  615. else
  616. ./build.sh
  617. ./test_interp.sh ${SGX_OPT}
  618. fi
  619. cp report.txt ${REPORT_DIR}/polybench_$1_test_report.txt
  620. echo "Finish polybench tests"
  621. }
  622. function libsodium_test()
  623. {
  624. echo "Now start libsodium tests"
  625. cd ${WORK_DIR}/../libsodium
  626. if [[ $1 == "aot" || $1 == "jit" ]];then
  627. ./build.sh ${SGX_OPT}
  628. ./test_aot.sh $1 ${SGX_OPT}
  629. else
  630. ./test_interp.sh ${SGX_OPT}
  631. fi
  632. cp report.txt ${REPORT_DIR}/libsodium_$1_test_report.txt
  633. echo "Finish libsodium tests"
  634. }
  635. function malformed_test()
  636. {
  637. # build iwasm firstly
  638. cd ${WORK_DIR}/../../malformed
  639. ./malformed_test.py --run ${IWASM_CMD} | tee ${REPORT_DIR}/malfomed_$1_test_report.txt
  640. }
  641. function collect_standalone()
  642. {
  643. if [[ ${COLLECT_CODE_COVERAGE} == 1 ]]; then
  644. pushd ${WORK_DIR} > /dev/null 2>&1
  645. CODE_COV_FILE=""
  646. if [[ -z "${CODE_COV_FILE}" ]]; then
  647. CODE_COV_FILE="${WORK_DIR}/wamr.lcov"
  648. else
  649. CODE_COV_FILE="${CODE_COV_FILE}"
  650. fi
  651. STANDALONE_DIR=${WORK_DIR}/../../standalone
  652. echo "Collect code coverage of standalone dump-call-stack"
  653. ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/dump-call-stack/build"
  654. echo "Collect code coverage of standalone dump-mem-profiling"
  655. ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/dump-mem-profiling/build"
  656. echo "Collect code coverage of standalone dump-perf-profiling"
  657. ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/dump-perf-profiling/build"
  658. if [[ $1 == "aot" ]]; then
  659. echo "Collect code coverage of standalone pad-test"
  660. ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/pad-test/build"
  661. fi
  662. echo "Collect code coverage of standalone test-invoke-native"
  663. ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/test-invoke-native/build"
  664. echo "Collect code coverage of standalone test-running-modes"
  665. ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/test-running-modes/build"
  666. echo "Collect code coverage of standalone test-running-modes/c-embed"
  667. ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/test-running-modes/c-embed/build"
  668. echo "Collect code coverage of standalone test-ts2"
  669. ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/test-ts2/build"
  670. echo "Collect code coverage of standalone test-module-malloc"
  671. ./collect_coverage.sh "${CODE_COV_FILE}" "${STANDALONE_DIR}/test-module-malloc/build"
  672. popd > /dev/null 2>&1
  673. fi
  674. }
  675. function standalone_test()
  676. {
  677. if [[ ${COLLECT_CODE_COVERAGE} == 1 ]]; then
  678. export COLLECT_CODE_COVERAGE=1
  679. fi
  680. cd ${WORK_DIR}/../../standalone
  681. args="--$1"
  682. [[ ${SGX_OPT} == "--sgx" ]] && args="$args --sgx" || args="$args --no-sgx"
  683. [[ ${ENABLE_MULTI_THREAD} == 1 ]] && args="$args --thread" || args="$args --no-thread"
  684. [[ ${ENABLE_SIMD} == 1 ]] && args="$args --simd" || args="$args --no-simd"
  685. args="$args ${TARGET}"
  686. ./standalone.sh $args | tee ${REPORT_DIR}/standalone_$1_test_report.txt
  687. collect_standalone "$1"
  688. }
  689. function build_iwasm_with_cfg()
  690. {
  691. echo "Build iwasm with compile flags " $* " for spec test" \
  692. | tee -a ${REPORT_DIR}/spec_test_report.txt
  693. if [[ ${SGX_OPT} == "--sgx" ]];then
  694. cd ${WAMR_DIR}/product-mini/platforms/linux-sgx \
  695. && if [ -d build ]; then rm -rf build/*; else mkdir build; fi \
  696. && cd build \
  697. && cmake $* .. \
  698. && make -j 4
  699. cd ${WAMR_DIR}/product-mini/platforms/linux-sgx/enclave-sample \
  700. && make clean \
  701. && make SPEC_TEST=1
  702. else
  703. cd ${WAMR_DIR}/product-mini/platforms/${PLATFORM} \
  704. && if [ -d build ]; then rm -rf build/*; else mkdir build; fi \
  705. && cd build \
  706. && cmake $* .. \
  707. && cmake --build . -j 4 --config RelWithDebInfo --target iwasm
  708. fi
  709. if [ "$?" != 0 ];then
  710. echo -e "build iwasm failed"
  711. exit 1
  712. fi
  713. if [[ ${PLATFORM} == "cosmopolitan" ]]; then
  714. # convert from APE to ELF so it can be ran easier
  715. # HACK: link to linux so tests work when platform is detected by uname
  716. cp iwasm.com iwasm \
  717. && ./iwasm --assimilate \
  718. && rm -rf ../../linux/build \
  719. && mkdir ../../linux/build \
  720. && ln -s ../../cosmopolitan/build/iwasm ../../linux/build/iwasm
  721. if [ "$?" != 0 ];then
  722. echo -e "build iwasm failed (cosmopolitan)"
  723. exit 1
  724. fi
  725. fi
  726. }
  727. function build_wamrc()
  728. {
  729. if [[ "${TARGET_LIST[*]}" =~ "${TARGET}" ]]; then
  730. echo "suppose wamrc is already built"
  731. return
  732. fi
  733. BUILD_LLVM_SH=build_llvm.sh
  734. if [ ${TARGET} = "XTENSA" ]; then
  735. BUILD_LLVM_SH=build_llvm_xtensa.sh
  736. fi
  737. echo "Build wamrc for spec test under aot compile type"
  738. cd ${WAMR_DIR}/wamr-compiler \
  739. && ./${BUILD_LLVM_SH} \
  740. && if [ -d build ]; then rm -r build/*; else mkdir build; fi \
  741. && cd build \
  742. && cmake .. \
  743. -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE} \
  744. -DWAMR_BUILD_SHRUNK_MEMORY=0 \
  745. -DWAMR_BUILD_EXTENDED_CONST_EXPR=${ENABLE_EXTENDED_CONST_EXPR} \
  746. && make -j 4
  747. }
  748. ### Need to add a test suite?
  749. ### The function name should be ${suite_name}_test
  750. # function xxx_test()
  751. # {
  752. #
  753. # }
  754. function collect_coverage()
  755. {
  756. if [[ ${COLLECT_CODE_COVERAGE} == 1 ]]; then
  757. ln -sf ${WORK_DIR}/../spec-test-script/collect_coverage.sh ${WORK_DIR}
  758. CODE_COV_FILE=""
  759. if [[ -z "${CODE_COV_FILE}" ]]; then
  760. CODE_COV_FILE="${WORK_DIR}/wamr.lcov"
  761. else
  762. CODE_COV_FILE="${CODE_COV_FILE}"
  763. fi
  764. pushd ${WORK_DIR} > /dev/null 2>&1
  765. echo "Collect code coverage of iwasm"
  766. ./collect_coverage.sh ${CODE_COV_FILE} ${IWASM_LINUX_ROOT_DIR}/build
  767. if [[ $1 == "llvm-aot" ]]; then
  768. echo "Collect code coverage of wamrc"
  769. ./collect_coverage.sh ${CODE_COV_FILE} ${WAMR_DIR}/wamr-compiler/build
  770. fi
  771. for suite in "${TEST_CASE_ARR[@]}"; do
  772. if [[ ${suite} = "unit" ]]; then
  773. echo "Collect code coverage of unit test"
  774. ./collect_coverage.sh ${CODE_COV_FILE} ${WORK_DIR}/unittest-build
  775. break
  776. fi
  777. done
  778. popd > /dev/null 2>&1
  779. else
  780. echo "code coverage isn't collected"
  781. fi
  782. }
  783. # decide whether execute test cases in current running mode based on the current configuration or not
  784. # return 1 if the test case should be executed, otherwise return 0
  785. function do_execute_in_running_mode()
  786. {
  787. local RUNNING_MODE="$1"
  788. # filter out uncompatible running mode based on targeting proposal features
  789. # keep alpha order
  790. if [[ ${ENABLE_EH} -eq 1 ]]; then
  791. if [[ "${RUNNING_MODE}" != "classic-interp" ]]; then
  792. echo "support exception handling in classic-interp"
  793. return 0;
  794. fi
  795. fi
  796. if [[ ${ENABLE_GC} -eq 1 ]]; then
  797. if [[ "${RUNNING_MODE}" != "classic-interp" \
  798. && "${RUNNING_MODE}" != "fast-interp" \
  799. && "${RUNNING_MODE}" != "jit" \
  800. && "${RUNNING_MODE}" != "aot" ]]; then
  801. echo "support gc in both interp modes, llvm-jit mode and aot mode"
  802. return 0;
  803. fi
  804. fi
  805. if [[ ${ENABLE_MEMORY64} -eq 1 ]]; then
  806. if [[ "${RUNNING_MODE}" != "classic-interp" \
  807. && "${RUNNING_MODE}" != "aot" ]]; then
  808. echo "support memory64(wasm64) in classic-interp mode and aot mode"
  809. return 0
  810. fi
  811. fi
  812. if [[ ${ENABLE_MULTI_MEMORY} -eq 1 ]]; then
  813. if [[ "${RUNNING_MODE}" != "classic-interp" ]]; then
  814. echo "support multi-memory in classic-interp mode mode"
  815. return 0
  816. fi
  817. fi
  818. if [[ ${ENABLE_MULTI_MODULE} -eq 1 ]]; then
  819. if [[ "${RUNNING_MODE}" != "classic-interp" \
  820. && "${RUNNING_MODE}" != "fast-interp" \
  821. && "${RUNNING_MODE}" != "aot" ]]; then
  822. echo "support multi-module in both interp modes"
  823. return 0
  824. fi
  825. fi
  826. if [[ ${ENABLE_SIMD} -eq 1 ]]; then
  827. if [[ "${RUNNING_MODE}" != "jit" && "${RUNNING_MODE}" != "aot" && "${RUNNING_MODE}" != "fast-interp" ]]; then
  828. echo "support simd in llvm-jit, aot and fast-interp mode"
  829. return 0;
  830. fi
  831. fi
  832. # filter out uncompatible running mode based on SGX support
  833. if [[ ${SGX_OPT} == "--sgx" ]]; then
  834. if [[ "${RUNNING_MODE}" != "classic-interp" \
  835. && "${RUNNING_MODE}" != "fast-interp" \
  836. && "${RUNNING_MODE}" != "aot" \
  837. && "${RUNNING_MODE}" != "fast-jit" ]]; then
  838. echo "support sgx in both interp modes, fast-jit mode and aot mode"
  839. return 0
  840. fi
  841. fi
  842. # filter out uncompatible running mode based on architecture
  843. if [[ ${TARGET} == "X86_32" ]]; then
  844. if [[ "${RUNNING_MODE}" == "jit" || "${RUNNING_MODE}" == "fast-jit" || "${RUNNING_MODE}" == "multi-tier-jit" ]]; then
  845. echo "both llvm-jit, fast-jit and multi-tier-jit mode do not support X86_32 target"
  846. return 0;
  847. fi
  848. if [[ ${ENABLE_MEMORY64} -eq 1 ]]; then
  849. echo "memory64 does not support X86_32 target"
  850. return 0;
  851. fi
  852. if [[ ${ENABLE_MULTI_MEMORY} -eq 1 ]]; then
  853. echo "multi-memory does not support X86_32 target"
  854. return 0;
  855. fi
  856. if [[ ${ENABLE_SIMD} -eq 1 ]]; then
  857. echo "simd does not support X86_32 target"
  858. return 0;
  859. fi
  860. fi
  861. # by default, always execute the test case
  862. return 1
  863. }
  864. function trigger()
  865. {
  866. # return if TEST_CASE_ARR is empty
  867. if [[ -z "${TEST_CASE_ARR[@]}" ]]; then
  868. echo "TEST_CASE_ARR is empty, NO test case to run"
  869. return
  870. fi
  871. # Print all the test cases to be executed
  872. echo "Following test cases to be executed: "
  873. for suite in "${TEST_CASE_ARR[@]}"; do
  874. echo " - " $suite"_test"
  875. done
  876. # Check if REQUIREMENT_NAME is set, if set, only calling requirement test and early return
  877. if [[ -n $REQUIREMENT_NAME ]]; then
  878. python ${REQUIREMENT_SCRIPT_DIR}/run_requirement.py -o ${REPORT_DIR}/ -r "$REQUIREMENT_NAME" "${SUBREQUIREMENT_IDS[@]}"
  879. # early return with the python script exit status
  880. return $?
  881. fi
  882. local EXTRA_COMPILE_FLAGS=""
  883. # for spec test
  884. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SPEC_TEST=1"
  885. EXTRA_COMPILE_FLAGS+=" -DCOLLECT_CODE_COVERAGE=${COLLECT_CODE_COVERAGE}"
  886. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SHRUNK_MEMORY=0"
  887. # default enabled features
  888. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_BULK_MEMORY=1"
  889. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_REF_TYPES=1"
  890. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_LIBC_WASI=0"
  891. if [[ ${ENABLE_MULTI_MODULE} == 1 ]];then
  892. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_MULTI_MODULE=1"
  893. else
  894. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_MULTI_MODULE=0"
  895. fi
  896. if [[ ${ENABLE_MEMORY64} == 1 ]];then
  897. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_MEMORY64=1"
  898. else
  899. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_MEMORY64=0"
  900. fi
  901. if [[ ${ENABLE_MULTI_MEMORY} == 1 ]];then
  902. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_MULTI_MEMORY=1"
  903. else
  904. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_MULTI_MEMORY=0"
  905. fi
  906. if [[ ${ENABLE_MULTI_THREAD} == 1 ]];then
  907. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_LIB_PTHREAD=1"
  908. fi
  909. if [[ ${ENABLE_SIMD} == 1 ]]; then
  910. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SIMD=1"
  911. else
  912. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SIMD=0"
  913. fi
  914. if [[ ${ENABLE_GC} == 1 ]]; then
  915. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_GC=1"
  916. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_BULK_MEMORY=1"
  917. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_TAIL_CALL=1"
  918. fi
  919. if [[ ${ENABLE_EXTENDED_CONST_EXPR} == 1 ]]; then
  920. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_EXTENDED_CONST_EXPR=1"
  921. fi
  922. if [[ ${ENABLE_DEBUG_VERSION} == 1 ]]; then
  923. EXTRA_COMPILE_FLAGS+=" -DCMAKE_BUILD_TYPE=Debug"
  924. fi
  925. if [[ ${ENABLE_GC_HEAP_VERIFY} == 1 ]]; then
  926. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_GC_HEAP_VERIFY=1"
  927. fi
  928. if [[ ${ENABLE_WASI_THREADS} == 1 ]]; then
  929. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_LIB_WASI_THREADS=1"
  930. fi
  931. if [[ ${ENABLE_EH} == 1 ]]; then
  932. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_EXCE_HANDLING=1"
  933. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_TAIL_CALL=1"
  934. fi
  935. if [[ -n "$WAMR_BUILD_SANITIZER" ]]; then
  936. echo "Setting run with sanitizer(s): $WAMR_BUILD_SANITIZER"
  937. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=$WAMR_BUILD_SANITIZER"
  938. fi
  939. # Make sure we're using the builtin WASI libc implementation
  940. # if we're running the wasi certification tests.
  941. if [[ $TEST_CASE_ARR ]]; then
  942. for test in "${TEST_CASE_ARR[@]}"; do
  943. if [[ "$test" == "wasi_certification" ]]; then
  944. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_WASI_TEST=1"
  945. fi
  946. if [[ "$test" == "wasi_certification"
  947. || "$test" == "standalone" ]]; then
  948. EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_LIBC_UVWASI=0 -DWAMR_BUILD_LIBC_WASI=1"
  949. break
  950. fi
  951. done
  952. fi
  953. for t in "${TYPE[@]}"; do
  954. do_execute_in_running_mode $t
  955. if [[ $? -eq 1 ]]; then
  956. echo "execute in running mode" $t
  957. else
  958. echo "skip in running mode" $t
  959. continue
  960. fi
  961. case $t in
  962. "classic-interp")
  963. # classic-interp
  964. BUILD_FLAGS="$CLASSIC_INTERP_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
  965. if [[ ${ENABLE_QEMU} == 0 ]]; then
  966. build_iwasm_with_cfg $BUILD_FLAGS
  967. fi
  968. for suite in "${TEST_CASE_ARR[@]}"; do
  969. $suite"_test" classic-interp
  970. done
  971. collect_coverage classic-interp
  972. ;;
  973. "fast-interp")
  974. # fast-interp
  975. BUILD_FLAGS="$FAST_INTERP_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
  976. if [[ ${ENABLE_QEMU} == 0 ]]; then
  977. build_iwasm_with_cfg $BUILD_FLAGS
  978. fi
  979. for suite in "${TEST_CASE_ARR[@]}"; do
  980. $suite"_test" fast-interp
  981. done
  982. collect_coverage fast-interp
  983. ;;
  984. "jit")
  985. echo "work in orc jit eager compilation mode"
  986. BUILD_FLAGS="$ORC_EAGER_JIT_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
  987. build_iwasm_with_cfg $BUILD_FLAGS
  988. for suite in "${TEST_CASE_ARR[@]}"; do
  989. $suite"_test" jit
  990. done
  991. collect_coverage llvm-jit
  992. echo "work in orc jit lazy compilation mode"
  993. BUILD_FLAGS="$ORC_LAZY_JIT_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
  994. build_iwasm_with_cfg $BUILD_FLAGS
  995. for suite in "${TEST_CASE_ARR[@]}"; do
  996. $suite"_test" jit
  997. done
  998. collect_coverage llvm-jit
  999. ;;
  1000. "aot")
  1001. echo "work in aot mode"
  1002. # aot
  1003. BUILD_FLAGS="$AOT_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
  1004. if [[ ${ENABLE_QEMU} == 0 ]]; then
  1005. build_iwasm_with_cfg $BUILD_FLAGS
  1006. fi
  1007. if [ -z "${WAMRC_CMD}" ]; then
  1008. build_wamrc
  1009. WAMRC_CMD=${WAMRC_CMD_DEFAULT}
  1010. fi
  1011. for suite in "${TEST_CASE_ARR[@]}"; do
  1012. $suite"_test" aot
  1013. done
  1014. collect_coverage llvm-aot
  1015. ;;
  1016. "fast-jit")
  1017. echo "work in fast-jit mode"
  1018. # fast-jit
  1019. BUILD_FLAGS="$FAST_JIT_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
  1020. build_iwasm_with_cfg $BUILD_FLAGS
  1021. for suite in "${TEST_CASE_ARR[@]}"; do
  1022. $suite"_test" fast-jit
  1023. done
  1024. collect_coverage fast-jit
  1025. ;;
  1026. "multi-tier-jit")
  1027. echo "work in multi-tier-jit mode"
  1028. # multi-tier-jit
  1029. BUILD_FLAGS="$MULTI_TIER_JIT_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
  1030. build_iwasm_with_cfg $BUILD_FLAGS
  1031. for suite in "${TEST_CASE_ARR[@]}"; do
  1032. $suite"_test" multi-tier-jit
  1033. done
  1034. collect_coverage multi-tier-jit
  1035. ;;
  1036. *)
  1037. echo "unexpected mode, do nothing"
  1038. ;;
  1039. esac
  1040. done
  1041. }
  1042. function remove_empty_elements()
  1043. {
  1044. # Remove empty elements from the array
  1045. local arr=("$@")
  1046. local new_arr=()
  1047. for element in "${arr[@]}"; do
  1048. if [[ -n "$element" ]]; then
  1049. new_arr+=("$element")
  1050. fi
  1051. done
  1052. echo "${new_arr[@]}"
  1053. }
  1054. if [[ $TEST_CASE_ARR ]];then
  1055. # Check if 'unit' is in TEST_CASE_ARR
  1056. if [[ " ${TEST_CASE_ARR[@]} " =~ " unit " ]]; then
  1057. # unit test cases are designed with specific compilation flags
  1058. # and run under specific modes.
  1059. # There is no need to loop through all running modes in this script.
  1060. unit_test || (echo "TEST FAILED"; exit 1)
  1061. collect_coverage unit
  1062. # remove 'unit' from TEST_CASE_ARR
  1063. TEST_CASE_ARR=("${TEST_CASE_ARR[@]/unit}")
  1064. # remove empty elements from TEST_CASE_ARR
  1065. TEST_CASE_ARR=($(remove_empty_elements "${TEST_CASE_ARR[@]}"))
  1066. fi
  1067. # loop others through all running modes
  1068. trigger || (echo "TEST FAILED"; exit 1)
  1069. else
  1070. # test all suite, ignore polybench and libsodium because of long time cost
  1071. TEST_CASE_ARR=("spec" "malformed" "standalone")
  1072. : '
  1073. if [[ $COLLECT_CODE_COVERAGE == 1 ]];then
  1074. # add polybench if collecting code coverage data
  1075. TEST_CASE_ARR+=("polybench")
  1076. # add libsodium if needed, which takes long time to run
  1077. TEST_CASE_ARR+=("libsodium")
  1078. fi
  1079. '
  1080. # loop through all running modes
  1081. trigger || (echo "TEST FAILED"; exit 1)
  1082. # Add more suites here
  1083. fi
  1084. echo -e "Test finish. Reports are under ${REPORT_DIR}"
  1085. DEBUG set +exv
  1086. DEBUG set +o pipefail
  1087. echo "TEST SUCCESSFUL"
  1088. exit 0