]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Update PRU assembler to corect hardware register numbering for DWARF.
authorDimitar Dimitrov <dimitar@dinux.eu>
Fri, 3 Aug 2018 09:02:39 +0000 (10:02 +0100)
committerNick Clifton <nickc@redhat.com>
Fri, 3 Aug 2018 09:02:39 +0000 (10:02 +0100)
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
gas/config/tc-pru.c
gas/config/tc-pru.h
ld/ldlex.l

index 54928d82e0b329a0db128ee8c0cb93780fc2d5f7..b704d8c8744bc529e050fdc0cc8e960095b852f0 100644 (file)
@@ -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.
index 5121b1f8a4c4703e7bea95ee8f756d10bbea9ca5..5a35a78487d23b6f109ce17ec77f60b1e0f8e705 100644 (file)
@@ -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);
 }
 
index bc4785154b54e6a24ea5e39faa9163ddb4f3b111..83d1ab8d85f6b18f5de85d249e81285d7ebe14de 100644 (file)
@@ -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
index 261c0c1c0fff5efc2a6aad041282e4c14592f0f6..c80db58634c28a194464c29238be75098165ba95 100644 (file)
@@ -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;