diff options
-rw-r--r-- | gas/ChangeLog | 14 | ||||
-rw-r--r-- | gas/Makefile.am | 6 | ||||
-rw-r--r-- | gas/Makefile.in | 6 | ||||
-rw-r--r-- | gas/config/tc-sh.c | 50 | ||||
-rw-r--r-- | gas/config/tc-sh.h | 16 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/cfi/cfi-sh-1.d | 29 | ||||
-rw-r--r-- | gas/testsuite/gas/cfi/cfi-sh-1.s | 39 | ||||
-rw-r--r-- | gas/testsuite/gas/cfi/cfi.exp | 7 |
9 files changed, 164 insertions, 9 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index a0fc439..1e8424b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,17 @@ +2004-03-17 Kaz Kojima <kkojima@rr.iij4u.or.jp> + + * 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. + 2004-03-17 Ralf Corsepius <corsepiu@faw.uni-ulm.de> * configure.in: Switch sh-*-rtems* to ELF. Add sh-*-rtemscoff*. diff --git a/gas/Makefile.am b/gas/Makefile.am index 0a88de0..49a0f13 100644 --- a/gas/Makefile.am +++ b/gas/Makefile.am @@ -1400,20 +1400,20 @@ DEPTC_sh_coff = $(INCDIR)/symcat.h $(srcdir)/config/obj-coff.h \ $(srcdir)/config/tc-sh.h $(INCDIR)/coff/internal.h \ $(INCDIR)/coff/sh.h $(INCDIR)/coff/external.h $(BFDDIR)/libcoff.h \ $(INCDIR)/bfdlink.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/sh-opc.h \ - $(INCDIR)/safe-ctype.h struc-symbol.h dwarf2dbg.h + $(INCDIR)/safe-ctype.h struc-symbol.h dwarf2dbg.h dw2gencfi.h DEPTC_sh_elf = $(INCDIR)/symcat.h $(srcdir)/config/obj-elf.h \ $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh.h \ subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/sh-opc.h \ $(INCDIR)/safe-ctype.h struc-symbol.h $(INCDIR)/elf/sh.h \ - $(INCDIR)/elf/reloc-macros.h dwarf2dbg.h + $(INCDIR)/elf/reloc-macros.h dwarf2dbg.h dw2gencfi.h DEPTC_sh64_elf = $(INCDIR)/symcat.h $(srcdir)/config/obj-elf.h \ $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh64.h \ $(srcdir)/config/tc-sh.h $(INCDIR)/elf/sh.h $(INCDIR)/elf/reloc-macros.h \ $(BFDDIR)/elf32-sh64.h $(INCDIR)/safe-ctype.h $(srcdir)/../opcodes/sh64-opc.h \ $(srcdir)/config/tc-sh.c subsegs.h $(INCDIR)/obstack.h \ - $(srcdir)/../opcodes/sh-opc.h struc-symbol.h dwarf2dbg.h + $(srcdir)/../opcodes/sh-opc.h struc-symbol.h dwarf2dbg.h dw2gencfi.h DEPTC_sparc_aout = $(INCDIR)/symcat.h $(srcdir)/config/obj-aout.h \ $(srcdir)/config/tc-sparc.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ $(INCDIR)/safe-ctype.h subsegs.h $(INCDIR)/obstack.h \ diff --git a/gas/Makefile.in b/gas/Makefile.in index 485dabd..f76f1c6 100644 --- a/gas/Makefile.in +++ b/gas/Makefile.in @@ -1262,14 +1262,14 @@ DEPTC_sh_coff = $(INCDIR)/symcat.h $(srcdir)/config/obj-coff.h \ $(srcdir)/config/tc-sh.h $(INCDIR)/coff/internal.h \ $(INCDIR)/coff/sh.h $(INCDIR)/coff/external.h $(BFDDIR)/libcoff.h \ $(INCDIR)/bfdlink.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/sh-opc.h \ - $(INCDIR)/safe-ctype.h struc-symbol.h dwarf2dbg.h + $(INCDIR)/safe-ctype.h struc-symbol.h dwarf2dbg.h dw2gencfi.h DEPTC_sh_elf = $(INCDIR)/symcat.h $(srcdir)/config/obj-elf.h \ $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh.h \ subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/sh-opc.h \ $(INCDIR)/safe-ctype.h struc-symbol.h $(INCDIR)/elf/sh.h \ - $(INCDIR)/elf/reloc-macros.h dwarf2dbg.h + $(INCDIR)/elf/reloc-macros.h dwarf2dbg.h dw2gencfi.h DEPTC_sh64_elf = $(INCDIR)/symcat.h $(srcdir)/config/obj-elf.h \ $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ @@ -1277,7 +1277,7 @@ DEPTC_sh64_elf = $(INCDIR)/symcat.h $(srcdir)/config/obj-elf.h \ $(srcdir)/config/tc-sh.h $(INCDIR)/elf/sh.h $(INCDIR)/elf/reloc-macros.h \ $(BFDDIR)/elf32-sh64.h $(INCDIR)/safe-ctype.h $(srcdir)/../opcodes/sh64-opc.h \ $(srcdir)/config/tc-sh.c subsegs.h $(INCDIR)/obstack.h \ - $(srcdir)/../opcodes/sh-opc.h struc-symbol.h dwarf2dbg.h + $(srcdir)/../opcodes/sh-opc.h struc-symbol.h dwarf2dbg.h dw2gencfi.h DEPTC_sparc_aout = $(INCDIR)/symcat.h $(srcdir)/config/obj-aout.h \ $(srcdir)/config/tc-sparc.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ 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 */ diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index be93703..0eb9ca4 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2004-03-17 Kaz Kojima <kkojima@rr.iij4u.or.jp> + + * gas/cfi/cfi-sh-1.d: New file. + * gas/cfi/cfi-sh-1.s: Likewise. + * gas/cfi/cfi.exp: Add SH case. + 2004-03-16 Alan Modra <amodra@bigpond.net.au> * gas/ppc/altivec.d: Update. diff --git a/gas/testsuite/gas/cfi/cfi-sh-1.d b/gas/testsuite/gas/cfi/cfi-sh-1.d new file mode 100644 index 0000000..fac7484 --- /dev/null +++ b/gas/testsuite/gas/cfi/cfi-sh-1.d @@ -0,0 +1,29 @@ +#readelf: -wf +#name: CFI on SH +The section .eh_frame contains: + +00000000 00000010 00000000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 2 + Data alignment factor: -4 + Return address column: 17 + Augmentation data: 1b + + DW_CFA_def_cfa: r15 ofs 0 + +00000014 00000020 00000018 FDE cie=00000000 pc=0000001c..00000048 + DW_CFA_advance_loc: 2 to 0000001e + DW_CFA_def_cfa_offset: 4 + DW_CFA_advance_loc: 2 to 00000020 + DW_CFA_def_cfa_offset: 8 + DW_CFA_offset: r15 at cfa-4 + DW_CFA_offset: r17 at cfa-8 + DW_CFA_advance_loc: 6 to 00000026 + DW_CFA_def_cfa_reg: r14 + DW_CFA_advance_loc: 2 to 00000028 + DW_CFA_def_cfa_offset: 40 + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + diff --git a/gas/testsuite/gas/cfi/cfi-sh-1.s b/gas/testsuite/gas/cfi/cfi-sh-1.s new file mode 100644 index 0000000..29fc63e --- /dev/null +++ b/gas/testsuite/gas/cfi/cfi-sh-1.s @@ -0,0 +1,39 @@ + .file "a.c" + .text + .align 1 + .globl foo + .type foo, @function +foo: + .cfi_startproc + mov.l r14,@-r15 + .cfi_adjust_cfa_offset 4 + sts.l pr,@-r15 + .cfi_adjust_cfa_offset 4 + .cfi_offset r15,-4 + .cfi_offset pr,-8 + tst r4,r4 + bt/s .L2 + mov r15,r14 + .cfi_def_cfa_register r14 + add #-32,r15 + .cfi_adjust_cfa_offset 32 + mov.l .L3,r0 + jsr @r0 + mov r15,r4 +.L2: + mov.l .L4,r0 + jsr @r0 + nop + mov #0,r0 + mov r14,r15 + lds.l @r15+,pr + rts + mov.l @r15+,r14 +.L5: + .align 2 +.L3: + .long bar +.L4: + .long baz + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/cfi/cfi.exp b/gas/testsuite/gas/cfi/cfi.exp index d09d6fd..f32a047 100644 --- a/gas/testsuite/gas/cfi/cfi.exp +++ b/gas/testsuite/gas/cfi/cfi.exp @@ -49,6 +49,13 @@ if [istarget "x86_64-*"] then { if { [regexp "elf64\[_-\]sparc" $nm_help] } then { run_dump_test "cfi-sparc64-1" } + +} elseif [istarget "sh*-*"] then { + if { [istarget sh64*-*-*] || [istarget sh5*-*-*] } then { + } else { + run_dump_test "cfi-sh-1" + } + } else { return } |