aboutsummaryrefslogtreecommitdiff
path: root/include/clang
diff options
context:
space:
mode:
authorAaron Ballman <aaron@aaronballman.com>2012-03-01 04:18:49 +0000
committerAaron Ballman <aaron@aaronballman.com>2012-03-01 04:18:49 +0000
commit7abe1666f225b6d1a11aa7ed19d9a0dcc49391cb (patch)
tree1f00308f151460e44b2fc9af6abec81749d045c3 /include/clang
parent6454a02e7bbda180ef3867b6ae3c1aee327a34a7 (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.td9
-rw-r--r--include/clang/Lex/HeaderSearch.h22
-rw-r--r--include/clang/Lex/Preprocessor.h1
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