This is the mail archive of the binutils@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]

[PATCH] gas: Enable PC-relative diff relocations on sparc64


gas/
	* config/tc-sparc.c (tc_gen_reloc): Convert BFD_RELOC_8/16/32/64
	into the corresponding BFD_RELOC_8/16/32/64_PCREL relocation
	when requested.
	* config/tc-sparc.h (DIFF_EXPR_OK): Define to enable PC-relative
	diff relocations.
---
 gas/config/tc-sparc.c | 26 +++++++++++++++++++++++++-
 gas/config/tc-sparc.h |  2 ++
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/gas/config/tc-sparc.c b/gas/config/tc-sparc.c
index 692a1873f4..6d1b038daa 100644
--- a/gas/config/tc-sparc.c
+++ b/gas/config/tc-sparc.c
@@ -3946,8 +3946,33 @@ tc_gen_reloc (asection *section, fixS *fixp)
 
   switch (fixp->fx_r_type)
     {
+    case BFD_RELOC_8:
     case BFD_RELOC_16:
     case BFD_RELOC_32:
+    case BFD_RELOC_64:
+      if (fixp->fx_pcrel)
+	{
+	  switch (fixp->fx_size)
+	    {
+	    default:
+	      as_bad_where (fixp->fx_file, fixp->fx_line,
+			    _("can not do %d byte pc-relative relocation"),
+			    fixp->fx_size);
+	      code = fixp->fx_r_type;
+	      fixp->fx_pcrel = 0;
+	      break;
+	    case 1: code = BFD_RELOC_8_PCREL;  break;
+	    case 2: code = BFD_RELOC_16_PCREL; break;
+	    case 4: code = BFD_RELOC_32_PCREL; break;
+#ifdef BFD64
+	    case 8: code = BFD_RELOC_64_PCREL; break;
+#endif
+	    }
+	  if (fixp->fx_pcrel)
+	    fixp->fx_addnumber = fixp->fx_offset;
+	  break;
+	}
+      /* Fall through.  */
     case BFD_RELOC_HI22:
     case BFD_RELOC_LO10:
     case BFD_RELOC_32_PCREL_S2:
@@ -3960,7 +3985,6 @@ tc_gen_reloc (asection *section, fixS *fixp)
     case BFD_RELOC_SPARC_WDISP16:
     case BFD_RELOC_SPARC_WDISP19:
     case BFD_RELOC_SPARC_WDISP22:
-    case BFD_RELOC_64:
     case BFD_RELOC_SPARC_5:
     case BFD_RELOC_SPARC_6:
     case BFD_RELOC_SPARC_7:
diff --git a/gas/config/tc-sparc.h b/gas/config/tc-sparc.h
index 3dd2483cd7..25ef8e4fe3 100644
--- a/gas/config/tc-sparc.h
+++ b/gas/config/tc-sparc.h
@@ -77,6 +77,8 @@ extern void sparc_handle_align (struct frag *);
 
 #define MAX_MEM_FOR_RS_ALIGN_CODE  (3 + 4 + 4)
 
+#define DIFF_EXPR_OK    /* foo-. gets turned into PC relative relocs */
+
 /* I know that "call 0" fails in sparc-coff if this doesn't return 1.  I
    don't know about other relocation types, or other formats, yet.  */
 #ifdef OBJ_COFF
-- 
2.13.3


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