Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,9 @@ foreach(SDK ${SWIFT_SDKS})
set(SWIFT_HAVE_LIBXML2 FALSE)
endif()

set(VARIANT_EXTERNAL_EMBEDDED_PLATFORM FALSE)
set(VARIANT_EXTERNAL_EMBEDDED_DEVICE)

swift_configure_lit_site_cfg(
"${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in"
"${test_bin_dir}/lit.site.cfg"
Expand Down Expand Up @@ -524,6 +527,28 @@ foreach(SDK ${SWIFT_SDKS})
endforeach()
endforeach()

if(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB_CROSS_COMPILING)
set(VARIANT_SUFFIX "-embedded-armv7")
set(VARIANT_TRIPLE "armv7em-none-none-eabi")
set(VARIANT_EXTERNAL_EMBEDDED_PLATFORM TRUE)
set(VARIANT_EXTERNAL_EMBEDDED_DEVICE "arm-qemu-stm32f4")
set(SWIFT_TEST_RESULTS_DIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/swift-test-results/${VARIANT_TRIPLE}")
swift_configure_lit_site_cfg(
"${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in"
"${CMAKE_CURRENT_BINARY_DIR}${VARIANT_SUFFIX}/lit.site.cfg"
"test${VARIANT_SUFFIX}.lit.site.cfg")

set(VARIANT_SUFFIX "-embedded-avr")
set(VARIANT_TRIPLE "avr-none-none-elf")
set(VARIANT_EXTERNAL_EMBEDDED_PLATFORM TRUE)
set(VARIANT_EXTERNAL_EMBEDDED_DEVICE "avr-qemu-atmega2560")
set(SWIFT_TEST_RESULTS_DIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/swift-test-results/${VARIANT_TRIPLE}")
swift_configure_lit_site_cfg(
"${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in"
"${CMAKE_CURRENT_BINARY_DIR}${VARIANT_SUFFIX}/lit.site.cfg"
"test${VARIANT_SUFFIX}.lit.site.cfg")
endif()

# Add shortcuts for the default variant.
foreach(test_mode ${TEST_MODES})
foreach(test_subset ${TEST_SUBSETS})
Expand Down
4 changes: 2 additions & 2 deletions test/Driver/LegacyDriver/lit.local.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ config.environment = dict(config.environment)

# Remove the settings that force tests to use the old driver so that tests
# in this directory can set `SWIFT_USE_NEW_DRIVER` to test those code paths.
del config.environment['SWIFT_USE_OLD_DRIVER']
del config.environment['SWIFT_AVOID_WARNING_USING_OLD_DRIVER']
if 'SWIFT_USE_OLD_DRIVER' in config.environment: del config.environment['SWIFT_USE_OLD_DRIVER']
if 'SWIFT_AVOID_WARNING_USING_OLD_DRIVER' in config.environment: del config.environment['SWIFT_AVOID_WARNING_USING_OLD_DRIVER']
4 changes: 2 additions & 2 deletions test/Profiler/lit.local.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
config.environment = dict(config.environment)

# Prefer the new driver for profiling tests
del config.environment['SWIFT_USE_OLD_DRIVER']
del config.environment['SWIFT_AVOID_WARNING_USING_OLD_DRIVER']
if 'SWIFT_USE_OLD_DRIVER' in config.environment: del config.environment['SWIFT_USE_OLD_DRIVER']
if 'SWIFT_AVOID_WARNING_USING_OLD_DRIVER' in config.environment: del config.environment['SWIFT_AVOID_WARNING_USING_OLD_DRIVER']
9 changes: 9 additions & 0 deletions test/embedded/hello.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// RUN: %target-run-simple-swift(-enable-experimental-feature Embedded -runtime-compatibility-version none -wmo) | %FileCheck %s

// REQUIRES: swift_in_compiler
// REQUIRES: executable_test
// REQUIRES: OS=macosx || OS=linux-gnu || OS=none-eabi || OS=none-elf

print("Hello, Embedded Swift!")

// CHECK: Hello, Embedded Swift!
3 changes: 3 additions & 0 deletions test/embedded/lit.local.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,6 @@ if config.target_sdk_name == 'macosx':
if 'embedded_stdlib' not in config.available_features:
config.unsupported = True

config.environment = dict(config.environment)
if 'SWIFT_USE_OLD_DRIVER' in config.environment: del config.environment['SWIFT_USE_OLD_DRIVER']
if 'SWIFT_AVOID_WARNING_USING_OLD_DRIVER' in config.environment: del config.environment['SWIFT_AVOID_WARNING_USING_OLD_DRIVER']
87 changes: 87 additions & 0 deletions test/lit.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,7 @@ config.swift_demangle_yamldump = inferSwiftBinary('swift-demangle-yamldump')
config.swift_demangle = inferSwiftBinary('swift-demangle')
config.benchmark_o = inferSwiftBinary('Benchmark_O')
config.benchmark_driver = inferSwiftBinary('Benchmark_Driver')
config.lld = inferSwiftBinary('lld')
config.wasm_ld = inferSwiftBinary('wasm-ld')
config.swift_plugin_server = inferSwiftBinary('swift-plugin-server')
config.swift_parse_test = inferSwiftBinary('swift-parse-test')
Expand Down Expand Up @@ -451,6 +452,8 @@ if run_os == 'openbsd' and run_cpu == 'amd64':
run_ptrsize = '64' if ('64' in run_cpu or run_cpu == "s390x") else '32'
if run_cpu == 'arm64_32':
run_ptrsize = '32'
if run_cpu == 'avr':
run_ptrsize = '16'

run_ptrauth = 'ptrauth' if run_cpu == 'arm64e' else 'noptrauth'
run_endian = 'little' if run_cpu != 's390x' else 'big'
Expand Down Expand Up @@ -2052,6 +2055,90 @@ elif run_os == 'wasi':
# The Swift interpreter is not available when targeting WebAssembly/WASI.
config.available_features.discard('swift_interpreter')

elif config.external_embedded_platform:
lit_config.note("Testing embedded platform " + config.variant_triple)

config.target_object_format = "elf"
config.target_sdk_name = "embedded"
config.target_runtime = "native"
config.target_shared_library_prefix = 'lib'
config.target_shared_library_suffix = ".so"
config.target_library_path_var = "LD_LIBRARY_PATH"

config.target_swift_autolink_extract = inferSwiftBinary("swift-autolink-extract")

embedded_test_support = os.path.join(config.swift_utils, 'embedded-test-support/embedded-test-support.py')
PATH = config.environment['PATH']

device = config.external_embedded_device
embedded_swift_flags = subprocess.check_output([embedded_test_support, "--device", device, "print-swift-flags"], env=config.environment).rstrip().decode('utf-8')
embedded_swift_frontend_flags = subprocess.check_output([embedded_test_support, "--device", device, "print-swift-frontend-flags"], env=config.environment).rstrip().decode('utf-8')
embedded_clang_flags = subprocess.check_output([embedded_test_support, "--device", device, "print-c-flags"], env=config.environment).rstrip().decode('utf-8')

config.target_build_swift = ' '.join([
config.swiftc,
'-target', config.variant_triple,
embedded_swift_flags,
mcp_opt, config.swift_test_options,
config.swift_driver_test_options, swift_execution_tests_extra_flags])
config.target_codesign = "echo"
config.target_build_swift_dylib = (
"%s -parse-as-library -emit-library -static -o '\\1'"
% (config.target_build_swift))
config.target_add_rpath = ''
config.target_swift_frontend = ' '.join([
config.swift_frontend,
'-target', config.variant_triple, embedded_swift_frontend_flags,
config.resource_dir_opt, mcp_opt,
config.swift_test_options, config.swift_frontend_test_options])
subst_target_swift_frontend_mock_sdk = config.target_swift_frontend
subst_target_swift_frontend_mock_sdk_after = ""
config.target_run = embedded_test_support + ' --device %s run --elf-file ' % device
config.target_env_prefix = ''

config.target_sil_opt = (
'%s -target %s %s %s %s' %
(config.sil_opt, config.variant_triple, config.resource_dir_opt, mcp_opt, config.sil_test_options))
subst_target_sil_opt_mock_sdk = config.target_sil_opt
subst_target_sil_opt_mock_sdk_after = ""
config.target_swift_symbolgraph_extract = ' '.join([
config.swift_symbolgraph_extract,
'-target', config.variant_triple,
mcp_opt])
config.target_swift_synthesize_interface = ' '.join([
config.swift_synthesize_interface,
'-target', config.variant_triple,
mcp_opt])
config.target_swift_ide_test = (
'%s -target %s %s %s %s %s' %
(config.swift_ide_test, config.variant_triple, config.resource_dir_opt,
mcp_opt, ccp_opt, config.swift_ide_test_test_options))
subst_target_swift_ide_test_mock_sdk = config.target_swift_ide_test
subst_target_swift_ide_test_mock_sdk_after = ""
config.target_swiftc_driver = (
"%s -target %s -toolchain-stdlib-rpath %s %s" %
(config.swiftc, config.variant_triple, config.resource_dir_opt, mcp_opt))
config.target_stdlib_swiftc_driver = config.target_swiftc_driver
config.target_swift_modulewrap = (
'%s -modulewrap -target %s' %
(config.swiftc, config.variant_triple))
config.target_swift_emit_pcm = (
'%s -emit-pcm -target %s' %
(config.swiftc, config.variant_triple))
config.target_clang = (
"%s -target %s %s %s" %
(config.clang, config.variant_triple, embedded_clang_flags, clang_mcp_opt))
config.target_ld = (
"%s -L%r" %
(config.lld, make_path(test_resource_dir, config.target_sdk_name)))

config.available_features.discard('swift_interpreter')

config.excludes += ['Unit']

if 'SWIFT_USE_OLD_DRIVER' in config.environment: del config.environment['SWIFT_USE_OLD_DRIVER']
if 'SWIFT_AVOID_WARNING_USING_OLD_DRIVER' in config.environment: del config.environment['SWIFT_AVOID_WARNING_USING_OLD_DRIVER']

else:
lit_config.fatal("Don't know how to define target_run and "
"target_build_swift for platform " + config.variant_triple)
Expand Down
2 changes: 2 additions & 0 deletions test/lit.site.cfg.in
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ config.target_triple = "@LLVM_TARGET_TRIPLE@"
config.variant_triple = "@VARIANT_TRIPLE@"
config.variant_sdk = "@VARIANT_SDK@"
config.variant_suffix = "@VARIANT_SUFFIX@"
config.external_embedded_platform = "@VARIANT_EXTERNAL_EMBEDDED_PLATFORM@" == "TRUE"
config.external_embedded_device = "@VARIANT_EXTERNAL_EMBEDDED_DEVICE@"
config.swiftlib_dir = "@LIT_SWIFTLIB_DIR@"
config.swift_test_results_dir = \
lit_config.params.get("swift_test_results_dir", "@SWIFT_TEST_RESULTS_DIR@")
Expand Down
13 changes: 13 additions & 0 deletions utils/embedded-test-support/arm-qemu-stm32f1/linkerscript.ld
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
MEMORY
{
flash : ORIGIN = 0x08000000, LENGTH = 32K
sram : ORIGIN = 0x20000000, LENGTH = 8K
}

SECTIONS
{
.text : { *(.vectors*) ; *(.text*) } > flash
.bss : { *(.bss*) } > sram
.data : { *(.data*) } > sram
/DISCARD/ : { *(.swift_modhash*) }
}
64 changes: 64 additions & 0 deletions utils/embedded-test-support/arm-qemu-stm32f1/support.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2024 Apple Inc. and the Swift project authors.
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

#include <stddef.h>
#include <stdint.h>

int main(int argc, char *argv[]);
void qemu_exit(void);
int puts(const char *);

__attribute__((noreturn))
void reset(void) {
main(0, NULL);
qemu_exit();
__builtin_trap();
}

void interrupt(void) {
puts("INTERRUPT\n");
qemu_exit();
while (1) {
}
}

__attribute__((aligned(4))) char stack[2048];

__attribute((used))
__attribute((section(".vectors"))) void *vector_table[114] = {
(void *)&stack[2048 - 4], // initial SP
reset, // Reset

interrupt, // NMI
interrupt, // HardFault
interrupt, // MemManage
interrupt, // BusFault
interrupt, // UsageFault

0 // NULL for all the other handlers
};

void qemu_exit() {
__asm__ volatile("mov r0, #0x18");
__asm__ volatile("movw r1, #0x0026");
__asm__ volatile("movt r1, #0x2"); // construct 0x20026 in r1
__asm__ volatile("bkpt #0xab");
}

int putchar(int c) {
// This is only valid in an emulator (QEMU), and it's skipping a proper configuration of the UART device
// and waiting for a "ready to transit" state.

// STM32F1 specific location of USART1 and its DR register
*(volatile uint32_t *)(0x40013800 + 0x04) = c;
return c;
}
13 changes: 13 additions & 0 deletions utils/embedded-test-support/arm-qemu-stm32f4/linkerscript.ld
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
MEMORY
{
flash : ORIGIN = 0x08000000, LENGTH = 32K
sram : ORIGIN = 0x20000000, LENGTH = 128K
}

SECTIONS
{
.text : { *(.vectors*) ; *(.text*) } > flash
.bss : { *(.bss*) } > sram
.data : { *(.data*) } > sram
/DISCARD/ : { *(.swift_modhash*) }
}
64 changes: 64 additions & 0 deletions utils/embedded-test-support/arm-qemu-stm32f4/support.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2024 Apple Inc. and the Swift project authors.
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

#include <stddef.h>
#include <stdint.h>

int main(int argc, char *argv[]);
void qemu_exit(void);
int puts(const char *);

__attribute__((noreturn))
void reset(void) {
main(0, NULL);
qemu_exit();
__builtin_trap();
}

void interrupt(void) {
puts("INTERRUPT\n");
qemu_exit();
while (1) {
}
}

__attribute__((aligned(4))) char stack[8192];

__attribute((used))
__attribute((section(".vectors"))) void *vector_table[114] = {
(void *)&stack[8192 - 4], // initial SP
reset, // Reset

interrupt, // NMI
interrupt, // HardFault
interrupt, // MemManage
interrupt, // BusFault
interrupt, // UsageFault

0 // NULL for all the other handlers
};

void qemu_exit() {
__asm__ volatile("mov r0, #0x18");
__asm__ volatile("movw r1, #0x0026");
__asm__ volatile("movt r1, #0x2"); // construct 0x20026 in r1
__asm__ volatile("bkpt #0xab");
}

int putchar(int c) {
// This is only valid in an emulator (QEMU), and it's skipping a proper configuration of the UART device
// and waiting for a "ready to transit" state.

// STM32F4 specific location of USART1 and its DR register
*(volatile uint32_t *)(0x40011000 + 0x04) = c;
return c;
}
15 changes: 15 additions & 0 deletions utils/embedded-test-support/avr-qemu-atmega2560/linkerscript.ld
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
MEMORY
{
flash_boot : ORIGIN = 0x00000000, LENGTH = 0x200
flash_sram : ORIGIN = 0x00000200, LENGTH = 7K
flash_stack : ORIGIN = 0x00001e00, LENGTH = 1K
flash_text : ORIGIN = 0x00002200, LENGTH = 32K
}

SECTIONS
{
.boot : { *(.start) } > flash_boot
.data : { *(.bss*) ; *(.data*) ; *(.rodata*) } > flash_sram
.text : { *(.text*) } > flash_text
/DISCARD/ : { *(.swift_modhash*) }
}
Loading