Introduce an egregious hack for modules to cope with headers that come
from unfriendly (== not at all modularized) directories. This is
temporary, and it only affects module construction until I'll figured
out how to deal with system headers.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140159 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp
index 4e4f80b..a169dd2 100644
--- a/lib/Sema/Sema.cpp
+++ b/lib/Sema/Sema.cpp
@@ -34,6 +34,7 @@
 #include "clang/AST/ExprCXX.h"
 #include "clang/AST/StmtCXX.h"
 #include "clang/Lex/Preprocessor.h"
+#include "clang/Basic/FileManager.h"
 #include "clang/Basic/PartialDiagnostic.h"
 #include "clang/Basic/TargetInfo.h"
 using namespace clang;
@@ -458,6 +459,34 @@
   }
 
   if (TUKind == TU_Module) {
+    // Mark any macros from system headers (in /usr/include) as exported, along
+    // with our own Clang headers.
+    // FIXME: This is a gross hack to deal with the fact that system headers
+    // are #include'd in many places within module headers, but are not 
+    // themselves modularized. This doesn't actually work, but it lets us
+    // focus on other issues for the moment.
+    for (Preprocessor::macro_iterator M = PP.macro_begin(false),
+                                   MEnd = PP.macro_end(false);
+         M != MEnd; ++M) {
+      if (M->second && 
+          !M->second->isExported() &&
+          !M->second->isBuiltinMacro()) {
+        SourceLocation Loc = M->second->getDefinitionLoc();
+        if (SourceMgr.isInSystemHeader(Loc)) {
+          const FileEntry *File
+            = SourceMgr.getFileEntryForID(SourceMgr.getFileID(Loc));
+          if (File && 
+              ((StringRef(File->getName()).find("lib/clang") 
+                  != StringRef::npos) ||
+               (StringRef(File->getName()).find("usr/include") 
+                  != StringRef::npos) ||
+               (StringRef(File->getName()).find("usr/local/include") 
+                  != StringRef::npos)))
+            M->second->setExportLocation(Loc);
+        }
+      }
+    }
+          
     // Modules don't need any of the checking below.
     TUScope = 0;
     return;