akyrtzi updated this revision to Diff 441587.
akyrtzi added a comment.
Herald added a project: clang-tools-extra.
Update `clang-tools-extra/test/pp-trace/pp-trace-include.cpp` to accomodate for
`PrevFID` getting a value and
preserve using `getFileEntryForID()` for the `SourceManager::getFilename()`
implementation.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D128947/new/
https://reviews.llvm.org/D128947
Files:
clang-tools-extra/test/pp-trace/pp-trace-include.cpp
clang/include/clang/Basic/SourceManager.h
clang/include/clang/Lex/PPCallbacks.h
clang/lib/Basic/SourceManager.cpp
clang/lib/Frontend/DependencyFile.cpp
clang/lib/Lex/PPLexerChange.cpp
Index: clang/lib/Lex/PPLexerChange.cpp
===================================================================
--- clang/lib/Lex/PPLexerChange.cpp
+++ clang/lib/Lex/PPLexerChange.cpp
@@ -111,6 +111,7 @@
/// and start lexing tokens from it instead of the current buffer.
void Preprocessor::EnterSourceFileWithLexer(Lexer *TheLexer,
ConstSearchDirIterator CurDir) {
+ PreprocessorLexer *PrevPPLexer = CurPPLexer;
// Add the current lexer to the include stack.
if (CurPPLexer || CurTokenLexer)
@@ -130,8 +131,17 @@
SrcMgr::CharacteristicKind FileType =
SourceMgr.getFileCharacteristic(CurLexer->getFileLoc());
- Callbacks->FileChanged(CurLexer->getFileLoc(),
- PPCallbacks::EnterFile, FileType);
+ FileID PrevFID;
+ SourceLocation EnterLoc;
+ if (PrevPPLexer) {
+ PrevFID = PrevPPLexer->getFileID();
+ EnterLoc = PrevPPLexer->getSourceLocation();
+ }
+ Callbacks->FileChanged(CurLexer->getFileLoc(), PPCallbacks::EnterFile,
+ FileType, PrevFID);
+ Callbacks->LexedFileChanged(CurLexer->getFileID(),
+ PPCallbacks::LexedFileChangeReason::EnterFile,
+ FileType, PrevFID, EnterLoc);
}
}
@@ -486,10 +496,13 @@
// Notify the client, if desired, that we are in a new source file.
if (Callbacks && !isEndOfMacro && CurPPLexer) {
+ SourceLocation Loc = CurPPLexer->getSourceLocation();
SrcMgr::CharacteristicKind FileType =
- SourceMgr.getFileCharacteristic(CurPPLexer->getSourceLocation());
- Callbacks->FileChanged(CurPPLexer->getSourceLocation(),
- PPCallbacks::ExitFile, FileType, ExitedFID);
+ SourceMgr.getFileCharacteristic(Loc);
+ Callbacks->FileChanged(Loc, PPCallbacks::ExitFile, FileType, ExitedFID);
+ Callbacks->LexedFileChanged(CurPPLexer->getFileID(),
+ PPCallbacks::LexedFileChangeReason::ExitFile,
+ FileType, ExitedFID, Loc);
}
// Restore conditional stack as well as the recorded
Index: clang/lib/Frontend/DependencyFile.cpp
===================================================================
--- clang/lib/Frontend/DependencyFile.cpp
+++ clang/lib/Frontend/DependencyFile.cpp
@@ -31,23 +31,22 @@
namespace {
struct DepCollectorPPCallbacks : public PPCallbacks {
DependencyCollector &DepCollector;
- SourceManager &SM;
- DiagnosticsEngine &Diags;
- DepCollectorPPCallbacks(DependencyCollector &L, SourceManager &SM,
- DiagnosticsEngine &Diags)
- : DepCollector(L), SM(SM), Diags(Diags) {}
-
- void FileChanged(SourceLocation Loc, FileChangeReason Reason,
- SrcMgr::CharacteristicKind FileType,
- FileID PrevFID) override {
- if (Reason != PPCallbacks::EnterFile)
+ Preprocessor &PP;
+ DepCollectorPPCallbacks(DependencyCollector &L, Preprocessor &PP)
+ : DepCollector(L), PP(PP) {}
+
+ void LexedFileChanged(FileID FID, LexedFileChangeReason Reason,
+ SrcMgr::CharacteristicKind FileType, FileID PrevFID,
+ SourceLocation Loc) override {
+ if (Reason != PPCallbacks::LexedFileChangeReason::EnterFile)
+ return;
+ if (PP.getPredefinesFileID() == FID)
return;
// Dependency generation really does want to go all the way to the
// file entry for a source location to find out what is depended on.
// We do not want #line markers to affect dependency generation!
- if (Optional<StringRef> Filename = SM.getNonBuiltinFilenameForID(
- SM.getFileID(SM.getExpansionLoc(Loc))))
+ if (Optional<StringRef> Filename = PP.getSourceManager().getFilename(FID))
DepCollector.maybeAddDependency(
llvm::sys::path::remove_leading_dotslash(*Filename),
/*FromModule*/ false, isSystem(FileType), /*IsModuleFile*/ false,
@@ -90,7 +89,9 @@
/*IsMissing=*/false);
}
- void EndOfMainFile() override { DepCollector.finishedMainFile(Diags); }
+ void EndOfMainFile() override {
+ DepCollector.finishedMainFile(PP.getDiagnostics());
+ }
};
struct DepCollectorMMCallbacks : public ModuleMapCallbacks {
@@ -175,8 +176,7 @@
DependencyCollector::~DependencyCollector() { }
void DependencyCollector::attachToPreprocessor(Preprocessor &PP) {
- PP.addPPCallbacks(std::make_unique<DepCollectorPPCallbacks>(
- *this, PP.getSourceManager(), PP.getDiagnostics()));
+ PP.addPPCallbacks(std::make_unique<DepCollectorPPCallbacks>(*this, PP));
PP.getHeaderSearchInfo().getModuleMap().addModuleMapCallbacks(
std::make_unique<DepCollectorMMCallbacks>(*this));
}
Index: clang/lib/Basic/SourceManager.cpp
===================================================================
--- clang/lib/Basic/SourceManager.cpp
+++ clang/lib/Basic/SourceManager.cpp
@@ -1011,9 +1011,13 @@
/// Return the filename of the file containing a SourceLocation.
StringRef SourceManager::getFilename(SourceLocation SpellingLoc) const {
- if (const FileEntry *F = getFileEntryForID(getFileID(SpellingLoc)))
+ return getFilename(getFileID(SpellingLoc)).value_or(StringRef());
+}
+
+Optional<StringRef> SourceManager::getFilename(FileID FID) const {
+ if (const FileEntry *F = getFileEntryForID(FID))
return F->getName();
- return StringRef();
+ return None;
}
/// getImmediateExpansionRange - Loc is required to be an expansion location.
Index: clang/include/clang/Lex/PPCallbacks.h
===================================================================
--- clang/include/clang/Lex/PPCallbacks.h
+++ clang/include/clang/Lex/PPCallbacks.h
@@ -43,12 +43,34 @@
/// Callback invoked whenever a source file is entered or exited.
///
/// \param Loc Indicates the new location.
- /// \param PrevFID the file that was exited if \p Reason is ExitFile.
+ /// \param PrevFID the file that was exited if \p Reason is ExitFile or the
+ /// the file before the new one entered for \p Reason EnterFile.
virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason,
SrcMgr::CharacteristicKind FileType,
FileID PrevFID = FileID()) {
}
+ enum class LexedFileChangeReason { EnterFile, ExitFile };
+
+ /// Callback invoked whenever the \p Lexer moves to a different file for
+ /// lexing. Unlike \p FileChanged line number directives and other related
+ /// pragmas do not trigger callbacks to \p LexedFileChanged.
+ ///
+ /// \param FID The \p FileID that the \p Lexer moved to.
+ ///
+ /// \param Reason Whether the \p Lexer entered a new file or exited one.
+ ///
+ /// \param FileType The \p CharacteristicKind of the file the \p Lexer moved
+ /// to.
+ ///
+ /// \param PrevFID The \p FileID the \p Lexer was using before the change.
+ ///
+ /// \param Loc The location where the \p Lexer entered a new file from or the
+ /// location that the \p Lexer moved into after exiting a file.
+ virtual void LexedFileChanged(FileID FID, LexedFileChangeReason Reason,
+ SrcMgr::CharacteristicKind FileType,
+ FileID PrevFID, SourceLocation Loc) {}
+
/// Callback invoked whenever a source file is skipped as the result
/// of header guard optimization.
///
@@ -420,6 +442,13 @@
Second->FileChanged(Loc, Reason, FileType, PrevFID);
}
+ void LexedFileChanged(FileID FID, LexedFileChangeReason Reason,
+ SrcMgr::CharacteristicKind FileType, FileID PrevFID,
+ SourceLocation Loc) override {
+ First->LexedFileChanged(FID, Reason, FileType, PrevFID, Loc);
+ Second->LexedFileChanged(FID, Reason, FileType, PrevFID, Loc);
+ }
+
void FileSkipped(const FileEntryRef &SkippedFile, const Token &FilenameTok,
SrcMgr::CharacteristicKind FileType) override {
First->FileSkipped(SkippedFile, FilenameTok, FileType);
Index: clang/include/clang/Basic/SourceManager.h
===================================================================
--- clang/include/clang/Basic/SourceManager.h
+++ clang/include/clang/Basic/SourceManager.h
@@ -1118,6 +1118,9 @@
/// Return the filename of the file containing a SourceLocation.
StringRef getFilename(SourceLocation SpellingLoc) const;
+ /// Return the filename of the file associated with a \p FileID.
+ Optional<StringRef> getFilename(FileID FID) const;
+
/// Return the source location corresponding to the first byte of
/// the specified file.
SourceLocation getLocForStartOfFile(FileID FID) const {
Index: clang-tools-extra/test/pp-trace/pp-trace-include.cpp
===================================================================
--- clang-tools-extra/test/pp-trace/pp-trace-include.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-include.cpp
@@ -13,7 +13,7 @@
// CHECK-NEXT: Loc: "<built-in>:1:1"
// CHECK-NEXT: Reason: EnterFile
// CHECK-NEXT: FileType: C_User
-// CHECK-NEXT: PrevFID: (invalid)
+// CHECK-NEXT: PrevFID: "{{.*}}{{[/\\]}}pp-trace-include.cpp"
// CHECK-NEXT: - Callback: FileChanged
// CHECK-NEXT: Loc: "<built-in>:1:1"
// CHECK-NEXT: Reason: RenameFile
@@ -64,7 +64,7 @@
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}Inputs/Level1A.h:1:1"
// CHECK-NEXT: Reason: EnterFile
// CHECK-NEXT: FileType: C_User
-// CHECK-NEXT: PrevFID: (invalid)
+// CHECK-NEXT: PrevFID: "{{.*}}{{[/\\]}}pp-trace-include.cpp"
// CHECK-NEXT: - Callback: InclusionDirective
// CHECK-NEXT: HashLoc: "{{.*}}{{[/\\]}}Inputs/Level1A.h:1:1"
// CHECK-NEXT: IncludeTok: include
@@ -79,7 +79,7 @@
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}Inputs/Level2A.h:1:1"
// CHECK-NEXT: Reason: EnterFile
// CHECK-NEXT: FileType: C_User
-// CHECK-NEXT: PrevFID: (invalid)
+// CHECK-NEXT: PrevFID: "{{.*}}{{[/\\]}}Inputs/Level1A.h"
// CHECK-NEXT: - Callback: MacroDefined
// CHECK-NEXT: MacroNameTok: MACRO_2A
// CHECK-NEXT: MacroDirective: MD_Define
@@ -110,7 +110,7 @@
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}Inputs/Level1B.h:1:1"
// CHECK-NEXT: Reason: EnterFile
// CHECK-NEXT: FileType: C_User
-// CHECK-NEXT: PrevFID: (invalid)
+// CHECK-NEXT: PrevFID: "{{.*}}{{[/\\]}}pp-trace-include.cpp"
// CHECK-NEXT: - Callback: InclusionDirective
// CHECK-NEXT: HashLoc: "{{.*}}{{[/\\]}}Inputs/Level1B.h:1:1"
// CHECK-NEXT: IncludeTok: include
@@ -125,7 +125,7 @@
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}Inputs/Level2B.h:1:1"
// CHECK-NEXT: Reason: EnterFile
// CHECK-NEXT: FileType: C_User
-// CHECK-NEXT: PrevFID: (invalid)
+// CHECK-NEXT: PrevFID: "{{.*}}{{[/\\]}}Inputs/Level1B.h"
// CHECK-NEXT: - Callback: MacroDefined
// CHECK-NEXT: MacroNameTok: MACRO_2B
// CHECK-NEXT: MacroDirective: MD_Define
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits