@@ -48,40 +48,14 @@ StringRef ScriptLexer::getLine() {
48
48
return s.substr (0 , s.find_first_of (" \r\n " ));
49
49
}
50
50
51
- // Returns 1-based line number of the current token.
52
- size_t ScriptLexer::getLineNumber () {
53
- if (prevTok.empty ())
54
- return 1 ;
55
- StringRef s = getCurrentMB ().getBuffer ();
56
- const size_t tokOffset = prevTok.data () - s.data ();
57
-
58
- // For the first token, or when going backwards, start from the beginning of
59
- // the buffer. If this token is after the previous token, start from the
60
- // previous token.
61
- size_t line = 1 ;
62
- size_t start = 0 ;
63
- if (lastLineNumberOffset > 0 && tokOffset >= lastLineNumberOffset) {
64
- start = lastLineNumberOffset;
65
- line = lastLineNumber;
66
- }
67
-
68
- line += s.substr (start, tokOffset - start).count (' \n ' );
69
-
70
- // Store the line number of this token for reuse.
71
- lastLineNumberOffset = tokOffset;
72
- lastLineNumber = line;
73
-
74
- return line;
75
- }
76
-
77
51
// Returns 0-based column number of the current token.
78
52
size_t ScriptLexer::getColumnNumber () {
79
53
return prevTok.data () - getLine ().data ();
80
54
}
81
55
82
56
std::string ScriptLexer::getCurrentLocation () {
83
57
std::string filename = std::string (getCurrentMB ().getBufferIdentifier ());
84
- return (filename + " :" + Twine (getLineNumber () )).str ();
58
+ return (filename + " :" + Twine (prevTokLine )).str ();
85
59
}
86
60
87
61
// We don't want to record cascading errors. Keep only the first one.
@@ -177,20 +151,25 @@ StringRef ScriptLexer::skipSpace(StringRef s) {
177
151
setError (" unclosed comment in a linker script" );
178
152
return " " ;
179
153
}
154
+ curBuf.lineNumber += s.substr (0 , e).count (' \n ' );
180
155
s = s.substr (e + 2 );
181
156
continue ;
182
157
}
183
158
if (s.starts_with (" #" )) {
184
159
size_t e = s.find (' \n ' , 1 );
185
160
if (e == StringRef::npos)
186
161
e = s.size () - 1 ;
162
+ else
163
+ ++curBuf.lineNumber ;
187
164
s = s.substr (e + 1 );
188
165
continue ;
189
166
}
190
- size_t size = s. size () ;
167
+ StringRef saved = s;
191
168
s = s.ltrim ();
192
- if (s.size () == size)
169
+ auto len = saved.size () - s.size ();
170
+ if (len == 0 )
193
171
return s;
172
+ curBuf.lineNumber += saved.substr (0 , len).count (' \n ' );
194
173
}
195
174
}
196
175
@@ -199,6 +178,10 @@ bool ScriptLexer::atEOF() { return eof || errorCount(); }
199
178
200
179
StringRef ScriptLexer::next () {
201
180
prevTok = peek ();
181
+ // `prevTokLine` is not updated for EOF so that the line number in `setError`
182
+ // will be more useful.
183
+ if (prevTok.size ())
184
+ prevTokLine = curBuf.lineNumber ;
202
185
return std::exchange (curTok, StringRef (curBuf.s .data (), 0 ));
203
186
}
204
187
0 commit comments