* arm-tdep.c: Include elf-bfd.h and coff/internal.h.
(MSYMBOL_SET_SPECIAL, MSYMBOL_IS_SPECIAL, MSYMBOL_SIZE): Move defines to here from config/tm-arm.h. (coff_sym_is_thumb): Make static. (arm_elf_make_msymbol_special): New function. (arm_coff_make_msymbol_special): New function. * config/arm/tm-arm.h (MSYMBOL_SET_SPECIAL): Delete definition. (MSYMBOL_IS_SPECIAL, MSYMBOL_SIZE): Likewise. (coff_sym_is_thumb): Delete declaration. (arm_elf_make_msymbol_special): Declare. (arm_coff_make_msymbol_special): Declare. (ELF_MAKE_MSYMBOL_SPECIAL): Call arm_elf_make_msymbol_special. (COFF_MAKE_MSYMBOL_SPECIAL): Call arm_coff_make_msymbol_special.
This commit is contained in:
parent
039c576668
commit
082fc60dfc
3 changed files with 83 additions and 47 deletions
|
@ -1,3 +1,19 @@
|
||||||
|
2002-02-06 Richard Earnshaw <rearnsha@arm.com>
|
||||||
|
|
||||||
|
* arm-tdep.c: Include elf-bfd.h and coff/internal.h.
|
||||||
|
(MSYMBOL_SET_SPECIAL, MSYMBOL_IS_SPECIAL, MSYMBOL_SIZE): Move defines
|
||||||
|
to here from config/tm-arm.h.
|
||||||
|
(coff_sym_is_thumb): Make static.
|
||||||
|
(arm_elf_make_msymbol_special): New function.
|
||||||
|
(arm_coff_make_msymbol_special): New function.
|
||||||
|
* config/arm/tm-arm.h (MSYMBOL_SET_SPECIAL): Delete definition.
|
||||||
|
(MSYMBOL_IS_SPECIAL, MSYMBOL_SIZE): Likewise.
|
||||||
|
(coff_sym_is_thumb): Delete declaration.
|
||||||
|
(arm_elf_make_msymbol_special): Declare.
|
||||||
|
(arm_coff_make_msymbol_special): Declare.
|
||||||
|
(ELF_MAKE_MSYMBOL_SPECIAL): Call arm_elf_make_msymbol_special.
|
||||||
|
(COFF_MAKE_MSYMBOL_SPECIAL): Call arm_coff_make_msymbol_special.
|
||||||
|
|
||||||
2002-02-06 Richard Earnshaw <rearnsha@arm.com>
|
2002-02-06 Richard Earnshaw <rearnsha@arm.com>
|
||||||
|
|
||||||
* arm-tdep.c (arm_software_single_step): ANSIfy function declaration.
|
* arm-tdep.c (arm_software_single_step): ANSIfy function declaration.
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
#include "doublest.h"
|
#include "doublest.h"
|
||||||
#include "value.h"
|
#include "value.h"
|
||||||
#include "solib-svr4.h"
|
#include "solib-svr4.h"
|
||||||
|
#include "elf-bfd.h"
|
||||||
|
#include "coff/internal.h"
|
||||||
|
|
||||||
/* Each OS has a different mechanism for accessing the various
|
/* Each OS has a different mechanism for accessing the various
|
||||||
registers stored in the sigcontext structure.
|
registers stored in the sigcontext structure.
|
||||||
|
@ -64,7 +66,27 @@
|
||||||
#define SIGCONTEXT_REGISTER_ADDRESS_P() 0
|
#define SIGCONTEXT_REGISTER_ADDRESS_P() 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void _initialize_arm_tdep (void);
|
/* Macros for setting and testing a bit in a minimal symbol that marks
|
||||||
|
it as Thumb function. The MSB of the minimal symbol's "info" field
|
||||||
|
is used for this purpose. This field is already being used to store
|
||||||
|
the symbol size, so the assumption is that the symbol size cannot
|
||||||
|
exceed 2^31.
|
||||||
|
|
||||||
|
MSYMBOL_SET_SPECIAL Actually sets the "special" bit.
|
||||||
|
MSYMBOL_IS_SPECIAL Tests the "special" bit in a minimal symbol.
|
||||||
|
MSYMBOL_SIZE Returns the size of the minimal symbol,
|
||||||
|
i.e. the "info" field with the "special" bit
|
||||||
|
masked out. */
|
||||||
|
|
||||||
|
#define MSYMBOL_SET_SPECIAL(msym) \
|
||||||
|
MSYMBOL_INFO (msym) = (char *) (((long) MSYMBOL_INFO (msym)) \
|
||||||
|
| 0x80000000)
|
||||||
|
|
||||||
|
#define MSYMBOL_IS_SPECIAL(msym) \
|
||||||
|
(((long) MSYMBOL_INFO (msym) & 0x80000000) != 0)
|
||||||
|
|
||||||
|
#define MSYMBOL_SIZE(msym) \
|
||||||
|
((long) MSYMBOL_INFO (msym) & 0x7fffffff)
|
||||||
|
|
||||||
/* Number of different reg name sets (options). */
|
/* Number of different reg name sets (options). */
|
||||||
static int num_flavor_options;
|
static int num_flavor_options;
|
||||||
|
@ -2282,6 +2304,43 @@ arm_linux_svr4_fetch_link_map_offsets (void)
|
||||||
return lmp;
|
return lmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test whether the coff symbol specific value corresponds to a Thumb
|
||||||
|
function. */
|
||||||
|
|
||||||
|
static int
|
||||||
|
coff_sym_is_thumb (int val)
|
||||||
|
{
|
||||||
|
return (val == C_THUMBEXT ||
|
||||||
|
val == C_THUMBSTAT ||
|
||||||
|
val == C_THUMBEXTFUNC ||
|
||||||
|
val == C_THUMBSTATFUNC ||
|
||||||
|
val == C_THUMBLABEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* arm_coff_make_msymbol_special()
|
||||||
|
arm_elf_make_msymbol_special()
|
||||||
|
|
||||||
|
These functions test whether the COFF or ELF symbol corresponds to
|
||||||
|
an address in thumb code, and set a "special" bit in a minimal
|
||||||
|
symbol to indicate that it does. */
|
||||||
|
|
||||||
|
void
|
||||||
|
arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
|
||||||
|
{
|
||||||
|
/* Thumb symbols are of type STT_LOPROC, (synonymous with
|
||||||
|
STT_ARM_TFUNC). */
|
||||||
|
if (ELF_ST_TYPE (((elf_symbol_type *)sym)->internal_elf_sym.st_info)
|
||||||
|
== STT_LOPROC)
|
||||||
|
MSYMBOL_SET_SPECIAL (msym);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
|
||||||
|
{
|
||||||
|
if (coff_sym_is_thumb (val))
|
||||||
|
MSYMBOL_SET_SPECIAL (msym);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
_initialize_arm_tdep (void)
|
_initialize_arm_tdep (void)
|
||||||
{
|
{
|
||||||
|
@ -2359,16 +2418,3 @@ The valid values are:\n");
|
||||||
prologue_cache.saved_regs = (CORE_ADDR *)
|
prologue_cache.saved_regs = (CORE_ADDR *)
|
||||||
xcalloc (1, SIZEOF_FRAME_SAVED_REGS);
|
xcalloc (1, SIZEOF_FRAME_SAVED_REGS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Test whether the coff symbol specific value corresponds to a Thumb
|
|
||||||
function. */
|
|
||||||
|
|
||||||
int
|
|
||||||
coff_sym_is_thumb (int val)
|
|
||||||
{
|
|
||||||
return (val == C_THUMBEXT ||
|
|
||||||
val == C_THUMBSTAT ||
|
|
||||||
val == C_THUMBEXTFUNC ||
|
|
||||||
val == C_THUMBSTATFUNC ||
|
|
||||||
val == C_THUMBLABEL);
|
|
||||||
}
|
|
||||||
|
|
|
@ -409,42 +409,16 @@ void arm_software_single_step (int, int);
|
||||||
|
|
||||||
CORE_ADDR arm_get_next_pc (CORE_ADDR pc);
|
CORE_ADDR arm_get_next_pc (CORE_ADDR pc);
|
||||||
|
|
||||||
/* Macros for setting and testing a bit in a minimal symbol that marks
|
|
||||||
it as Thumb function. The MSB of the minimal symbol's "info" field
|
|
||||||
is used for this purpose. This field is already being used to store
|
|
||||||
the symbol size, so the assumption is that the symbol size cannot
|
|
||||||
exceed 2^31.
|
|
||||||
|
|
||||||
COFF_MAKE_MSYMBOL_SPECIAL
|
struct minimal_symbol;
|
||||||
ELF_MAKE_MSYMBOL_SPECIAL
|
|
||||||
|
|
||||||
These macros test whether the COFF or ELF symbol corresponds to a
|
|
||||||
thumb function, and set a "special" bit in a minimal symbol to
|
|
||||||
indicate that it does.
|
|
||||||
|
|
||||||
MSYMBOL_SET_SPECIAL Actually sets the "special" bit.
|
|
||||||
MSYMBOL_IS_SPECIAL Tests the "special" bit in a minimal symbol.
|
|
||||||
MSYMBOL_SIZE Returns the size of the minimal symbol,
|
|
||||||
i.e. the "info" field with the "special" bit
|
|
||||||
masked out
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern int coff_sym_is_thumb (int val);
|
void arm_elf_make_msymbol_special(asymbol *, struct minimal_symbol *);
|
||||||
|
#define ELF_MAKE_MSYMBOL_SPECIAL(SYM,MSYM) \
|
||||||
|
arm_elf_make_msymbol_special (SYM, MSYM)
|
||||||
|
|
||||||
#define MSYMBOL_SET_SPECIAL(msym) \
|
void arm_coff_make_msymbol_special(int, struct minimal_symbol *);
|
||||||
MSYMBOL_INFO (msym) = (char *) (((long) MSYMBOL_INFO (msym)) | 0x80000000)
|
#define COFF_MAKE_MSYMBOL_SPECIAL(VAL,MSYM) \
|
||||||
#define MSYMBOL_IS_SPECIAL(msym) \
|
arm_coff_make_msymbol_special (VAL, MSYM)
|
||||||
(((long) MSYMBOL_INFO (msym) & 0x80000000) != 0)
|
|
||||||
#define MSYMBOL_SIZE(msym) \
|
|
||||||
((long) MSYMBOL_INFO (msym) & 0x7fffffff)
|
|
||||||
|
|
||||||
/* Thumb symbols are of type STT_LOPROC, (synonymous with STT_ARM_TFUNC) */
|
|
||||||
#define ELF_MAKE_MSYMBOL_SPECIAL(sym,msym) \
|
|
||||||
{ if(ELF_ST_TYPE(((elf_symbol_type *)(sym))->internal_elf_sym.st_info) == STT_LOPROC) \
|
|
||||||
MSYMBOL_SET_SPECIAL(msym); }
|
|
||||||
|
|
||||||
#define COFF_MAKE_MSYMBOL_SPECIAL(val,msym) \
|
|
||||||
{ if(coff_sym_is_thumb(val)) MSYMBOL_SET_SPECIAL(msym); }
|
|
||||||
|
|
||||||
/* The first 0x20 bytes are the trap vectors. */
|
/* The first 0x20 bytes are the trap vectors. */
|
||||||
#define LOWEST_PC 0x20
|
#define LOWEST_PC 0x20
|
||||||
|
|
Loading…
Add table
Reference in a new issue