Branch data Line data Source code
1 : : // Copyright (C) 2020-2024 Free Software Foundation, Inc.
2 : :
3 : : // This file is part of GCC.
4 : :
5 : : // GCC is free software; you can redistribute it and/or modify it under
6 : : // the terms of the GNU General Public License as published by the Free
7 : : // Software Foundation; either version 3, or (at your option) any later
8 : : // version.
9 : :
10 : : // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 : : // WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 : : // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 : : // for more details.
14 : :
15 : : // You should have received a copy of the GNU General Public License
16 : : // along with GCC; see the file COPYING3. If not see
17 : : // <http://www.gnu.org/licenses/>.
18 : :
19 : : // rust-linemap.cc -- GCC implementation of Linemap.
20 : :
21 : : #include "rust-linemap.h"
22 : :
23 : : Linemap *Linemap::instance_ = NULL;
24 : :
25 : : // Start getting locations from a new file.
26 : :
27 : : void
28 : 3746 : Linemap::start_file (const char *file_name, unsigned line_begin)
29 : : {
30 : 3746 : if (this->in_file_)
31 : 50 : linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
32 : 3746 : linemap_add (line_table, LC_ENTER, 0, file_name, line_begin);
33 : 3746 : this->in_file_ = true;
34 : 3746 : }
35 : :
36 : : // Stringify a location
37 : :
38 : : std::string
39 : 0 : Linemap::location_to_string (location_t location)
40 : : {
41 : 0 : const line_map_ordinary *lmo;
42 : 0 : location_t resolved_location;
43 : :
44 : : // Screen out unknown and predeclared locations; produce output
45 : : // only for simple file:line locations.
46 : 0 : resolved_location = linemap_resolve_location (line_table, location,
47 : : LRK_SPELLING_LOCATION, &lmo);
48 : 0 : if (lmo == NULL || resolved_location < RESERVED_LOCATION_COUNT)
49 : 0 : return "";
50 : 0 : const char *path = LINEMAP_FILE (lmo);
51 : 0 : if (!path)
52 : 0 : return "";
53 : :
54 : : // Strip the source file down to the base file, to reduce clutter.
55 : 0 : std::stringstream ss;
56 : 0 : ss << lbasename (path) << ":" << SOURCE_LINE (lmo, location) << ":"
57 : 0 : << SOURCE_COLUMN (lmo, location);
58 : 0 : return ss.str ();
59 : 0 : }
60 : :
61 : : // Stop getting locations.
62 : :
63 : : void
64 : 0 : Linemap::stop ()
65 : : {
66 : 0 : linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
67 : 0 : this->in_file_ = false;
68 : 0 : }
69 : :
70 : : // Return the Linemap to use for the gcc backend.
71 : :
72 : : Linemap *
73 : 3696 : rust_get_linemap ()
74 : : {
75 : 3696 : return new Linemap;
76 : : }
|