This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] avr: Fix PR target/12721.


Hi,

Attached is a patch to fix PR target/12721.

The port uses global variables tmp_reg_rtx and zero_reg_rtx.  They
used to be initialized in avr_init_once, called from
INIT_TARGET_OPTABS.  After Zack zapped INIT_TARGET_OPTABS with

http://gcc.gnu.org/ml/gcc-patches/2003-10/msg00091.html

nobody calls avr_init_once() anymore, leaving the above global
variables uninitialized.

The patch restores the initialization in avr_override_options(),
called from OVERRIDE_OPTIONS and make these variable GC-safe at the
same time.

The patch also removes ldi_reg_rtx as it is unused.

Built avr-elf.  OK to apply?

Kazu Hirata

2003-12-24  Kazu Hirata  <kazu@cs.umass.edu>

	PR target/12721.
	* config/avr/avr.c: Include ggc.h.
	(tmp_reg_rtx): Declare with GTY.
	(zero_reg_rtx): Likewise.
	(ldi_reg_rtx): Remove.
	(avr_override_options): Initialize zero_reg_rtx and
	ldi_reg_rtx.
	(avr_init): Remove.
	Include gt-avr.h.
	* config/avr/avr.h (LDI_REG_REGNO): Remove.
	Remove externs for tmp_reg_rtx, zero_reg_rtx, and ldi_reg_rtx.

Index: avr.c
===================================================================
RCS file: /home/kazu/nobackup/gcc-cvs/gcc/gcc/config/avr/avr.c,v
retrieving revision 1.103
diff -c -p -r1.103 avr.c
*** avr.c	13 Oct 2003 08:40:44 -0000	1.103
--- avr.c	24 Dec 2003 20:05:42 -0000
***************
*** 39,44 ****
--- 39,45 ----
  #include "obstack.h"
  #include "function.h"
  #include "recog.h"
+ #include "ggc.h"
  #include "tm_p.h"
  #include "target.h"
  #include "target-def.h"
*************** static int avr_address_cost (rtx);
*** 81,94 ****
  #define FIRST_CUM_REG 26
  
  /* Temporary register RTX (gen_rtx (REG,QImode,TMP_REGNO)) */
! rtx tmp_reg_rtx;
  
  /* Zeroed register RTX (gen_rtx (REG,QImode,ZERO_REGNO)) */
! rtx zero_reg_rtx;
! 
! /* RTX for register which will be used for loading immediate values to
!    r0-r15 registers.  */
! rtx ldi_reg_rtx;
  
  /* AVR register names {"r0", "r1", ..., "r31"} */
  static const char *const avr_regnames[] = REGISTER_NAMES;
--- 82,91 ----
  #define FIRST_CUM_REG 26
  
  /* Temporary register RTX (gen_rtx (REG,QImode,TMP_REGNO)) */
! static GTY(()) rtx tmp_reg_rtx;
  
  /* Zeroed register RTX (gen_rtx (REG,QImode,ZERO_REGNO)) */
! static GTY(()) rtx zero_reg_rtx;
  
  /* AVR register names {"r0", "r1", ..., "r31"} */
  static const char *const avr_regnames[] = REGISTER_NAMES;
*************** avr_override_options (void)
*** 274,302 ****
  
    if (optimize && !TARGET_NO_TABLEJUMP)
      avr_case_values_threshold = (!AVR_MEGA || TARGET_CALL_PROLOGUES) ? 8 : 17;
- }
  
! #if 0 /* Does not play nice with GC.  FIXME. */
! /* Initialize TMP_REG_RTX and ZERO_REG_RTX */
! void
! avr_init_once (void)
! {
!   tmp_reg_rtx = xcalloc (1, sizeof (struct rtx_def) + 1 * sizeof (rtunion));
!   PUT_CODE (tmp_reg_rtx, REG);
!   PUT_MODE (tmp_reg_rtx, QImode);
!   XINT (tmp_reg_rtx, 0) = TMP_REGNO;
! 
!   zero_reg_rtx = xcalloc (1, sizeof (struct rtx_def) + 1 * sizeof (rtunion));
!   PUT_CODE (zero_reg_rtx, REG);
!   PUT_MODE (zero_reg_rtx, QImode);
!   XINT (zero_reg_rtx, 0) = ZERO_REGNO;
! 
!   ldi_reg_rtx = xcalloc (1, sizeof (struct rtx_def) + 1 * sizeof (rtunion));
!   PUT_CODE (ldi_reg_rtx, REG);
!   PUT_MODE (ldi_reg_rtx, QImode);
!   XINT (ldi_reg_rtx, 0) = LDI_REG_REGNO;
  }
- #endif
  
  /*  return register class from register number */
  
--- 271,280 ----
  
    if (optimize && !TARGET_NO_TABLEJUMP)
      avr_case_values_threshold = (!AVR_MEGA || TARGET_CALL_PROLOGUES) ? 8 : 17;
  
!   tmp_reg_rtx  = gen_rtx_REG (QImode, TMP_REGNO);
!   zero_reg_rtx = gen_rtx_REG (QImode, ZERO_REGNO);
  }
  
  /*  return register class from register number */
  
*************** avr_asm_out_dtor (rtx symbol, int priori
*** 5389,5391 ****
--- 5367,5370 ----
    default_dtor_section_asm_out_destructor (symbol, priority);
  }
  
+ #include "gt-avr.h"
Index: avr.h
===================================================================
RCS file: /home/kazu/nobackup/gcc-cvs/gcc/gcc/config/avr/avr.h,v
retrieving revision 1.92
diff -c -p -r1.92 avr.h
*** avr.h	21 Dec 2003 07:29:35 -0000	1.92
--- avr.h	24 Dec 2003 20:01:57 -0000
*************** extern int avr_case_values_threshold;
*** 2482,2492 ****
  /* zero register r1 */
  #define ZERO_REGNO 1
  
- /* Temporary register which used for load immediate values to r0-r15  */
- #define LDI_REG_REGNO 31
- 
- extern struct rtx_def *tmp_reg_rtx;
- extern struct rtx_def *zero_reg_rtx;
- extern struct rtx_def *ldi_reg_rtx;
- 
  #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
--- 2482,2485 ----


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]