This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran 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]

[gfortran] Make --enable-mapped-location work


The patch below updates the fortran frontend work with 
--enable-mapped-location. It's based on the recent patch from Per Bothner.
I updated it to make sure we set the locus of all decls. For some reason we 
got away with not doing this before.

Tested on i686-linux.
Applied to mainline.

Paul

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.

Index: fortran/error.c
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/fortran/error.c,v
retrieving revision 1.6
diff -u -p -r1.6 error.c
--- fortran/error.c 28 Aug 2004 14:07:03 -0000 1.6
+++ fortran/error.c 6 Sep 2004 00:46:27 -0000
@@ -127,7 +127,13 @@ show_locus (int offset, locus * loc)
 
   lb = loc->lb;
   f = lb->file;
-  error_printf ("In file %s:%d\n", f->filename, lb->linenum);
+  error_printf ("In file %s:%d\n", f->filename,
+#ifdef USE_MAPPED_LOCATION
+		LOCATION_LINE (lb->location)
+#else
+		lb->linenum
+#endif
+		);
 
   for (;;)
     {
Index: fortran/f95-lang.c
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/fortran/f95-lang.c,v
retrieving revision 1.17
diff -u -p -r1.17 f95-lang.c
--- fortran/f95-lang.c	31 Aug 2004 13:39:40 -0000	1.17
+++ fortran/f95-lang.c	5 Sep 2004 23:08:24 -0000
@@ -280,6 +280,11 @@ gfc_be_parse_file (int set_yydebug ATTRI
 static bool
 gfc_init (void)
 {
+#ifdef USE_MAPPED_LOCATION
+  linemap_add (&line_table, LC_ENTER, false, gfc_option.source, 1);
+  linemap_add (&line_table, LC_RENAME, false, "<built-in>", 0);
+#endif
+
   /* First initialize the backend.  */
   gfc_init_decl_processing ();
   gfc_static_ctors = NULL_TREE;
Index: fortran/gfortran.h
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/fortran/gfortran.h,v
retrieving revision 1.34
diff -u -p -r1.34 gfortran.h
--- fortran/gfortran.h	30 Aug 2004 21:59:07 -0000	1.34
+++ fortran/gfortran.h	5 Sep 2004 23:08:24 -0000
@@ -33,6 +33,7 @@ Software Foundation, 59 Temple Place - S
    seem to be sufficient on some systems.  */
 #include "system.h"
 #include "coretypes.h"
+#include "input.h"
 
 /* The following ifdefs are recommended by the autoconf documentation
    for any code using alloca.  */
@@ -459,7 +460,11 @@ typedef struct gfc_file 
 
 typedef struct gfc_linebuf 
 {
+#ifdef USE_MAPPED_LOCATION
+  source_location location;
+#else
   int linenum;
+#endif
   struct gfc_file *file;
   struct gfc_linebuf *next;
 
Index: fortran/scanner.c
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/fortran/scanner.c,v
retrieving revision 1.7
diff -u -p -r1.7 scanner.c
--- fortran/scanner.c	18 Jul 2004 13:00:34 -0000	1.7
+++ fortran/scanner.c	5 Sep 2004 23:08:24 -0000
@@ -801,7 +801,7 @@ load_line (FILE * input, char **pbuf, ch
    the file stack.  */
 
 static gfc_file *
-get_file (char *name)
+get_file (char *name, enum lc_reason reason)
 {
   gfc_file *f;
 
@@ -817,6 +817,10 @@ get_file (char *name)
   if (current_file != NULL)
     f->inclusion_line = current_file->line;
 
+#ifdef USE_MAPPED_LOCATION
+  linemap_add (&line_table, reason, false, f->filename, 1);
+#endif
+
   return f;
 }
 
@@ -874,7 +878,7 @@ preprocessor_line (char *c)
   
   if (flag[1] || flag[3]) /* Starting new file.  */
     {
-      f = get_file (filename);
+      f = get_file (filename, LC_RENAME);
       f->up = current_file;
       current_file = f;
     }
@@ -999,7 +1003,7 @@ load_file (char *filename, bool initial)
 
   /* Load the file.  */
 
-  f = get_file (filename);
+  f = get_file (filename, initial ? LC_RENAME : LC_ENTER);
   f->up = current_file;
   current_file = f;
   current_file->line = 1;
@@ -1032,7 +1036,12 @@ load_file (char *filename, bool initial)
 
       b = gfc_getmem (sizeof (gfc_linebuf) + len + 1);
 
+#ifdef USE_MAPPED_LOCATION
+      b->location
+	= linemap_line_start (&line_table, current_file->line++, 120);
+#else
       b->linenum = current_file->line++;
+#endif
       b->file = current_file;
       strcpy (b->line, line);
 
@@ -1050,6 +1059,9 @@ load_file (char *filename, bool initial)
   fclose (input);
 
   current_file = current_file->up;
+#ifdef USE_MAPPED_LOCATION
+  linemap_add (&line_table, LC_LEAVE, 0, NULL, 0);
+#endif
   return SUCCESS;
 }
 
@@ -1167,7 +1179,12 @@ gfc_new_file (const char *filename, gfc_
 #if 0 /* Debugging aid.  */
   for (; line_head; line_head = line_head->next)
     gfc_status ("%s:%3d %s\n", line_head->file->filename, 
-		line_head->linenum, line_head->line);
+#ifdef USE_MAPPED_LOCATION
+		LOCATION_LINE (line_head->location),
+#else
+		line_head->linenum,
+#endif
+		line_head->line);
 
   exit (0);
 #endif
Index: fortran/trans-common.c
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/fortran/trans-common.c,v
retrieving revision 1.14
diff -u -p -r1.14 trans-common.c
--- fortran/trans-common.c	25 Aug 2004 15:50:35 -0000	1.14
+++ fortran/trans-common.c	7 Sep 2004 13:36:03 -0000
@@ -226,6 +226,7 @@ build_field (segment_info *h, tree union
 
   name = get_identifier (h->sym->name);
   field = build_decl (FIELD_DECL, name, h->field);
+  gfc_set_decl_location (field, &h->sym->declared_at);
   known_align = (offset & -offset) * BITS_PER_UNIT;
   if (known_align == 0 || known_align > BIGGEST_ALIGNMENT)
     known_align = BIGGEST_ALIGNMENT;
@@ -268,6 +269,11 @@ build_equiv_decl (tree union_type, bool 
 
   TREE_ADDRESSABLE (decl) = 1;
   TREE_USED (decl) = 1;
+
+  /* The source location has been lost, and doesn't really matter.
+     We need to set it to something though.  */
+  gfc_set_decl_location (decl, &gfc_current_locus);
+
   gfc_add_decl_to_function (decl);
 
   return decl;
@@ -321,6 +327,8 @@ build_common_decl (gfc_common_head *com,
       DECL_ALIGN (decl) = BIGGEST_ALIGNMENT;
       DECL_USER_ALIGN (decl) = 0;
 
+      gfc_set_decl_location (decl, &com->where);
+
       /* Place the back end declaration for this common block in
          GLOBAL_BINDING_LEVEL.  */
       common_sym->backend_decl = pushdecl_top_level (decl);
@@ -797,6 +805,9 @@ gfc_trans_common (gfc_namespace *ns)
   if (ns->blank_common.head != NULL)
     {
       c = gfc_get_common_head ();
+      /* We've lost the real location, so use the location of the
+	 enclosing procedure.  */
+      c->where = ns->proc_name->declared_at;
       strcpy (c->name, BLANK_COMMON_NAME);
       translate_common (c, ns->blank_common.head);
     }
Index: fortran/trans-decl.c
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/fortran/trans-decl.c,v
retrieving revision 1.40
diff -u -p -r1.40 trans-decl.c
--- fortran/trans-decl.c	31 Aug 2004 14:06:46 -0000	1.40
+++ fortran/trans-decl.c	7 Sep 2004 13:03:51 -0000
@@ -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 *
   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
Index: fortran/trans-io.c
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/fortran/trans-io.c,v
retrieving revision 1.16
diff -u -p -r1.16 trans-io.c
--- fortran/trans-io.c	31 Aug 2004 14:06:47 -0000	1.16
+++ fortran/trans-io.c	5 Sep 2004 23:08:24 -0000
@@ -524,7 +524,11 @@ set_error_locus (stmtblock_t * block, lo
   tmp = gfc_build_addr_expr (pchar_type_node, tmp);
   gfc_add_modify_expr (block, locus_file, tmp);
 
+#ifdef USE_MAPPED_LOCATION
+  line = LOCATION_LINE (where->lb->location);
+#else
   line = where->lb->linenum;
+#endif
   gfc_add_modify_expr (block, locus_line, build_int_cst (NULL_TREE, line));
 }
 
Index: fortran/trans.c
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/fortran/trans.c,v
retrieving revision 1.14
diff -u -p -r1.14 trans.c
--- fortran/trans.c	30 Aug 2004 19:08:38 -0000	1.14
+++ fortran/trans.c	7 Sep 2004 11:40:10 -0000
@@ -442,7 +442,11 @@ void
 gfc_get_backend_locus (locus * loc)
 {
   loc->lb = gfc_getmem (sizeof (gfc_linebuf));    
+#ifdef USE_MAPPED_LOCATION
+  loc->lb->location = input_location; // FIXME adjust??
+#else
   loc->lb->linenum = input_line - 1;
+#endif
   loc->lb->file = gfc_current_backend_file;
 }
 
@@ -452,9 +456,13 @@ gfc_get_backend_locus (locus * loc)
 void
 gfc_set_backend_locus (locus * loc)
 {
-  input_line = loc->lb->linenum;
   gfc_current_backend_file = loc->lb->file;
+#ifdef USE_MAPPED_LOCATION
+  input_location = loc->lb->location;
+#else
+  input_line = loc->lb->linenum;
   input_filename = loc->lb->file->filename;
+#endif
 }
 
 
@@ -626,7 +634,7 @@ gfc_trans_code (gfc_code * code)
    if (TREE_CODE (res) == STATEMENT_LIST)
      annotate_all_with_locus (&res, input_location);
    else
-     annotate_with_locus (res, input_location);
+     SET_EXPR_LOCATION (res, input_location);
 
    /* Add the new statemment to the block.  */
    gfc_add_expr_to_block (&block, res);
@@ -665,6 +673,9 @@ gfc_generate_code (gfc_namespace * ns)
       attr.subroutine = 1;
       attr.access = ACCESS_PUBLIC;
       main_program->attr = attr;
+      /* Set the location to the first line of code.  */
+      if (ns->code)
+ main_program->declared_at = ns->code->loc;
       ns->proc_name = main_program;
       gfc_commit_symbols ();
     }
Index: fortran/trans.h
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/fortran/trans.h,v
retrieving revision 1.15
diff -u -p -r1.15 trans.h
--- fortran/trans.h 30 Aug 2004 19:08:38 -0000 1.15
+++ fortran/trans.h 7 Sep 2004 13:02:44 -0000
@@ -374,6 +374,9 @@ void gfc_add_decl_to_function (tree);
 /* Make prototypes for runtime library functions.  */
 void gfc_build_builtin_function_decls (void);
 
+/* Set the backend source location of a decl.  */
+void gfc_set_decl_location (tree, locus *);
+
 /* Return the variable decl for a symbol.  */
 tree gfc_get_symbol_decl (gfc_symbol *);
 


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