Conditionally compile support for --enable-mapped_location.

* input.h:  #include line-map.h for source_location typedef.
	(BUILTINS_LOCATION, UNKNOWN_LOCATION, expand_location,
	LOCATION_FILE, LOCATION_LINE):  New macros and functions.
	(expanded_location, source_locus):  New typedefs.
	(push_srcloc):  Change parameter list if USE_MAPPED_LOCATION.
	* rtl.def (NOTE, ASM_OPERANDS):  Modify specifcation, if
	USE_MAPPED_LOCATION.
	* rtl.h (NOTE_DELETED_LABEL_NAME):  New macro.
	(NOTE_SOURCE_LOCATION, NOTE_EXPNDED_LOCATION, SET_INSN_DELETED):
	New conditional macros.
	(ASM_OPERANDS_SOURCE_FILE, ASM_OPERANDS_SOURCE_LINE):  Replace
	by ASM_OPERANDS_SOURCE_LOCATION if USE_MAPPED_LOCATION.
	* tree.h (EXPR_LOCATION, SET_EXPR_LOCATION, EXPR_HAS_LOCATION,
	EXPR_LOCUS, SET_EXPR_LOCUS, EXPR_FILENAME, EXPR_LINENO,
	DECL_IS_BUILTIN):  New macros, most depending on USE_MAPPED__LOCATION.
	(tree_exp):  Change type of locus to use new source_locus typedef.
	* tree.c (build1_stat):  Use SET_EXPR_LOCATION.
	(annotate_with_locus, annotate_with_file_line):  Conditionalize.
	(expand_location):  New function.
	* toplev.c (unknown_location):  New static, when USE_MAPPED_LOCATION.
	(push_srcloc, pop_loc):  Adjust parameter handling.
	(process_options):  Don't set input_filename by itself.
	(lang_dependent_init):  Save, set input_location to <built-in>.
	(warn_deprecated_use):  Use expand_location.

From-SVN: r83918
This commit is contained in:
Per Bothner 2004-06-30 10:58:21 -07:00 committed by Per Bothner
parent b5674962f1
commit c166747038
7 changed files with 219 additions and 31 deletions

View File

@ -1,3 +1,31 @@
2004-06-30 Per Bothner <per@bothner.com>
Conditionally compile support for --enable-mapped_location.
* input.h: #include line-map.h for source_location typedef.
(BUILTINS_LOCATION, UNKNOWN_LOCATION, expand_location,
LOCATION_FILE, LOCATION_LINE): New macros and functions.
(expanded_location, source_locus): New typedefs.
(push_srcloc): Change parameter list if USE_MAPPED_LOCATION.
* rtl.def (NOTE, ASM_OPERANDS): Modify specifcation, if
USE_MAPPED_LOCATION.
* rtl.h (NOTE_DELETED_LABEL_NAME): New macro.
(NOTE_SOURCE_LOCATION, NOTE_EXPNDED_LOCATION, SET_INSN_DELETED):
New conditional macros.
(ASM_OPERANDS_SOURCE_FILE, ASM_OPERANDS_SOURCE_LINE): Replace
by ASM_OPERANDS_SOURCE_LOCATION if USE_MAPPED_LOCATION.
* tree.h (EXPR_LOCATION, SET_EXPR_LOCATION, EXPR_HAS_LOCATION,
EXPR_LOCUS, SET_EXPR_LOCUS, EXPR_FILENAME, EXPR_LINENO,
DECL_IS_BUILTIN): New macros, most depending on USE_MAPPED__LOCATION.
(tree_exp): Change type of locus to use new source_locus typedef.
* tree.c (build1_stat): Use SET_EXPR_LOCATION.
(annotate_with_locus, annotate_with_file_line): Conditionalize.
(expand_location): New function.
* toplev.c (unknown_location): New static, when USE_MAPPED_LOCATION.
(push_srcloc, pop_loc): Adjust parameter handling.
(process_options): Don't set input_filename by itself.
(lang_dependent_init): Save, set input_location to <built-in>.
(warn_deprecated_use): Use expand_location.
2004-06-30 Richard Sandiford <rsandifo@redhat.com> 2004-06-30 Richard Sandiford <rsandifo@redhat.com>
Eric Christopher <echristo@redhat.com> Eric Christopher <echristo@redhat.com>

