Mercurial > ecos
diff packages/hal/common/current/src/hal_misc.c @ 199:920b9b754b53
Merge from eCos master repository on 2001-12-15-12:00:33-GMT
| author | jlarmour |
|---|---|
| date | Sat, 15 Dec 2001 13:42:19 +0000 |
| parents | b939e9cada46 |
| children | e0c0827131d1 |
line wrap: on
line diff
--- a/packages/hal/common/current/src/hal_misc.c +++ b/packages/hal/common/current/src/hal_misc.c @@ -60,12 +60,18 @@ // Macro for finding return address. #ifndef CYGARC_HAL_GET_RETURN_ADDRESS -#define CYGARC_HAL_GET_RETURN_ADDRESS(_x_) \ - (_x_) = (CYG_ADDRWORD)&&__backup_return_address +#define CYGARC_HAL_GET_RETURN_ADDRESS(_x_, _dummy_) \ + CYG_MACRO_START \ + (_dummy_) = 1; \ + (_x_) = (CYG_ADDRWORD)&&__backup_return_address; \ + CYG_MACRO_END -#define CYGARC_HAL_GET_RETURN_ADDRESS_BACKUP() \ -__backup_return_address: - +#define CYGARC_HAL_GET_RETURN_ADDRESS_BACKUP(_dummy_) \ + CYG_MACRO_START \ +__backup_return_address: \ + if ((_dummy_)-- > 0) \ + goto __backup_return_address; \ + CYG_MACRO_END #endif //-------------------------------------------------------------------------- @@ -91,6 +97,11 @@ cyg_hal_is_break(char *buf, int size) return false; } +// Keep this variable global, to prevent the compiler removing it (and +// the goto-reference) due to being local to the function where it is +// used. Yes, it's ugly. +int _cyg_hal_compiler_dummy; + void cyg_hal_user_break( CYG_ADDRWORD *regs ) { @@ -102,14 +113,14 @@ cyg_hal_user_break( CYG_ADDRWORD *regs ) CYG_WORD32 __pc; HAL_SavedRegisters *sreg = (HAL_SavedRegisters *)regs; - CYGARC_HAL_GET_RETURN_ADDRESS(__ra); + CYGARC_HAL_GET_RETURN_ADDRESS(__ra, _cyg_hal_compiler_dummy); if( regs == NULL ) __pc = __ra; else CYGARC_HAL_GET_PC_REG(sreg, __pc); CYGACC_CALL_IF_INSTALL_BPT_FN((void *)__pc); - CYGARC_HAL_GET_RETURN_ADDRESS_BACKUP(); + CYGARC_HAL_GET_RETURN_ADDRESS_BACKUP(_cyg_hal_compiler_dummy); #else
