mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-28 08:02:08 +00:00
Reland '[clang] Adding CharacteristicKind to PPCallbacks::InclusionDirective'
This commit relands r331904. Adding a SrcMgr::CharacteristicKind parameter to the InclusionDirective in PPCallbacks, and updating calls to that function. This will be useful in https://reviews.llvm.org/D43778 to determine which includes are system headers. Differential Revision: https://reviews.llvm.org/D46614 llvm-svn: 332021
This commit is contained in:
parent
c58988a908
commit
96fbe58b0f
@ -117,6 +117,10 @@ public:
|
||||
/// \param Imported The module, whenever an inclusion directive was
|
||||
/// automatically turned into a module import or null otherwise.
|
||||
///
|
||||
/// \param FileType The characteristic kind, indicates whether a file or
|
||||
/// directory holds normal user code, system code, or system code which is
|
||||
/// implicitly 'extern "C"' in C++ mode.
|
||||
///
|
||||
virtual void InclusionDirective(SourceLocation HashLoc,
|
||||
const Token &IncludeTok,
|
||||
StringRef FileName,
|
||||
@ -125,7 +129,8 @@ public:
|
||||
const FileEntry *File,
|
||||
StringRef SearchPath,
|
||||
StringRef RelativePath,
|
||||
const Module *Imported) {
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) {
|
||||
}
|
||||
|
||||
/// Callback invoked whenever there was an explicit module-import
|
||||
@ -367,13 +372,14 @@ public:
|
||||
StringRef FileName, bool IsAngled,
|
||||
CharSourceRange FilenameRange, const FileEntry *File,
|
||||
StringRef SearchPath, StringRef RelativePath,
|
||||
const Module *Imported) override {
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) override {
|
||||
First->InclusionDirective(HashLoc, IncludeTok, FileName, IsAngled,
|
||||
FilenameRange, File, SearchPath, RelativePath,
|
||||
Imported);
|
||||
Imported, FileType);
|
||||
Second->InclusionDirective(HashLoc, IncludeTok, FileName, IsAngled,
|
||||
FilenameRange, File, SearchPath, RelativePath,
|
||||
Imported);
|
||||
Imported, FileType);
|
||||
}
|
||||
|
||||
void moduleImport(SourceLocation ImportLoc, ModuleIdPath Path,
|
||||
|
@ -532,8 +532,8 @@ class Token;
|
||||
StringRef FileName, bool IsAngled,
|
||||
CharSourceRange FilenameRange,
|
||||
const FileEntry *File, StringRef SearchPath,
|
||||
StringRef RelativePath,
|
||||
const Module *Imported) override;
|
||||
StringRef RelativePath, const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) override;
|
||||
void Ifdef(SourceLocation Loc, const Token &MacroNameTok,
|
||||
const MacroDefinition &MD) override;
|
||||
void Ifndef(SourceLocation Loc, const Token &MacroNameTok,
|
||||
|
@ -178,7 +178,8 @@ void MacroPPCallbacks::FileChanged(SourceLocation Loc, FileChangeReason Reason,
|
||||
void MacroPPCallbacks::InclusionDirective(
|
||||
SourceLocation HashLoc, const Token &IncludeTok, StringRef FileName,
|
||||
bool IsAngled, CharSourceRange FilenameRange, const FileEntry *File,
|
||||
StringRef SearchPath, StringRef RelativePath, const Module *Imported) {
|
||||
StringRef SearchPath, StringRef RelativePath, const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) {
|
||||
|
||||
// Record the line location of the current included file.
|
||||
LastHashLoc = HashLoc;
|
||||
|
@ -101,7 +101,8 @@ public:
|
||||
StringRef FileName, bool IsAngled,
|
||||
CharSourceRange FilenameRange, const FileEntry *File,
|
||||
StringRef SearchPath, StringRef RelativePath,
|
||||
const Module *Imported) override;
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) override;
|
||||
|
||||
/// Hook called whenever a macro definition is seen.
|
||||
void MacroDefined(const Token &MacroNameTok,
|
||||
|
@ -63,7 +63,8 @@ struct DepCollectorPPCallbacks : public PPCallbacks {
|
||||
StringRef FileName, bool IsAngled,
|
||||
CharSourceRange FilenameRange, const FileEntry *File,
|
||||
StringRef SearchPath, StringRef RelativePath,
|
||||
const Module *Imported) override {
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) override {
|
||||
if (!File)
|
||||
DepCollector.maybeAddDependency(FileName, /*FromModule*/false,
|
||||
/*IsSystem*/false, /*IsModuleFile*/false,
|
||||
@ -193,7 +194,8 @@ public:
|
||||
StringRef FileName, bool IsAngled,
|
||||
CharSourceRange FilenameRange, const FileEntry *File,
|
||||
StringRef SearchPath, StringRef RelativePath,
|
||||
const Module *Imported) override;
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) override;
|
||||
|
||||
void EndOfMainFile() override {
|
||||
OutputDependencyFile();
|
||||
@ -313,7 +315,8 @@ void DFGImpl::InclusionDirective(SourceLocation HashLoc,
|
||||
const FileEntry *File,
|
||||
StringRef SearchPath,
|
||||
StringRef RelativePath,
|
||||
const Module *Imported) {
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) {
|
||||
if (!File) {
|
||||
if (AddMissingHeaderDeps)
|
||||
AddFilename(FileName);
|
||||
|
@ -50,7 +50,8 @@ public:
|
||||
StringRef FileName, bool IsAngled,
|
||||
CharSourceRange FilenameRange, const FileEntry *File,
|
||||
StringRef SearchPath, StringRef RelativePath,
|
||||
const Module *Imported) override;
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) override;
|
||||
|
||||
void EndOfMainFile() override {
|
||||
OutputGraphFile();
|
||||
@ -65,15 +66,17 @@ void clang::AttachDependencyGraphGen(Preprocessor &PP, StringRef OutputFile,
|
||||
SysRoot));
|
||||
}
|
||||
|
||||
void DependencyGraphCallback::InclusionDirective(SourceLocation HashLoc,
|
||||
const Token &IncludeTok,
|
||||
StringRef FileName,
|
||||
bool IsAngled,
|
||||
CharSourceRange FilenameRange,
|
||||
const FileEntry *File,
|
||||
StringRef SearchPath,
|
||||
StringRef RelativePath,
|
||||
const Module *Imported) {
|
||||
void DependencyGraphCallback::InclusionDirective(
|
||||
SourceLocation HashLoc,
|
||||
const Token &IncludeTok,
|
||||
StringRef FileName,
|
||||
bool IsAngled,
|
||||
CharSourceRange FilenameRange,
|
||||
const FileEntry *File,
|
||||
StringRef SearchPath,
|
||||
StringRef RelativePath,
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) {
|
||||
if (!File)
|
||||
return;
|
||||
|
||||
|
@ -50,7 +50,8 @@ struct ModuleDependencyPPCallbacks : public PPCallbacks {
|
||||
StringRef FileName, bool IsAngled,
|
||||
CharSourceRange FilenameRange, const FileEntry *File,
|
||||
StringRef SearchPath, StringRef RelativePath,
|
||||
const Module *Imported) override {
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) override {
|
||||
if (!File)
|
||||
return;
|
||||
Collector.addFile(File->getName());
|
||||
|
@ -130,7 +130,8 @@ public:
|
||||
StringRef FileName, bool IsAngled,
|
||||
CharSourceRange FilenameRange, const FileEntry *File,
|
||||
StringRef SearchPath, StringRef RelativePath,
|
||||
const Module *Imported) override;
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) override;
|
||||
void Ident(SourceLocation Loc, StringRef str) override;
|
||||
void PragmaMessage(SourceLocation Loc, StringRef Namespace,
|
||||
PragmaMessageKind Kind, StringRef Str) override;
|
||||
@ -320,15 +321,17 @@ void PrintPPOutputPPCallbacks::FileChanged(SourceLocation Loc,
|
||||
}
|
||||
}
|
||||
|
||||
void PrintPPOutputPPCallbacks::InclusionDirective(SourceLocation HashLoc,
|
||||
const Token &IncludeTok,
|
||||
StringRef FileName,
|
||||
bool IsAngled,
|
||||
CharSourceRange FilenameRange,
|
||||
const FileEntry *File,
|
||||
StringRef SearchPath,
|
||||
StringRef RelativePath,
|
||||
const Module *Imported) {
|
||||
void PrintPPOutputPPCallbacks::InclusionDirective(
|
||||
SourceLocation HashLoc,
|
||||
const Token &IncludeTok,
|
||||
StringRef FileName,
|
||||
bool IsAngled,
|
||||
CharSourceRange FilenameRange,
|
||||
const FileEntry *File,
|
||||
StringRef SearchPath,
|
||||
StringRef RelativePath,
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) {
|
||||
// In -dI mode, dump #include directives prior to dumping their content or
|
||||
// interpretation.
|
||||
if (DumpIncludeDirectives) {
|
||||
|
@ -77,7 +77,8 @@ private:
|
||||
StringRef FileName, bool IsAngled,
|
||||
CharSourceRange FilenameRange, const FileEntry *File,
|
||||
StringRef SearchPath, StringRef RelativePath,
|
||||
const Module *Imported) override;
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) override;
|
||||
void WriteLineInfo(StringRef Filename, int Line,
|
||||
SrcMgr::CharacteristicKind FileType,
|
||||
StringRef Extra = StringRef());
|
||||
@ -192,7 +193,8 @@ void InclusionRewriter::InclusionDirective(SourceLocation HashLoc,
|
||||
const FileEntry * /*File*/,
|
||||
StringRef /*SearchPath*/,
|
||||
StringRef /*RelativePath*/,
|
||||
const Module *Imported) {
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType){
|
||||
if (Imported) {
|
||||
auto P = ModuleIncludes.insert(
|
||||
std::make_pair(HashLoc.getRawEncoding(), Imported));
|
||||
|
@ -1968,7 +1968,7 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
|
||||
HashLoc, IncludeTok,
|
||||
LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename, isAngled,
|
||||
FilenameRange, File, SearchPath, RelativePath,
|
||||
ShouldEnter ? nullptr : SuggestedModule.getModule());
|
||||
ShouldEnter ? nullptr : SuggestedModule.getModule(), FileCharacter);
|
||||
if (SkipHeader && !SuggestedModule.getModule())
|
||||
Callbacks->FileSkipped(*File, FilenameTok, FileCharacter);
|
||||
}
|
||||
|
@ -471,7 +471,8 @@ void PreprocessingRecord::InclusionDirective(
|
||||
const FileEntry *File,
|
||||
StringRef SearchPath,
|
||||
StringRef RelativePath,
|
||||
const Module *Imported) {
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) {
|
||||
InclusionDirective::InclusionKind Kind = InclusionDirective::Include;
|
||||
|
||||
switch (IncludeTok.getIdentifierInfo()->getPPKeywordID()) {
|
||||
|
@ -249,7 +249,8 @@ public:
|
||||
StringRef FileName, bool IsAngled,
|
||||
CharSourceRange FilenameRange, const FileEntry *File,
|
||||
StringRef SearchPath, StringRef RelativePath,
|
||||
const Module *Imported) override {
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) override {
|
||||
bool isImport = (IncludeTok.is(tok::identifier) &&
|
||||
IncludeTok.getIdentifierInfo()->getPPKeywordID() == tok::pp_import);
|
||||
DataConsumer.ppIncludedFile(HashLoc, FileName, File, isImport, IsAngled,
|
||||
|
@ -39,16 +39,18 @@ public:
|
||||
StringRef FileName, bool IsAngled,
|
||||
CharSourceRange FilenameRange, const FileEntry *File,
|
||||
StringRef SearchPath, StringRef RelativePath,
|
||||
const Module *Imported) override {
|
||||
this->HashLoc = HashLoc;
|
||||
this->IncludeTok = IncludeTok;
|
||||
this->FileName = FileName.str();
|
||||
this->IsAngled = IsAngled;
|
||||
this->FilenameRange = FilenameRange;
|
||||
this->File = File;
|
||||
this->SearchPath = SearchPath.str();
|
||||
this->RelativePath = RelativePath.str();
|
||||
this->Imported = Imported;
|
||||
const Module *Imported,
|
||||
SrcMgr::CharacteristicKind FileType) override {
|
||||
this->HashLoc = HashLoc;
|
||||
this->IncludeTok = IncludeTok;
|
||||
this->FileName = FileName.str();
|
||||
this->IsAngled = IsAngled;
|
||||
this->FilenameRange = FilenameRange;
|
||||
this->File = File;
|
||||
this->SearchPath = SearchPath.str();
|
||||
this->RelativePath = RelativePath.str();
|
||||
this->Imported = Imported;
|
||||
this->FileType = FileType;
|
||||
}
|
||||
|
||||
SourceLocation HashLoc;
|
||||
@ -60,6 +62,7 @@ public:
|
||||
SmallString<16> SearchPath;
|
||||
SmallString<16> RelativePath;
|
||||
const Module* Imported;
|
||||
SrcMgr::CharacteristicKind FileType;
|
||||
};
|
||||
|
||||
// Stub to collect data from PragmaOpenCLExtension callbacks.
|
||||
@ -153,6 +156,30 @@ protected:
|
||||
SourceMgr, PCMCache, HeaderInfo, ModLoader,
|
||||
/*IILookup =*/nullptr,
|
||||
/*OwnsHeaderSearch =*/false);
|
||||
return InclusionDirectiveCallback(PP)->FilenameRange;
|
||||
}
|
||||
|
||||
SrcMgr::CharacteristicKind InclusionDirectiveCharacteristicKind(
|
||||
const char *SourceText, const char *HeaderPath, bool SystemHeader) {
|
||||
std::unique_ptr<llvm::MemoryBuffer> Buf =
|
||||
llvm::MemoryBuffer::getMemBuffer(SourceText);
|
||||
SourceMgr.setMainFileID(SourceMgr.createFileID(std::move(Buf)));
|
||||
|
||||
TrivialModuleLoader ModLoader;
|
||||
MemoryBufferCache PCMCache;
|
||||
|
||||
HeaderSearch HeaderInfo(std::make_shared<HeaderSearchOptions>(), SourceMgr,
|
||||
Diags, LangOpts, Target.get());
|
||||
AddFakeHeader(HeaderInfo, HeaderPath, SystemHeader);
|
||||
|
||||
Preprocessor PP(std::make_shared<PreprocessorOptions>(), Diags, LangOpts,
|
||||
SourceMgr, PCMCache, HeaderInfo, ModLoader,
|
||||
/*IILookup =*/nullptr,
|
||||
/*OwnsHeaderSearch =*/false);
|
||||
return InclusionDirectiveCallback(PP)->FileType;
|
||||
}
|
||||
|
||||
InclusionDirectiveCallbacks *InclusionDirectiveCallback(Preprocessor &PP) {
|
||||
PP.Initialize(*Target);
|
||||
InclusionDirectiveCallbacks* Callbacks = new InclusionDirectiveCallbacks;
|
||||
PP.addPPCallbacks(std::unique_ptr<PPCallbacks>(Callbacks));
|
||||
@ -168,7 +195,7 @@ protected:
|
||||
}
|
||||
|
||||
// Callbacks have been executed at this point -- return filename range.
|
||||
return Callbacks->FilenameRange;
|
||||
return Callbacks;
|
||||
}
|
||||
|
||||
PragmaOpenCLExtensionCallbacks::CallbackParameters
|
||||
@ -222,6 +249,15 @@ protected:
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(PPCallbacksTest, UserFileCharacteristics) {
|
||||
const char *Source = "#include \"quoted.h\"\n";
|
||||
|
||||
SrcMgr::CharacteristicKind Kind =
|
||||
InclusionDirectiveCharacteristicKind(Source, "/quoted.h", false);
|
||||
|
||||
ASSERT_EQ(SrcMgr::CharacteristicKind::C_User, Kind);
|
||||
}
|
||||
|
||||
TEST_F(PPCallbacksTest, QuotedFilename) {
|
||||
const char* Source =
|
||||
"#include \"quoted.h\"\n";
|
||||
|
Loading…
Reference in New Issue
Block a user