View File

@ -22,19 +22,41 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#ifndef GCC_INPUT_H #ifndef GCC_INPUT_H
#define GCC_INPUT_H #define GCC_INPUT_H
#include "line-map.h"
extern struct line_maps line_table; extern struct line_maps line_table;
/* The data structure used to record a location in a translation unit. */ /* The location for declarations in "<built-in>" */
/* Long-term, we want to get rid of this and typedef fileline location_t. */ #define BUILTINS_LOCATION ((source_location) 2)
struct location_s GTY (())
typedef struct location_s GTY(())
{ {
/* The name of the source file involved. */ /* The name of the source file involved. */
const char *file; const char *file;
/* The line-location in the source file. */ /* The line-location in the source file. */
int line; int line;
};
/* FUTURE (but confuses gentype): int column. */
} expanded_location;
#ifdef USE_MAPPED_LOCATION
extern expanded_location expand_location (source_location);
#define UNKNOWN_LOCATION ((source_location) 0)
typedef source_location location_t; /* deprecated typedef */
typedef source_location source_locus; /* to be removed */
#else /* ! USE_MAPPED_LOCATION */
typedef struct location_s location_t; typedef struct location_s location_t;
typedef location_t *source_locus;
#define expand_location(FILELINE) (FILELINE)
extern location_t unknown_location;
#define UNKNOWN_LOCATION unknown_location
#endif /* ! USE_MAPPED_LOCATION */
struct file_stack struct file_stack
{ {
@ -46,8 +68,18 @@ struct file_stack
extern const char *main_input_filename; extern const char *main_input_filename;
extern location_t input_location; extern location_t input_location;
#define input_line (input_location.line) #ifdef USE_MAPPED_LOCATION
#define input_filename (input_location.file) extern void push_srcloc (location_t);
#else /* ! USE_MAPPED_LOCATION */
extern void push_srcloc (const char *name, int line);
#endif /* ! USE_MAPPED_LOCATION */
extern void pop_srcloc (void);
#define LOCATION_FILE(LOC) ((expand_location (LOC)).file)
#define LOCATION_LINE(LOC) ((expand_location (LOC)).line)
#define input_line LOCATION_LINE(input_location)
#define input_filename LOCATION_FILE(input_location)
/* Stack of currently pending input files. /* Stack of currently pending input files.
The line member is not accurate for the innermost file on the stack. */ The line member is not accurate for the innermost file on the stack. */
@ -56,7 +88,4 @@ extern struct file_stack *input_file_stack;
/* Incremented on each change to input_file_stack. */ /* Incremented on each change to input_file_stack. */
extern int input_file_stack_tick; extern int input_file_stack_tick;
extern void push_srcloc (const char *name, int line);
extern void pop_srcloc (void);
#endif #endif

View File

@ -640,11 +640,19 @@ DEF_RTL_EXPR(BARRIER, "barrier", "iuu000000", RTX_EXTRA)
7: is the user-given name of the label, if any. */ 7: is the user-given name of the label, if any. */
DEF_RTL_EXPR(CODE_LABEL, "code_label", "iuuB00is", RTX_EXTRA) DEF_RTL_EXPR(CODE_LABEL, "code_label", "iuuB00is", RTX_EXTRA)
#ifdef USE_MAPPED_LOCATION
/* Say where in the code a source line starts, for symbol table's sake.
Operand:
4: unused if line number > 0, note-specific data otherwise.
5: line number if > 0, enum note_insn otherwise.
6: CODE_LABEL_NUMBER if line number == NOTE_INSN_DELETED_LABEL. */
#else
/* Say where in the code a source line starts, for symbol table's sake. /* Say where in the code a source line starts, for symbol table's sake.
Operand: Operand:
4: filename, if line number > 0, note-specific data otherwise. 4: filename, if line number > 0, note-specific data otherwise.
5: line number if > 0, enum note_insn otherwise. 5: line number if > 0, enum note_insn otherwise.
6: unique number if line number == note_insn_deleted_label. */ 6: unique number if line number == note_insn_deleted_label. */
#endif
DEF_RTL_EXPR(NOTE, "note", "iuuB0ni", RTX_EXTRA) DEF_RTL_EXPR(NOTE, "note", "iuuB0ni", RTX_EXTRA)
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
@ -671,6 +679,20 @@ DEF_RTL_EXPR(PARALLEL, "parallel", "E", RTX_EXTRA)
as a convenient way to hold a string. */ as a convenient way to hold a string. */
DEF_RTL_EXPR(ASM_INPUT, "asm_input", "s", RTX_EXTRA) DEF_RTL_EXPR(ASM_INPUT, "asm_input", "s", RTX_EXTRA)
#ifdef USE_MAPPED_LOCATION
/* An assembler instruction with operands.
1st operand is the instruction template.
2nd operand is the constraint for the output.
3rd operand is the number of the output this expression refers to.
When an insn stores more than one value, a separate ASM_OPERANDS
is made for each output; this integer distinguishes them.
4th is a vector of values of input operands.
5th is a vector of modes and constraints for the input operands.
Each element is an ASM_INPUT containing a constraint string
and whose mode indicates the mode of the input operand.
6th is the source line number. */
DEF_RTL_EXPR(ASM_OPERANDS, "asm_operands", "ssiEEi", RTX_EXTRA)
#else
/* An assembler instruction with operands. /* An assembler instruction with operands.
1st operand is the instruction template. 1st operand is the instruction template.
2nd operand is the constraint for the output. 2nd operand is the constraint for the output.
@ -684,6 +706,7 @@ DEF_RTL_EXPR(ASM_INPUT, "asm_input", "s", RTX_EXTRA)
6th is the name of the containing source file. 6th is the name of the containing source file.
7th is the source line number. */ 7th is the source line number. */
DEF_RTL_EXPR(ASM_OPERANDS, "asm_operands", "ssiEEsi", RTX_EXTRA) DEF_RTL_EXPR(ASM_OPERANDS, "asm_operands", "ssiEEsi", RTX_EXTRA)
#endif
/* A machine-specific operation. /* A machine-specific operation.
1st operand is a vector of operands being used by the operation so that 1st operand is a vector of operands being used by the operation so that

View File

@ -914,7 +914,22 @@ extern const char * const reg_note_name[];
/* Opaque data. */ /* Opaque data. */
#define NOTE_DATA(INSN) RTL_CHECKC1 (INSN, 4, NOTE) #define NOTE_DATA(INSN) RTL_CHECKC1 (INSN, 4, NOTE)
#define NOTE_DELETED_LABEL_NAME(INSN) XCSTR (INSN, 4, NOTE)
#ifdef USE_MAPPED_LOCATION
#define NOTE_SOURCE_LOCATION(INSN) XCUINT (INSN, 5, NOTE)
#define NOTE_EXPANDED_LOCATION(XLOC, INSN) \
(XLOC) = expand_location (NOTE_SOURCE_LOCATION (INSN))
#define SET_INSN_DELETED(INSN) \
(PUT_CODE (INSN, NOTE), NOTE_LINE_NUMBER (INSN) = NOTE_INSN_DELETED)
#else
#define NOTE_EXPANDED_LOCATION(XLOC, INSN) \
((XLOC).file = NOTE_SOURCE_FILE (INSN), \
(XLOC).line = NOTE_LINE_NUMBER (INSN))
#define NOTE_SOURCE_FILE(INSN) XCSTR (INSN, 4, NOTE) #define NOTE_SOURCE_FILE(INSN) XCSTR (INSN, 4, NOTE)
#define SET_INSN_DELETED(INSN) \
(PUT_CODE (INSN, NOTE), NOTE_SOURCE_FILE (INSN) = 0, \
NOTE_LINE_NUMBER (INSN) = NOTE_INSN_DELETED)
#endif
#define NOTE_BLOCK(INSN) XCTREE (INSN, 4, NOTE) #define NOTE_BLOCK(INSN) XCTREE (INSN, 4, NOTE)
#define NOTE_EH_HANDLER(INSN) XCINT (INSN, 4, NOTE) #define NOTE_EH_HANDLER(INSN) XCINT (INSN, 4, NOTE)
#define NOTE_BASIC_BLOCK(INSN) XCBBDEF (INSN, 4, NOTE) #define NOTE_BASIC_BLOCK(INSN) XCBBDEF (INSN, 4, NOTE)
@ -1247,8 +1262,12 @@ do { \
XSTR (XCVECEXP (RTX, 4, N, ASM_OPERANDS), 0) XSTR (XCVECEXP (RTX, 4, N, ASM_OPERANDS), 0)
#define ASM_OPERANDS_INPUT_MODE(RTX, N) \ #define ASM_OPERANDS_INPUT_MODE(RTX, N) \
GET_MODE (XCVECEXP (RTX, 4, N, ASM_OPERANDS)) GET_MODE (XCVECEXP (RTX, 4, N, ASM_OPERANDS))
#ifdef USE_MAPPED_LOCATION
#define ASM_OPERANDS_SOURCE_LOCATION(RTX) XCUINT (RTX, 5, ASM_OPERANDS)
#else
#define ASM_OPERANDS_SOURCE_FILE(RTX) XCSTR (RTX, 5, ASM_OPERANDS) #define ASM_OPERANDS_SOURCE_FILE(RTX) XCSTR (RTX, 5, ASM_OPERANDS)
#define ASM_OPERANDS_SOURCE_LINE(RTX) XCINT (RTX, 6, ASM_OPERANDS) #define ASM_OPERANDS_SOURCE_LINE(RTX) XCINT (RTX, 6, ASM_OPERANDS)
#endif
/* 1 if RTX is a mem and we should keep the alias set for this mem /* 1 if RTX is a mem and we should keep the alias set for this mem
unchanged when we access a component. Set to 1, or example, when we unchanged when we access a component. Set to 1, or example, when we
@ -2001,6 +2020,11 @@ extern GTY(()) rtx return_address_pointer_rtx;
#ifndef NO_GENRTL_H #ifndef NO_GENRTL_H
#include "genrtl.h" #include "genrtl.h"
#ifndef USE_MAPPED_LOCATION
#undef gen_rtx_ASM_OPERANDS
#define gen_rtx_ASM_OPERANDS(MODE, ARG0, ARG1, ARG2, ARG3, ARG4, LOC) \
gen_rtx_fmt_ssiEEsi (ASM_OPERANDS, (MODE), (ARG0), (ARG1), (ARG2), (ARG3), (ARG4), (LOC).file, (LOC).line)
#endif
#endif #endif
/* There are some RTL codes that require special attention; the /* There are some RTL codes that require special attention; the

View File

@ -140,6 +140,10 @@ static const char **save_argv;
const char *main_input_filename; const char *main_input_filename;
#ifndef USE_MAPPED_LOCATION
location_t unknown_location = { NULL, 0 };
#endif
/* Used to enable -fvar-tracking, -fweb and -frename-registers according /* Used to enable -fvar-tracking, -fweb and -frename-registers according
to optimize and default_debug_hooks in process_options (). */ to optimize and default_debug_hooks in process_options (). */
#define AUTODETECT_FLAG_VAR_TRACKING 2 #define AUTODETECT_FLAG_VAR_TRACKING 2
@ -879,9 +883,12 @@ warn_deprecated_use (tree node)
return; return;
if (DECL_P (node)) if (DECL_P (node))
{
expanded_location xloc = expand_location (DECL_SOURCE_LOCATION (node));
warning ("`%s' is deprecated (declared at %s:%d)", warning ("`%s' is deprecated (declared at %s:%d)",
IDENTIFIER_POINTER (DECL_NAME (node)), IDENTIFIER_POINTER (DECL_NAME (node)),
DECL_SOURCE_FILE (node), DECL_SOURCE_LINE (node)); xloc.file, xloc.line);
}
else if (TYPE_P (node)) else if (TYPE_P (node))
{ {
const char *what = NULL; const char *what = NULL;
@ -893,19 +900,24 @@ warn_deprecated_use (tree node)
&& DECL_NAME (TYPE_NAME (node))) && DECL_NAME (TYPE_NAME (node)))
what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))); what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node)));
if (what)
{
if (decl) if (decl)
{
expanded_location xloc
= expand_location (DECL_SOURCE_LOCATION (decl));
if (what)
warning ("`%s' is deprecated (declared at %s:%d)", what, warning ("`%s' is deprecated (declared at %s:%d)", what,
DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl)); xloc.file, xloc.line);
else
warning ("type is deprecated (declared at %s:%d)",
xloc.file, xloc.line);
}
else
{
if (what)
warning ("type is deprecated");
else else
warning ("`%s' is deprecated", what); warning ("`%s' is deprecated", what);
} }
else if (decl)
warning ("type is deprecated (declared at %s:%d)",
DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
else
warning ("type is deprecated");
} }
} }
@ -914,15 +926,23 @@ warn_deprecated_use (tree node)
INPUT_LOCATION accordingly. */ INPUT_LOCATION accordingly. */
void void
#ifdef USE_MAPPED_LOCATION
push_srcloc (location_t fline)
#else
push_srcloc (const char *file, int line) push_srcloc (const char *file, int line)
#endif
{ {
struct file_stack *fs; struct file_stack *fs;
fs = xmalloc (sizeof (struct file_stack)); fs = xmalloc (sizeof (struct file_stack));
fs->location = input_location; fs->location = input_location;
fs->next = input_file_stack; fs->next = input_file_stack;
#ifdef USE_MAPPED_LOCATION
input_location = fline;
#else
input_filename = file; input_filename = file;
input_line = line; input_line = line;
#endif
input_file_stack = fs; input_file_stack = fs;
input_file_stack_tick++; input_file_stack_tick++;
} }
@ -1607,7 +1627,9 @@ process_options (void)
sets the original filename if appropriate (e.g. foo.i -> foo.c) sets the original filename if appropriate (e.g. foo.i -> foo.c)
so we can correctly initialize debug output. */ so we can correctly initialize debug output. */
no_backend = lang_hooks.post_options (&main_input_filename); no_backend = lang_hooks.post_options (&main_input_filename);
#ifndef USE_MAPPED_LOCATION
input_filename = main_input_filename; input_filename = main_input_filename;
#endif
#ifdef OVERRIDE_OPTIONS #ifdef OVERRIDE_OPTIONS
/* Some machines may reject certain combinations of options. */ /* Some machines may reject certain combinations of options. */
@ -1928,12 +1950,20 @@ backend_init (void)
static int static int
lang_dependent_init (const char *name) lang_dependent_init (const char *name)
{ {
location_t save_loc = input_location;
if (dump_base_name == 0) if (dump_base_name == 0)
dump_base_name = name ? name : "gccdump"; dump_base_name = name ? name : "gccdump";
/* Other front-end initialization. */ /* Other front-end initialization. */
#ifdef USE_MAPPED_LOCATION
input_location = BUILTINS_LOCATION;
#else
input_filename = "<built-in>";
input_line = 0;
#endif
if (lang_hooks.init () == 0) if (lang_hooks.init () == 0)
return 0; return 0;
input_location = save_loc;
init_asm_output (name); init_asm_output (name);

View File

@ -2438,7 +2438,11 @@ build1_stat (enum tree_code code, tree type, tree node MEM_STAT_DECL)
TREE_SET_CODE (t, code); TREE_SET_CODE (t, code);
TREE_TYPE (t) = type; TREE_TYPE (t) = type;
#ifdef USE_MAPPED_LOCATION
SET_EXPR_LOCATION (t, UNKNOWN_LOCATION);
#else
SET_EXPR_LOCUS (t, NULL); SET_EXPR_LOCUS (t, NULL);
#endif
TREE_COMPLEXITY (t) = 0; TREE_COMPLEXITY (t) = 0;
TREE_OPERAND (t, 0) = node; TREE_OPERAND (t, 0) = node;
TREE_BLOCK (t) = NULL_TREE; TREE_BLOCK (t) = NULL_TREE;
@ -2748,7 +2752,28 @@ build_block (tree vars, tree tags ATTRIBUTE_UNUSED, tree subblocks,
return block; return block;
} }
#if 1 /* ! defined(USE_MAPPED_LOCATION) */
/* ??? gengtype doesn't handle conditionals */
static GTY(()) tree last_annotated_node; static GTY(()) tree last_annotated_node;
#endif
#ifdef USE_MAPPED_LOCATION
expanded_location
expand_location (source_location loc)
{
expanded_location xloc;
if (loc == 0) { xloc.file = NULL; xloc.line = 0; }
else
{
const struct line_map *map = linemap_lookup (&line_table, loc);
xloc.file = map->to_file;
xloc.line = SOURCE_LINE (map, loc);
};
return xloc;
}
#else
/* Record the exact location where an expression or an identifier were /* Record the exact location where an expression or an identifier were
encountered. */ encountered. */
@ -2792,6 +2817,7 @@ annotate_with_locus (tree node, location_t locus)
{ {
annotate_with_file_line (node, locus.file, locus.line); annotate_with_file_line (node, locus.file, locus.line);
} }
#endif
/* Return a declaration like DDECL except that its DECL_ATTRIBUTES /* Return a declaration like DDECL except that its DECL_ATTRIBUTES
is ATTRIBUTE. */ is ATTRIBUTE. */

View File

@ -1073,6 +1073,31 @@ struct tree_vec GTY(())
/* In a LOOP_EXPR node. */ /* In a LOOP_EXPR node. */
#define LOOP_EXPR_BODY(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_EXPR, 0) #define LOOP_EXPR_BODY(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_EXPR, 0)
#ifdef USE_MAPPED_LOCATION
/* The source location of this expression. Non-tree_exp nodes such as
decls and constants can be shared among multiple locations, so
return nothing. */
#define EXPR_LOCATION(NODE) \
(IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE))) \
? (NODE)->exp.locus \
: UNKNOWN_LOCATION)
#define SET_EXPR_LOCATION(NODE, FROM) \
(EXPR_CHECK (NODE)->exp.locus = (FROM))
#define EXPR_HAS_LOCATION(NODE) (EXPR_LOCATION (NODE) != UNKNOWN_LOCATION)
/* EXPR_LOCUS and SET_EXPR_LOCUS are deprecated. */
#define EXPR_LOCUS(NODE) \
(IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE))) \
? &(NODE)->exp.locus \
: (location_t *)NULL)
#define SET_EXPR_LOCUS(NODE, FROM) \
do { source_location *loc_tmp = FROM; \
EXPR_CHECK (NODE)->exp.locus \
= loc_tmp == NULL ? UNKNOWN_LOCATION : *loc_tmp; } while (0)
#define EXPR_FILENAME(NODE) \
LOCATION_FILE (EXPR_CHECK (NODE)->exp.locus)
#define EXPR_LINENO(NODE) \
LOCATION_LINE (EXPR_CHECK (NODE)->exp.locus)
#else
/* The source location of this expression. Non-tree_exp nodes such as /* The source location of this expression. Non-tree_exp nodes such as
decls and constants can be shared among multiple locations, so decls and constants can be shared among multiple locations, so
return nothing. */ return nothing. */
@ -1082,19 +1107,14 @@ struct tree_vec GTY(())
: (location_t *)NULL) : (location_t *)NULL)
#define SET_EXPR_LOCUS(NODE, FROM) \ #define SET_EXPR_LOCUS(NODE, FROM) \
(EXPR_CHECK (NODE)->exp.locus = (FROM)) (EXPR_CHECK (NODE)->exp.locus = (FROM))
#define SET_EXPR_LOCATION(NODE, FROM) annotate_with_locus (NODE, FROM)
#define EXPR_FILENAME(NODE) \ #define EXPR_FILENAME(NODE) \
(EXPR_CHECK (NODE)->exp.locus->file) (EXPR_CHECK (NODE)->exp.locus->file)
#define EXPR_LINENO(NODE) \ #define EXPR_LINENO(NODE) \
(EXPR_CHECK (NODE)->exp.locus->line) (EXPR_CHECK (NODE)->exp.locus->line)
#ifdef USE_MAPPED_LOCATION
#define EXPR_LOCATION(NODE) \
(IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE))) \
? (NODE)->exp.locus \
: UNKNOWN_LOCATION)
#define EXPR_HAS_LOCATION(NODE) (EXPR_LOCATION (NODE) != UNKNOWN_LOCATION)
#else
#define EXPR_LOCATION(NODE) (*EXPR_LOCUS (NODE))
#define EXPR_HAS_LOCATION(NODE) (EXPR_LOCUS (NODE) != NULL) #define EXPR_HAS_LOCATION(NODE) (EXPR_LOCUS (NODE) != NULL)
#define EXPR_LOCATION(NODE) \
(EXPR_HAS_LOCATION(NODE) ? *(NODE)->exp.locus : UNKNOWN_LOCATION)
#endif #endif
/* In a TARGET_EXPR node. */ /* In a TARGET_EXPR node. */
@ -1172,7 +1192,7 @@ struct tree_vec GTY(())
struct tree_exp GTY(()) struct tree_exp GTY(())
{ {
struct tree_common common; struct tree_common common;
location_t *locus; source_locus locus;
int complexity; int complexity;
tree block; tree block;
tree GTY ((special ("tree_exp"), tree GTY ((special ("tree_exp"),
@ -1773,8 +1793,14 @@ struct tree_type GTY(())
function that is declared first and then defined later), this function that is declared first and then defined later), this
information should refer to the definition. */ information should refer to the definition. */
#define DECL_SOURCE_LOCATION(NODE) (DECL_CHECK (NODE)->decl.locus) #define DECL_SOURCE_LOCATION(NODE) (DECL_CHECK (NODE)->decl.locus)
#define DECL_SOURCE_FILE(NODE) (DECL_SOURCE_LOCATION (NODE).file) #define DECL_SOURCE_FILE(NODE) LOCATION_FILE (DECL_SOURCE_LOCATION (NODE))
#define DECL_SOURCE_LINE(NODE) (DECL_SOURCE_LOCATION (NODE).line) #define DECL_SOURCE_LINE(NODE) LOCATION_LINE (DECL_SOURCE_LOCATION (NODE))
#ifdef USE_MAPPED_LOCATION
#define DECL_IS_BUILTIN(DECL) \
(DECL_SOURCE_LOCATION (DECL) <= BUILTINS_LOCATION)
#else
#define DECL_IS_BUILTIN(DECL) (DECL_SOURCE_LINE(DECL) == 0)
#endif
/* Holds the size of the datum, in bits, as a tree expression. /* Holds the size of the datum, in bits, as a tree expression.
Need not be constant. */ Need not be constant. */
#define DECL_SIZE(NODE) (DECL_CHECK (NODE)->decl.size) #define DECL_SIZE(NODE) (DECL_CHECK (NODE)->decl.size)
@ -2665,8 +2691,10 @@ extern tree build_tree_list_stat (tree, tree MEM_STAT_DECL);
extern tree build_decl_stat (enum tree_code, tree, tree MEM_STAT_DECL); extern tree build_decl_stat (enum tree_code, tree, tree MEM_STAT_DECL);
#define build_decl(c,t,q) build_decl_stat (c,t,q MEM_STAT_INFO) #define build_decl(c,t,q) build_decl_stat (c,t,q MEM_STAT_INFO)
extern tree build_block (tree, tree, tree, tree, tree); extern tree build_block (tree, tree, tree, tree, tree);
#ifndef USE_MAPPED_LOCATION
extern void annotate_with_file_line (tree, const char *, int); extern void annotate_with_file_line (tree, const char *, int);
extern void annotate_with_locus (tree, location_t); extern void annotate_with_locus (tree, location_t);
#endif
extern tree build_empty_stmt (void); extern tree build_empty_stmt (void);
/* Construct various nodes representing data types. */ /* Construct various nodes representing data types. */