NUVOTON: Re-implement __PC() with toolchain built-in

Re-implement __PC() by replacing BSP assembly with toolchain built-in.
pull/11650/head
Chun-Chieh Li 2019-10-02 16:43:23 +08:00
parent 3548d38a98
commit d993c5a108
3 changed files with 32 additions and 37 deletions

View File

@ -1,37 +0,0 @@
#if defined(__CC_ARM) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
AREA |.text|, CODE, READONLY
__PC PROC
EXPORT __PC
#elif defined(__GNUC__)
.text
.thumb
.thumb_func
.globl __PC
.type __PC, %function
__PC:
#else ;; for IAR, __ICCARM__ seems not defined in IAR asm
MODULE nvtfunc
SECTION .text:CODE:REORDER:NOROOT(1)
THUMB
PUBLIC __PC
__PC
#endif
MOV r0, lr
BLX lr
#if defined(__CC_ARM) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
ALIGN
ENDP
END
#elif defined(__GNUC__)
.align
.pool
.size __PC, . - __PC
.end
#else ;; for IAR, __ICCARM__ seems not defined in IAR asm
END
#endif

View File

@ -115,3 +115,19 @@ void AssertError(uint8_t * file, uint32_t line)
}
#endif
/* Return LR (return address)
*
* Replace BSP assembly implementation with toolchain built-in (borrow MBED_CALLER_ADDR())
*/
uint32_t __PC(void)
{
#if (defined(__GNUC__) || defined(__clang__)) && !defined(__CC_ARM)
return (uint32_t) __builtin_extract_return_addr(__builtin_return_address(0));
#elif defined(__CC_ARM)
return (uint32_t) __builtin_return_address(0);
#elif defined(__ICCARM__)
return (uint32_t) __get_LR();
#else
#error("__PC() not implemented")
#endif
}

View File

@ -116,3 +116,19 @@ void AssertError(uint8_t * file, uint32_t line)
}
#endif
/* Return LR (return address)
*
* Replace BSP assembly implementation with toolchain built-in (borrow MBED_CALLER_ADDR())
*/
uint32_t __PC(void)
{
#if (defined(__GNUC__) || defined(__clang__)) && !defined(__CC_ARM)
return (uint32_t) __builtin_extract_return_addr(__builtin_return_address(0));
#elif defined(__CC_ARM)
return (uint32_t) __builtin_return_address(0);
#elif defined(__ICCARM__)
return (uint32_t) __get_LR();
#else
#error("__PC() not implemented")
#endif
}