clang 20.0.0git
PPLexerChange.cpp
Go to the documentation of this file.
1//===--- PPLexerChange.cpp - Handle changing lexers in the preprocessor ---===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements pieces of the Preprocessor interface that manage the
10// current lexer stack.
11//
12//===----------------------------------------------------------------------===//
13
18#include "clang/Lex/MacroInfo.h"
21#include "llvm/ADT/StringSwitch.h"
22#include "llvm/Support/MemoryBufferRef.h"
23#include "llvm/Support/Path.h"
24#include <optional>
25
26using namespace clang;
27
28//===----------------------------------------------------------------------===//
29// Miscellaneous Methods.
30//===----------------------------------------------------------------------===//
31
32/// isInPrimaryFile - Return true if we're in the top-level file, not in a
33/// \#include. This looks through macro expansions and active _Pragma lexers.
35 if (IsFileLexer())
36 return IncludeMacroStack.empty();
37
38 // If there are any stacked lexers, we're in a #include.
39 assert(IsFileLexer(IncludeMacroStack[0]) &&
40 "Top level include stack isn't our primary lexer?");
41 return llvm::none_of(
42 llvm::drop_begin(IncludeMacroStack),
43 [&](const IncludeStackInfo &ISI) -> bool { return IsFileLexer(ISI); });
44}
45
46/// getCurrentLexer - Return the current file lexer being lexed from. Note
47/// that this ignores any potentially active macro expansions and _Pragma
48/// expansions going on at the time.
50 if (IsFileLexer())
51 return CurPPLexer;
52
53 // Look for a stacked lexer.
54 for (const IncludeStackInfo &ISI : llvm::reverse(IncludeMacroStack)) {
55 if (IsFileLexer(ISI))
56 return ISI.ThePPLexer;
57 }
58 return nullptr;
59}
60
61
62//===----------------------------------------------------------------------===//
63// Methods for Entering and Callbacks for leaving various contexts
64//===----------------------------------------------------------------------===//
65
66/// EnterSourceFile - Add a source file to the top of the include stack and
67/// start lexing tokens from it instead of the current buffer.
70 bool IsFirstIncludeOfFile) {
71 assert(!CurTokenLexer && "Cannot #include a file inside a macro!");
72 ++NumEnteredSourceFiles;
73
74 if (MaxIncludeStackDepth < IncludeMacroStack.size())
75 MaxIncludeStackDepth = IncludeMacroStack.size();
76
77 // Get the MemoryBuffer for this FID, if it fails, we fail.
78 std::optional<llvm::MemoryBufferRef> InputFile =
80 if (!InputFile) {
81 SourceLocation FileStart = SourceMgr.getLocForStartOfFile(FID);
82 Diag(Loc, diag::err_pp_error_opening_file)
83 << std::string(SourceMgr.getBufferName(FileStart)) << "";
84 return true;
85 }
86
88 SourceMgr.getFileEntryForID(FID) == CodeCompletionFile) {
89 CodeCompletionFileLoc = SourceMgr.getLocForStartOfFile(FID);
90 CodeCompletionLoc =
91 CodeCompletionFileLoc.getLocWithOffset(CodeCompletionOffset);
92 }
93
94 Lexer *TheLexer = new Lexer(FID, *InputFile, *this, IsFirstIncludeOfFile);
95 if (getPreprocessorOpts().DependencyDirectivesForFile &&
96 FID != PredefinesFileID) {
97 if (OptionalFileEntryRef File = SourceMgr.getFileEntryRefForID(FID)) {
99 DepDirectives =
100 getPreprocessorOpts().DependencyDirectivesForFile(*File)) {
101 TheLexer->DepDirectives = *DepDirectives;
102 }
103 }
104 }
105
106 EnterSourceFileWithLexer(TheLexer, CurDir);
107 return false;
108}
109
110/// EnterSourceFileWithLexer - Add a source file to the top of the include stack
111/// and start lexing tokens from it instead of the current buffer.
112void Preprocessor::EnterSourceFileWithLexer(Lexer *TheLexer,
113 ConstSearchDirIterator CurDir) {
114 PreprocessorLexer *PrevPPLexer = CurPPLexer;
115
116 // Add the current lexer to the include stack.
117 if (CurPPLexer || CurTokenLexer)
118 PushIncludeMacroStack();
119
120 CurLexer.reset(TheLexer);
121 CurPPLexer = TheLexer;
122 CurDirLookup = CurDir;
123 CurLexerSubmodule = nullptr;
124 if (CurLexerCallback != CLK_LexAfterModuleImport)
125 CurLexerCallback = TheLexer->isDependencyDirectivesLexer()
126 ? CLK_DependencyDirectivesLexer
127 : CLK_Lexer;
128
129 // Notify the client, if desired, that we are in a new source file.
130 if (Callbacks && !CurLexer->Is_PragmaLexer) {
132 SourceMgr.getFileCharacteristic(CurLexer->getFileLoc());
133
134 FileID PrevFID;
135 SourceLocation EnterLoc;
136 if (PrevPPLexer) {
137 PrevFID = PrevPPLexer->getFileID();
138 EnterLoc = PrevPPLexer->getSourceLocation();
139 }
140 Callbacks->FileChanged(CurLexer->getFileLoc(), PPCallbacks::EnterFile,
141 FileType, PrevFID);
142 Callbacks->LexedFileChanged(CurLexer->getFileID(),
144 FileType, PrevFID, EnterLoc);
145 }
146}
147
148/// EnterMacro - Add a Macro to the top of the include stack and start lexing
149/// tokens from it instead of the current buffer.
151 MacroInfo *Macro, MacroArgs *Args) {
152 std::unique_ptr<TokenLexer> TokLexer;
153 if (NumCachedTokenLexers == 0) {
154 TokLexer = std::make_unique<TokenLexer>(Tok, ILEnd, Macro, Args, *this);
155 } else {
156 TokLexer = std::move(TokenLexerCache[--NumCachedTokenLexers]);
157 TokLexer->Init(Tok, ILEnd, Macro, Args);
158 }
159
160 PushIncludeMacroStack();
161 CurDirLookup = nullptr;
162 CurTokenLexer = std::move(TokLexer);
163 if (CurLexerCallback != CLK_LexAfterModuleImport)
164 CurLexerCallback = CLK_TokenLexer;
165}
166
167/// EnterTokenStream - Add a "macro" context to the top of the include stack,
168/// which will cause the lexer to start returning the specified tokens.
169///
170/// If DisableMacroExpansion is true, tokens lexed from the token stream will
171/// not be subject to further macro expansion. Otherwise, these tokens will
172/// be re-macro-expanded when/if expansion is enabled.
173///
174/// If OwnsTokens is false, this method assumes that the specified stream of
175/// tokens has a permanent owner somewhere, so they do not need to be copied.
176/// If it is true, it assumes the array of tokens is allocated with new[] and
177/// must be freed.
178///
179void Preprocessor::EnterTokenStream(const Token *Toks, unsigned NumToks,
180 bool DisableMacroExpansion, bool OwnsTokens,
181 bool IsReinject) {
182 if (CurLexerCallback == CLK_CachingLexer) {
183 if (CachedLexPos < CachedTokens.size()) {
184 assert(IsReinject && "new tokens in the middle of cached stream");
185 // We're entering tokens into the middle of our cached token stream. We
186 // can't represent that, so just insert the tokens into the buffer.
187 CachedTokens.insert(CachedTokens.begin() + CachedLexPos,
188 Toks, Toks + NumToks);
189 if (OwnsTokens)
190 delete [] Toks;
191 return;
192 }
193
194 // New tokens are at the end of the cached token sequnece; insert the
195 // token stream underneath the caching lexer.
196 ExitCachingLexMode();
197 EnterTokenStream(Toks, NumToks, DisableMacroExpansion, OwnsTokens,
198 IsReinject);
199 EnterCachingLexMode();
200 return;
201 }
202
203 // Create a macro expander to expand from the specified token stream.
204 std::unique_ptr<TokenLexer> TokLexer;
205 if (NumCachedTokenLexers == 0) {
206 TokLexer = std::make_unique<TokenLexer>(
207 Toks, NumToks, DisableMacroExpansion, OwnsTokens, IsReinject, *this);
208 } else {
209 TokLexer = std::move(TokenLexerCache[--NumCachedTokenLexers]);
210 TokLexer->Init(Toks, NumToks, DisableMacroExpansion, OwnsTokens,
211 IsReinject);
212 }
213
214 // Save our current state.
215 PushIncludeMacroStack();
216 CurDirLookup = nullptr;
217 CurTokenLexer = std::move(TokLexer);
218 if (CurLexerCallback != CLK_LexAfterModuleImport)
219 CurLexerCallback = CLK_TokenLexer;
220}
221
222/// Compute the relative path that names the given file relative to
223/// the given directory.
226 Result.clear();
227
228 StringRef FilePath = File.getDir().getName();
229 StringRef Path = FilePath;
230 while (!Path.empty()) {
231 if (auto CurDir = FM.getOptionalDirectoryRef(Path)) {
232 if (*CurDir == Dir) {
233 Result = FilePath.substr(Path.size());
234 llvm::sys::path::append(Result,
235 llvm::sys::path::filename(File.getName()));
236 return;
237 }
238 }
239
240 Path = llvm::sys::path::parent_path(Path);
241 }
242
243 Result = File.getName();
244}
245
246void Preprocessor::PropagateLineStartLeadingSpaceInfo(Token &Result) {
247 if (CurTokenLexer) {
248 CurTokenLexer->PropagateLineStartLeadingSpaceInfo(Result);
249 return;
250 }
251 if (CurLexer) {
252 CurLexer->PropagateLineStartLeadingSpaceInfo(Result);
253 return;
254 }
255 // FIXME: Handle other kinds of lexers? It generally shouldn't matter,
256 // but it might if they're empty?
257}
258
259/// Determine the location to use as the end of the buffer for a lexer.
260///
261/// If the file ends with a newline, form the EOF token on the newline itself,
262/// rather than "on the line following it", which doesn't exist. This makes
263/// diagnostics relating to the end of file include the last file that the user
264/// actually typed, which is goodness.
265const char *Preprocessor::getCurLexerEndPos() {
266 const char *EndPos = CurLexer->BufferEnd;
267 if (EndPos != CurLexer->BufferStart &&
268 (EndPos[-1] == '\n' || EndPos[-1] == '\r')) {
269 --EndPos;
270
271 // Handle \n\r and \r\n:
272 if (EndPos != CurLexer->BufferStart &&
273 (EndPos[-1] == '\n' || EndPos[-1] == '\r') &&
274 EndPos[-1] != EndPos[0])
275 --EndPos;
276 }
277
278 return EndPos;
279}
280
282 const Module &Mod, SmallVectorImpl<const Module *> &SubMods) {
284 SubMods.push_back(&Mod);
285 for (auto *M : Mod.submodules())
287}
288
289void Preprocessor::diagnoseMissingHeaderInUmbrellaDir(const Module &Mod) {
290 std::optional<Module::Header> UmbrellaHeader =
292 assert(UmbrellaHeader && "Module must use umbrella header");
293 const FileID &File = SourceMgr.translateFile(UmbrellaHeader->Entry);
294 SourceLocation ExpectedHeadersLoc = SourceMgr.getLocForEndOfFile(File);
295 if (getDiagnostics().isIgnored(diag::warn_uncovered_module_header,
296 ExpectedHeadersLoc))
297 return;
298
301 llvm::vfs::FileSystem &FS = FileMgr.getVirtualFileSystem();
302 std::error_code EC;
303 for (llvm::vfs::recursive_directory_iterator Entry(FS, Dir->getName(), EC),
304 End;
305 Entry != End && !EC; Entry.increment(EC)) {
306 using llvm::StringSwitch;
307
308 // Check whether this entry has an extension typically associated with
309 // headers.
310 if (!StringSwitch<bool>(llvm::sys::path::extension(Entry->path()))
311 .Cases(".h", ".H", ".hh", ".hpp", true)
312 .Default(false))
313 continue;
314
315 if (auto Header = getFileManager().getOptionalFileRef(Entry->path()))
316 if (!getSourceManager().hasFileInfo(*Header)) {
317 if (!ModMap.isHeaderInUnavailableModule(*Header)) {
318 // Find the relative path that would access this header.
319 SmallString<128> RelativePath;
320 computeRelativePath(FileMgr, *Dir, *Header, RelativePath);
321 Diag(ExpectedHeadersLoc, diag::warn_uncovered_module_header)
322 << Mod.getFullModuleName() << RelativePath;
323 }
324 }
325 }
326}
327
328/// HandleEndOfFile - This callback is invoked when the lexer hits the end of
329/// the current file. This either returns the EOF token or pops a level off
330/// the include stack and keeps going.
331bool Preprocessor::HandleEndOfFile(Token &Result, bool isEndOfMacro) {
332 assert(!CurTokenLexer &&
333 "Ending a file when currently in a macro!");
334
335 SourceLocation UnclosedSafeBufferOptOutLoc;
336
337 if (IncludeMacroStack.empty() &&
338 isPPInSafeBufferOptOutRegion(UnclosedSafeBufferOptOutLoc)) {
339 // To warn if a "-Wunsafe-buffer-usage" opt-out region is still open by the
340 // end of a file.
341 Diag(UnclosedSafeBufferOptOutLoc,
342 diag::err_pp_unclosed_pragma_unsafe_buffer_usage);
343 }
344 // If we have an unclosed module region from a pragma at the end of a
345 // module, complain and close it now.
346 const bool LeavingSubmodule = CurLexer && CurLexerSubmodule;
347 if ((LeavingSubmodule || IncludeMacroStack.empty()) &&
348 !BuildingSubmoduleStack.empty() &&
349 BuildingSubmoduleStack.back().IsPragma) {
350 Diag(BuildingSubmoduleStack.back().ImportLoc,
351 diag::err_pp_module_begin_without_module_end);
352 Module *M = LeaveSubmodule(/*ForPragma*/true);
353
354 Result.startToken();
355 const char *EndPos = getCurLexerEndPos();
356 CurLexer->BufferPtr = EndPos;
357 CurLexer->FormTokenWithChars(Result, EndPos, tok::annot_module_end);
358 Result.setAnnotationEndLoc(Result.getLocation());
359 Result.setAnnotationValue(M);
360 return true;
361 }
362
363 // See if this file had a controlling macro.
364 if (CurPPLexer) { // Not ending a macro, ignore it.
365 if (const IdentifierInfo *ControllingMacro =
367 // Okay, this has a controlling macro, remember in HeaderFileInfo.
368 if (OptionalFileEntryRef FE = CurPPLexer->getFileEntry()) {
369 HeaderInfo.SetFileControllingMacro(*FE, ControllingMacro);
370 if (MacroInfo *MI = getMacroInfo(ControllingMacro))
371 MI->setUsedForHeaderGuard(true);
372 if (const IdentifierInfo *DefinedMacro =
373 CurPPLexer->MIOpt.GetDefinedMacro()) {
374 if (!isMacroDefined(ControllingMacro) &&
375 DefinedMacro != ControllingMacro &&
376 CurLexer->isFirstTimeLexingFile()) {
377
378 // If the edit distance between the two macros is more than 50%,
379 // DefinedMacro may not be header guard, or can be header guard of
380 // another header file. Therefore, it maybe defining something
381 // completely different. This can be observed in the wild when
382 // handling feature macros or header guards in different files.
383
384 const StringRef ControllingMacroName = ControllingMacro->getName();
385 const StringRef DefinedMacroName = DefinedMacro->getName();
386 const size_t MaxHalfLength = std::max(ControllingMacroName.size(),
387 DefinedMacroName.size()) / 2;
388 const unsigned ED = ControllingMacroName.edit_distance(
389 DefinedMacroName, true, MaxHalfLength);
390 if (ED <= MaxHalfLength) {
391 // Emit a warning for a bad header guard.
392 Diag(CurPPLexer->MIOpt.GetMacroLocation(),
393 diag::warn_header_guard)
394 << CurPPLexer->MIOpt.GetMacroLocation() << ControllingMacro;
395 Diag(CurPPLexer->MIOpt.GetDefinedLocation(),
396 diag::note_header_guard)
397 << CurPPLexer->MIOpt.GetDefinedLocation() << DefinedMacro
398 << ControllingMacro
400 CurPPLexer->MIOpt.GetDefinedLocation(),
401 ControllingMacro->getName());
402 }
403 }
404 }
405 }
406 }
407 }
408
409 // Complain about reaching a true EOF within arc_cf_code_audited.
410 // We don't want to complain about reaching the end of a macro
411 // instantiation or a _Pragma.
412 if (PragmaARCCFCodeAuditedInfo.second.isValid() && !isEndOfMacro &&
413 !(CurLexer && CurLexer->Is_PragmaLexer)) {
414 Diag(PragmaARCCFCodeAuditedInfo.second,
415 diag::err_pp_eof_in_arc_cf_code_audited);
416
417 // Recover by leaving immediately.
418 PragmaARCCFCodeAuditedInfo = {nullptr, SourceLocation()};
419 }
420
421 // Complain about reaching a true EOF within assume_nonnull.
422 // We don't want to complain about reaching the end of a macro
423 // instantiation or a _Pragma.
424 if (PragmaAssumeNonNullLoc.isValid() &&
425 !isEndOfMacro && !(CurLexer && CurLexer->Is_PragmaLexer)) {
426 // If we're at the end of generating a preamble, we should record the
427 // unterminated \#pragma clang assume_nonnull so we can restore it later
428 // when the preamble is loaded into the main file.
430 PreambleRecordedPragmaAssumeNonNullLoc = PragmaAssumeNonNullLoc;
431 else
432 Diag(PragmaAssumeNonNullLoc, diag::err_pp_eof_in_assume_nonnull);
433 // Recover by leaving immediately.
434 PragmaAssumeNonNullLoc = SourceLocation();
435 }
436
437 bool LeavingPCHThroughHeader = false;
438
439 // If this is a #include'd file, pop it off the include stack and continue
440 // lexing the #includer file.
441 if (!IncludeMacroStack.empty()) {
442
443 // If we lexed the code-completion file, act as if we reached EOF.
444 if (isCodeCompletionEnabled() && CurPPLexer &&
445 SourceMgr.getLocForStartOfFile(CurPPLexer->getFileID()) ==
446 CodeCompletionFileLoc) {
447 assert(CurLexer && "Got EOF but no current lexer set!");
448 Result.startToken();
449 CurLexer->FormTokenWithChars(Result, CurLexer->BufferEnd, tok::eof);
450 CurLexer.reset();
451
452 CurPPLexer = nullptr;
454 return true;
455 }
456
457 if (!isEndOfMacro && CurPPLexer &&
458 (SourceMgr.getIncludeLoc(CurPPLexer->getFileID()).isValid() ||
459 // Predefines file doesn't have a valid include location.
460 (PredefinesFileID.isValid() &&
461 CurPPLexer->getFileID() == PredefinesFileID))) {
462 // Notify SourceManager to record the number of FileIDs that were created
463 // during lexing of the #include'd file.
464 unsigned NumFIDs =
465 SourceMgr.local_sloc_entry_size() -
466 CurPPLexer->getInitialNumSLocEntries() + 1/*#include'd file*/;
467 SourceMgr.setNumCreatedFIDsForFileID(CurPPLexer->getFileID(), NumFIDs);
468 }
469
470 bool ExitedFromPredefinesFile = false;
471 FileID ExitedFID;
472 if (!isEndOfMacro && CurPPLexer) {
473 ExitedFID = CurPPLexer->getFileID();
474
475 assert(PredefinesFileID.isValid() &&
476 "HandleEndOfFile is called before PredefinesFileId is set");
477 ExitedFromPredefinesFile = (PredefinesFileID == ExitedFID);
478 }
479
480 if (LeavingSubmodule) {
481 // We're done with this submodule.
482 Module *M = LeaveSubmodule(/*ForPragma*/false);
483
484 // Notify the parser that we've left the module.
485 const char *EndPos = getCurLexerEndPos();
486 Result.startToken();
487 CurLexer->BufferPtr = EndPos;
488 CurLexer->FormTokenWithChars(Result, EndPos, tok::annot_module_end);
489 Result.setAnnotationEndLoc(Result.getLocation());
490 Result.setAnnotationValue(M);
491 }
492
493 bool FoundPCHThroughHeader = false;
494 if (CurPPLexer && creatingPCHWithThroughHeader() &&
496 SourceMgr.getFileEntryForID(CurPPLexer->getFileID())))
497 FoundPCHThroughHeader = true;
498
499 // We're done with the #included file.
501
502 // Propagate info about start-of-line/leading white-space/etc.
503 PropagateLineStartLeadingSpaceInfo(Result);
504
505 // Notify the client, if desired, that we are in a new source file.
506 if (Callbacks && !isEndOfMacro && CurPPLexer) {
507 SourceLocation Loc = CurPPLexer->getSourceLocation();
509 SourceMgr.getFileCharacteristic(Loc);
510 Callbacks->FileChanged(Loc, PPCallbacks::ExitFile, FileType, ExitedFID);
511 Callbacks->LexedFileChanged(CurPPLexer->getFileID(),
513 FileType, ExitedFID, Loc);
514 }
515
516 // Restore conditional stack as well as the recorded
517 // \#pragma clang assume_nonnull from the preamble right after exiting
518 // from the predefines file.
519 if (ExitedFromPredefinesFile) {
520 replayPreambleConditionalStack();
521 if (PreambleRecordedPragmaAssumeNonNullLoc.isValid())
522 PragmaAssumeNonNullLoc = PreambleRecordedPragmaAssumeNonNullLoc;
523 }
524
525 if (!isEndOfMacro && CurPPLexer && FoundPCHThroughHeader &&
526 (isInPrimaryFile() ||
527 CurPPLexer->getFileID() == getPredefinesFileID())) {
528 // Leaving the through header. Continue directly to end of main file
529 // processing.
530 LeavingPCHThroughHeader = true;
531 } else {
532 // Client should lex another token unless we generated an EOM.
533 return LeavingSubmodule;
534 }
535 }
536 // If this is the end of the main file, form an EOF token.
537 assert(CurLexer && "Got EOF but no current lexer set!");
538 const char *EndPos = getCurLexerEndPos();
539 Result.startToken();
540 CurLexer->BufferPtr = EndPos;
541
542 if (getLangOpts().IncrementalExtensions) {
543 CurLexer->FormTokenWithChars(Result, EndPos, tok::annot_repl_input_end);
544 Result.setAnnotationEndLoc(Result.getLocation());
545 Result.setAnnotationValue(nullptr);
546 } else {
547 CurLexer->FormTokenWithChars(Result, EndPos, tok::eof);
548 }
549
551 // Inserting the code-completion point increases the source buffer by 1,
552 // but the main FileID was created before inserting the point.
553 // Compensate by reducing the EOF location by 1, otherwise the location
554 // will point to the next FileID.
555 // FIXME: This is hacky, the code-completion point should probably be
556 // inserted before the main FileID is created.
557 if (CurLexer->getFileLoc() == CodeCompletionFileLoc)
558 Result.setLocation(Result.getLocation().getLocWithOffset(-1));
559 }
560
561 if (creatingPCHWithThroughHeader() && !LeavingPCHThroughHeader) {
562 // Reached the end of the compilation without finding the through header.
563 Diag(CurLexer->getFileLoc(), diag::err_pp_through_header_not_seen)
564 << PPOpts->PCHThroughHeader << 0;
565 }
566
568 // We're done with lexing.
569 CurLexer.reset();
570
572 CurPPLexer = nullptr;
573
574 if (TUKind == TU_Complete) {
575 // This is the end of the top-level file. 'WarnUnusedMacroLocs' has
576 // collected all macro locations that we need to warn because they are not
577 // used.
578 for (WarnUnusedMacroLocsTy::iterator
579 I=WarnUnusedMacroLocs.begin(), E=WarnUnusedMacroLocs.end();
580 I!=E; ++I)
581 Diag(*I, diag::pp_macro_not_used);
582 }
583
584 // If we are building a module that has an umbrella header, make sure that
585 // each of the headers within the directory, including all submodules, is
586 // covered by the umbrella header was actually included by the umbrella
587 // header.
588 if (Module *Mod = getCurrentModule()) {
591 for (auto *M : AllMods)
592 diagnoseMissingHeaderInUmbrellaDir(*M);
593 }
594
595 return true;
596}
597
598/// HandleEndOfTokenLexer - This callback is invoked when the current TokenLexer
599/// hits the end of its token stream.
601 assert(CurTokenLexer && !CurPPLexer &&
602 "Ending a macro when currently in a #include file!");
603
604 if (!MacroExpandingLexersStack.empty() &&
605 MacroExpandingLexersStack.back().first == CurTokenLexer.get())
606 removeCachedMacroExpandedTokensOfLastLexer();
607
608 // Delete or cache the now-dead macro expander.
609 if (NumCachedTokenLexers == TokenLexerCacheSize)
610 CurTokenLexer.reset();
611 else
612 TokenLexerCache[NumCachedTokenLexers++] = std::move(CurTokenLexer);
613
614 // Handle this like a #include file being popped off the stack.
615 return HandleEndOfFile(Result, true);
616}
617
618/// RemoveTopOfLexerStack - Pop the current lexer/macro exp off the top of the
619/// lexer stack. This should only be used in situations where the current
620/// state of the top-of-stack lexer is unknown.
622 assert(!IncludeMacroStack.empty() && "Ran out of stack entries to load");
623
624 if (CurTokenLexer) {
625 // Delete or cache the now-dead macro expander.
626 if (NumCachedTokenLexers == TokenLexerCacheSize)
627 CurTokenLexer.reset();
628 else
629 TokenLexerCache[NumCachedTokenLexers++] = std::move(CurTokenLexer);
630 }
631
632 PopIncludeMacroStack();
633}
634
635/// HandleMicrosoftCommentPaste - When the macro expander pastes together a
636/// comment (/##/) in microsoft mode, this method handles updating the current
637/// state, returning the token on the next source line.
639 assert(CurTokenLexer && !CurPPLexer &&
640 "Pasted comment can only be formed from macro");
641 // We handle this by scanning for the closest real lexer, switching it to
642 // raw mode and preprocessor mode. This will cause it to return \n as an
643 // explicit EOD token.
644 PreprocessorLexer *FoundLexer = nullptr;
645 bool LexerWasInPPMode = false;
646 for (const IncludeStackInfo &ISI : llvm::reverse(IncludeMacroStack)) {
647 if (ISI.ThePPLexer == nullptr) continue; // Scan for a real lexer.
648
649 // Once we find a real lexer, mark it as raw mode (disabling macro
650 // expansions) and preprocessor mode (return EOD). We know that the lexer
651 // was *not* in raw mode before, because the macro that the comment came
652 // from was expanded. However, it could have already been in preprocessor
653 // mode (#if COMMENT) in which case we have to return it to that mode and
654 // return EOD.
655 FoundLexer = ISI.ThePPLexer;
656 FoundLexer->LexingRawMode = true;
657 LexerWasInPPMode = FoundLexer->ParsingPreprocessorDirective;
658 FoundLexer->ParsingPreprocessorDirective = true;
659 break;
660 }
661
662 // Okay, we either found and switched over the lexer, or we didn't find a
663 // lexer. In either case, finish off the macro the comment came from, getting
664 // the next token.
665 if (!HandleEndOfTokenLexer(Tok)) Lex(Tok);
666
667 // Discarding comments as long as we don't have EOF or EOD. This 'comments
668 // out' the rest of the line, including any tokens that came from other macros
669 // that were active, as in:
670 // #define submacro a COMMENT b
671 // submacro c
672 // which should lex to 'a' only: 'b' and 'c' should be removed.
673 while (Tok.isNot(tok::eod) && Tok.isNot(tok::eof))
674 Lex(Tok);
675
676 // If we got an eod token, then we successfully found the end of the line.
677 if (Tok.is(tok::eod)) {
678 assert(FoundLexer && "Can't get end of line without an active lexer");
679 // Restore the lexer back to normal mode instead of raw mode.
680 FoundLexer->LexingRawMode = false;
681
682 // If the lexer was already in preprocessor mode, just return the EOD token
683 // to finish the preprocessor line.
684 if (LexerWasInPPMode) return;
685
686 // Otherwise, switch out of PP mode and return the next lexed token.
687 FoundLexer->ParsingPreprocessorDirective = false;
688 return Lex(Tok);
689 }
690
691 // If we got an EOF token, then we reached the end of the token stream but
692 // didn't find an explicit \n. This can only happen if there was no lexer
693 // active (an active lexer would return EOD at EOF if there was no \n in
694 // preprocessor directive mode), so just return EOF as our token.
695 assert(!FoundLexer && "Lexer should return EOD before EOF in PP mode");
696}
697
699 bool ForPragma) {
700 if (!getLangOpts().ModulesLocalVisibility) {
701 // Just track that we entered this submodule.
702 BuildingSubmoduleStack.push_back(
703 BuildingSubmoduleInfo(M, ImportLoc, ForPragma, CurSubmoduleState,
704 PendingModuleMacroNames.size()));
705 if (Callbacks)
706 Callbacks->EnteredSubmodule(M, ImportLoc, ForPragma);
707 return;
708 }
709
710 // Resolve as much of the module definition as we can now, before we enter
711 // one of its headers.
712 // FIXME: Can we enable Complain here?
713 // FIXME: Can we do this when local visibility is disabled?
715 ModMap.resolveExports(M, /*Complain=*/false);
716 ModMap.resolveUses(M, /*Complain=*/false);
717 ModMap.resolveConflicts(M, /*Complain=*/false);
718
719 // If this is the first time we've entered this module, set up its state.
720 auto R = Submodules.insert(std::make_pair(M, SubmoduleState()));
721 auto &State = R.first->second;
722 bool FirstTime = R.second;
723 if (FirstTime) {
724 // Determine the set of starting macros for this submodule; take these
725 // from the "null" module (the predefines buffer).
726 //
727 // FIXME: If we have local visibility but not modules enabled, the
728 // NullSubmoduleState is polluted by #defines in the top-level source
729 // file.
730 auto &StartingMacros = NullSubmoduleState.Macros;
731
732 // Restore to the starting state.
733 // FIXME: Do this lazily, when each macro name is first referenced.
734 for (auto &Macro : StartingMacros) {
735 // Skip uninteresting macros.
736 if (!Macro.second.getLatest() &&
737 Macro.second.getOverriddenMacros().empty())
738 continue;
739
740 MacroState MS(Macro.second.getLatest());
741 MS.setOverriddenMacros(*this, Macro.second.getOverriddenMacros());
742 State.Macros.insert(std::make_pair(Macro.first, std::move(MS)));
743 }
744 }
745
746 // Track that we entered this module.
747 BuildingSubmoduleStack.push_back(
748 BuildingSubmoduleInfo(M, ImportLoc, ForPragma, CurSubmoduleState,
749 PendingModuleMacroNames.size()));
750
751 if (Callbacks)
752 Callbacks->EnteredSubmodule(M, ImportLoc, ForPragma);
753
754 // Switch to this submodule as the current submodule.
755 CurSubmoduleState = &State;
756
757 // This module is visible to itself.
758 if (FirstTime)
759 makeModuleVisible(M, ImportLoc);
760}
761
762bool Preprocessor::needModuleMacros() const {
763 // If we're not within a submodule, we never need to create ModuleMacros.
764 if (BuildingSubmoduleStack.empty())
765 return false;
766 // If we are tracking module macro visibility even for textually-included
767 // headers, we need ModuleMacros.
768 if (getLangOpts().ModulesLocalVisibility)
769 return true;
770 // Otherwise, we only need module macros if we're actually compiling a module
771 // interface.
773}
774
776 if (BuildingSubmoduleStack.empty() ||
777 BuildingSubmoduleStack.back().IsPragma != ForPragma) {
778 assert(ForPragma && "non-pragma module enter/leave mismatch");
779 return nullptr;
780 }
781
782 auto &Info = BuildingSubmoduleStack.back();
783
784 Module *LeavingMod = Info.M;
785 SourceLocation ImportLoc = Info.ImportLoc;
786
787 if (!needModuleMacros() ||
788 (!getLangOpts().ModulesLocalVisibility &&
789 LeavingMod->getTopLevelModuleName() != getLangOpts().CurrentModule)) {
790 // If we don't need module macros, or this is not a module for which we
791 // are tracking macro visibility, don't build any, and preserve the list
792 // of pending names for the surrounding submodule.
793 BuildingSubmoduleStack.pop_back();
794
795 if (Callbacks)
796 Callbacks->LeftSubmodule(LeavingMod, ImportLoc, ForPragma);
797
798 makeModuleVisible(LeavingMod, ImportLoc);
799 return LeavingMod;
800 }
801
802 // Create ModuleMacros for any macros defined in this submodule.
804 for (unsigned I = Info.OuterPendingModuleMacroNames;
805 I != PendingModuleMacroNames.size(); ++I) {
806 auto *II = PendingModuleMacroNames[I];
807 if (!VisitedMacros.insert(II).second)
808 continue;
809
810 auto MacroIt = CurSubmoduleState->Macros.find(II);
811 if (MacroIt == CurSubmoduleState->Macros.end())
812 continue;
813 auto &Macro = MacroIt->second;
814
815 // Find the starting point for the MacroDirective chain in this submodule.
816 MacroDirective *OldMD = nullptr;
817 auto *OldState = Info.OuterSubmoduleState;
818 if (getLangOpts().ModulesLocalVisibility)
819 OldState = &NullSubmoduleState;
820 if (OldState && OldState != CurSubmoduleState) {
821 // FIXME: It'd be better to start at the state from when we most recently
822 // entered this submodule, but it doesn't really matter.
823 auto &OldMacros = OldState->Macros;
824 auto OldMacroIt = OldMacros.find(II);
825 if (OldMacroIt == OldMacros.end())
826 OldMD = nullptr;
827 else
828 OldMD = OldMacroIt->second.getLatest();
829 }
830
831 // This module may have exported a new macro. If so, create a ModuleMacro
832 // representing that fact.
833 bool ExplicitlyPublic = false;
834 for (auto *MD = Macro.getLatest(); MD != OldMD; MD = MD->getPrevious()) {
835 assert(MD && "broken macro directive chain");
836
837 if (auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
838 // The latest visibility directive for a name in a submodule affects
839 // all the directives that come before it.
840 if (VisMD->isPublic())
841 ExplicitlyPublic = true;
842 else if (!ExplicitlyPublic)
843 // Private with no following public directive: not exported.
844 break;
845 } else {
846 MacroInfo *Def = nullptr;
847 if (DefMacroDirective *DefMD = dyn_cast<DefMacroDirective>(MD))
848 Def = DefMD->getInfo();
849
850 // FIXME: Issue a warning if multiple headers for the same submodule
851 // define a macro, rather than silently ignoring all but the first.
852 bool IsNew;
853 // Don't bother creating a module macro if it would represent a #undef
854 // that doesn't override anything.
855 if (Def || !Macro.getOverriddenMacros().empty())
856 addModuleMacro(LeavingMod, II, Def, Macro.getOverriddenMacros(),
857 IsNew);
858
859 if (!getLangOpts().ModulesLocalVisibility) {
860 // This macro is exposed to the rest of this compilation as a
861 // ModuleMacro; we don't need to track its MacroDirective any more.
862 Macro.setLatest(nullptr);
863 Macro.setOverriddenMacros(*this, {});
864 }
865 break;
866 }
867 }
868 }
869 PendingModuleMacroNames.resize(Info.OuterPendingModuleMacroNames);
870
871 // FIXME: Before we leave this submodule, we should parse all the other
872 // headers within it. Otherwise, we're left with an inconsistent state
873 // where we've made the module visible but don't yet have its complete
874 // contents.
875
876 // Put back the outer module's state, if we're tracking it.
877 if (getLangOpts().ModulesLocalVisibility)
878 CurSubmoduleState = Info.OuterSubmoduleState;
879
880 BuildingSubmoduleStack.pop_back();
881
882 if (Callbacks)
883 Callbacks->LeftSubmodule(LeavingMod, ImportLoc, ForPragma);
884
885 // A nested #include makes the included submodule visible.
886 makeModuleVisible(LeavingMod, ImportLoc);
887 return LeavingMod;
888}
IndirectLocalPath & Path
Expr * E
Defines the clang::FileManager interface and associated types.
llvm::MachO::FileType FileType
Definition: MachO.h:46
Defines the clang::MacroInfo and clang::MacroDirective classes.
static void collectAllSubModulesWithUmbrellaHeader(const Module &Mod, SmallVectorImpl< const Module * > &SubMods)
static void computeRelativePath(FileManager &FM, const DirectoryEntry *Dir, FileEntryRef File, SmallString< 128 > &Result)
Compute the relative path that names the given file relative to the given directory.
Defines the clang::Preprocessor interface.
SourceLocation Loc
Definition: SemaObjC.cpp:759
Defines the SourceManager interface.
A directive for a defined macro or a macro imported from a module.
Definition: MacroInfo.h:432
StringRef getName() const
Cached information about one directory (either on disk or in the virtual file system).
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
Definition: FileEntry.h:57
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
bool isValid() const
Implements support for file system lookup, file system caching, and directory search management.
Definition: FileManager.h:53
llvm::vfs::FileSystem & getVirtualFileSystem() const
Definition: FileManager.h:256
OptionalDirectoryEntryRef getOptionalDirectoryRef(StringRef DirName, bool CacheFailure=true)
Get a DirectoryEntryRef if it exists, without doing anything on error.
Definition: FileManager.h:175
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Definition: Diagnostic.h:138
void SetFileControllingMacro(FileEntryRef File, const IdentifierInfo *ControllingMacro)
Mark the specified file as having a controlling macro.
Definition: HeaderSearch.h:565
ModuleMap & getModuleMap()
Retrieve the module map.
Definition: HeaderSearch.h:821
One of these records is kept for each identifier that is lexed.
bool isCompilingModule() const
Are we compiling a module?
Definition: LangOptions.h:649
Lexer - This provides a simple interface that turns a text buffer into a stream of tokens.
Definition: Lexer.h:78
MacroArgs - An instance of this class captures information about the formal arguments specified to a ...
Definition: MacroArgs.h:30
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
Definition: MacroInfo.h:313
const MacroDirective * getPrevious() const
Get previous definition of the macro with the same name.
Definition: MacroInfo.h:354
Encapsulates the data about a macro definition (e.g.
Definition: MacroInfo.h:39
bool resolveExports(Module *Mod, bool Complain)
Resolve all of the unresolved exports in the given module.
Definition: ModuleMap.cpp:1417
bool resolveConflicts(Module *Mod, bool Complain)
Resolve all of the unresolved conflicts in the given module.
Definition: ModuleMap.cpp:1444
bool isHeaderInUnavailableModule(FileEntryRef Header) const
Determine whether the given header is part of a module marked 'unavailable'.
Definition: ModuleMap.cpp:719
bool resolveUses(Module *Mod, bool Complain)
Resolve all of the unresolved uses in the given module.
Definition: ModuleMap.cpp:1430
Describes a module or submodule.
Definition: Module.h:115
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
Definition: Module.h:703
llvm::iterator_range< submodule_iterator > submodules()
Definition: Module.h:809
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
Definition: Module.h:727
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
Definition: Module.cpp:240
OptionalDirectoryEntryRef getEffectiveUmbrellaDir() const
Get the effective umbrella directory for this module: either the one explicitly written in the module...
Definition: Module.cpp:264
const IdentifierInfo * GetDefinedMacro() const
If the ControllingMacro is followed by a macro definition, return the macro that was defined.
const IdentifierInfo * GetControllingMacroAtEndOfFile() const
Once the entire file has been lexed, if there is a controlling macro, return it.
SourceLocation GetDefinedLocation() const
SourceLocation GetMacroLocation() const
unsigned getInitialNumSLocEntries() const
Number of SLocEntries before lexing the file.
bool LexingRawMode
True if in raw mode.
bool ParsingPreprocessorDirective
True when parsing #XXX; turns '\n' into a tok::eod token.
MultipleIncludeOpt MIOpt
A state machine that detects the #ifndef-wrapping a file idiom for the multiple-include optimization.
OptionalFileEntryRef getFileEntry() const
getFileEntry - Return the FileEntry corresponding to this FileID.
virtual SourceLocation getSourceLocation()=0
Return the source location for the next observable location.
bool creatingPCHWithThroughHeader()
True if creating a PCH with a through header.
ModuleMacro * addModuleMacro(Module *Mod, IdentifierInfo *II, MacroInfo *Macro, ArrayRef< ModuleMacro * > Overrides, bool &IsNew)
Register an exported macro for a module and identifier.
bool isIncrementalProcessingEnabled() const
Returns true if incremental processing is enabled.
const MacroInfo * getMacroInfo(const IdentifierInfo *II) const
bool isRecordingPreamble() const
bool isInPrimaryFile() const
Return true if we're in the top-level file, not in a #include.
void EnterSubmodule(Module *M, SourceLocation ImportLoc, bool ForPragma)
bool HandleEndOfTokenLexer(Token &Result)
Callback invoked when the current TokenLexer hits the end of its token stream.
void makeModuleVisible(Module *M, SourceLocation Loc)
void Lex(Token &Result)
Lex the next token for this preprocessor.
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
Definition: Preprocessor.h:296
bool EnterSourceFile(FileID FID, ConstSearchDirIterator Dir, SourceLocation Loc, bool IsFirstIncludeOfFile=true)
Add a source file to the top of the include stack and start lexing tokens from it instead of the curr...
SourceManager & getSourceManager() const
bool isMacroDefined(StringRef Id)
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
bool isPPInSafeBufferOptOutRegion()
FileManager & getFileManager() const
PreprocessorOptions & getPreprocessorOpts() const
Retrieve the preprocessor options used to initialize this preprocessor.
bool isPCHThroughHeader(const FileEntry *FE)
Returns true if the FileEntry is the PCH through header.
FileID getPredefinesFileID() const
Returns the FileID for the preprocessor predefines.
bool isCodeCompletionEnabled() const
Determine if we are performing code completion.
PreprocessorLexer * getCurrentFileLexer() const
Return the current file lexer being lexed from.
HeaderSearch & getHeaderSearchInfo() const
Module * LeaveSubmodule(bool ForPragma)
void recomputeCurLexerKind()
Recompute the current lexer kind based on the CurLexer/ CurTokenLexer pointers.
const LangOptions & getLangOpts() const
void RemoveTopOfLexerStack()
Pop the current lexer/macro exp off the top of the lexer stack.
bool HandleEndOfFile(Token &Result, bool isEndOfMacro=false)
Callback invoked when the lexer hits the end of the current file.
DiagnosticsEngine & getDiagnostics() const
void EnterMacro(Token &Tok, SourceLocation ILEnd, MacroInfo *Macro, MacroArgs *Args)
Add a Macro to the top of the include stack and start lexing tokens from it instead of the current bu...
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) const
Forwarding function for diagnostics.
void HandleMicrosoftCommentPaste(Token &Tok)
When the macro expander pastes together a comment (/##/) in Microsoft mode, this method handles updat...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
OptionalFileEntryRef getFileEntryRefForID(FileID FID) const
Returns the FileEntryRef for the provided FileID.
StringRef getBufferName(SourceLocation Loc, bool *Invalid=nullptr) const
Return the filename or buffer identifier of the buffer the location is in.
FileID translateFile(const FileEntry *SourceFile) const
Get the FileID for the given file.
unsigned local_sloc_entry_size() const
Get the number of local SLocEntries we have.
SourceLocation getLocForEndOfFile(FileID FID) const
Return the source location corresponding to the last byte of the specified file.
SourceLocation getIncludeLoc(FileID FID) const
Returns the include location if FID is a #include'd file otherwise it returns an invalid location.
void setNumCreatedFIDsForFileID(FileID FID, unsigned NumFIDs, bool Force=false)
Set the number of FileIDs (files and macros) that were created during preprocessing of FID,...
const FileEntry * getFileEntryForID(FileID FID) const
Returns the FileEntry record for the provided FileID.
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
SrcMgr::CharacteristicKind getFileCharacteristic(SourceLocation Loc) const
Return the file characteristic of the specified source location, indicating whether this is a normal ...
std::optional< llvm::MemoryBufferRef > getBufferOrNone(FileID FID, SourceLocation Loc=SourceLocation()) const
Return the buffer for the specified FileID.
Token - This structure provides full information about a lexed token.
Definition: Token.h:36
bool is(tok::TokenKind K) const
is/isNot - Predicates to check if this token is a specific kind, as in "if (Tok.is(tok::l_brace)) {....
Definition: Token.h:99
bool isNot(tok::TokenKind K) const
Definition: Token.h:100
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
Definition: SourceManager.h:81
The JSON file list parser is used to communicate input to InstallAPI.
@ Result
The result type of a method or function.
@ TU_Complete
The translation unit is a complete translation unit.
Definition: LangOptions.h:1098