diff options
author | Kaz Kojima <kkojima@rr.iij4u.or.jp> | 2004-03-18 00:49:23 +0000 |
---|---|---|
committer | Kaz Kojima <kkojima@rr.iij4u.or.jp> | 2004-03-18 00:49:23 +0000 |
commit | 2ce4cc60250621eab0d9ae587e8b2ba1b8603236 (patch) | |
tree | 263779898cef850321638cf84ca46c84ca15b975 /gas/config | |
parent | cfef7cefb00af49639f979223382c5e837d9e78e (diff) | |
download | gdb-2ce4cc60250621eab0d9ae587e8b2ba1b8603236.zip gdb-2ce4cc60250621eab0d9ae587e8b2ba1b8603236.tar.gz gdb-2ce4cc60250621eab0d9ae587e8b2ba1b8603236.tar.bz2 |
[gas]
* config/tc-sh.c: Include dw2gencfi.h.
(sh_cfi_frame_initial_instructions): New function.
(sh_regname_to_dw2regnum): Likewise.
* config/tc-sh.h (DWARF2_LINE_MIN_INSN_LENGTH): Move to the end of
file.
(TARGET_USE_CFIPOP): Define.
(tc_cfi_frame_initial_instructions): Likewise.
(tc_regname_to_dw2regnum): Likewise.
(DWARF2_DEFAULT_RETURN_COLUMN, DWARF2_CIE_DATA_ALIGNMENT): Likewise.
* Makefile.am: Update dependencies.
* Makefile.in: Regenerate.
[gas/testsuite]
* gas/cfi/cfi-sh-1.d: New file.
* gas/cfi/cfi-sh-1.s: Likewise.
* gas/cfi/cfi.exp: Add SH case.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-sh.c | 50 | ||||
-rw-r--r-- | gas/config/tc-sh.h | 16 |
2 files changed, 63 insertions, 3 deletions
diff --git a/gas/config/tc-sh.c b/gas/config/tc-sh.c index f3af8ab..7f7e28e 100644 --- a/gas/config/tc-sh.c +++ b/gas/config/tc-sh.c @@ -35,6 +35,7 @@ #endif #include "dwarf2dbg.h" +#include "dw2gencfi.h" typedef struct { @@ -4341,4 +4342,53 @@ sh_parse_name (char const *name, expressionS *exprP, char *nextcharP) return 1; } #endif + +void +sh_cfi_frame_initial_instructions (void) +{ + cfi_add_CFA_def_cfa (15, 0); +} + +int +sh_regname_to_dw2regnum (const char *regname) +{ + unsigned int regnum = -1; + unsigned int i; + const char *p; + char *q; + static struct { char *name; int dw2regnum; } regnames[] = + { + { "pr", 17 }, { "t", 18 }, { "gbr", 19 }, { "mach", 20 }, + { "macl", 21 }, { "fpul", 23 } + }; + + for (i = 0; i < ARRAY_SIZE (regnames); ++i) + if (strcmp (regnames[i].name, regname) == 0) + return regnames[i].dw2regnum; + + if (regname[0] == 'r') + { + p = regname + 1; + regnum = strtoul (p, &q, 10); + if (p == q || *q || regnum >= 16) + return -1; + } + else if (regname[0] == 'f' && regname[1] == 'r') + { + p = regname + 2; + regnum = strtoul (p, &q, 10); + if (p == q || *q || regnum >= 16) + return -1; + regnum += 25; + } + else if (regname[0] == 'x' && regname[1] == 'd') + { + p = regname + 2; + regnum = strtoul (p, &q, 10); + if (p == q || *q || regnum >= 8) + return -1; + regnum += 87; + } + return regnum; +} #endif /* BFD_ASSEMBLER */ diff --git a/gas/config/tc-sh.h b/gas/config/tc-sh.h index f6fc053..9931847 100644 --- a/gas/config/tc-sh.h +++ b/gas/config/tc-sh.h @@ -42,9 +42,6 @@ extern int sh_small; /* Don't try to break words. */ #define WORKING_DOT_WORD -/* All SH instructions are multiples of 16 bits. */ -#define DWARF2_LINE_MIN_INSN_LENGTH 2 - /* We require .long, et. al., to be aligned correctly. */ #define md_cons_align(nbytes) sh_cons_align (nbytes) extern void sh_cons_align (int); @@ -261,4 +258,17 @@ void sh_cons_fix_new (fragS *, int, int, expressionS *); symbols. The relocation type is stored in X_md. */ #define O_PIC_reloc O_md1 +#define TARGET_USE_CFIPOP 1 + +#define tc_cfi_frame_initial_instructions sh_cfi_frame_initial_instructions +extern void sh_cfi_frame_initial_instructions (void); + +#define tc_regname_to_dw2regnum sh_regname_to_dw2regnum +extern int sh_regname_to_dw2regnum (const char *regname); + +/* All SH instructions are multiples of 16 bits. */ +#define DWARF2_LINE_MIN_INSN_LENGTH 2 +#define DWARF2_DEFAULT_RETURN_COLUMN 17 +#define DWARF2_CIE_DATA_ALIGNMENT -4 + #endif /* OBJ_ELF */ |