diff options
Diffstat (limited to 'patches/gcc-4.4.3/atmel/0002-Fix-incomplete-check-in-RTL-for-pm-annotation.patch')
-rw-r--r-- | patches/gcc-4.4.3/atmel/0002-Fix-incomplete-check-in-RTL-for-pm-annotation.patch | 89 |
1 files changed, 0 insertions, 89 deletions
diff --git a/patches/gcc-4.4.3/atmel/0002-Fix-incomplete-check-in-RTL-for-pm-annotation.patch b/patches/gcc-4.4.3/atmel/0002-Fix-incomplete-check-in-RTL-for-pm-annotation.patch deleted file mode 100644 index e8995b6..0000000 --- a/patches/gcc-4.4.3/atmel/0002-Fix-incomplete-check-in-RTL-for-pm-annotation.patch +++ /dev/null @@ -1,89 +0,0 @@ -From 78d4497ba8df93b225e3303d96334186fa7945ae Mon Sep 17 00:00:00 2001 -From: Stephan Linz <linz@li-pro.net> -Date: Tue, 19 Apr 2011 22:39:33 +0200 -Subject: [PATCH 02/10] Fix incomplete check in RTL for pm() annotation - -Backend (avr part) creates special "pm()" annotation by looking at -RTL. This is done in avr.c by function avr_assemble_integer(). This -patch allows function address expressions of the form address+k to -be correctly recognized as program memory addresses and thus force -use of pm() assembler syntax. - -GCC bug #35013 report: -http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35013 - -Original ATMEL patch from: -http://distribute.atmel.no/tools/opensource/avr-gcc/gcc-4.4.3/40-gcc-4.4.3-bug-35013.patch - -Signed-off-by: Stephan Linz <linz@li-pro.net> ---- - gcc/config/avr/avr-protos.h | 1 + - gcc/config/avr/avr.c | 26 ++++++++++++++++++++++---- - 2 files changed, 23 insertions(+), 4 deletions(-) - -diff --git a/gcc/config/avr/avr-protos.h b/gcc/config/avr/avr-protos.h -index d61ac39..c300c89 100644 ---- a/gcc/config/avr/avr-protos.h -+++ b/gcc/config/avr/avr-protos.h -@@ -114,6 +114,7 @@ extern int reg_unused_after (rtx insn, rtx reg); - extern int _reg_unused_after (rtx insn, rtx reg); - extern int avr_jump_mode (rtx x, rtx insn); - extern int byte_immediate_operand (rtx op, enum machine_mode mode); -+extern int text_segment_operand (rtx op, enum machine_mode mode); - extern int test_hard_reg_class (enum reg_class rclass, rtx x); - extern int jump_over_one_insn_p (rtx insn, rtx dest); - -diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c -index 4351e59..4a2588d 100644 ---- a/gcc/config/avr/avr.c -+++ b/gcc/config/avr/avr.c -@@ -1276,8 +1276,7 @@ print_operand_address (FILE *file, rtx addr) - - default: - if (CONSTANT_ADDRESS_P (addr) -- && ((GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (addr)) -- || GET_CODE (addr) == LABEL_REF)) -+ && text_segment_operand (addr, VOIDmode)) - { - fprintf (file, "gs("); - output_addr_const (file,addr); -@@ -1593,6 +1592,26 @@ byte_immediate_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) - && INTVAL (op) <= 0xff && INTVAL (op) >= 0); - } - -+/* Return true if OP is a program memory reference.*/ -+int -+text_segment_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) -+{ -+ switch (GET_CODE (op)) -+ { -+ case LABEL_REF : -+ return true; -+ case SYMBOL_REF : -+ return SYMBOL_REF_FUNCTION_P (op); -+ case PLUS : -+ /* Assume canonical format of symbol + constant. -+ Fall through. */ -+ case CONST : -+ return text_segment_operand (XEXP (op, 0), VOIDmode); -+ default : -+ return false; -+ } -+} -+ - /* Output all insn addresses and their sizes into the assembly language - output file. This is helpful for debugging whether the length attributes - in the md file are correct. -@@ -4808,8 +4827,7 @@ static bool - avr_assemble_integer (rtx x, unsigned int size, int aligned_p) - { - if (size == POINTER_SIZE / BITS_PER_UNIT && aligned_p -- && ((GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (x)) -- || GET_CODE (x) == LABEL_REF)) -+ && text_segment_operand (x, VOIDmode) ) - { - fputs ("\t.word\tgs(", asm_out_file); - output_addr_const (asm_out_file, x); --- -1.6.0.4 - |