r269730 - Modules: set SystemHeader to true if we are building a system module.
Manman Ren via cfe-commits
cfe-commits at lists.llvm.org
Mon May 16 19:15:13 PDT 2016
Author: mren
Date: Mon May 16 21:15:12 2016
New Revision: 269730
URL: http://llvm.org/viewvc/llvm-project?rev=269730&view=rev
Log:
Modules: set SystemHeader to true if we are building a system module.
If we are processing a #include from a module build, we should treat it
as a system header if we're building a system module. Passing an optional
flag to HeaderSearch::LookupFile.
Before this, the testing case will crash when accessing a freed FileEntry.
rdar://26214027
Added:
cfe/trunk/test/Modules/Inputs/UseAfterFree/
cfe/trunk/test/Modules/Inputs/UseAfterFree/UseAfterFreePrivate.h
cfe/trunk/test/Modules/Inputs/UseAfterFree/UseAfterFreePublic.h
cfe/trunk/test/Modules/Inputs/UseAfterFree/module.map
cfe/trunk/test/Modules/Inputs/UseAfterFree/module_private.map
cfe/trunk/test/Modules/use-after-free.m
Modified:
cfe/trunk/include/clang/Lex/HeaderSearch.h
cfe/trunk/lib/Lex/HeaderSearch.cpp
cfe/trunk/lib/Lex/PPDirectives.cpp
Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=269730&r1=269729&r2=269730&view=diff
==============================================================================
--- cfe/trunk/include/clang/Lex/HeaderSearch.h (original)
+++ cfe/trunk/include/clang/Lex/HeaderSearch.h Mon May 16 21:15:12 2016
@@ -381,7 +381,7 @@ public:
ArrayRef<std::pair<const FileEntry *, const DirectoryEntry *>> Includers,
SmallVectorImpl<char> *SearchPath, SmallVectorImpl<char> *RelativePath,
Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule,
- bool SkipCache = false);
+ bool SkipCache = false, bool BuildSystemModule = false);
/// \brief Look up a subframework for the specified \#include file.
///
Modified: cfe/trunk/lib/Lex/HeaderSearch.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=269730&r1=269729&r2=269730&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/HeaderSearch.cpp (original)
+++ cfe/trunk/lib/Lex/HeaderSearch.cpp Mon May 16 21:15:12 2016
@@ -565,7 +565,7 @@ const FileEntry *HeaderSearch::LookupFil
ArrayRef<std::pair<const FileEntry *, const DirectoryEntry *>> Includers,
SmallVectorImpl<char> *SearchPath, SmallVectorImpl<char> *RelativePath,
Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule,
- bool SkipCache) {
+ bool SkipCache, bool BuildSystemModule) {
if (SuggestedModule)
*SuggestedModule = ModuleMap::KnownHeader();
@@ -613,11 +613,12 @@ const FileEntry *HeaderSearch::LookupFil
// getFileAndSuggestModule, because it's a reference to an element of
// a container that could be reallocated across this call.
//
- // FIXME: If we have no includer, that means we're processing a #include
+ // If we have no includer, that means we're processing a #include
// from a module build. We should treat this as a system header if we're
// building a [system] module.
bool IncluderIsSystemHeader =
- Includer && getFileInfo(Includer).DirInfo != SrcMgr::C_User;
+ (Includer && getFileInfo(Includer).DirInfo != SrcMgr::C_User) ||
+ (!Includer && BuildSystemModule);
if (const FileEntry *FE = getFileAndSuggestModule(
TmpDir, IncluderAndDir.second, IncluderIsSystemHeader,
RequestingModule, SuggestedModule)) {
Modified: cfe/trunk/lib/Lex/PPDirectives.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=269730&r1=269729&r2=269730&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/PPDirectives.cpp (original)
+++ cfe/trunk/lib/Lex/PPDirectives.cpp Mon May 16 21:15:12 2016
@@ -671,6 +671,7 @@ const FileEntry *Preprocessor::LookupFil
// stack, record the parent #includes.
SmallVector<std::pair<const FileEntry *, const DirectoryEntry *>, 16>
Includers;
+ bool BuildSystemModule = false;
if (!FromDir && !FromFile) {
FileID FID = getCurrentFileLexer()->getFileID();
const FileEntry *FileEnt = SourceMgr.getFileEntryForID(FID);
@@ -688,9 +689,10 @@ const FileEntry *Preprocessor::LookupFil
// come from header declarations in the module map) relative to the module
// map file.
if (!FileEnt) {
- if (FID == SourceMgr.getMainFileID() && MainFileDir)
+ if (FID == SourceMgr.getMainFileID() && MainFileDir) {
Includers.push_back(std::make_pair(nullptr, MainFileDir));
- else if ((FileEnt =
+ BuildSystemModule = getCurrentModule()->IsSystem;
+ } else if ((FileEnt =
SourceMgr.getFileEntryForID(SourceMgr.getMainFileID())))
Includers.push_back(std::make_pair(FileEnt, FileMgr.getDirectory(".")));
} else {
@@ -736,7 +738,8 @@ const FileEntry *Preprocessor::LookupFil
// Do a standard file entry lookup.
const FileEntry *FE = HeaderInfo.LookupFile(
Filename, FilenameLoc, isAngled, FromDir, CurDir, Includers, SearchPath,
- RelativePath, RequestingModule, SuggestedModule, SkipCache);
+ RelativePath, RequestingModule, SuggestedModule, SkipCache,
+ BuildSystemModule);
if (FE) {
if (SuggestedModule && !LangOpts.AsmPreprocessor)
HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
Added: cfe/trunk/test/Modules/Inputs/UseAfterFree/UseAfterFreePrivate.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/UseAfterFree/UseAfterFreePrivate.h?rev=269730&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/UseAfterFree/UseAfterFreePrivate.h (added)
+++ cfe/trunk/test/Modules/Inputs/UseAfterFree/UseAfterFreePrivate.h Mon May 16 21:15:12 2016
@@ -0,0 +1 @@
+ at import UseAfterFreePublic;
Added: cfe/trunk/test/Modules/Inputs/UseAfterFree/UseAfterFreePublic.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/UseAfterFree/UseAfterFreePublic.h?rev=269730&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/UseAfterFree/UseAfterFreePublic.h (added)
+++ cfe/trunk/test/Modules/Inputs/UseAfterFree/UseAfterFreePublic.h Mon May 16 21:15:12 2016
@@ -0,0 +1,2 @@
+ at interface S1
+ at end
Added: cfe/trunk/test/Modules/Inputs/UseAfterFree/module.map
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/UseAfterFree/module.map?rev=269730&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/UseAfterFree/module.map (added)
+++ cfe/trunk/test/Modules/Inputs/UseAfterFree/module.map Mon May 16 21:15:12 2016
@@ -0,0 +1,3 @@
+module UseAfterFreePublic {
+ header "UseAfterFreePublic.h"
+}
Added: cfe/trunk/test/Modules/Inputs/UseAfterFree/module_private.map
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/UseAfterFree/module_private.map?rev=269730&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/UseAfterFree/module_private.map (added)
+++ cfe/trunk/test/Modules/Inputs/UseAfterFree/module_private.map Mon May 16 21:15:12 2016
@@ -0,0 +1,3 @@
+module UseAfterFreePrivate {
+ header "UseAfterFreePrivate.h"
+}
Added: cfe/trunk/test/Modules/use-after-free.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/use-after-free.m?rev=269730&view=auto
==============================================================================
--- cfe/trunk/test/Modules/use-after-free.m (added)
+++ cfe/trunk/test/Modules/use-after-free.m Mon May 16 21:15:12 2016
@@ -0,0 +1,24 @@
+// RUN: rm -rf %t
+
+// Here, we build the module without "non-modular-include-in-framework-module".
+// RUN: echo '@import UseAfterFreePublic;' | \
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps \
+// RUN: -fmodules-cache-path=%t -isystem %S/Inputs/UseAfterFree/ -fsyntax-only \
+// RUN: -x objective-c -
+
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps \
+// RUN: -fmodules-cache-path=%t -isystem %S/Inputs/UseAfterFree/ -fsyntax-only \
+// RUN: -Wnon-modular-include-in-framework-module -Werror=non-modular-include-in-framework-module \
+// RUN: -x objective-c %s -verify
+// expected-no-diagnostics
+
+// Here, we load the module UseAfterFreePublic, it is treated as a system module,
+// we ignore the inconsistency for "non-modular-include-in-framework-module".
+ at import UseAfterFreePublic;
+
+// We start a thread to build the module for UseAfterFreePrivate.h. In the thread,
+// we load UseAfterFreePublic and should treat it as a system module as well.
+// If not, we will invalidate UseAfterFreePublic because of the inconsistency
+// for "non-modular-include-in-framework-module", and have a use-after-free error
+// of the FileEntry.
+#import <UseAfterFreePrivate.h>
More information about the cfe-commits
mailing list