aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitar Dimitrov <dimitar@dinux.eu>2018-08-03 10:02:39 +0100
committerNick Clifton <nickc@redhat.com>2018-08-03 10:02:39 +0100
commit2688aab226c6d8871af4cf53ea5651e06f104744 (patch)
tree2c32180e5a4a87d1a9a6ee64944c56aa95f65c39
parentdbf8be89edf7b6443fa0b7d31ca6d6ad202fadae (diff)
downloadfsf-binutils-gdb-2688aab226c6d8871af4cf53ea5651e06f104744.zip
fsf-binutils-gdb-2688aab226c6d8871af4cf53ea5651e06f104744.tar.gz
fsf-binutils-gdb-2688aab226c6d8871af4cf53ea5651e06f104744.tar.bz2
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.
-rw-r--r--gas/ChangeLog9
-rw-r--r--gas/config/tc-pru.c22
-rw-r--r--gas/config/tc-pru.h10
-rw-r--r--ld/ldlex.l2
4 files changed, 36 insertions, 7 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 54928d8..b704d8c 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,12 @@
+2018-08-03 Dimitar Dimitrov <dimitar@dinux.eu>
+
+ * 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 <jbeulich@suse.com>
* config/tc-i386.c (Operand_Mem): Define.
diff --git a/gas/config/tc-pru.c b/gas/config/tc-pru.c
index 5121b1f..5a35a78 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 bc47851..83d1ab8 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 261c0c1..c80db58 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;