[PATCH] [ARC] GAS: allow CFI pseudo-ops.
Claudiu Zissulescu
Claudiu.Zissulescu@synopsys.com
Thu Feb 11 11:02:00 GMT 2016
Enable .cfi_* pseudo-ops for ARC backend.
Ok to apply?
Claudiu
gas/
2016-02-11 Claudiu Zissulescu <claziss@synopsys.com>
* config/tc-arc.c (tc_arc_frame_initial_instructions): New
function.
(tc_arc_regname_to_dw2regnum): Likewise.
* config/tc-arc.h (TARGET_USE_CFIPOP): Define
(tc_cfi_frame_initial_instructions): Likewise.
(tc_regname_to_dw2regnum): Likewise.
gas/testsuite
2016-02-11 Claudiu Zissulescu <claziss@synopsys.com>
* gas/cfi/cfi-arc-1.d: New file.
* gas/cfi/cfi-arc-1.s: Likewise.
* gas/cfi/cfi.exp: Allow running tests for arc.
gas/testsuite
2016-02-11 Claudiu Zissulescu <claziss@synopsys.com>
* readelf.c (is_32bit_pcrel_reloc): Add R_ARC_32_PCREL.
---
binutils/readelf.c | 3 +++
gas/config/tc-arc.c | 21 +++++++++++++++++++++
gas/config/tc-arc.h | 9 +++++++++
gas/testsuite/gas/cfi/cfi-arc-1.d | 30 ++++++++++++++++++++++++++++++
gas/testsuite/gas/cfi/cfi-arc-1.s | 21 +++++++++++++++++++++
gas/testsuite/gas/cfi/cfi.exp | 3 ++-
6 files changed, 86 insertions(+), 1 deletion(-)
create mode 100644 gas/testsuite/gas/cfi/cfi-arc-1.d
create mode 100644 gas/testsuite/gas/cfi/cfi-arc-1.s
diff --git a/binutils/readelf.c b/binutils/readelf.c
index b3a28a8..6389321 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -11560,6 +11560,9 @@ is_32bit_pcrel_reloc (unsigned int reloc_type)
return reloc_type == 6;
case EM_ALPHA:
return reloc_type == 10; /* R_ALPHA_SREL32. */
+ case EM_ARC_COMPACT:
+ case EM_ARC_COMPACT2:
+ return reloc_type == 49; /* R_ARC_32_PCREL. */
case EM_ARM:
return reloc_type == 3; /* R_ARM_REL32 */
case EM_MICROBLAZE:
diff --git a/gas/config/tc-arc.c b/gas/config/tc-arc.c
index 65ca787..3e3a9ae 100644
--- a/gas/config/tc-arc.c
+++ b/gas/config/tc-arc.c
@@ -3675,3 +3675,24 @@ arc_pcrel_adjust (fragS *fragP)
return 0;
}
+
+/* Initialize the DWARF-2 unwind information for this procedure. */
+
+void
+tc_arc_frame_initial_instructions (void)
+{
+ /* Stack pointer is register 28. */
+ cfi_add_CFA_def_cfa_register (28);
+}
+
+int
+tc_arc_regname_to_dw2regnum (char *regname)
+{
+ struct symbol *sym;
+
+ sym = hash_find (arc_reg_hash, regname);
+ if (sym)
+ return S_GET_VALUE (sym);
+
+ return -1;
+}
diff --git a/gas/config/tc-arc.h b/gas/config/tc-arc.h
index acd007b..95efd77 100644
--- a/gas/config/tc-arc.h
+++ b/gas/config/tc-arc.h
@@ -191,12 +191,21 @@ extern void arc_handle_align (fragS *);
extern void arc_cons_fix_new (fragS *, int, int, expressionS *,
bfd_reloc_code_real_type);
extern void arc_frob_label (symbolS *);
+extern void tc_arc_frame_initial_instructions (void);
+extern int tc_arc_regname_to_dw2regnum (char *regname);
/* The blink register is r31. */
#define DWARF2_DEFAULT_RETURN_COLUMN 31
/* Registers are generally saved at negative offsets to the CFA. */
#define DWARF2_CIE_DATA_ALIGNMENT (-4)
+/* We want .cfi_* pseudo-ops for generating unwind info. */
+#define TARGET_USE_CFIPOP 1
+
+/* CFI hooks. */
+#define tc_cfi_frame_initial_instructions tc_arc_frame_initial_instructions
+#define tc_regname_to_dw2regnum tc_arc_regname_to_dw2regnum
+
/* Define the NOPs. */
#define NOP_OPCODE_S 0x000078E0
#define NOP_OPCODE_L 0x264A7000 /* mov 0,0. */
diff --git a/gas/testsuite/gas/cfi/cfi-arc-1.d b/gas/testsuite/gas/cfi/cfi-arc-1.d
new file mode 100644
index 0000000..cdb75bd
--- /dev/null
+++ b/gas/testsuite/gas/cfi/cfi-arc-1.d
@@ -0,0 +1,30 @@
+#readelf: -wf
+#name: CFI on ARC
+
+Contents of the .eh_frame section:
+
+00000000 00000010 00000000 CIE
+ Version: 1
+ Augmentation: "zR"
+ Code alignment factor: 1
+ Data alignment factor: -4
+ Return address column: 31
+ Augmentation data: 1b
+
+ DW_CFA_def_cfa_register: r28
+ DW_CFA_nop
+
+00000014 00000020 00000018 FDE cie=00000000 pc=00000000..00000010
+ DW_CFA_advance_loc: 4 to 00000004
+ DW_CFA_def_cfa_offset: 48
+ DW_CFA_offset: r13 at cfa-48
+ DW_CFA_advance_loc: 4 to 00000008
+ DW_CFA_def_cfa_offset: 52
+ DW_CFA_offset: r14 at cfa-44
+ DW_CFA_offset: r15 at cfa-40
+ DW_CFA_advance_loc: 4 to 0000000c
+ DW_CFA_offset: r27 at cfa-52
+ DW_CFA_advance_loc: 2 to 0000000e
+ DW_CFA_def_cfa_register: r27
+ DW_CFA_nop
+
diff --git a/gas/testsuite/gas/cfi/cfi-arc-1.s b/gas/testsuite/gas/cfi/cfi-arc-1.s
new file mode 100644
index 0000000..5d4f99d
--- /dev/null
+++ b/gas/testsuite/gas/cfi/cfi-arc-1.s
@@ -0,0 +1,21 @@
+ .file "foo.c"
+ .cpu HS
+ .section .text
+ .align 4
+ .cfi_startproc
+foo:
+ st.a r13,[sp,-48]
+ .cfi_def_cfa_offset 48
+ .cfi_offset r13, -48
+.LCFI0:
+ std r14,[sp,4]
+ .cfi_adjust_cfa_offset 4
+ .cfi_offset r14, -44
+ .cfi_rel_offset r15, 12
+ st.a fp,[sp,-4]
+ .cfi_rel_offset fp, 0
+ mov_s fp,sp
+ .cfi_def_cfa_register fp
+ j_s [blink]
+ .cfi_endproc
+ .size foo, .-foo
diff --git a/gas/testsuite/gas/cfi/cfi.exp b/gas/testsuite/gas/cfi/cfi.exp
index 379e6f4..4a8d3ba 100644
--- a/gas/testsuite/gas/cfi/cfi.exp
+++ b/gas/testsuite/gas/cfi/cfi.exp
@@ -91,7 +91,8 @@ if { [istarget "i*86-*-*"] || [istarget "x86_64-*-*"] } then {
} else {
run_dump_test "cfi-sh-1"
}
-
+} elseif { [istarget "arc*-*-*"] } then {
+ run_dump_test "cfi-arc-1"
} elseif { [istarget "arm*-*"] } then {
# Only ELF based ARM targets support CFI.
if { [is_pecoff_format] } then {
--
1.9.1
More information about the Binutils
mailing list