diff options
author | 2017-07-21 21:33:46 -0500 | |
---|---|---|
committer | 2017-07-21 21:33:46 -0500 | |
commit | 8c3fb0e7cd30a8a29589808fa336bf2c24b55250 (patch) | |
tree | 5e39d89480713711400aa40eefe84e5b2eb511b1 | |
parent | 83ab03c7798fb6badb1c687de9e1ca5f90778591 (diff) | |
parent | a1d223528d534391805699d9714d78e213e9c471 (diff) | |
download | cortex-m-8c3fb0e7cd30a8a29589808fa336bf2c24b55250.tar.gz cortex-m-8c3fb0e7cd30a8a29589808fa336bf2c24b55250.tar.zst cortex-m-8c3fb0e7cd30a8a29589808fa336bf2c24b55250.zip |
Merge pull request #27 from japaric/handlers
define handlers as weak aliases of DEFAULT_HANDLER
-rw-r--r-- | cortex-m-rt/CHANGELOG.md | 5 | ||||
-rw-r--r-- | cortex-m-rt/src/lib.rs | 124 |
2 files changed, 34 insertions, 95 deletions
diff --git a/cortex-m-rt/CHANGELOG.md b/cortex-m-rt/CHANGELOG.md index 653c55e..b210b23 100644 --- a/cortex-m-rt/CHANGELOG.md +++ b/cortex-m-rt/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Fixed + +- Remove duplication of default exception handlers. This saves 32 bytes of Flash + memory (.text). + ## [v0.3.4] - 2017-07-19 ### Changed diff --git a/cortex-m-rt/src/lib.rs b/cortex-m-rt/src/lib.rs index 9543fbf..2968252 100644 --- a/cortex-m-rt/src/lib.rs +++ b/cortex-m-rt/src/lib.rs @@ -284,6 +284,7 @@ #![deny(warnings)] #![feature(asm)] #![feature(compiler_builtins_lib)] +#![feature(global_asm)] #![feature(lang_items)] #![feature(linkage)] #![feature(naked_functions)] @@ -371,108 +372,41 @@ unsafe extern "C" fn reset_handler() -> ! { } } -#[allow(non_snake_case)] -#[allow(private_no_mangle_fns)] -#[cfg(target_arch = "arm")] -#[linkage = "weak"] -#[naked] -#[no_mangle] -extern "C" fn NMI() { - unsafe { - asm!("b DEFAULT_HANDLER" :::: "volatile"); - intrinsics::unreachable(); - } -} +global_asm!(r#" +.weak NMI +NMI = DEFAULT_HANDLER -#[allow(non_snake_case)] -#[allow(private_no_mangle_fns)] -#[cfg(target_arch = "arm")] -#[linkage = "weak"] -#[naked] -#[no_mangle] -extern "C" fn HARD_FAULT() { - unsafe { - asm!("b DEFAULT_HANDLER" :::: "volatile"); - intrinsics::unreachable(); - } -} +.weak HARD_FAULT +HARD_FAULT = DEFAULT_HANDLER -#[allow(non_snake_case)] -#[allow(private_no_mangle_fns)] -#[cfg(target_arch = "arm")] -#[linkage = "weak"] -#[naked] -#[no_mangle] -extern "C" fn MEM_MANAGE() { - unsafe { - asm!("b DEFAULT_HANDLER" :::: "volatile"); - intrinsics::unreachable(); - } -} +.weak MEM_MANAGE +MEM_MANAGE = DEFAULT_HANDLER -#[allow(non_snake_case)] -#[allow(private_no_mangle_fns)] -#[cfg(target_arch = "arm")] -#[linkage = "weak"] -#[naked] -#[no_mangle] -extern "C" fn BUS_FAULT() { - unsafe { - asm!("b DEFAULT_HANDLER" :::: "volatile"); - intrinsics::unreachable(); - } -} +.weak BUS_FAULT +BUS_FAULT = DEFAULT_HANDLER -#[allow(non_snake_case)] -#[allow(private_no_mangle_fns)] -#[cfg(target_arch = "arm")] -#[linkage = "weak"] -#[naked] -#[no_mangle] -extern "C" fn USAGE_FAULT() { - unsafe { - asm!("b DEFAULT_HANDLER" :::: "volatile"); - intrinsics::unreachable(); - } -} +.weak USAGE_FAULT +USAGE_FAULT = DEFAULT_HANDLER -#[allow(non_snake_case)] -#[allow(private_no_mangle_fns)] -#[cfg(target_arch = "arm")] -#[linkage = "weak"] -#[naked] -#[no_mangle] -extern "C" fn SVCALL() { - unsafe { - asm!("b DEFAULT_HANDLER" :::: "volatile"); - intrinsics::unreachable(); - } -} +.weak SVCALL +SVCALL = DEFAULT_HANDLER -#[allow(non_snake_case)] -#[allow(private_no_mangle_fns)] -#[cfg(target_arch = "arm")] -#[linkage = "weak"] -#[naked] -#[no_mangle] -extern "C" fn PENDSV() { - unsafe { - asm!("b DEFAULT_HANDLER" :::: "volatile"); - intrinsics::unreachable(); - } -} +.weak PENDSV +PENDSV = DEFAULT_HANDLER -#[allow(non_snake_case)] -#[allow(private_no_mangle_fns)] -#[cfg(target_arch = "arm")] -#[linkage = "weak"] -#[naked] -#[no_mangle] -extern "C" fn SYS_TICK() { - unsafe { - asm!("b DEFAULT_HANDLER" :::: "volatile"); - intrinsics::unreachable(); - } +.weak SYS_TICK +SYS_TICK = DEFAULT_HANDLER +"#); + +extern "C" { + fn NMI(); + fn HARD_FAULT(); + fn MEM_MANAGE(); + fn BUS_FAULT(); + fn USAGE_FAULT(); + fn SVCALL(); + fn PENDSV(); + fn SYS_TICK(); } #[cfg(target_arch = "arm")] |