@@ -134,7 +134,14 @@ option(
134134 the tools every time you update llvm-project."
135135 ON
136136)
137-
137+ set (
138+ FVP_INSTALL_DIR
139+ "${CMAKE_CURRENT_SOURCE_DIR} /fvp/install" CACHE STRING
140+ "The directory in which the FVP models are installed. These are not
141+ included in this repository, but can be downloaded by the script
142+ fvp/get_fvps.sh"
143+ )
144+ set (FVP_CONFIG_DIR "${CMAKE_CURRENT_SOURCE_DIR} /fvp/config" )
138145set (LLVM_TOOLCHAIN_C_LIBRARY
139146 "picolibc" CACHE STRING
140147 "Which C library to use."
@@ -393,6 +400,19 @@ if(LLVM_TOOLCHAIN_C_LIBRARY STREQUAL llvmlibc)
393400 # find one for every libc type. We have no current setup to run the LLVM
394401 # libc test suite.
395402 add_custom_target (check-llvmlibc)
403+
404+ # LLVM libc lacks a configuration for AArch64, but the AArch32 one works
405+ # fine. However, setting the configuration for both architectures to the
406+ # arm config directory means the baremetal config.json is never loaded,
407+ # as it resides in the directory above. To ensure both are used, copy
408+ # them to the same location and point libc to that.
409+ set (LIBC_CFG_DIR ${CMAKE_BINARY_DIR} /llvmlibc-config)
410+ file (COPY
411+ ${llvmproject_SOURCE_DIR} /libc/config/baremetal/config.json
412+ ${llvmproject_SOURCE_DIR} /libc/config/baremetal/arm/.
413+ DESTINATION
414+ ${LIBC_CFG_DIR}
415+ )
396416endif ()
397417
398418add_subdirectory (
@@ -632,7 +652,7 @@ set(LLVM_DEFAULT_EXTERNAL_LIT "${LLVM_BINARY_DIR}/bin/llvm-lit")
632652
633653add_custom_target (check-newlib) # FIXME: put things in this
634654
635- function (get_test_executor_params target_triple qemu_machine qemu_cpu qemu_params)
655+ function (get_qemu_params target_triple qemu_machine qemu_cpu qemu_params)
636656 if (target_triple MATCHES "^aarch64" )
637657 set (qemu_command "qemu-system-aarch64" )
638658 else ()
@@ -656,6 +676,24 @@ function(get_test_executor_params target_triple qemu_machine qemu_cpu qemu_param
656676 set (test_executor_params "${test_executor_params} " PARENT_SCOPE)
657677endfunction ()
658678
679+ function (get_fvp_params fvp_model fvp_config)
680+ set (
681+ test_executor_params
682+ --fvp-install -dir ${FVP_INSTALL_DIR}
683+ --fvp-config-dir ${FVP_CONFIG_DIR}
684+ --fvp-model ${fvp_model}
685+ )
686+ string (REPLACE " " ";" fvp_config_list ${fvp_config} )
687+ foreach (cfg ${fvp_config_list} )
688+ set (
689+ test_executor_params
690+ ${test_executor_params}
691+ --fvp-config ${cfg}
692+ )
693+ endforeach ()
694+ set (test_executor_params "${test_executor_params} " PARENT_SCOPE)
695+ endfunction ()
696+
659697function (
660698 add_picolibc
661699 directory
@@ -671,6 +709,7 @@ function(
671709 default_ram_addr
672710 default_ram_size
673711 default_stack_size
712+ run_tests
674713)
675714 if (CMAKE_INSTALL_MESSAGE STREQUAL NEVER)
676715 set (MESON_INSTALL_QUIET "--quiet" )
@@ -753,10 +792,12 @@ function(
753792 # only in tests step, otherwise, they would be built before install.
754793 ExternalProject_Add_StepDependencies(picolibc_${variant} test compiler_rt_${variant} -install )
755794
756- add_custom_target (check-picolibc-${variant} )
757- add_dependencies (check-picolibc-${variant} picolibc_${variant} -test )
758- add_dependencies (check-picolibc check-picolibc-${variant} )
759- add_dependencies (llvm-toolchain-runtimes picolibc_${variant} )
795+ if (run_tests)
796+ add_custom_target (check-picolibc-${variant} )
797+ add_dependencies (check-picolibc-${variant} picolibc_${variant} -test )
798+ add_dependencies (check-picolibc check-picolibc-${variant} )
799+ add_dependencies (llvm-toolchain-runtimes picolibc_${variant} )
800+ endif ()
760801endfunction ()
761802
762803function (
@@ -913,7 +954,7 @@ function(
913954 ${common_cmake_args}
914955 -DLIBC_TARGET_TRIPLE=${target_triple}
915956 -DLIBC_HDRGEN_EXE=${LIBC_HDRGEN}
916- -DLIBC_CONFIG_PATH=${llvmproject_SOURCE_DIR} /libc/config/baremetal/arm # llvmlibc has no AArch64 bare-metal configuration, but the AArch32 one is fine
957+ -DLIBC_CONFIG_PATH=${LIBC_CFG_DIR}
917958 -DLIBC_CONF_TIME_64BIT=ON
918959 -DLLVM_CMAKE_DIR=${LLVM_BINARY_DIR} /lib/cmake/llvm
919960 -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON
@@ -985,6 +1026,7 @@ macro(
9851026 default_ram_addr
9861027 default_ram_size
9871028 default_stack_size
1029+ run_tests
9881030)
9891031 # It would be nice to just pass ${ARGN} to both the underlying functions,
9901032 # but that has the side effect of expanding any list arguments (e.g.
@@ -1006,6 +1048,7 @@ macro(
10061048 "${default_ram_addr} "
10071049 "${default_ram_size} "
10081050 "${default_stack_size} "
1051+ "${run_tests} "
10091052 )
10101053 elseif (LLVM_TOOLCHAIN_C_LIBRARY STREQUAL newlib)
10111054 add_newlib(
@@ -1317,9 +1360,12 @@ function(add_library_variant target_arch)
13171360 COMPILE_FLAGS
13181361 MULTILIB_FLAGS
13191362 PICOLIBC_BUILD_TYPE
1363+ EXECUTOR
13201364 QEMU_MACHINE
13211365 QEMU_CPU
13221366 QEMU_PARAMS
1367+ FVP_MODEL
1368+ FVP_CONFIG
13231369 BOOT_FLASH_ADDRESS
13241370 BOOT_FLASH_SIZE
13251371 FLASH_ADDRESS
@@ -1365,17 +1411,36 @@ function(add_library_variant target_arch)
13651411
13661412 set (directory "${TARGET_LIBRARIES_DIR}${library_subdir} /${parent_dir_name} /${variant} " )
13671413 set (VARIANT_COMPILE_FLAGS "--target=${target_triple} ${VARIANT_COMPILE_FLAGS} " )
1368- get_test_executor_params(
1369- "${target_triple} "
1370- "${VARIANT_QEMU_MACHINE} "
1371- "${VARIANT_QEMU_CPU} "
1372- "${VARIANT_QEMU_PARAMS} "
1373- )
1374- set (
1375- lit_test_executor
1376- ${CMAKE_CURRENT_SOURCE_DIR} /test -support/lit-exec-qemu.py
1377- ${test_executor_params}
1378- )
1414+
1415+ if (VARIANT_EXECUTOR STREQUAL "fvp" )
1416+ if (EXISTS "${FVP_INSTALL_DIR} " )
1417+ get_fvp_params(
1418+ "${VARIANT_FVP_MODEL} "
1419+ "${VARIANT_FVP_CONFIG} "
1420+ )
1421+ set (
1422+ lit_test_executor
1423+ ${CMAKE_CURRENT_SOURCE_DIR} /test -support/lit-exec-fvp.py
1424+ ${test_executor_params}
1425+ )
1426+ set (have_executor TRUE )
1427+ else ()
1428+ set (have_executor FALSE )
1429+ endif ()
1430+ else ()
1431+ get_qemu_params(
1432+ "${target_triple} "
1433+ "${VARIANT_QEMU_MACHINE} "
1434+ "${VARIANT_QEMU_CPU} "
1435+ "${VARIANT_QEMU_PARAMS} "
1436+ )
1437+ set (
1438+ lit_test_executor
1439+ ${CMAKE_CURRENT_SOURCE_DIR} /test -support/lit-exec-qemu.py
1440+ ${test_executor_params}
1441+ )
1442+ set (have_executor TRUE )
1443+ endif ()
13791444 list (JOIN lit_test_executor " " lit_test_executor)
13801445 if (NOT PREBUILT_TARGET_LIBRARIES)
13811446 add_libc(
@@ -1392,6 +1457,7 @@ function(add_library_variant target_arch)
13921457 "${VARIANT_RAM_ADDRESS} "
13931458 "${VARIANT_RAM_SIZE} "
13941459 "${VARIANT_STACK_SIZE} "
1460+ "${have_executor} "
13951461 )
13961462 add_compiler_rt(
13971463 "${directory} "
@@ -1414,7 +1480,9 @@ function(add_library_variant target_arch)
14141480 ${VARIANT_ENABLE_RTTI}
14151481 )
14161482 endif ()
1417- if (VARIANT_COMPILE_FLAGS MATCHES "-march=armv8" )
1483+ if (NOT have_executor)
1484+ message ("All library tests disabled for ${variant} , due to missing executor" )
1485+ elseif (VARIANT_COMPILE_FLAGS MATCHES "-march=armv8" )
14181486 message ("C++ runtime libraries tests disabled for ${variant} " )
14191487 else ()
14201488 add_custom_target (check-llvm-toolchain-runtimes-${variant} )
@@ -1443,16 +1511,39 @@ function(add_library_variant target_arch)
14431511 set (multilib_yaml_content "${multilib_yaml_content} " PARENT_SCOPE)
14441512endfunction ()
14451513
1514+ function (add_nonexistent_library_variant)
1515+ set (
1516+ one_value_args
1517+ MULTILIB_FLAGS
1518+ ERROR_MESSAGE
1519+ )
1520+ cmake_parse_arguments (ERR "" "${one_value_args} " "" ${ARGN} )
1521+
1522+ string (APPEND multilib_yaml_content "- FatalError: \" ${ERR_ERROR_MESSAGE} \"\n " )
1523+
1524+ string (APPEND multilib_yaml_content " Flags:\n " )
1525+ string (REPLACE " " ";" multilib_flags_list ${ERR_MULTILIB_FLAGS} )
1526+ foreach (flag ${multilib_flags_list} )
1527+ string (APPEND multilib_yaml_content " - ${flag} \n " )
1528+ endforeach ()
1529+ string (APPEND multilib_yaml_content " Group: stdlibs\n " )
1530+
1531+ set (multilib_yaml_content "${multilib_yaml_content} " PARENT_SCOPE)
1532+ endfunction ()
1533+
14461534function (add_library_variants_for_cpu target_arch)
14471535 set (
14481536 one_value_args
14491537 SUFFIX
14501538 COMPILE_FLAGS
14511539 MULTILIB_FLAGS
14521540 PICOLIBC_BUILD_TYPE
1541+ EXECUTOR
14531542 QEMU_MACHINE
14541543 QEMU_CPU
14551544 QEMU_PARAMS
1545+ FVP_MODEL
1546+ FVP_CONFIG
14561547 BOOT_FLASH_ADDRESS
14571548 BOOT_FLASH_SIZE
14581549 FLASH_ADDRESS
@@ -1482,9 +1573,12 @@ function(add_library_variants_for_cpu target_arch)
14821573 COMPILE_FLAGS "${VARIANT_COMPILE_FLAGS} "
14831574 MULTILIB_FLAGS "${VARIANT_MULTILIB_FLAGS} "
14841575 PICOLIBC_BUILD_TYPE "${VARIANT_PICOLIBC_BUILD_TYPE} "
1576+ EXECUTOR "${VARIANT_EXECUTOR} "
14851577 QEMU_MACHINE "${VARIANT_QEMU_MACHINE} "
14861578 QEMU_CPU "${VARIANT_QEMU_CPU} "
14871579 QEMU_PARAMS "${VARIANT_QEMU_PARAMS} "
1580+ FVP_MODEL "${VARIANT_FVP_MODEL} "
1581+ FVP_CONFIG "${VARIANT_FVP_CONFIG} "
14881582 BOOT_FLASH_ADDRESS "${VARIANT_BOOT_FLASH_ADDRESS} "
14891583 BOOT_FLASH_SIZE "${VARIANT_BOOT_FLASH_SIZE} "
14901584 FLASH_ADDRESS "${VARIANT_FLASH_ADDRESS} "
@@ -1856,20 +1950,28 @@ add_library_variants_for_cpu(
18561950 RAM_SIZE 0x1000000
18571951 STACK_SIZE 4K
18581952)
1859- # FIXME: qemu currently has no support for PACBTI-M, so the branch protection
1860- # variants below can't be fully tested in runtime. Since PACBTI-M instructions
1861- # are NOP-compatible we can use the cortex-m55 CPU for now, but these should be
1862- # updated to use a PACBTI-M enabled CPU once this is available.
1953+ add_nonexistent_library_variant(
1954+ # We don't build any MVE-capable libraries with the soft-float ABI.
1955+ # We do have Armv7-M soft-float libraries, but you can't fall back to
1956+ # using those, because MVE requires the FPSCR to be set up specially
1957+ # at startup time, and our v7-M soft-float libraries don't do that.
1958+ #
1959+ # So, rather than select one of those libraries and silently generate
1960+ # wrong MVE code, we force an error report instead.
1961+ MULTILIB_FLAGS "--target=thumbv8.1m.main-unknown-none-eabi -march=thumbv8.1m.main+mve"
1962+ ERROR_MESSAGE "No library available for MVE with soft-float ABI. Try -mfloat-abi=hard."
1963+ )
18631964add_library_variants_for_cpu(
18641965 armv8.1m.main
18651966 SUFFIX soft_nofp_nomve_pacret_bti
1866- COMPILE_FLAGS "-mfloat-abi=soft -march=armv8.1m.main+nomve -mfpu=none -mbranch-protection=standard "
1867- MULTILIB_FLAGS "--target=thumbv8.1m.main-unknown-none-eabi -mfpu=none -mbranch-protection=standard "
1967+ COMPILE_FLAGS "-mfloat-abi=soft -march=armv8.1m.main+nomve+pacbti -mfpu=none -mbranch-protection=pac-ret+bti "
1968+ MULTILIB_FLAGS "--target=thumbv8.1m.main-unknown-none-eabi -mfpu=none -mbranch-protection=pac-ret+bti "
18681969 PICOLIBC_BUILD_TYPE "release"
1869- QEMU_MACHINE "mps3-an547"
1870- QEMU_CPU "cortex-m55"
1871- BOOT_FLASH_ADDRESS 0x00000000
1872- BOOT_FLASH_SIZE 512K
1970+ EXECUTOR fvp
1971+ FVP_MODEL corstone-310
1972+ FVP_CONFIG "cortex-m85 m-pacbti m-nofp mve-none"
1973+ BOOT_FLASH_ADDRESS 0x01000000
1974+ BOOT_FLASH_SIZE 2M
18731975 FLASH_ADDRESS 0x60000000
18741976 FLASH_SIZE 0x1000000
18751977 RAM_ADDRESS 0x61000000
@@ -1879,13 +1981,14 @@ add_library_variants_for_cpu(
18791981add_library_variants_for_cpu(
18801982 armv8.1m.main
18811983 SUFFIX hard_fp_nomve_pacret_bti
1882- COMPILE_FLAGS "-mfloat-abi=hard -march=armv8.1m.main+nomve -mfpu=fp-armv8-fullfp16-sp-d16 -mbranch-protection=standard "
1883- MULTILIB_FLAGS "--target=thumbv8.1m.main-unknown-none-eabihf -march=thumbv8.1m.main+fp16 -mfpu=fp-armv8-fullfp16-sp-d16 -mbranch-protection=standard "
1984+ COMPILE_FLAGS "-mfloat-abi=hard -march=armv8.1m.main+nomve+pacbti -mfpu=fp-armv8-fullfp16-sp-d16 -mbranch-protection=pac-ret+bti "
1985+ MULTILIB_FLAGS "--target=thumbv8.1m.main-unknown-none-eabihf -march=thumbv8.1m.main+fp16 -mfpu=fp-armv8-fullfp16-sp-d16 -mbranch-protection=pac-ret+bti "
18841986 PICOLIBC_BUILD_TYPE "release"
1885- QEMU_MACHINE "mps3-an547"
1886- QEMU_CPU "cortex-m55"
1887- BOOT_FLASH_ADDRESS 0x00000000
1888- BOOT_FLASH_SIZE 512K
1987+ EXECUTOR fvp
1988+ FVP_MODEL corstone-310
1989+ FVP_CONFIG "cortex-m85 m-pacbti m-fp mve-none"
1990+ BOOT_FLASH_ADDRESS 0x01000000
1991+ BOOT_FLASH_SIZE 2M
18891992 FLASH_ADDRESS 0x60000000
18901993 FLASH_SIZE 0x1000000
18911994 RAM_ADDRESS 0x61000000
@@ -1895,13 +1998,14 @@ add_library_variants_for_cpu(
18951998add_library_variants_for_cpu(
18961999 armv8.1m.main
18972000 SUFFIX hard_fpdp_nomve_pacret_bti
1898- COMPILE_FLAGS "-mfloat-abi=hard -march=armv8.1m.main+nomve -mfpu=fp-armv8-fullfp16-d16 -mbranch-protection=standard "
1899- MULTILIB_FLAGS "--target=thumbv8.1m.main-unknown-none-eabihf -march=thumbv8.1m.main+fp16 -mfpu=fp-armv8-fullfp16-d16 -mbranch-protection=standard "
2001+ COMPILE_FLAGS "-mfloat-abi=hard -march=armv8.1m.main+nomve+pacbti -mfpu=fp-armv8-fullfp16-d16 -mbranch-protection=pac-ret+bti "
2002+ MULTILIB_FLAGS "--target=thumbv8.1m.main-unknown-none-eabihf -march=thumbv8.1m.main+fp16 -mfpu=fp-armv8-fullfp16-d16 -mbranch-protection=pac-ret+bti "
19002003 PICOLIBC_BUILD_TYPE "release"
1901- QEMU_MACHINE "mps3-an547"
1902- QEMU_CPU "cortex-m55"
1903- BOOT_FLASH_ADDRESS 0x00000000
1904- BOOT_FLASH_SIZE 512K
2004+ EXECUTOR fvp
2005+ FVP_MODEL corstone-310
2006+ FVP_CONFIG "cortex-m85 m-pacbti m-fp mve-none"
2007+ BOOT_FLASH_ADDRESS 0x01000000
2008+ BOOT_FLASH_SIZE 2M
19052009 FLASH_ADDRESS 0x60000000
19062010 FLASH_SIZE 0x1000000
19072011 RAM_ADDRESS 0x61000000
@@ -1911,13 +2015,14 @@ add_library_variants_for_cpu(
19112015add_library_variants_for_cpu(
19122016 armv8.1m.main
19132017 SUFFIX hard_nofp_mve_pacret_bti
1914- COMPILE_FLAGS "-mfloat-abi=hard -march=armv8.1m.main+mve -mfpu=none -mbranch-protection=standard "
1915- MULTILIB_FLAGS "--target=thumbv8.1m.main-unknown-none-eabihf -march=thumbv8.1m.main+mve -mfpu=none -mbranch-protection=standard "
2018+ COMPILE_FLAGS "-mfloat-abi=hard -march=armv8.1m.main+mve+pacbti -mfpu=none -mbranch-protection=pac-ret+bti "
2019+ MULTILIB_FLAGS "--target=thumbv8.1m.main-unknown-none-eabihf -march=thumbv8.1m.main+mve -mfpu=none -mbranch-protection=pac-ret+bti "
19162020 PICOLIBC_BUILD_TYPE "release"
1917- QEMU_MACHINE "mps3-an547"
1918- QEMU_CPU "cortex-m55"
1919- BOOT_FLASH_ADDRESS 0x00000000
1920- BOOT_FLASH_SIZE 512K
2021+ EXECUTOR fvp
2022+ FVP_MODEL corstone-310
2023+ FVP_CONFIG "cortex-m85 m-pacbti m-nofp mve-int"
2024+ BOOT_FLASH_ADDRESS 0x01000000
2025+ BOOT_FLASH_SIZE 2M
19212026 FLASH_ADDRESS 0x60000000
19222027 FLASH_SIZE 0x1000000
19232028 RAM_ADDRESS 0x61000000
0 commit comments