Commit 7b0f476d by Andreas Schwab Committed by Andreas Schwab

re PR target/43294 (Error: junk at end of line, first unrecognized character is `@')

PR target/43294
* config/m68k/m68k.c (TARGET_DELEGITIMIZE_ADDRESS): Define.
(m68k_delegitimize_address): New function.

From-SVN: r157328
parent 8325c9b8
2010-03-09 Andreas Schwab <schwab@linux-m68k.org>
PR target/43294
* config/m68k/m68k.c (TARGET_DELEGITIMIZE_ADDRESS): Define.
(m68k_delegitimize_address): New function.
2010-03-09 Jakub Jelinek <jakub@redhat.com>
PR debug/43299
......
/* Subroutines for insn-output.c for Motorola 68000 family.
Copyright (C) 1987, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009
2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
This file is part of GCC.
......@@ -154,6 +154,7 @@ static bool m68k_return_in_memory (const_tree, const_tree);
#endif
static void m68k_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
static void m68k_trampoline_init (rtx, tree, rtx);
static rtx m68k_delegitimize_address (rtx);
/* Specify the identification number of the library being built */
......@@ -271,6 +272,9 @@ const char *m68k_library_id_string = "_current_shared_library_a5_offset_";
#undef TARGET_TRAMPOLINE_INIT
#define TARGET_TRAMPOLINE_INIT m68k_trampoline_init
#undef TARGET_DELEGITIMIZE_ADDRESS
#define TARGET_DELEGITIMIZE_ADDRESS m68k_delegitimize_address
static const struct attribute_spec m68k_attribute_table[] =
{
/* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
......@@ -4616,6 +4620,57 @@ m68k_output_dwarf_dtprel (FILE *file, int size, rtx x)
fputs ("@TLSLDO+0x8000", file);
}
/* In the name of slightly smaller debug output, and to cater to
general assembler lossage, recognize various UNSPEC sequences
and turn them back into a direct symbol reference. */
static rtx
m68k_delegitimize_address (rtx x)
{
rtx orig_x = delegitimize_mem_from_attrs (x);
rtx y;
rtx addend = NULL_RTX;
rtx result;
x = orig_x;
if (MEM_P (x))
x = XEXP (x, 0);
if (GET_CODE (x) == PLUS
&& GET_CODE (XEXP (x, 1)) == CONST
&& REG_P (XEXP (x, 0))
&& REGNO (XEXP (x, 0)) == PIC_REG)
{
y = x = XEXP (XEXP (x, 1), 0);
/* Handle an addend. */
if ((GET_CODE (x) == PLUS || GET_CODE (x) == MINUS)
&& CONST_INT_P (XEXP (x, 1)))
{
addend = XEXP (x, 1);
x = XEXP (x, 0);
}
if (GET_CODE (x) == UNSPEC
&& (XINT (x, 1) == UNSPEC_RELOC16
|| XINT (x, 1) == UNSPEC_RELOC32))
{
result = XVECEXP (x, 0, 0);
if (addend)
{
if (GET_CODE (y) == PLUS)
result = gen_rtx_PLUS (Pmode, result, addend);
else
result = gen_rtx_MINUS (Pmode, result, addend);
result = gen_rtx_CONST (Pmode, result);
}
return result;
}
}
return orig_x;
}
/* A C compound statement to output to stdio stream STREAM the
assembler syntax for an instruction operand that is a memory
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment