aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/Sema.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-09-20 18:13:03 +0000
committerDouglas Gregor <dgregor@apple.com>2011-09-20 18:13:03 +0000
commitf7572a64a1e5f6f700527583ec5206a58ce6d9b6 (patch)
tree6f722e8100c21820b2909b3fad922f6293f7f6e9 /lib/Sema/Sema.cpp
parent47fcd293a526e898437b8fe1696310ccf92dd8e5 (diff)
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
Diffstat (limited to 'lib/Sema/Sema.cpp')
-rw-r--r--lib/Sema/Sema.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp
index 4e4f80bd0b..a169dd270e 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 @@ void Sema::ActOnEndOfTranslationUnit() {
}
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;