FreeBSD/contrib/gcc/varasm.c
/* Worker function for output_constant_pool.  Emit constant DESC,
   giving it ALIGN bits of alignment.  */
Worker function for output_constant_pool.  Emit constant DESC,
giving it ALIGN bits of alignment.
Worker function for output_constant_pool . Emit constant DESC giving it ALIGN bits of alignment .
static void
output_constant_pool_1 (struct constant_descriptor_rtx *desc,
			unsigned int align)
{
  rtx x, tmp;
  x = desc->constant;
  tmp = x;
  switch (GET_CODE (x))
    {
    case CONST:
      if (GET_CODE (XEXP (x, 0)) != PLUS
	  || GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
	break;
      tmp = XEXP (XEXP (x, 0), 0);
    case LABEL_REF:
      tmp = XEXP (x, 0);
      gcc_assert (!INSN_DELETED_P (tmp));
      gcc_assert (!NOTE_P (tmp)
		  || NOTE_LINE_NUMBER (tmp) != NOTE_INSN_DELETED);
      break;
    default:
      break;
    }
#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
  ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, desc->mode,
				 align, desc->labelno, done);
#endif
  assemble_align (align);
  targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno);
  output_constant_pool_2 (desc->mode, x, align);
  if (align > GET_MODE_BITSIZE (desc->mode)
      && in_section
      && (in_section->common.flags & SECTION_MERGE))
    assemble_align (align);
#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
 done:
#endif
  return;
}
static void output_constant_pool_1 ( struct constant_descriptor_rtx * desc , unsigned int align ) { rtx x , tmp ; x = desc -> constant ; tmp = x ; switch ( GET_CODE ( x ) ) { case CONST : if ( GET_CODE ( XEXP ( x , 0 ) ) != PLUS || GET_CODE ( XEXP ( XEXP ( x , 0 ) , 0 ) ) != LABEL_REF ) break ; tmp = XEXP ( XEXP ( x , 0 ) , 0 ) ; case LABEL_REF : tmp = XEXP ( x , 0 ) ; gcc_assert ( ! INSN_DELETED_P ( tmp ) ) ; gcc_assert ( ! NOTE_P ( tmp ) || NOTE_LINE_NUMBER ( tmp ) != NOTE_INSN_DELETED ) ; break ; default : break ; } #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY ASM_OUTPUT_SPECIAL_POOL_ENTRY ( asm_out_file , x , desc -> mode , align , desc -> labelno , done ) ; #endif assemble_align ( align ) ; targetm . asm_out . internal_label ( asm_out_file , " " , desc -> labelno ) ; output_constant_pool_2 ( desc -> mode , x , align ) ; if ( align > GET_MODE_BITSIZE ( desc -> mode ) && in_section && ( in_section -> common . flags & SECTION_MERGE ) ) assemble_align ( align ) ; #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY done : #endif return ; }
Worker function for output_constant_pool.
Worker function for output_constant_pool .
/* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
     whose CODE_LABEL has been deleted.  This can occur if a jump table
     is eliminated by optimization.  If so, write a constant of zero
     instead.  Note that this can also happen by turning the
     CODE_LABEL into a NOTE.  */ /* ??? This seems completely and utterly wrong.  Certainly it's
     not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
     functioning even with INSN_DELETED_P and friends.  */ /* FALLTHRU  */ /* Output the label.  */ /* Output the data.  */ /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
     sections have proper size.  */