kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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