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.

From-SVN: r238185
This commit is contained in:
James Bowman 2016-07-08 22:11:30 +00:00 committed by James Bowman
parent 72b3e20335
commit f0f649c33c
3 changed files with 58 additions and 0 deletions

View 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

View 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"

View 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 */