summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjamesbowman <jamesbowman@138bc75d-0d04-0410-961f-82ee72b054a4>2016-07-08 22:11:30 +0000
committerjamesbowman <jamesbowman@138bc75d-0d04-0410-961f-82ee72b054a4>2016-07-08 22:11:30 +0000
commit44c5a84b3bc1adc0be2e4f0192a01ce1d4924bff (patch)
tree625ab019316dfe33ea4e16e9e672a38ec42c0a83
parent18bede74b43027123455fd978c675ad7b3237cb7 (diff)
downloadgcc-44c5a84b3bc1adc0be2e4f0192a01ce1d4924bff.tar.gz
FT32: apply unbias to references to RAM symbols.
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@238185 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/ft32/ft32.c43
-rw-r--r--gcc/config/ft32/ft32.h10
3 files changed, 58 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9cdfd1a86e9..7dd0db561c2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/ft32/ft32.c b/gcc/config/ft32/ft32.c
index 26e5a92195a..216a8040428 100644
--- a/gcc/config/ft32/ft32.c
+++ b/gcc/config/ft32/ft32.c
@@ -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"
diff --git a/gcc/config/ft32/ft32.h b/gcc/config/ft32/ft32.h
index 7c3a678b9a7..dd40b1de0b6 100644
--- a/gcc/config/ft32/ft32.h
+++ b/gcc/config/ft32/ft32.h
@@ -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 */