mirror of https://github.com/ARMmbed/mbed-os.git
NUVOTON: Re-implement __PC() with toolchain built-in
Re-implement __PC() by replacing BSP assembly with toolchain built-in.pull/11650/head
parent
3548d38a98
commit
d993c5a108
|
|
@ -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
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue