aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-decl.c
diff options
context:
space:
mode:
authorPer Bothner <per@bothner.com>2004-09-07 07:43:37 -0700
committerPaul Brook <pbrook@gcc.gnu.org>2004-09-07 14:43:37 +0000
commitc8cc8542fa03e78ff3a39734f5dad49b233be54f (patch)
tree52dd9f205592562d8c793717e022109001b07465 /gcc/fortran/trans-decl.c
parent5212068fdf32944f8a35909cd5e9eb8d420fbc76 (diff)
downloadgcc-c8cc8542fa03e78ff3a39734f5dad49b233be54f.zip
gcc-c8cc8542fa03e78ff3a39734f5dad49b233be54f.tar.gz
gcc-c8cc8542fa03e78ff3a39734f5dad49b233be54f.tar.bz2
error.c (show_locus): Handle mapped locations.
2004-09-07 Per Bothner <per@bothner.com> Paul Brook <paul@codesourcery.com> * error.c (show_locus): Handle mapped locations. * f95-lang.c (gfc_be_parse_file): Initialize mapped locations. * gfortran.h: Include input.h. (struct gfc_linebuf): Use source_location. * scanner.c (get_file): Initialize linemap. (preprocessor_line): Pass extra argument to get_file. (load_file): Ditto. Setup linemap. (gfc_new_file): Handle mapped locations. * trans-common.c (build_field, build_equiv_decl, build_common_decl): Set decl source locations. (gfc_trans_common): Set blank common block location. * trans-decl.c (gfc_set_decl_location): New function. (gfc_get_label_decl, gfc_get_symbol_decl): Use it. (trans_function_start): Move call to gfc_set_backend_locus.. (build_function_decl): ... to here. (build_entry_thunks): Set and restore the backend locus. (gfc_generate_constructors): Remove excess arguments to init_function_start. (gfc_generate_block_data): Add comments. Set the decl locus. * trans-io.c (set_error_locus): Handle mapped locations. * trans.c (gfc_get_backend_locus, gfc_get_backend_locus): Ditto. (gfc_trans_code): Use SET_EXPR_LOCATION. (gfc_generate_code): Override the location of the new symbol. * trans.h (gfc_set_decl_location): Add prototype. Co-Authored-By: Paul Brook <paul@codesourcery.com> From-SVN: r87142
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r--gcc/fortran/trans-decl.c45
1 files changed, 36 insertions, 9 deletions
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 730448a..4968939 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -214,6 +214,20 @@ gfc_get_return_label (void)
}
+/* Set the backend source location of a decl. */
+
+void
+gfc_set_decl_location (tree decl, locus * loc)
+{
+#ifdef USE_MAPPED_LOCATION
+ DECL_SOURCE_LOCATION (decl) = loc->lb->location;
+#else
+ DECL_SOURCE_LINE (decl) = loc->lb->linenum;
+ DECL_SOURCE_FILE (decl) = loc->lb->file->filename;
+#endif
+}
+
+
/* Return the backend label declaration for a given label structure,
or create it if it doesn't exist yet. */
@@ -238,10 +252,7 @@ gfc_get_label_decl (gfc_st_label * lp)
/* Tell the debugger where the label came from. */
if (lp->value <= MAX_LABEL_VALUE) /* An internal label. */
- {
- DECL_SOURCE_LINE (label_decl) = lp->where.lb->linenum;
- DECL_SOURCE_FILE (label_decl) = lp->where.lb->file->filename;
- }
+ gfc_set_decl_location (label_decl, &lp->where);
else
DECL_ARTIFICIAL (label_decl) = 1;
@@ -757,6 +768,8 @@ gfc_get_symbol_decl (gfc_symbol * sym)
/* Create the decl for the variable. */
decl = build_decl (VAR_DECL, gfc_sym_identifier (sym), gfc_sym_type (sym));
+ gfc_set_decl_location (decl, &sym->declared_at);
+
/* Symbols from modules should have their assembler names mangled.
This is done here rather than in gfc_finish_var_decl because it
is different for string length variables. */
@@ -978,6 +991,10 @@ build_function_decl (gfc_symbol * sym)
assert (!sym->backend_decl);
assert (!sym->attr.external);
+ /* Set the line and filename. sym->declared_at seems to point to the
+ last statement for subroutines, but it'll do for now. */
+ gfc_set_backend_locus (&sym->declared_at);
+
/* Allow only one nesting level. Allow public declarations. */
assert (current_function_decl == NULL_TREE
|| DECL_CONTEXT (current_function_decl) == NULL_TREE);
@@ -1298,10 +1315,6 @@ trans_function_start (gfc_symbol * sym)
/* Create RTL for function definition. */
make_decl_rtl (fndecl);
- /* Set the line and filename. sym->declared_at seems to point to the
- last statement for subroutines, but it'll do for now. */
- gfc_set_backend_locus (&sym->declared_at);
-
init_function_start (fndecl);
/* Even though we're inside a function body, we still don't want to
@@ -1328,10 +1341,12 @@ build_entry_thunks (gfc_namespace * ns)
tree args;
tree string_args;
tree tmp;
+ locus old_loc;
/* This should always be a toplevel function. */
assert (current_function_decl == NULL_TREE);
+ gfc_get_backend_locus (&old_loc);
for (el = ns->entries; el; el = el->next)
{
thunk_sym = el->sym;
@@ -1430,6 +1445,8 @@ build_entry_thunks (gfc_namespace * ns)
formal->sym->ts.cl->backend_decl = NULL_TREE;
}
}
+
+ gfc_set_backend_locus (&old_loc);
}
@@ -2338,7 +2355,7 @@ gfc_generate_constructors (void)
make_decl_rtl (fndecl);
- init_function_start (fndecl, input_filename, input_line);
+ init_function_start (fndecl);
pushlevel (0);
@@ -2373,8 +2390,18 @@ gfc_generate_block_data (gfc_namespace * ns)
tree decl;
tree id;
+ /* Tell the backend the source location of the block data. */
+ if (ns->proc_name)
+ gfc_set_backend_locus (&ns->proc_name->declared_at);
+ else
+ gfc_set_backend_locus (&gfc_current_locus);
+
+ /* Process the DATA statements. */
gfc_trans_common (ns);
+ /* Create a global symbol with the mane of the block data. This is to
+ generate linker errors if the same name is used twice. It is never
+ really used. */
if (ns->proc_name)
id = gfc_sym_mangled_function_id (ns->proc_name);
else