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
