annotate gcc/go/go-linemap.cc @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // go-linemap.cc -- GCC implementation of Linemap.
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 // Copyright 2011 The Go Authors. All rights reserved.
kono
parents:
diff changeset
4 // Use of this source code is governed by a BSD-style
kono
parents:
diff changeset
5 // license that can be found in the LICENSE file.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 #include "go-linemap.h"
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 #include "go-gcc.h"
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 // This class implements the Linemap interface defined by the
kono
parents:
diff changeset
12 // frontend.
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 class Gcc_linemap : public Linemap
kono
parents:
diff changeset
15 {
kono
parents:
diff changeset
16 public:
kono
parents:
diff changeset
17 Gcc_linemap()
kono
parents:
diff changeset
18 : Linemap(),
kono
parents:
diff changeset
19 in_file_(false)
kono
parents:
diff changeset
20 { }
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 void
kono
parents:
diff changeset
23 start_file(const char* file_name, unsigned int line_begin);
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 void
kono
parents:
diff changeset
26 start_line(unsigned int line_number, unsigned int line_size);
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 Location
kono
parents:
diff changeset
29 get_location(unsigned int column);
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 void
kono
parents:
diff changeset
32 stop();
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 std::string
kono
parents:
diff changeset
35 to_string(Location);
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 int
kono
parents:
diff changeset
38 location_line(Location);
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 protected:
kono
parents:
diff changeset
41 Location
kono
parents:
diff changeset
42 get_predeclared_location();
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 Location
kono
parents:
diff changeset
45 get_unknown_location();
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 bool
kono
parents:
diff changeset
48 is_predeclared(Location);
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 bool
kono
parents:
diff changeset
51 is_unknown(Location);
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 private:
kono
parents:
diff changeset
54 // Whether we are currently reading a file.
kono
parents:
diff changeset
55 bool in_file_;
kono
parents:
diff changeset
56 };
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 Linemap* Linemap::instance_ = NULL;
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 // Start getting locations from a new file.
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 void
kono
parents:
diff changeset
63 Gcc_linemap::start_file(const char *file_name, unsigned line_begin)
kono
parents:
diff changeset
64 {
kono
parents:
diff changeset
65 if (this->in_file_)
kono
parents:
diff changeset
66 linemap_add(line_table, LC_LEAVE, 0, NULL, 0);
kono
parents:
diff changeset
67 linemap_add(line_table, LC_ENTER, 0, file_name, line_begin);
kono
parents:
diff changeset
68 this->in_file_ = true;
kono
parents:
diff changeset
69 }
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 // Stringify a location
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 std::string
kono
parents:
diff changeset
74 Gcc_linemap::to_string(Location location)
kono
parents:
diff changeset
75 {
kono
parents:
diff changeset
76 const line_map_ordinary *lmo;
kono
parents:
diff changeset
77 source_location resolved_location;
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 // Screen out unknown and predeclared locations; produce output
kono
parents:
diff changeset
80 // only for simple file:line locations.
kono
parents:
diff changeset
81 resolved_location =
kono
parents:
diff changeset
82 linemap_resolve_location (line_table, location.gcc_location(),
kono
parents:
diff changeset
83 LRK_SPELLING_LOCATION, &lmo);
kono
parents:
diff changeset
84 if (lmo == NULL || resolved_location < RESERVED_LOCATION_COUNT)
kono
parents:
diff changeset
85 return "";
kono
parents:
diff changeset
86 const char *path = LINEMAP_FILE (lmo);
kono
parents:
diff changeset
87 if (!path)
kono
parents:
diff changeset
88 return "";
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 // Strip the source file down to the base file, to reduce clutter.
kono
parents:
diff changeset
91 std::stringstream ss;
kono
parents:
diff changeset
92 ss << lbasename(path) << ":" << SOURCE_LINE (lmo, location.gcc_location());
kono
parents:
diff changeset
93 return ss.str();
kono
parents:
diff changeset
94 }
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 // Return the line number for a given location (for debugging dumps)
kono
parents:
diff changeset
97 int
kono
parents:
diff changeset
98 Gcc_linemap::location_line(Location loc)
kono
parents:
diff changeset
99 {
kono
parents:
diff changeset
100 return LOCATION_LINE(loc.gcc_location());
kono
parents:
diff changeset
101 }
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 // Stop getting locations.
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 void
kono
parents:
diff changeset
106 Gcc_linemap::stop()
kono
parents:
diff changeset
107 {
kono
parents:
diff changeset
108 linemap_add(line_table, LC_LEAVE, 0, NULL, 0);
kono
parents:
diff changeset
109 this->in_file_ = false;
kono
parents:
diff changeset
110 }
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 // Start a new line.
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 void
kono
parents:
diff changeset
115 Gcc_linemap::start_line(unsigned lineno, unsigned linesize)
kono
parents:
diff changeset
116 {
kono
parents:
diff changeset
117 linemap_line_start(line_table, lineno, linesize);
kono
parents:
diff changeset
118 }
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 // Get a location.
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 Location
kono
parents:
diff changeset
123 Gcc_linemap::get_location(unsigned column)
kono
parents:
diff changeset
124 {
kono
parents:
diff changeset
125 return Location(linemap_position_for_column(line_table, column));
kono
parents:
diff changeset
126 }
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 // Get the unknown location.
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 Location
kono
parents:
diff changeset
131 Gcc_linemap::get_unknown_location()
kono
parents:
diff changeset
132 {
kono
parents:
diff changeset
133 return Location(UNKNOWN_LOCATION);
kono
parents:
diff changeset
134 }
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 // Get the predeclared location.
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 Location
kono
parents:
diff changeset
139 Gcc_linemap::get_predeclared_location()
kono
parents:
diff changeset
140 {
kono
parents:
diff changeset
141 return Location(BUILTINS_LOCATION);
kono
parents:
diff changeset
142 }
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 // Return whether a location is the predeclared location.
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 bool
kono
parents:
diff changeset
147 Gcc_linemap::is_predeclared(Location loc)
kono
parents:
diff changeset
148 {
kono
parents:
diff changeset
149 return loc.gcc_location() == BUILTINS_LOCATION;
kono
parents:
diff changeset
150 }
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 // Return whether a location is the unknown location.
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 bool
kono
parents:
diff changeset
155 Gcc_linemap::is_unknown(Location loc)
kono
parents:
diff changeset
156 {
kono
parents:
diff changeset
157 return loc.gcc_location() == UNKNOWN_LOCATION;
kono
parents:
diff changeset
158 }
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 // Return the Linemap to use for the gcc backend.
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 Linemap*
kono
parents:
diff changeset
163 go_get_linemap()
kono
parents:
diff changeset
164 {
kono
parents:
diff changeset
165 return new Gcc_linemap;
kono
parents:
diff changeset
166 }