/* Insn note definitions.
   Copyright (C) 2004 Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING.  If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  */

/* This file defines all the codes that may appear in the
   NOTE_LINE_NUMBER field of a NOTE insn for kinds of notes that are
   not line numbers.  Source files define DEF_INSN_NOTE appropriately
   before including this file.

   We are slowly removing the concept of insn-chain notes from the
   compiler.  Adding new codes to this file is STRONGLY DISCOURAGED.
   If you think you need one, look for other ways to express what you
   mean, such as register notes or bits in the basic-block structure.  */

/* Shorthand.  */
#define INSN_NOTE(NAME) DEF_INSN_NOTE (NOTE_INSN_##NAME)

/* This note is used to get rid of an insn when it isn't safe to patch
   the insn out of the chain.  */
INSN_NOTE (DELETED)

/* Generated in place of user-declared labels when they are deleted.  */
INSN_NOTE (DELETED_LABEL)

/* These are used to mark the beginning and end of a lexical block.
   See NOTE_BLOCK and reorder_blocks.  */
INSN_NOTE (BLOCK_BEG)
INSN_NOTE (BLOCK_END)

/* These mark the extremes of a loop.  */
INSN_NOTE (LOOP_BEG)
INSN_NOTE (LOOP_END)

/* This note indicates the start of the real body of the function,
   i.e. the point just after all of the parms have been moved into
   their homes, etc.  */
INSN_NOTE (FUNCTION_BEG)

/* This kind of note is generated at the end of the function body,
   just before the return insn or return label.  In an optimizing
   compilation it is deleted by the first jump optimization, after
   enabling that optimizer to determine whether control can fall
   off the end of the function body without a return statement.  */
INSN_NOTE (FUNCTION_END)

/* This marks the point immediately after the last prologue insn.  */
INSN_NOTE (PROLOGUE_END)

/* This marks the point immediately prior to the first epilogue insn.  */
INSN_NOTE (EPILOGUE_BEG)

/* These note where exception handling regions begin and end.
   Uses NOTE_EH_HANDLER to identify the region in question.  */
INSN_NOTE (EH_REGION_BEG)
INSN_NOTE (EH_REGION_END)

/* Generated whenever a duplicate line number note is output.
   For example, one is output after the end of an inline function,
   in order to prevent the line containing the inline call from
   being counted twice in gcov.  */
INSN_NOTE (REPEATED_LINE_NUMBER)

/* The location of a variable.  */
INSN_NOTE (VAR_LOCATION)

/* Record the expected value of a register at a location.  Uses
   NOTE_EXPECTED_VALUE; stored as (eq (reg) (const_int)).  */
INSN_NOTE (EXPECTED_VALUE)

/* Record the struct for the following basic block.  Uses
   NOTE_BASIC_BLOCK.  FIXME: Redundant with the basic block pointer
   now included in every insn.  */
INSN_NOTE (BASIC_BLOCK)

/* Record that the current basic block is unlikely to be executed and
   should be moved to the UNLIKELY_EXECUTED_TEXT_SECTION.  FIXME: Make
   this a bit on the basic block structure.  */
INSN_NOTE (UNLIKELY_EXECUTED_CODE)

#undef INSN_NOTE
