line-map.h (struct line_maps): New field highest_line.
authorPer Bothner <per@bothner.com>
Fri, 23 Apr 2004 02:22:27 +0000 (19:22 -0700)
committerPer Bothner <bothner@gcc.gnu.org>
Fri, 23 Apr 2004 02:22:27 +0000 (19:22 -0700)
* line-map.h (struct line_maps):  New field highest_line.
(linemap_position_for_column):  Make non-inline function.
(LINEMAP_POSITION_FOR_COLUMN):  New macro.
* line-map.c (linemap_init):  Clear highest_line field.
(linemap_add):  Set highest_line field.
(linemap_line_start):  Minor optimization - use highest_line field.
Reduce maximum column hint to 10000.  Update highest_line field.
(linemap_position_for_column):  Moved from line-map.h.  Optimize a bit.
* cpphash.h (struct cpp_reader):  Remove line field - instead use
line_table->highest_line.
(saved_line):  Remove unused field.
(CPP_INCREMENT_FILE):  Don't do linemap_lookup - just use newest map.
Use  line_table's highest_line field instead of cpp_reader's line.
* cpplib.c (start_directive):  Likewise use highest_line field.
(do_line, do_linemarker):  Likewise just use newest map.
(_cpp_do_file_change):  Don't need to set cpp_reader's line field.
* cpperror.c (cpp_error):  Likewise use highest_line field.
* cppfiles.c (open_file_failed:  Likewise.
(cpp_make_system_header):  Likewise use newest map and highest_line.
* cppinit.c (cpp_create_reader):  Don't initialize removed field.
* cpplex.c (_cpp_process_line_notes, _cpp_skip_block_comment,
skip_line_comment, skip_whitespace, _cpp_get_fresh_line,
_cpp_lex_direct):  Likewise use highest_line.
(_cpp_lex_direct):  Use new LINEMAP_POSITION_FOR_COLUMN macro.
* cppmacro.c (_cpp_builtin_macro_text):  Likewise use highest_line,
and use newest map.
* cpppch.c (cpp_read_state):  Don't save+restore cpp_reader's line.
* cpptrad.c (_cpp_overlay_buffer):  Don't save cpp_reader's line.
(copy_comment, _cpp_scan_out_logical_line):  Likewise use highest_line.

From-SVN: r81074

12 files changed:
gcc/ChangeLog
gcc/cpperror.c
gcc/cppfiles.c
gcc/cpphash.h
gcc/cppinit.c
gcc/cpplex.c
gcc/cpplib.c
gcc/cppmacro.c
gcc/cpppch.c
gcc/cpptrad.c
gcc/line-map.c
gcc/line-map.h

index 81c9af40d772308cff21397c45d8ed66f0bb2f3f..aac5802e8c665ef8f338664863f161ecfe65169d 100644 (file)
@@ -1,3 +1,35 @@
+2004-04-22  Per Bothner  <per@bothner.com>
+
+       * line-map.h (struct line_maps):  New field highest_line.
+       (linemap_position_for_column):  Make non-inline function.
+       (LINEMAP_POSITION_FOR_COLUMN):  New macro.
+       * line-map.c (linemap_init):  Clear highest_line field.
+       (linemap_add):  Set highest_line field.
+       (linemap_line_start):  Minor optimization - use highest_line field.
+       Reduce maximum column hint to 10000.  Update highest_line field.
+       (linemap_position_for_column):  Moved from line-map.h.  Optimize a bit.
+       * cpphash.h (struct cpp_reader):  Remove line field - instead use
+       line_table->highest_line.
+       (saved_line):  Remove unused field.
+       (CPP_INCREMENT_FILE):  Don't do linemap_lookup - just use newest map.
+       Use  line_table's highest_line field instead of cpp_reader's line.
+       * cpplib.c (start_directive):  Likewise use highest_line field.
+       (do_line, do_linemarker):  Likewise just use newest map.
+       (_cpp_do_file_change):  Don't need to set cpp_reader's line field.
+       * cpperror.c (cpp_error):  Likewise use highest_line field.
+       * cppfiles.c (open_file_failed:  Likewise.
+       (cpp_make_system_header):  Likewise use newest map and highest_line.
+       * cppinit.c (cpp_create_reader):  Don't initialize removed field.
+       * cpplex.c (_cpp_process_line_notes, _cpp_skip_block_comment,
+       skip_line_comment, skip_whitespace, _cpp_get_fresh_line,
+       _cpp_lex_direct):  Likewise use highest_line.
+       (_cpp_lex_direct):  Use new LINEMAP_POSITION_FOR_COLUMN macro.
+       * cppmacro.c (_cpp_builtin_macro_text):  Likewise use highest_line,
+       and use newest map.
+       * cpppch.c (cpp_read_state):  Don't save+restore cpp_reader's line.
+       * cpptrad.c (_cpp_overlay_buffer):  Don't save cpp_reader's line.
+       (copy_comment, _cpp_scan_out_logical_line):  Likewise use highest_line.
+
 2004-04-23  Alan Modra  <amodra@bigpond.net.au>
 
        PR bootstrap/14992
index d57238069d6574f9ea2dc05095e2dbd85f492d55..362c1c5f2e00d2da41ae7131d32e0b2513bca519 100644 (file)
@@ -144,7 +144,7 @@ cpp_error (cpp_reader * pfile, int level, const char *msgid, ...)
       if (pfile->state.in_directive)
        src_loc = pfile->directive_line;
       else
-       src_loc = pfile->line;
+       src_loc = pfile->line_table->highest_line;
     }
   else
     {
index d31f61b7aee861d4156f3667ca98bf5770f579b4..bdfaa3f9ac6f14e4f70e3a95cb5f54cf2d13d28b 100644 (file)
@@ -806,7 +806,7 @@ _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
 static void
 open_file_failed (cpp_reader *pfile, _cpp_file *file)
 {
-  int sysp = pfile->line > 1 && pfile->buffer ? pfile->buffer->sysp : 0;
+  int sysp = pfile->line_table->highest_line > 1 && pfile->buffer ? pfile->buffer->sysp : 0;
   bool print_dep = CPP_OPTION (pfile, deps.style) > !!sysp;
 
   errno = file->err_no;
@@ -987,14 +987,15 @@ void
 cpp_make_system_header (cpp_reader *pfile, int syshdr, int externc)
 {
   int flags = 0;
-  const struct line_map *map = linemap_lookup (pfile->line_table, pfile->line);
+  const struct line_maps *line_table = pfile->line_table;
+  const struct line_map *map = &line_table->maps[line_table->used-1];
 
   /* 1 = system header, 2 = system header to be treated as C.  */
   if (syshdr)
     flags = 1 + (externc != 0);
   pfile->buffer->sysp = flags;
   _cpp_do_file_change (pfile, LC_RENAME, map->to_file,
-                      SOURCE_LINE (map, pfile->line), flags);
+                      SOURCE_LINE (map, pfile->line_table->highest_line), flags);
 }
 
 /* Allow the client to change the current file.  Used by the front end
index 4e86bf37d5b320ae3e9d14f5c882d8fd63bcb9e6..1c5015173e0d87ad0d7c988abe6c40c2920dd580 100644 (file)
@@ -65,10 +65,10 @@ typedef unsigned char uchar;
 #define CPP_BUF_COL(BUF) CPP_BUF_COLUMN(BUF, (BUF)->cur)
 
 #define CPP_INCREMENT_LINE(PFILE, COLS_HINT) do { \
-    const struct line_map *map \
-      = linemap_lookup (PFILE->line_table, PFILE->line); \
-    unsigned int line = SOURCE_LINE (map, PFILE->line) + 1; \
-    PFILE->line = linemap_line_start (PFILE->line_table, line, COLS_HINT); \
+    const struct line_maps *line_table = PFILE->line_table; \
+    const struct line_map *map = &line_table->maps[line_table->used-1]; \
+    unsigned int line = SOURCE_LINE (map, line_table->highest_line); \
+    linemap_line_start (PFILE->line_table, line + 1, COLS_HINT); \
   } while (0)
 
 /* Maximum nesting of cpp_buffers.  We use a static limit, partly for
@@ -344,7 +344,6 @@ struct cpp_reader
 
   /* Source line tracking.  */
   struct line_maps *line_table;
-  fileline line;
 
   /* The line of the '#' of the current directive.  */
   fileline directive_line;
@@ -466,10 +465,6 @@ struct cpp_reader
   /* Used for buffer overlays by cpptrad.c.  */
   const uchar *saved_cur, *saved_rlimit, *saved_line_base;
 
-  /* Used to save the original line number during traditional
-     preprocessing.  */
-  unsigned int saved_line;
-
   /* A saved list of the defined macros, for dependency checking
      of precompiled headers.  */
   struct cpp_savedstate *savedstate;
index 84fa520953bafb0c1231f6a5963463ab91079d6e..55323b4ea9b4f238827f8486dcdcfe379b693163 100644 (file)
@@ -172,10 +172,8 @@ cpp_create_reader (enum c_lang lang, hash_table *table,
      other entries are correct zero-initialized.  */
   pfile->no_search_path.name = (char *) "";
 
-  /* Initialize the line map.  Start at logical line 1, so we can use
-     a line number of zero for special states.  */
+  /* Initialize the line map.  */
   pfile->line_table = line_table;
-  pfile->line = 1;
 
   /* Initialize lexer state.  */
   pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
index 9912aac559cf9f8c8f3c8e6e5f11311874815b10..d03096cdc638c8e4e2d580304cc40347106f9516 100644 (file)
@@ -270,12 +270,12 @@ _cpp_process_line_notes (cpp_reader *pfile, int in_comment)
       if (note->type == '\\' || note->type == ' ')
        {
          if (note->type == ' ' && !in_comment)
-           cpp_error_with_line (pfile, CPP_DL_WARNING, pfile->line, col,
+           cpp_error_with_line (pfile, CPP_DL_WARNING, pfile->line_table->highest_line, col,
                                 "backslash and newline separated by space");
 
          if (buffer->next_line > buffer->rlimit)
            {
-             cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->line, col,
+             cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->line_table->highest_line, col,
                                   "backslash-newline at end of file");
              /* Prevent "no newline at end of file" warning.  */
              buffer->next_line = buffer->rlimit;
@@ -290,14 +290,14 @@ _cpp_process_line_notes (cpp_reader *pfile, int in_comment)
              && (!in_comment || warn_in_comment (pfile, note)))
            {
              if (CPP_OPTION (pfile, trigraphs))
-               cpp_error_with_line (pfile, CPP_DL_WARNING, pfile->line, col,
+               cpp_error_with_line (pfile, CPP_DL_WARNING, pfile->line_table->highest_line, col,
                                     "trigraph ??%c converted to %c",
                                     note->type,
                                     (int) _cpp_trigraph_map[note->type]);
              else
                {
                  cpp_error_with_line 
-                   (pfile, CPP_DL_WARNING, pfile->line, col,
+                   (pfile, CPP_DL_WARNING, pfile->line_table->highest_line, col,
                     "trigraph ??%c ignored, use -trigraphs to enable",
                     note->type);
                }
@@ -343,7 +343,7 @@ _cpp_skip_block_comment (cpp_reader *pfile)
            {
              buffer->cur = cur;
              cpp_error_with_line (pfile, CPP_DL_WARNING,
-                                  pfile->line, CPP_BUF_COL (buffer),
+                                  pfile->line_table->highest_line, CPP_BUF_COL (buffer),
                                   "\"/*\" within comment");
            }
        }
@@ -375,13 +375,13 @@ static int
 skip_line_comment (cpp_reader *pfile)
 {
   cpp_buffer *buffer = pfile->buffer;
-  unsigned int orig_line = pfile->line;
+  unsigned int orig_line = pfile->line_table->highest_line;
 
   while (*buffer->cur != '\n')
     buffer->cur++;
 
   _cpp_process_line_notes (pfile, true);
-  return orig_line != pfile->line;
+  return orig_line != pfile->line_table->highest_line;
 }
 
 /* Skips whitespace, saving the next non-whitespace character.  */
@@ -400,7 +400,7 @@ skip_whitespace (cpp_reader *pfile, cppchar_t c)
       else if (c == '\0')
        saw_NUL = true;
       else if (pfile->state.in_directive && CPP_PEDANTIC (pfile))
-       cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->line,
+       cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->line_table->highest_line,
                             CPP_BUF_COL (buffer),
                             "%s in preprocessing directive",
                             c == '\f' ? "form feed" : "vertical tab");
@@ -777,7 +777,7 @@ _cpp_get_fresh_line (cpp_reader *pfile)
        {
          /* Only warn once.  */
          buffer->next_line = buffer->rlimit;
-         cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->line,
+         cpp_error_with_line (pfile, CPP_DL_PEDWARN, pfile->line_table->highest_line,
                               CPP_BUF_COLUMN (buffer, buffer->cur),
                               "no newline at end of file");
        }
@@ -828,7 +828,7 @@ _cpp_lex_direct (cpp_reader *pfile)
          if (!pfile->state.in_directive)
            {
              /* Tell the compiler the line number of the EOF token.  */
-             result->src_loc = pfile->line;
+             result->src_loc = pfile->line_table->highest_line;
              result->flags = BOL;
            }
          return result;
@@ -845,19 +845,19 @@ _cpp_lex_direct (cpp_reader *pfile)
     }
   buffer = pfile->buffer;
  update_tokens_line:
-  result->src_loc = pfile->line;
+  result->src_loc = pfile->line_table->highest_line;
 
  skipped_white:
   if (buffer->cur >= buffer->notes[buffer->cur_note].pos
       && !pfile->overlaid_buffer)
     {
       _cpp_process_line_notes (pfile, false);
-      result->src_loc = pfile->line;
+      result->src_loc = pfile->line_table->highest_line;
     }
   c = *buffer->cur++;
 
-  result->src_loc = linemap_position_for_column (pfile->line_table,
-                                                CPP_BUF_COLUMN (buffer, buffer->cur));
+  LINEMAP_POSITION_FOR_COLUMN (result->src_loc, pfile->line_table,
+                              CPP_BUF_COLUMN (buffer, buffer->cur));
 
   switch (c)
     {
index 80adfb8844438f8802d7842be2ea34caff49c107..808dcdaa2b1ebfd535e15c5d6c5c58dcef998a84 100644 (file)
@@ -228,7 +228,7 @@ start_directive (cpp_reader *pfile)
   pfile->state.save_comments = 0;
 
   /* Some handlers need the position of the # for diagnostics.  */
-  pfile->directive_line = pfile->line;
+  pfile->directive_line = pfile->line_table->highest_line;
 }
 
 /* Called when leaving a directive, _Pragma or command-line directive.  */
@@ -777,7 +777,8 @@ strtoul_for_line (const uchar *str, unsigned int len, long unsigned int *nump)
 static void
 do_line (cpp_reader *pfile)
 {
-  const struct line_map *map = linemap_lookup (pfile->line_table, pfile->line);
+  const struct line_maps *line_table = pfile->line_table;
+  const struct line_map *map = &line_table->maps[line_table->used - 1];
   const cpp_token *token;
   const char *new_file = map->to_file;
   unsigned long new_lineno;
@@ -827,7 +828,8 @@ do_line (cpp_reader *pfile)
 static void
 do_linemarker (cpp_reader *pfile)
 {
-  const struct line_map *map = linemap_lookup (pfile->line_table, pfile->line);
+  const struct line_maps *line_table = pfile->line_table;
+  const struct line_map *map = &line_table->maps[line_table->used - 1];
   const cpp_token *token;
   const char *new_file = map->to_file;
   unsigned long new_lineno;
@@ -907,10 +909,8 @@ _cpp_do_file_change (cpp_reader *pfile, enum lc_reason reason,
 {
   const struct line_map *map = linemap_add (pfile->line_table, reason, sysp,
                                            to_file, file_line);
-  if (map == NULL)
-    pfile->line = 0;
-  else
-    pfile->line = linemap_line_start (pfile->line_table, map->to_line, 127);
+  if (map != NULL)
+    linemap_line_start (pfile->line_table, map->to_line, 127);
 
   if (pfile->cb.file_change)
     pfile->cb.file_change (pfile, map);
index 065c3972016656fbebd8a481b145350486e11abc..e3d0dc37b29fd896f3c2cdc99ca59f1cb2abffb1 100644 (file)
@@ -133,7 +133,7 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node)
        unsigned int len;
        const char *name;
        uchar *buf;
-       map = linemap_lookup (pfile->line_table, pfile->line);
+       map = linemap_lookup (pfile->line_table, pfile->line_table->highest_line);
 
        if (node->value.builtin == BT_BASE_FILE)
          while (! MAIN_FILE_P (map))
@@ -158,12 +158,12 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node)
       break;
 
     case BT_SPECLINE:
-      map = linemap_lookup (pfile->line_table, pfile->line);
+      map = &pfile->line_table->maps[pfile->line_table->used-1];
       /* If __LINE__ is embedded in a macro, it must expand to the
         line of the macro's invocation, not its definition.
         Otherwise things like assert() will not work properly.  */
       if (CPP_OPTION (pfile, traditional))
-       number = pfile->line;
+       number = pfile->line_table->highest_line;
       else
        number = pfile->cur_token[-1].src_loc;
       number = SOURCE_LINE (map, number);
index 8cb5bcff87a4855c8cb172aafe7e8ccb01d61be4..815235c6c4053ef9d53a01592343b57f674a573c 100644 (file)
@@ -618,7 +618,6 @@ cpp_read_state (cpp_reader *r, const char *name, FILE *f,
   struct lexer_state old_state;
   struct save_macro_item *d;
   size_t i, mac_count;
-  int saved_line = r->line;
 
   /* Restore spec_nodes, which will be full of references to the old 
      hashtable entries and so will now be invalid.  */
@@ -707,7 +706,6 @@ cpp_read_state (cpp_reader *r, const char *name, FILE *f,
     }
 
   r->state = old_state;
-  r->line = saved_line;
   free (defn);
   defn = NULL;
 
index f6dc99d3fecf39b1e489a702b2c22ffba5c11af1..e2b11cb41158b5f09be1d856605cf0c881f8cc27 100644 (file)
@@ -148,7 +148,7 @@ static const uchar *
 copy_comment (cpp_reader *pfile, const uchar *cur, int in_define)
 {
   bool unterminated, copy = false;
-  source_location src_loc = pfile->line;
+  source_location src_loc = pfile->line_table->highest_line;
   cpp_buffer *buffer = pfile->buffer;
 
   buffer->cur = cur;
@@ -271,7 +271,6 @@ _cpp_overlay_buffer (cpp_reader *pfile, const uchar *start, size_t len)
   pfile->saved_cur = buffer->cur;
   pfile->saved_rlimit = buffer->rlimit;
   pfile->saved_line_base = buffer->next_line;
-  pfile->saved_line = pfile->line;
   buffer->need_line = false;
 
   buffer->cur = start;
@@ -360,7 +359,7 @@ _cpp_scan_out_logical_line (cpp_reader *pfile, cpp_macro *macro)
   CUR (pfile->context) = pfile->buffer->cur;
   RLIMIT (pfile->context) = pfile->buffer->rlimit;
   pfile->out.cur = pfile->out.base;
-  pfile->out.first_line = pfile->line;
+  pfile->out.first_line = pfile->line_table->highest_line;
   /* start_of_input_line is needed to make sure that directives really,
      really start at the first character of the line.  */
   start_of_input_line = pfile->buffer->cur;
@@ -488,7 +487,7 @@ _cpp_scan_out_logical_line (cpp_reader *pfile, cpp_macro *macro)
                    {
                      maybe_start_funlike (pfile, node, out_start, &fmacro);
                      lex_state = ls_fun_open;
-                     fmacro.line = pfile->line;
+                     fmacro.line = pfile->line_table->highest_line;
                      continue;
                    }
                  else if (!recursive_macro (pfile, node))
index ceb57d45e210b5b2f38dd67bfa5a88b9ef65149c..e7d41b652e0914054905cca9907ceca520f0a7ac 100644 (file)
@@ -40,6 +40,7 @@ linemap_init (struct line_maps *set)
   set->depth = 0;
   set->cache = 0;
   set->highest_location = 0;
+  set->highest_line = 0;
   set->max_column_hint = 0;
 }
 
@@ -154,6 +155,7 @@ linemap_add (struct line_maps *set, enum lc_reason reason,
   set->cache = set->used++;
   map->column_bits = 0;
   set->highest_location = start_location;
+  set->highest_line = start_location;
   set->max_column_hint = 0;
 
   if (reason == LC_ENTER)
@@ -181,7 +183,7 @@ linemap_line_start (struct line_maps *set, unsigned int to_line,
   struct line_map *map = &set->maps[set->used - 1];
   source_location highest = set->highest_location;
   source_location r;
-  unsigned int last_line = SOURCE_LINE (map, highest);
+  unsigned int last_line = SOURCE_LINE (map, set->highest_line);
   int line_delta = to_line - last_line;
   bool add_map = false;
   if (line_delta < 0
@@ -196,7 +198,7 @@ linemap_line_start (struct line_maps *set, unsigned int to_line,
   if (add_map)
     {
       int column_bits;
-      if (max_column_hint > 1000000 || highest > 0xC0000000)
+      if (max_column_hint > 100000 || highest > 0xC0000000)
        {
          max_column_hint = 0;
          if (highest >0xF0000000)
@@ -221,12 +223,36 @@ linemap_line_start (struct line_maps *set, unsigned int to_line,
   else
     r = highest - SOURCE_COLUMN (map, highest)
       + (line_delta << map->column_bits);
+  set->highest_line = r;
   if (r > set->highest_location)
     set->highest_location = r;
   set->max_column_hint = max_column_hint;
   return r;
 }
 
+source_location
+linemap_position_for_column (struct line_maps *set, unsigned int to_column)
+{
+  source_location r = set->highest_line;
+  if (to_column >= set->max_column_hint)
+    {
+      if (r >= 0xC000000 || to_column > 100000)
+       {
+         /* Running low on source_locations - disable column numbers.  */
+         return r;
+       }
+      else
+       {
+         struct line_map *map = &set->maps[set->used - 1];
+         r = linemap_line_start (set, SOURCE_LINE (map, r), to_column + 50);
+       }
+    }
+  r = r + to_column;
+  if (r >= set->highest_location)
+    set->highest_location = r;
+  return r;
+}
+
 /* Given a logical line, returns the map from which the corresponding
    (source file, line) pair can be deduced.  Since the set is built
    chronologically, the logical lines are monotonic increasing, and so
index a3933a349e25d55c9b585248c9d0da3800f4a17a..73631be229f3dacbc6891913741e27be38e9b593 100644 (file)
@@ -84,6 +84,9 @@ struct line_maps
   /* Highest source_location "given out".  */
   source_location highest_location;
 
+  /* Start of line of highest source_location "given out".  */
+  source_location highest_line;
+
   /* The maximum column number we can quickly allocate.  Higher numbers
      may require allocating a new line_map.  */
   unsigned int max_column_hint;
@@ -157,32 +160,23 @@ extern void linemap_print_containing_files (struct line_maps *,
 /* Nonzero if the map is at the bottom of the include stack.  */
 #define MAIN_FILE_P(MAP) ((MAP)->included_from < 0)
 
-/* Get a source position that for the same line as the most recent
+/* Set LOC to a source position that is the same line as the most recent
    linemap_line_start, but with the specified TO_COLUMN column number.  */
 
-static inline source_location
-linemap_position_for_column (struct line_maps *set, unsigned int to_column)
-{
-  struct line_map *map = &set->maps[set->used - 1];
-  source_location r = set->highest_location;
-  if (__builtin_expect (to_column > set->max_column_hint, 0))
-    {
-      if (r >= 0xC000000 || to_column > 1000000) /* FIXME */
-       {
-         /* Running low on source_locations - disable column numbers.  */
-         return r - SOURCE_COLUMN (map, r);
-       }
-      else
-       {
-         r = linemap_line_start (set, SOURCE_LINE (map, r), to_column + 50);
-         map = &set->maps[set->used - 1];
-         r = set->highest_location;
-       }
-    }
-  r = r - SOURCE_COLUMN (map, r) + to_column;
-  if (r >= set->highest_location)
-    set->highest_location = r;
-  return r;
-}
-                                                 
+#define LINEMAP_POSITION_FOR_COLUMN(LOC, SET, TO_COLUMN) { \
+  unsigned int to_column = (TO_COLUMN); \
+  struct line_maps *set = (SET); \
+  if (__builtin_expect (to_column >= set->max_column_hint, 0)) \
+    (LOC) = linemap_position_for_column (set, to_column); \
+  else { \
+    source_location r = set->highest_line; \
+    r = r + to_column; \
+    if (r >= set->highest_location) \
+      set->highest_location = r; \
+    (LOC) = r;                  \
+  }}
+    
+
+extern source_location
+linemap_position_for_column (struct line_maps *set, unsigned int to_column);
 #endif /* !GCC_LINE_MAP_H  */