@@ -48,40 +48,14 @@ StringRef ScriptLexer::getLine() {
4848 return s.substr (0 , s.find_first_of (" \r\n " ));
4949}
5050
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-
7751// Returns 0-based column number of the current token.
7852size_t ScriptLexer::getColumnNumber () {
7953 return prevTok.data () - getLine ().data ();
8054}
8155
8256std::string ScriptLexer::getCurrentLocation () {
8357 std::string filename = std::string (getCurrentMB ().getBufferIdentifier ());
84- return (filename + " :" + Twine (getLineNumber () )).str ();
58+ return (filename + " :" + Twine (prevTokLine )).str ();
8559}
8660
8761// We don't want to record cascading errors. Keep only the first one.
@@ -177,20 +151,25 @@ StringRef ScriptLexer::skipSpace(StringRef s) {
177151 setError (" unclosed comment in a linker script" );
178152 return " " ;
179153 }
154+ curBuf.lineNumber += s.substr (0 , e).count (' \n ' );
180155 s = s.substr (e + 2 );
181156 continue ;
182157 }
183158 if (s.starts_with (" #" )) {
184159 size_t e = s.find (' \n ' , 1 );
185160 if (e == StringRef::npos)
186161 e = s.size () - 1 ;
162+ else
163+ ++curBuf.lineNumber ;
187164 s = s.substr (e + 1 );
188165 continue ;
189166 }
190- size_t size = s. size () ;
167+ StringRef saved = s;
191168 s = s.ltrim ();
192- if (s.size () == size)
169+ auto len = saved.size () - s.size ();
170+ if (len == 0 )
193171 return s;
172+ curBuf.lineNumber += saved.substr (0 , len).count (' \n ' );
194173 }
195174}
196175
@@ -199,6 +178,10 @@ bool ScriptLexer::atEOF() { return eof || errorCount(); }
199178
200179StringRef ScriptLexer::next () {
201180 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 ;
202185 return std::exchange (curTok, StringRef (curBuf.s .data (), 0 ));
203186}
204187
0 commit comments