This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH/RFA] SH: cfi stuff


Hi,

The attached patch adds cfi_ stuff for SH gas.  There are no regressions
on sh-elf and sh64-elf.  It seems work in my local glibc work too.  I'd
like to get approval for it because the testsuite portion touches the
generic part slightly.

I'm happy if I get ok also for 2.15.

Regards,
	kaz
--
2004-03-17  Kaz Kojima  <kkojima@rr.iij4u.or.jp>
[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.

[gas/testsuite]
	* gas/cfi/cfi-sh-1.d: New file.
	* gas/cfi/cfi-sh-1.s: Likewise.	
	* gas/cfi/cfi.exp: Add SH case.

diff -u3prN ORIG/src/gas/config/tc-sh.c LOCAL/src/gas/config/tc-sh.c
--- ORIG/src/gas/config/tc-sh.c	Thu Mar  4 08:17:32 2004
+++ LOCAL/src/gas/config/tc-sh.c	Thu Mar  4 08:39:43 2004
@@ -35,6 +35,7 @@
 #endif
 
 #include "dwarf2dbg.h"
+#include "dw2gencfi.h"
 
 typedef struct
   {
@@ -4341,4 +4342,53 @@ sh_parse_name (char const *name, express
   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 -u3prN ORIG/src/gas/config/tc-sh.h LOCAL/src/gas/config/tc-sh.h
--- ORIG/src/gas/config/tc-sh.h	Sun Oct 12 06:32:39 2003
+++ LOCAL/src/gas/config/tc-sh.h	Thu Mar  4 08:39:43 2004
@@ -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);
@@ -260,5 +257,18 @@ void sh_cons_fix_new (fragS *, int, int,
 /* This is used to construct expressions out of @GOTOFF, @PLT and @GOT
    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 -u3prN ORIG/src/gas/testsuite/gas/cfi/cfi-sh-1.d LOCAL/src/gas/testsuite/gas/cfi/cfi-sh-1.d
--- ORIG/src/gas/testsuite/gas/cfi/cfi-sh-1.d	Thu Jan  1 09:00:00 1970
+++ LOCAL/src/gas/testsuite/gas/cfi/cfi-sh-1.d	Thu Mar  4 08:39:43 2004
@@ -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 -u3prN ORIG/src/gas/testsuite/gas/cfi/cfi-sh-1.s LOCAL/src/gas/testsuite/gas/cfi/cfi-sh-1.s
--- ORIG/src/gas/testsuite/gas/cfi/cfi-sh-1.s	Thu Jan  1 09:00:00 1970
+++ LOCAL/src/gas/testsuite/gas/cfi/cfi-sh-1.s	Thu Mar  4 08:39:43 2004
@@ -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 -u3prN ORIG/src/gas/testsuite/gas/cfi/cfi.exp LOCAL/src/gas/testsuite/gas/cfi/cfi.exp
--- ORIG/src/gas/testsuite/gas/cfi/cfi.exp	Mon Sep  1 20:16:58 2003
+++ LOCAL/src/gas/testsuite/gas/cfi/cfi.exp	Thu Mar  4 08:39:43 2004
@@ -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
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]