comicfans44 created this revision.
comicfans44 added a project: clang.

clang will drop user supplied include path if it's already in system include 
paths to emulate gcc. if two files with same name both exist in user path and 
system path, and user set system path first in arguments, this leads different 
behavior to msvc. this patch preserve user include path order when emulating 
msvc.


Repository:
  rL LLVM

https://reviews.llvm.org/D38356

Files:
  clang/lib/Frontend/InitHeaderSearch.cpp


Index: clang/lib/Frontend/InitHeaderSearch.cpp
===================================================================
--- clang/lib/Frontend/InitHeaderSearch.cpp
+++ clang/lib/Frontend/InitHeaderSearch.cpp
@@ -99,7 +99,7 @@
 
   /// Realize - Merges all search path lists into one list and send it to
   /// HeaderSearch.
-  void Realize(const LangOptions &Lang);
+  void Realize(const LangOptions &Lang, bool msvc);
 };
 
 }  // end anonymous namespace.
@@ -493,7 +493,7 @@
 /// search list, remove the later (dead) ones.  Returns the number of 
non-system
 /// headers removed, which is used to update NumAngled.
 static unsigned RemoveDuplicates(std::vector<DirectoryLookup> &SearchList,
-                                 unsigned First, bool Verbose) {
+                                 unsigned First, bool Verbose, bool msvc) {
   llvm::SmallPtrSet<const DirectoryEntry *, 8> SeenDirs;
   llvm::SmallPtrSet<const DirectoryEntry *, 8> SeenFrameworkDirs;
   llvm::SmallPtrSet<const HeaderMap *, 8> SeenHeaderMaps;
@@ -525,7 +525,7 @@
     //
     // Since dupes of system dirs are rare, just rescan to find the original
     // that we're nuking instead of using a DenseMap.
-    if (CurEntry.getDirCharacteristic() != SrcMgr::C_User) {
+    if (!msvc && (CurEntry.getDirCharacteristic() != SrcMgr::C_User)) {
       // Find the dir that this is the same of.
       unsigned FirstDir;
       for (FirstDir = First;; ++FirstDir) {
@@ -576,7 +576,7 @@
 }
 
 
-void InitHeaderSearch::Realize(const LangOptions &Lang) {
+void InitHeaderSearch::Realize(const LangOptions &Lang, bool msvc) {
   // Concatenate ANGLE+SYSTEM+AFTER chains together into SearchList.
   std::vector<DirectoryLookup> SearchList;
   SearchList.reserve(IncludePath.size());
@@ -587,14 +587,14 @@
       SearchList.push_back(Include.second);
 
   // Deduplicate and remember index.
-  RemoveDuplicates(SearchList, 0, Verbose);
+  RemoveDuplicates(SearchList, 0, Verbose, msvc);
   unsigned NumQuoted = SearchList.size();
 
   for (auto &Include : IncludePath)
     if (Include.first == Angled || Include.first == IndexHeaderMap)
       SearchList.push_back(Include.second);
 
-  RemoveDuplicates(SearchList, NumQuoted, Verbose);
+  RemoveDuplicates(SearchList, NumQuoted, Verbose, msvc);
   unsigned NumAngled = SearchList.size();
 
   for (auto &Include : IncludePath)
@@ -613,7 +613,8 @@
   // Remove duplicates across both the Angled and System directories.  GCC does
   // this and failing to remove duplicates across these two groups breaks
   // #include_next.
-  unsigned NonSystemRemoved = RemoveDuplicates(SearchList, NumQuoted, Verbose);
+  unsigned NonSystemRemoved =
+      RemoveDuplicates(SearchList, NumQuoted, Verbose, msvc);
   NumAngled -= NonSystemRemoved;
 
   bool DontSearchCurDir = false;  // TODO: set to true if -I- is set?
@@ -673,5 +674,6 @@
       HS.getModuleMap().setBuiltinIncludeDir(Dir);
   }
 
-  Init.Realize(Lang);
+  Init.Realize(Lang,
+               Triple.getEnvironment() == llvm::Triple::EnvironmentType::MSVC);
 }


Index: clang/lib/Frontend/InitHeaderSearch.cpp
===================================================================
--- clang/lib/Frontend/InitHeaderSearch.cpp
+++ clang/lib/Frontend/InitHeaderSearch.cpp
@@ -99,7 +99,7 @@
 
   /// Realize - Merges all search path lists into one list and send it to
   /// HeaderSearch.
-  void Realize(const LangOptions &Lang);
+  void Realize(const LangOptions &Lang, bool msvc);
 };
 
 }  // end anonymous namespace.
@@ -493,7 +493,7 @@
 /// search list, remove the later (dead) ones.  Returns the number of non-system
 /// headers removed, which is used to update NumAngled.
 static unsigned RemoveDuplicates(std::vector<DirectoryLookup> &SearchList,
-                                 unsigned First, bool Verbose) {
+                                 unsigned First, bool Verbose, bool msvc) {
   llvm::SmallPtrSet<const DirectoryEntry *, 8> SeenDirs;
   llvm::SmallPtrSet<const DirectoryEntry *, 8> SeenFrameworkDirs;
   llvm::SmallPtrSet<const HeaderMap *, 8> SeenHeaderMaps;
@@ -525,7 +525,7 @@
     //
     // Since dupes of system dirs are rare, just rescan to find the original
     // that we're nuking instead of using a DenseMap.
-    if (CurEntry.getDirCharacteristic() != SrcMgr::C_User) {
+    if (!msvc && (CurEntry.getDirCharacteristic() != SrcMgr::C_User)) {
       // Find the dir that this is the same of.
       unsigned FirstDir;
       for (FirstDir = First;; ++FirstDir) {
@@ -576,7 +576,7 @@
 }
 
 
-void InitHeaderSearch::Realize(const LangOptions &Lang) {
+void InitHeaderSearch::Realize(const LangOptions &Lang, bool msvc) {
   // Concatenate ANGLE+SYSTEM+AFTER chains together into SearchList.
   std::vector<DirectoryLookup> SearchList;
   SearchList.reserve(IncludePath.size());
@@ -587,14 +587,14 @@
       SearchList.push_back(Include.second);
 
   // Deduplicate and remember index.
-  RemoveDuplicates(SearchList, 0, Verbose);
+  RemoveDuplicates(SearchList, 0, Verbose, msvc);
   unsigned NumQuoted = SearchList.size();
 
   for (auto &Include : IncludePath)
     if (Include.first == Angled || Include.first == IndexHeaderMap)
       SearchList.push_back(Include.second);
 
-  RemoveDuplicates(SearchList, NumQuoted, Verbose);
+  RemoveDuplicates(SearchList, NumQuoted, Verbose, msvc);
   unsigned NumAngled = SearchList.size();
 
   for (auto &Include : IncludePath)
@@ -613,7 +613,8 @@
   // Remove duplicates across both the Angled and System directories.  GCC does
   // this and failing to remove duplicates across these two groups breaks
   // #include_next.
-  unsigned NonSystemRemoved = RemoveDuplicates(SearchList, NumQuoted, Verbose);
+  unsigned NonSystemRemoved =
+      RemoveDuplicates(SearchList, NumQuoted, Verbose, msvc);
   NumAngled -= NonSystemRemoved;
 
   bool DontSearchCurDir = false;  // TODO: set to true if -I- is set?
@@ -673,5 +674,6 @@
       HS.getModuleMap().setBuiltinIncludeDir(Dir);
   }
 
-  Init.Realize(Lang);
+  Init.Realize(Lang,
+               Triple.getEnvironment() == llvm::Triple::EnvironmentType::MSVC);
 }
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to