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 @@ +@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 @@ +@interface S1 +@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". +@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> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits