| 1 | /* Remap file names for debug info for GNU assembler. |
| 2 | Copyright 2007 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 | } |