Subversion Repositories Kolibri OS

Rev

Rev 5222 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /* Remap file names for debug info for GNU assembler.
  2.    Copyright (C) 2007-2015 Free Software Foundation, Inc.
  3.  
  4.    This file is part of GAS, the GNU Assembler.
  5.  
  6.    GAS is free software; you can redistribute it and/or modify
  7.    it under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 3, or (at your option)
  9.    any later version.
  10.  
  11.    GAS is distributed in the hope that it will be useful,
  12.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.    GNU General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License
  17.    along with GAS; see the file COPYING.  If not, write to the Free
  18.    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
  19.    02110-1301, USA.  */
  20.  
  21. #include "as.h"
  22. #include "filenames.h"
  23.  
  24. /* Structure recording the mapping from source file and directory
  25.    names at compile time to those to be embedded in debug
  26.    information.  */
  27. typedef struct debug_prefix_map
  28. {
  29.   const char *old_prefix;
  30.   const char *new_prefix;
  31.   size_t old_len;
  32.   size_t new_len;
  33.   struct debug_prefix_map *next;
  34. } debug_prefix_map;
  35.  
  36. /* Linked list of such structures.  */
  37. debug_prefix_map *debug_prefix_maps;
  38.  
  39.  
  40. /* Record a debug file prefix mapping.  ARG is the argument to
  41.    -fdebug-prefix-map and must be of the form OLD=NEW.  */
  42.  
  43. void
  44. add_debug_prefix_map (const char *arg)
  45. {
  46.   debug_prefix_map *map;
  47.   const char *p;
  48.   char *o;
  49.  
  50.   p = strchr (arg, '=');
  51.   if (!p)
  52.     {
  53.       as_fatal (_("invalid argument '%s' to -fdebug-prefix-map"), arg);
  54.       return;
  55.     }
  56.   map = (struct debug_prefix_map *) xmalloc (sizeof (debug_prefix_map));
  57.   o = xstrdup (arg);
  58.   map->old_prefix = o;
  59.   map->old_len = p - arg;
  60.   o[map->old_len] = 0;
  61.   p++;
  62.   map->new_prefix = xstrdup (p);
  63.   map->new_len = strlen (p);
  64.   map->next = debug_prefix_maps;
  65.   debug_prefix_maps = map;
  66. }
  67.  
  68. /* Perform user-specified mapping of debug filename prefixes.  Returns
  69.    a newly allocated buffer containing the name corresponding to FILENAME.
  70.    It is the caller's responsibility to free the buffer.  */
  71.  
  72. const char *
  73. remap_debug_filename (const char *filename)
  74. {
  75.   debug_prefix_map *map;
  76.   char *s;
  77.   const char *name;
  78.   size_t name_len;
  79.  
  80.   for (map = debug_prefix_maps; map; map = map->next)
  81.     if (filename_ncmp (filename, map->old_prefix, map->old_len) == 0)
  82.       break;
  83.   if (!map)
  84.     return xstrdup (filename);
  85.   name = filename + map->old_len;
  86.   name_len = strlen (name) + 1;
  87.   s = (char *) alloca (name_len + map->new_len);
  88.   memcpy (s, map->new_prefix, map->new_len);
  89.   memcpy (s + map->new_len, name, name_len);
  90.   return xstrdup (s);
  91. }
  92.