aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jorge Aparicio <jorge@japaric.io> 2017-07-21 21:33:46 -0500
committerGravatar GitHub <noreply@github.com> 2017-07-21 21:33:46 -0500
commit8c3fb0e7cd30a8a29589808fa336bf2c24b55250 (patch)
tree5e39d89480713711400aa40eefe84e5b2eb511b1
parent83ab03c7798fb6badb1c687de9e1ca5f90778591 (diff)
parenta1d223528d534391805699d9714d78e213e9c471 (diff)
downloadcortex-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.md5
-rw-r--r--cortex-m-rt/src/lib.rs124
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")]