From 726c18e1c8a74682270bcd80f7145cda3cc76389 Mon Sep 17 00:00:00 2001 From: Claudiu Zissulescu Date: Tue, 16 Feb 2016 15:56:04 +0100 Subject: [PATCH] [ARC] Enable .cfi_* pseudo-ops. gas/ 2016-02-16 Claudiu Zissulescu * 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-16 Claudiu Zissulescu * gas/cfi/cfi-arc-1.d: New file. * gas/cfi/cfi-arc-1.s: Likewise. * gas/cfi/cfi.exp: Allow running tests for arc. binutils/ 2016-02-16 Claudiu Zissulescu * readelf.c (is_32bit_pcrel_reloc): Add R_ARC_32_PCREL. --- binutils/ChangeLog | 4 ++++ binutils/readelf.c | 3 +++ gas/ChangeLog | 9 +++++++++ gas/config/tc-arc.c | 22 ++++++++++++++++++++++ gas/config/tc-arc.h | 9 +++++++++ gas/testsuite/ChangeLog | 5 +++++ 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 ++- 9 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 gas/testsuite/ChangeLog 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/ChangeLog b/binutils/ChangeLog index 96ce7a84259..4ac0e2d1ecc 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,7 @@ +2016-02-16 Claudiu Zissulescu + + * readelf.c (is_32bit_pcrel_reloc): Add R_ARC_32_PCREL. + 2016-02-15 Nick Clifton * readelf.c (get_section_type_name): Add hex prefix to offsets diff --git a/binutils/readelf.c b/binutils/readelf.c index f33257bc047..d6abab800af 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -11558,6 +11558,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/ChangeLog b/gas/ChangeLog index ce09b011022..220b5b10e2f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +2016-02-16 Claudiu Zissulescu + + * 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. + 2016-02-16 Trevor Saunders * doc/internals.texi (S_IS_EXTERN): Remove. diff --git a/gas/config/tc-arc.c b/gas/config/tc-arc.c index f2d3a0e52c8..bfe9ae14488 100644 --- a/gas/config/tc-arc.c +++ b/gas/config/tc-arc.c @@ -24,6 +24,7 @@ #include "subsegs.h" #include "struc-symbol.h" #include "dwarf2dbg.h" +#include "dw2gencfi.h" #include "safe-ctype.h" #include "opcode/arc.h" @@ -3675,3 +3676,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 acd007bb503..95efd772363 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/ChangeLog b/gas/testsuite/ChangeLog new file mode 100644 index 00000000000..e9652f8f63e --- /dev/null +++ b/gas/testsuite/ChangeLog @@ -0,0 +1,5 @@ +2016-02-16 Claudiu Zissulescu + + * gas/cfi/cfi-arc-1.d: New file. + * gas/cfi/cfi-arc-1.s: Likewise. + * gas/cfi/cfi.exp: Allow running tests for arc. 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 00000000000..cdb75bd0e4b --- /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 00000000000..5d4f99d8c67 --- /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 379e6f4f3be..4a8d3bae62a 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 { -- 2.30.2