arm32_macros.sh (4975B)
1 #!/usr/bin/env bash 2 # test/smoke/arm32_macros.sh — verify kit's arm-none-eabi __ARM_* predefined 3 # macro set for the -march / -mcpu / -mfpu / -mfloat-abi axes. 4 # 5 # kit's `cc -E` has no `-dM` dump, so the macro set is asserted with a 6 # #error-guarded compile: a probe TU enumerates the expected (and the 7 # must-NOT-be-defined) macros for a configuration; `kit cc -fsyntax-only` 8 # succeeds iff the predefines match. This needs only `kit` (no qemu/lld), so it 9 # runs independently of the behavioral-oracle prerequisites. 10 # 11 # When host clang has the arm-none-eabi target, the probe set is ALSO 12 # cross-checked against `clang -dM -E` for the same configuration — clang is the 13 # authority for the __ARM_* values. If clang is absent the cross-check is 14 # skipped (the kit-internal #error assertions still run). 15 16 set -u 17 ROOT="$(cd "$(dirname "$0")/../.." && pwd)" 18 BUILD_DIR="$ROOT/build/test/smoke-arm32-macros" 19 mkdir -p "$BUILD_DIR" 20 21 KIT_KIT_DIR="$ROOT/test/lib" 22 # shellcheck source=../lib/kit_sh_kit.sh 23 . "$ROOT/test/lib/kit_sh_kit.sh" 24 kit_report_init 25 KIT_SKIP_IS_FAILURE=0 26 27 KIT="$ROOT/build/kit" 28 CLANG="${ARM32_CLANG:-clang}" 29 30 # Does host clang have the arm-none-eabi target (for the cross-check)? 31 HAVE_CLANG=0 32 if command -v "$CLANG" >/dev/null 2>&1 && 33 echo 'int e(void){return 0;}' | 34 "$CLANG" --target=arm-none-eabi -mcpu=cortex-m3 -mthumb -mfloat-abi=soft \ 35 -ffreestanding -nostdlib -c -x c - -o /dev/null >/dev/null 2>&1; then 36 HAVE_CLANG=1 37 fi 38 39 # kit_macro_case <name> <kit-flags...> -- <expect-defined...> // <expect-undef...> 40 # Builds a probe TU and asserts kit's predefines via #error, then (if clang is 41 # available) confirms clang agrees on the same defined/undefined split. 42 kit_macro_case() { 43 local name="$1"; shift 44 local flags=() 45 while [ "$1" != "--" ]; do flags+=("$1"); shift; done 46 shift 47 local defined=() 48 while [ "$1" != "//" ]; do defined+=("$1"); shift; done 49 shift 50 local undef=("$@") 51 52 local src="$BUILD_DIR/$name.c" 53 : > "$src" 54 local m 55 for m in "${defined[@]}"; do 56 printf '#if !defined(%s)\n#error "%s: expected %s defined"\n#endif\n' \ 57 "$m" "$name" "$m" >> "$src" 58 done 59 for m in "${undef[@]}"; do 60 printf '#if defined(%s)\n#error "%s: did not expect %s defined"\n#endif\n' \ 61 "$m" "$name" "$m" >> "$src" 62 done 63 printf 'int probe_%s;\n' "$(echo "$name" | tr -c 'A-Za-z0-9_' '_')" >> "$src" 64 65 if "$KIT" cc -target arm-none-eabi "${flags[@]}" -ffreestanding \ 66 -fsyntax-only "$src" >/dev/null 2>"$BUILD_DIR/$name.kit.err"; then 67 kit_pass "macros/$name (kit)" 68 else 69 kit_fail "macros/$name (kit)" "$(cat "$BUILD_DIR/$name.kit.err")" 70 fi 71 72 if [ "$HAVE_CLANG" -eq 1 ]; then 73 # kit is soft-float-only; clang defaults some cores (e.g. cortex-m4) to an 74 # FPU, so pin -mfloat-abi=soft to make the comparison apples-to-apples. 75 local dm 76 dm="$("$CLANG" --target=arm-none-eabi "${flags[@]}" -mfloat-abi=soft \ 77 -ffreestanding -dM -E - </dev/null 2>/dev/null)" 78 local ok=1 msg="" 79 for m in "${defined[@]}"; do 80 if ! printf '%s\n' "$dm" | grep -q "^#define $m\b"; then 81 ok=0; msg="$msg clang-missing:$m" 82 fi 83 done 84 for m in "${undef[@]}"; do 85 if printf '%s\n' "$dm" | grep -q "^#define $m\b"; then 86 ok=0; msg="$msg clang-has:$m" 87 fi 88 done 89 if [ "$ok" -eq 1 ]; then 90 kit_pass "macros/$name (clang agrees)" 91 else 92 kit_fail "macros/$name (clang agrees)" "$msg" 93 fi 94 fi 95 } 96 97 # ---- armv7-m baseline (Cortex-M3, soft) ----------------------------------- 98 kit_macro_case "cortex-m3" -mcpu=cortex-m3 -- \ 99 __arm__ __ARMEL__ __THUMBEL__ __thumb__ __thumb2__ __THUMB_INTERWORK__ \ 100 __ELF__ __ARM_32BIT_STATE __ARM_ACLE __ARM_ARCH __ARM_ARCH_PROFILE \ 101 __ARM_ARCH_ISA_THUMB __ARM_EABI__ __ARM_PCS __ARM_FEATURE_CLZ \ 102 __ARM_FEATURE_QBIT __ARM_FEATURE_SAT __ARM_FEATURE_UNALIGNED \ 103 __ARM_FEATURE_LDREX __ARM_FEATURE_COPROC __ARM_FEATURE_IDIV \ 104 __ARM_ARCH_EXT_IDIV__ __ARM_FP16_FORMAT_IEEE __ARM_FP16_ARGS \ 105 __ARM_SIZEOF_WCHAR_T __ARM_SIZEOF_MINIMAL_ENUM __VFP_FP__ \ 106 __ARM_ARCH_7M__ __SOFTFP__ \ 107 // \ 108 __ARM_ARCH_7EM__ __ARM_FEATURE_DSP __ARM_FEATURE_SIMD32 __ARM_FP \ 109 __ARM_PCS_VFP __ARM_FP_FAST 110 111 # ---- armv7e-m via -march (DSP, soft) -------------------------------------- 112 kit_macro_case "march-armv7e-m" -march=armv7e-m -- \ 113 __ARM_ARCH_7EM__ __ARM_FEATURE_DSP __ARM_FEATURE_SIMD32 __SOFTFP__ \ 114 // \ 115 __ARM_ARCH_7M__ __ARM_FP __ARM_PCS_VFP 116 117 # ---- cortex-m4 (DSP via -mcpu, soft) -------------------------------------- 118 kit_macro_case "cortex-m4" -mcpu=cortex-m4 -- \ 119 __ARM_ARCH_7EM__ __ARM_FEATURE_DSP __ARM_FEATURE_SIMD32 __SOFTFP__ \ 120 // \ 121 __ARM_ARCH_7M__ __ARM_FP __ARM_PCS_VFP 122 123 # ---- cortex-m7 (DSP via -mcpu, soft) -------------------------------------- 124 kit_macro_case "cortex-m7" -mcpu=cortex-m7 -- \ 125 __ARM_ARCH_7EM__ __ARM_FEATURE_DSP __ARM_FEATURE_SIMD32 __SOFTFP__ \ 126 // \ 127 __ARM_ARCH_7M__ __ARM_FP __ARM_PCS_VFP 128 129 kit_summary test-smoke-arm32-macros 130 kit_exit