This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Update PRU assembler to corect hardware register numbering for DWARF.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=2688aab226c6d8871af4cf53ea5651e06f104744

commit 2688aab226c6d8871af4cf53ea5651e06f104744
Author: Dimitar Dimitrov <dimitar@dinux.eu>
Date:   Fri Aug 3 10:02:39 2018 +0100

    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.

Diff:
---
 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 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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]