From 2688aab226c6d8871af4cf53ea5651e06f104744 Mon Sep 17 00:00:00 2001 From: Dimitar Dimitrov Date: Fri, 3 Aug 2018 10:02:39 +0100 Subject: [PATCH] Update PRU assembler to corect hardware register numbering for DWARF. A small rework of the PRU GCC port exposed that CIE data alignment is erroneously set to 4 for PRU in GAS. In fact PRU stack must be aligned to 1. Set the macro to -1, to allow output from GCC to be assembled without errors. Also, while at it, set DWARF2 HW register numbering to follow latest * config/tc-pru.c (pru_regname_to_dw2regnum): Return the starting HW byte-register number. (pru_frame_initial_instructions): Use byte-numbering for FP index. * config/tc-pru.h (DWARF2_DEFAULT_RETURN_COLUMN): Use number from latest GCC. (DWARF2_CIE_DATA_ALIGNMENT): Set to -1. --- gas/ChangeLog | 9 +++++++++ gas/config/tc-pru.c | 22 ++++++++++++++++++---- gas/config/tc-pru.h | 10 ++++++++-- ld/ldlex.l | 2 +- 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 54928d82e0..b704d8c874 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +2018-08-03 Dimitar Dimitrov + + * config/tc-pru.c (pru_regname_to_dw2regnum): Return the starting HW + byte-register number. + (pru_frame_initial_instructions): Use byte-numbering for FP index. + * config/tc-pru.h (DWARF2_DEFAULT_RETURN_COLUMN): Use number from + latest GCC. + (DWARF2_CIE_DATA_ALIGNMENT): Set to -1. + 2018-08-03 Jan Beulich * config/tc-i386.c (Operand_Mem): Define. diff --git a/gas/config/tc-pru.c b/gas/config/tc-pru.c index 5121b1f8a4..5a35a78487 100644 --- a/gas/config/tc-pru.c +++ b/gas/config/tc-pru.c @@ -1920,14 +1920,28 @@ pru_cons_fix_new (fragS *frag, int where, unsigned int nbytes, } /* Implement tc_regname_to_dw2regnum, to convert REGNAME to a DWARF-2 - register number. */ + register number. Return the starting HW byte-register number. */ + int pru_regname_to_dw2regnum (char *regname) { + static const unsigned int regstart[RSEL_NUM_ITEMS] = + { + [RSEL_7_0] = 0, + [RSEL_15_8] = 1, + [RSEL_23_16] = 2, + [RSEL_31_24] = 3, + [RSEL_15_0] = 0, + [RSEL_23_8] = 1, + [RSEL_31_16] = 2, + [RSEL_31_0] = 0, + }; + struct pru_reg *r = pru_reg_lookup (regname); - if (r == NULL) + + if (r == NULL || r->regsel >= RSEL_NUM_ITEMS) return -1; - return r->index; + return r->index * 4 + regstart[r->regsel]; } /* Implement tc_cfi_frame_initial_instructions, to initialize the DWARF-2 @@ -1935,7 +1949,7 @@ pru_regname_to_dw2regnum (char *regname) void pru_frame_initial_instructions (void) { - const unsigned fp_regno = 4; + const unsigned fp_regno = 4 * 4; cfi_add_CFA_def_cfa (fp_regno, 0); } diff --git a/gas/config/tc-pru.h b/gas/config/tc-pru.h index bc4785154b..83d1ab8d85 100644 --- a/gas/config/tc-pru.h +++ b/gas/config/tc-pru.h @@ -138,8 +138,14 @@ extern int pru_validate_fix_sub (struct fix *); /* We want .cfi_* pseudo-ops for generating unwind info. */ #define TARGET_USE_CFIPOP 1 -#define DWARF2_DEFAULT_RETURN_COLUMN 31 -#define DWARF2_CIE_DATA_ALIGNMENT (-4) + +/* Program Counter register number is not defined by TI documents. + Pick the virtual number used by GCC. */ +#define DWARF2_DEFAULT_RETURN_COLUMN 132 + +/* The stack grows down, and is only byte aligned. */ +#define DWARF2_CIE_DATA_ALIGNMENT -1 + #define tc_regname_to_dw2regnum pru_regname_to_dw2regnum extern int pru_regname_to_dw2regnum (char *regname); #define tc_cfi_frame_initial_instructions pru_frame_initial_instructions diff --git a/ld/ldlex.l b/ld/ldlex.l index 261c0c1c0f..c80db58634 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -424,7 +424,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* /* PR ld/20906. A corrupt input file can contain bogus strings. */ len = strlen (yylval.name); - if (len > yyleng - 2) + if (len > (bfd_size_type) yyleng - 2) len = yyleng - 2; yylval.name[len] = 0; return NAME;