FT32: apply unbias to references to RAM symbols.
authorJames Bowman <james.bowman@ftdichip.com>
Fri, 8 Jul 2016 22:11:30 +0000 (22:11 +0000)
committerJames Bowman <jamesbowman@gcc.gnu.org>
Fri, 8 Jul 2016 22:11:30 +0000 (22:11 +0000)
The FT32 binutils use a bias to distinguish between RAM and flash
addresses.

This fix adds an ASM_OUTPUT_SYMBOL_REF() that unbiases references to
RAM symbols.

Only references to RAM objects have the bias applied. Flash objects
(that is, objects in ADDR SPACE 1) are not biased, so for these no bias
should be applied. Likewise references in the gdb section need to use
the biased address, so references in debug sections are not unbiased.

gcc/ChangeLog:

2016-07-08  James Bowman  <james.bowman@ftdichip.com>

* config/ft32/ft32.c (ft32_elf_encode_section_info): New function.
* config/ft32/ft32.h (ASM_OUTPUT_SYMBOL_REF): New function.

From-SVN: r238185

gcc/ChangeLog
gcc/config/ft32/ft32.c
gcc/config/ft32/ft32.h

index 9cdfd1a86e9e93216b1ec0f13718fc6bea4a0a75..7dd0db561c208442c942d13899e9a5477dca34de 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-08  James Bowman  <james.bowman@ftdichip.com>
+
+       * config/ft32/ft32.c (ft32_elf_encode_section_info): New function.
+       * config/ft32/ft32.h (ASM_OUTPUT_SYMBOL_REF): New function.
+
 2016-07-08  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR rtl-optimization/71621
index 26e5a92195a672c83710f0367bcb50005b73f4db..216a80404287263e083db373b356a56039958365 100644 (file)
@@ -35,6 +35,7 @@
 #include "calls.h"
 #include "expr.h"
 #include "builtins.h"
+#include "print-tree.h"
 
 /* This file should be included last.  */
 #include "target-def.h"
@@ -895,6 +896,48 @@ yes:
   return 1;
 }
 
+#undef TARGET_ENCODE_SECTION_INFO
+#define TARGET_ENCODE_SECTION_INFO  ft32_elf_encode_section_info
+
+void
+ft32_elf_encode_section_info (tree decl, rtx rtl, int first)
+{
+  enum tree_code code;
+  rtx symbol;
+
+  /* Careful not to prod global register variables.  */
+  if (!MEM_P (rtl))
+    return;
+  symbol = XEXP (rtl, 0);
+  if (GET_CODE (symbol) != SYMBOL_REF)
+    return;
+
+  default_encode_section_info (decl, rtl, first);
+
+  code = TREE_CODE (decl);
+  switch (TREE_CODE_CLASS (code))
+    {
+    case tcc_declaration:
+      {
+       tree type = TREE_TYPE (decl);
+       int is_flash = (type && TYPE_P (type)
+                       && !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (type)));
+       if ((code == VAR_DECL) && !is_flash)
+         SYMBOL_REF_FLAGS (symbol) |= 0x1000;
+      }
+      break;
+
+    case tcc_constant:
+    case tcc_exceptional:
+      if (code == STRING_CST)
+       SYMBOL_REF_FLAGS (symbol) |= 0x1000;
+      break;
+
+    default:
+      break;
+    }
+}
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-ft32.h"
index 7c3a678b9a7ca71fdbd414ae43ed8e5705036dc3..dd40b1de0b665f816c15a5db99ba1595e4071448 100644 (file)
@@ -506,4 +506,14 @@ do { \
 
 extern int ft32_is_mem_pm(rtx o);
 
+#define ASM_OUTPUT_SYMBOL_REF(stream, sym) \
+  do { \
+    assemble_name (stream, XSTR (sym, 0)); \
+    int section_debug = in_section && \
+      (SECTION_STYLE (in_section) == SECTION_NAMED) && \
+      (in_section->named.common.flags & SECTION_DEBUG); \
+    if (!section_debug && SYMBOL_REF_FLAGS (sym) & 0x1000) \
+      asm_fprintf (stream, "-0x800000"); \
+  } while (0)
+
 #endif /* GCC_FT32_H */