[gas]
authorKaz Kojima <kkojima@rr.iij4u.or.jp>
Thu, 18 Mar 2004 00:49:23 +0000 (00:49 +0000)
committerKaz Kojima <kkojima@rr.iij4u.or.jp>
Thu, 18 Mar 2004 00:49:23 +0000 (00:49 +0000)
* 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.

gas/ChangeLog
gas/Makefile.am
gas/Makefile.in
gas/config/tc-sh.c
gas/config/tc-sh.h
gas/testsuite/ChangeLog
gas/testsuite/gas/cfi/cfi-sh-1.d [new file with mode: 0644]
gas/testsuite/gas/cfi/cfi-sh-1.s [new file with mode: 0644]
gas/testsuite/gas/cfi/cfi.exp

index a0fc439f5f7cf5711438d4c2f41cdad62c569147..1e8424b86c7a983562958d062a65ae750215028b 100644 (file)
@@ -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*.
index 0a88de05adb6fcb6f5bd05007720e22eadc40f65..49a0f1389b347f636adde31c47ad9d3d48e156e7 100644 (file)
@@ -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 \
index 485dabd33488a112c412419800a32b18b4073c24..f76f1c639c145a909983583ffe163b06e96794cd 100644 (file)
@@ -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 \
index f3af8ab5821cd6ca5de13d1bd81a240e0731f3d7..7f7e28ec85fe65f20a94518439aa67cde170b6e0 100644 (file)
@@ -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 */
index f6fc053b9f489ca72d0ec5e8ae1488585cd2071c..9931847b01c42e6f7cd060a280949891c1f054f7 100644 (file)
@@ -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 */
index be937031aef2b261ca7404f6cc659e55c6ccf539..0eb9ca4d967721b77ab8df48abd8bde24edab709 100644 (file)
@@ -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 (file)
index 0000000..fac7484
--- /dev/null
@@ -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 (file)
index 0000000..29fc63e
--- /dev/null
@@ -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
index d09d6fd1d67dfbf9844e9c90a0335b925b962441..f32a047460746b60e5ad159980bae6049ae7d708 100644 (file)
@@ -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
 }