diff options
author | Aaron Ballman <aaron@aaronballman.com> | 2012-03-01 04:18:49 +0000 |
---|---|---|
committer | Aaron Ballman <aaron@aaronballman.com> | 2012-03-01 04:18:49 +0000 |
commit | 7abe1666f225b6d1a11aa7ed19d9a0dcc49391cb (patch) | |
tree | 1f00308f151460e44b2fc9af6abec81749d045c3 /include/clang | |
parent | 6454a02e7bbda180ef3867b6ae3c1aee327a34a7 (diff) |
Implements support for #pragma include_alias in ms compatibility mode. Fixes PR10705.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151800 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang')
-rw-r--r-- | include/clang/Basic/DiagnosticLexKinds.td | 9 | ||||
-rw-r--r-- | include/clang/Lex/HeaderSearch.h | 22 | ||||
-rw-r--r-- | include/clang/Lex/Preprocessor.h | 1 |
3 files changed, 32 insertions, 0 deletions
diff --git a/include/clang/Basic/DiagnosticLexKinds.td b/include/clang/Basic/DiagnosticLexKinds.td index 46e0bebb3e..d7ed55a81f 100644 --- a/include/clang/Basic/DiagnosticLexKinds.td +++ b/include/clang/Basic/DiagnosticLexKinds.td @@ -292,6 +292,15 @@ def warn_has_warning_invalid_option : ExtWarn<"__has_warning expected option name (e.g. \"-Wundef\")">, InGroup<MalformedWarningCheck>; +def warn_pragma_include_alias_mismatch : + ExtWarn<"pragma include_alias requires matching include directives " + "(e.g include_alias(\"foo.h\", \"bar.h\") or " + "include_alias(<foo.h>, <bar.h>))">, + InGroup<UnknownPragmas>; +def warn_pragma_include_alias_expected : + ExtWarn<"pragma include_alias expected '%0'">, + InGroup<UnknownPragmas>; + def err__Pragma_malformed : Error< "_Pragma takes a parenthesized string literal">; def err_pragma_comment_malformed : Error< diff --git a/include/clang/Lex/HeaderSearch.h b/include/clang/Lex/HeaderSearch.h index 84bb37da3a..bbd7146cf4 100644 --- a/include/clang/Lex/HeaderSearch.h +++ b/include/clang/Lex/HeaderSearch.h @@ -154,6 +154,9 @@ class HeaderSearch { llvm::StringMap<const DirectoryEntry *, llvm::BumpPtrAllocator> FrameworkMap; + llvm::StringMap<std::pair<StringRef, bool>, llvm::BumpPtrAllocator> + IncludeAliasMap; + /// HeaderMaps - This is a mapping from FileEntry -> HeaderMap, uniquing /// headermaps. This vector owns the headermap. std::vector<std::pair<const FileEntry*, const HeaderMap*> > HeaderMaps; @@ -217,6 +220,25 @@ public: SystemDirIdx++; } + /// AddHeaderMapping -- Map the source include name to the dest include name + void AddHeaderMapping(const StringRef& Source, const StringRef& Dest, + bool IsAngled) { + IncludeAliasMap[Source] = std::make_pair(Dest, IsAngled); + } + + StringRef MapHeader(const StringRef& Source, bool isAngled) { + // Do any filename replacements before anything else + llvm::StringMap<std::pair<StringRef,bool>>::const_iterator iter = + IncludeAliasMap.find(Source); + if (iter != IncludeAliasMap.end()) { + // If the angling matches, then we've found a replacement + if (iter->second.second == isAngled) { + return iter->second.first; + } + } + return Source; + } + /// \brief Set the path to the module cache. void setModuleCachePath(StringRef CachePath) { ModuleCachePath = CachePath; diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index feed6a8bfa..9ee9e82529 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -1262,6 +1262,7 @@ public: void HandlePragmaMessage(Token &MessageTok); void HandlePragmaPushMacro(Token &Tok); void HandlePragmaPopMacro(Token &Tok); + void HandlePragmaIncludeAlias(Token &Tok); IdentifierInfo *ParsePragmaPushOrPopMacro(Token &Tok); // Return true and store the first token only if any CommentHandler |