r206673 On Apr 18, 2014, at 4:42 PM, Ben Langmuir <[email protected]> wrote:
> > On Apr 18, 2014, at 4:41 PM, Quentin Colombet <[email protected]> wrote: > >> Hi Ben, >> >> Looks like your commit broke a buildbot: >> http://lab.llvm.org:8013/builders/clang-x86_64-darwin11-nobootstrap-RAincremental/builds/14603 >> >> Could you fix it or revert? > > Already on it, thanks! Should have a fix in momentarily. > >> >> Thanks, >> -Quentin >> >> On Apr 18, 2014, at 3:07 PM, Ben Langmuir <[email protected]> wrote: >> >>> Author: benlangmuir >>> Date: Fri Apr 18 17:07:31 2014 >>> New Revision: 206664 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=206664&view=rev >>> Log: >>> Don't build modules with (submodules with) missing headers >>> >>> Unless they are in submodules that aren't available anyway, due to >>> requirements not being met. Also, mark children as unavailable when the >>> parent is. >>> >>> Added: >>> cfe/trunk/test/Modules/missing-header.m >>> Modified: >>> cfe/trunk/include/clang/Basic/Module.h >>> cfe/trunk/lib/Basic/Module.cpp >>> cfe/trunk/lib/Frontend/FrontendActions.cpp >>> cfe/trunk/lib/Lex/ModuleMap.cpp >>> cfe/trunk/test/Modules/Inputs/submodules/module.map >>> cfe/trunk/test/Modules/submodules.cpp >>> >>> Modified: cfe/trunk/include/clang/Basic/Module.h >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Module.h?rev=206664&r1=206663&r2=206664&view=diff >>> ============================================================================== >>> --- cfe/trunk/include/clang/Basic/Module.h (original) >>> +++ cfe/trunk/include/clang/Basic/Module.h Fri Apr 18 17:07:31 2014 >>> @@ -123,8 +123,13 @@ public: >>> /// will be false to indicate that this (sub)module is not available. >>> SmallVector<Requirement, 2> Requirements; >>> >>> - /// \brief Whether this module is available in the current >>> - /// translation unit. >>> + /// \brief Whether this module is missing a feature from \c Requirements. >>> + unsigned IsMissingRequirement : 1; >>> + >>> + /// \brief Whether this module is available in the current translation >>> unit. >>> + /// >>> + /// If the module is missing headers or does not meet all requirements >>> then >>> + /// this bit will be 0. >>> unsigned IsAvailable : 1; >>> >>> /// \brief Whether this module was loaded from a module file. >>> @@ -407,6 +412,9 @@ public: >>> const LangOptions &LangOpts, >>> const TargetInfo &Target); >>> >>> + /// \brief Mark this module and all of its submodules as unavailable. >>> + void markUnavailable(); >>> + >>> /// \brief Find the submodule with the given name. >>> /// >>> /// \returns The submodule if found, or NULL otherwise. >>> >>> Modified: cfe/trunk/lib/Basic/Module.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Module.cpp?rev=206664&r1=206663&r2=206664&view=diff >>> ============================================================================== >>> --- cfe/trunk/lib/Basic/Module.cpp (original) >>> +++ cfe/trunk/lib/Basic/Module.cpp Fri Apr 18 17:07:31 2014 >>> @@ -160,6 +160,11 @@ void Module::addRequirement(StringRef Fe >>> if (hasFeature(Feature, LangOpts, Target) == RequiredState) >>> return; >>> >>> + IsMissingRequirement = true; >>> + markUnavailable(); >>> +} >>> + >>> +void Module::markUnavailable() { >>> if (!IsAvailable) >>> return; >>> >>> >>> Modified: cfe/trunk/lib/Frontend/FrontendActions.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendActions.cpp?rev=206664&r1=206663&r2=206664&view=diff >>> ============================================================================== >>> --- cfe/trunk/lib/Frontend/FrontendActions.cpp (original) >>> +++ cfe/trunk/lib/Frontend/FrontendActions.cpp Fri Apr 18 17:07:31 2014 >>> @@ -288,7 +288,8 @@ bool GenerateModuleAction::BeginSourceFi >>> if (!Module->isAvailable(CI.getLangOpts(), CI.getTarget(), Requirement, >>> MissingHeader)) { >>> if (MissingHeader.FileNameLoc.isValid()) { >>> - CI.getDiagnostics().Report(diag::err_module_header_missing) >>> + CI.getDiagnostics().Report(MissingHeader.FileNameLoc, >>> + diag::err_module_header_missing) >>> << MissingHeader.IsUmbrella << MissingHeader.FileName; >>> } else { >>> CI.getDiagnostics().Report(diag::err_module_unavailable) >>> >>> Modified: cfe/trunk/lib/Lex/ModuleMap.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=206664&r1=206663&r2=206664&view=diff >>> ============================================================================== >>> --- cfe/trunk/lib/Lex/ModuleMap.cpp (original) >>> +++ cfe/trunk/lib/Lex/ModuleMap.cpp Fri Apr 18 17:07:31 2014 >>> @@ -1477,6 +1477,15 @@ void ModuleMapParser::parseModuleDecl() >>> inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager()); >>> } >>> >>> + // If the module meets all requirements but is still unavailable, mark >>> the >>> + // whole tree as unavailable to prevent it from building. >>> + if (!ActiveModule->IsAvailable && !ActiveModule->IsMissingRequirement && >>> + ActiveModule->Parent) { >>> + ActiveModule->getTopLevelModule()->markUnavailable(); >>> + ActiveModule->getTopLevelModule()->MissingHeaders.append( >>> + ActiveModule->MissingHeaders.begin(), >>> ActiveModule->MissingHeaders.end()); >>> + } >>> + >>> // We're done parsing this module. Pop back to the previous module. >>> ActiveModule = PreviousActiveModule; >>> } >>> @@ -1705,9 +1714,8 @@ void ModuleMapParser::parseHeaderDecl(MM >>> >>> // If we find a module that has a missing header, we mark this module as >>> // unavailable and store the header directive for displaying >>> diagnostics. >>> - // Other submodules in the same module can still be used. >>> Header.IsUmbrella = LeadingToken == MMToken::UmbrellaKeyword; >>> - ActiveModule->IsAvailable = false; >>> + ActiveModule->markUnavailable(); >>> ActiveModule->MissingHeaders.push_back(Header); >>> } >>> } >>> >>> Modified: cfe/trunk/test/Modules/Inputs/submodules/module.map >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/submodules/module.map?rev=206664&r1=206663&r2=206664&view=diff >>> ============================================================================== >>> --- cfe/trunk/test/Modules/Inputs/submodules/module.map (original) >>> +++ cfe/trunk/test/Modules/Inputs/submodules/module.map Fri Apr 18 17:07:31 >>> 2014 >>> @@ -15,3 +15,11 @@ module missing_headers { >>> module missing { header "missing.h" } >>> module not_missing { header "not_missing.h" } >>> } >>> + >>> +module missing_unavailable_headers { >>> + module missing { >>> + requires !objc >>> + header "missing.h" >>> + } >>> + module not_missing { } >>> +} >>> >>> Added: cfe/trunk/test/Modules/missing-header.m >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/missing-header.m?rev=206664&view=auto >>> ============================================================================== >>> --- cfe/trunk/test/Modules/missing-header.m (added) >>> +++ cfe/trunk/test/Modules/missing-header.m Fri Apr 18 17:07:31 2014 >>> @@ -0,0 +1,13 @@ >>> +// RUN: rm -rf %t >>> +// RUN: not %clang_cc1 -x objective-c -fmodules-cache-path=%t -fmodules -I >>> %S/Inputs/submodules %s 2>&1 | FileCheck %s >>> + >>> +// FIXME: cannot use -verify, because the error from inside the module >>> build has >>> +// a different source manager than the verifier. >>> + >>> +@import missing_unavailable_headers; // OK >>> +@import missing_unavailable_headers.not_missing; // OK >>> +// CHECK-NOT: missing_unavailable_headers >>> + >>> +@import missing_headers; >>> +// CHECK: module.map:15:27: error: header 'missing.h' not found >>> +// CHECK: could not build module 'missing_headers' >>> >>> Modified: cfe/trunk/test/Modules/submodules.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/submodules.cpp?rev=206664&r1=206663&r2=206664&view=diff >>> ============================================================================== >>> --- cfe/trunk/test/Modules/submodules.cpp (original) >>> +++ cfe/trunk/test/Modules/submodules.cpp Fri Apr 18 17:07:31 2014 >>> @@ -32,8 +32,3 @@ extern MyTypeA import_self_test_a; // ex >>> // [email protected]:1 {{here}} >>> extern MyTypeC import_self_test_c; >>> extern MyTypeD import_self_test_d; >>> - >>> -// expected-error@Inputs/submodules/module.map:15{{header 'missing.h' not >>> found}} >>> -@import missing_headers.missing; >>> -@import missing_headers.not_missing; >>> -void f() { NotMissingFunction(); }; >>> >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> [email protected] >>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
