From 06495658ce886d7286d2939f7f03f4a4384a1581 Mon Sep 17 00:00:00 2001 From: Adam Green Date: Thu, 12 Feb 2015 00:14:26 -0800 Subject: [PATCH] Move exit override to retarget.cpp I moved the exit handler from exit.c to retarget.cpp where the rest of the standard C library retargetting routines are found. The exported makefiles already explicitly link in retarget.o but not exit.o When building with the GNU toolchain, it is safest to link in the object file directly for retargetting routines so that GNU linker has to use these versions of the routines. Testing: I have only tested this change with GCC_ARM. It should really be tested with more toolchains before getting merged. --- libraries/mbed/common/exit.c | 46 ------------------------------ libraries/mbed/common/retarget.cpp | 42 +++++++++++++++++++++------ 2 files changed, 33 insertions(+), 55 deletions(-) delete mode 100644 libraries/mbed/common/exit.c diff --git a/libraries/mbed/common/exit.c b/libraries/mbed/common/exit.c deleted file mode 100644 index edf8a710d6..0000000000 --- a/libraries/mbed/common/exit.c +++ /dev/null @@ -1,46 +0,0 @@ -/* mbed Microcontroller Library - * Copyright (c) 2006-2013 ARM Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#include "semihost_api.h" -#include "mbed_interface.h" -#if DEVICE_STDIO_MESSAGES -#include -#endif - -#ifdef TOOLCHAIN_GCC_CW -// TODO: Ideally, we would like to define directly "_ExitProcess" -void mbed_exit(int return_code) { -#elif defined TOOLCHAIN_GCC_ARM -void _exit(int return_code) { -#else -void exit(int return_code) { -#endif - -#if DEVICE_STDIO_MESSAGES - fflush(stdout); - fflush(stderr); -#endif - -#if DEVICE_SEMIHOST - if (mbed_interface_connected()) { - semihost_exit(); - } -#endif - if (return_code) { - mbed_die(); - } - - while (1); -} diff --git a/libraries/mbed/common/retarget.cpp b/libraries/mbed/common/retarget.cpp index a2ba7c86ce..a026682c28 100644 --- a/libraries/mbed/common/retarget.cpp +++ b/libraries/mbed/common/retarget.cpp @@ -1,5 +1,5 @@ /* mbed Microcontroller Library - * Copyright (c) 2006-2013 ARM Limited + * Copyright (c) 2006-2015 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,11 @@ #include "FilePath.h" #include "serial_api.h" #include "toolchain.h" +#include "semihost_api.h" +#include "mbed_interface.h" +#if DEVICE_STDIO_MESSAGES +#include +#endif #include #if defined(__ARMCC_VERSION) @@ -482,6 +487,33 @@ extern "C" caddr_t _sbrk(int incr) { #endif +#ifdef TOOLCHAIN_GCC_CW +// TODO: Ideally, we would like to define directly "_ExitProcess" +extern "C" void mbed_exit(int return_code) { +#elif defined TOOLCHAIN_GCC_ARM +extern "C" void _exit(int return_code) { +#else +extern "C" void exit(int return_code) { +#endif + +#if DEVICE_STDIO_MESSAGES + fflush(stdout); + fflush(stderr); +#endif + +#if DEVICE_SEMIHOST + if (mbed_interface_connected()) { + semihost_exit(); + } +#endif + if (return_code) { + mbed_die(); + } + + while (1); +} + + namespace mbed { void mbed_set_unbuffered_stream(FILE *_file) { @@ -524,11 +556,3 @@ char* mbed_gets(char*s, int size, FILE *_file){ } } // namespace mbed - - - - - - - -