This might finally be a repro! Nicos-MacBook-Pro:llvm-mono-2 thakis$ ls bar foo.h foo2.h Nicos-MacBook-Pro:llvm-mono-2 thakis$ type foo.h -bash: type: foo.h: not found Nicos-MacBook-Pro:llvm-mono-2 thakis$ ls bar foo.h foo2.h Nicos-MacBook-Pro:llvm-mono-2 thakis$ cat bar/foo.h #include "foo2.h" Nicos-MacBook-Pro:llvm-mono-2 thakis$ cat bar/foo2.h Nicos-MacBook-Pro:llvm-mono-2 thakis$ cat pch.h #include "foo.h" Nicos-MacBook-Pro:llvm-mono-2 thakis$ cat pch.cc Nicos-MacBook-Pro:llvm-mono-2 thakis$ cat client.cc #include "bar/foo.h" #include "bar/foo2.h"
#include "foo3.h" Nicos-MacBook-Pro:llvm-mono-2 thakis$ out/gn/bin/clang-cl /c /Ycpch.h /FIpch.h pch.cc /Ibar stat pch.cc 1 opened pch.cc closing pch.cc stat ./pch.h 1 opened ./pch.h closing ./pch.h stat ./foo.h 1 stat bar/foo.h 1 opened bar/foo.h closing bar/foo.h stat bar/foo2.h 1 opened bar/foo2.h closing bar/foo2.h stat pch.cc 1 opened pch.cc stat pch.pch 1 opened pch.pch closing pch.pch stat /Users/thakis/src/llvm-mono-2/bar/foo2.h 0 stat /Users/thakis/src/llvm-mono-2/bar/foo.h 0 stat /Users/thakis/src/llvm-mono-2/pch.h 0 stat /Users/thakis/src/llvm-mono-2/pch.cc 0 closing /Users/thakis/src/llvm-mono-2/pch.cc stat ./pch.h 1 opened ./pch.h Nicos-MacBook-Pro:llvm-mono-2 thakis$ out/gn/bin/clang-cl /c /Yupch.h /FIpch.h client.cc stat client.cc 1 opened client.cc stat pch.pch 1 opened pch.pch closing pch.pch stat /Users/thakis/src/llvm-mono-2/bar/foo2.h 0 stat /Users/thakis/src/llvm-mono-2/bar/foo.h 0 stat /Users/thakis/src/llvm-mono-2/pch.h 0 stat /Users/thakis/src/llvm-mono-2/pch.cc 0 closing client.cc stat ./pch.h 1 opened ./pch.h stat ./bar/foo.h 1 opened ./bar/foo.h closing ./bar/foo.h stat /Users/thakis/src/llvm-mono-2/bar/foo2.h 1 opened /Users/thakis/src/llvm-mono-2/bar/foo2.h closing /Users/thakis/src/llvm-mono-2/bar/foo2.h stat ./bar/foo2.h 1 opened ./bar/foo2.h stat ./foo3.h 1 opened ./foo3.h closing ./foo3.h Note how ./bar/foo2.h is opened in the 4th-to-last line but never closed. For comparision, with your patch reverted: Nicos-MacBook-Pro:llvm-mono-2 thakis$ out/gn/bin/clang-cl /c /Ycpch.h /FIpch.h pch.cc /Ibar stat pch.cc 1 opened pch.cc closing pch.cc stat ./pch.h 1 opened ./pch.h closing ./pch.h stat ./foo.h 1 stat bar/foo.h 1 opened bar/foo.h closing bar/foo.h stat bar/foo2.h 1 opened bar/foo2.h closing bar/foo2.h stat pch.cc 1 opened pch.cc stat pch.pch 1 opened pch.pch closing pch.pch stat /Users/thakis/src/llvm-mono-2/bar/foo2.h 0 stat /Users/thakis/src/llvm-mono-2/bar/foo.h 0 stat /Users/thakis/src/llvm-mono-2/pch.h 0 stat /Users/thakis/src/llvm-mono-2/pch.cc 0 closing /Users/thakis/src/llvm-mono-2/pch.cc stat ./pch.h 1 Nicos-MacBook-Pro:llvm-mono-2 thakis$ out/gn/bin/clang-cl /c /Yupch.h /FIpch.h client.cc stat client.cc 1 opened client.cc stat pch.pch 1 opened pch.pch closing pch.pch stat /Users/thakis/src/llvm-mono-2/bar/foo2.h 0 stat /Users/thakis/src/llvm-mono-2/bar/foo.h 0 stat /Users/thakis/src/llvm-mono-2/pch.h 0 stat /Users/thakis/src/llvm-mono-2/pch.cc 0 closing client.cc stat ./pch.h 1 stat ./bar/foo.h 1 stat ./bar/foo2.h 1 stat ./foo3.h 1 opened ./foo3.h closing ./foo3.h On Wed, Jan 23, 2019 at 2:21 PM Nico Weber <tha...@chromium.org> wrote: > On Wed, Jan 23, 2019 at 2:17 PM Nico Weber <tha...@chromium.org> wrote: > >> Here's what I think is a repro: >> >> Nicos-MacBook-Pro:llvm-mono-2 thakis$ cat foo.h >> Nicos-MacBook-Pro:llvm-mono-2 thakis$ cat foo2.h >> Nicos-MacBook-Pro:llvm-mono-2 thakis$ cat pch.h >> #include "foo.h" >> Nicos-MacBook-Pro:llvm-mono-2 thakis$ cat pch.cc >> Nicos-MacBook-Pro:llvm-mono-2 thakis$ cat client.cc >> #include "foo2.h" >> #include "foo.h" >> >> #include "foo2.h" >> #include "foo.h" >> >> Then just build pch.cc with a pch file, and then use it (you can do this >> on any OS; you could also use the gcc style driver if you prefer it). >> >> The following output is with your change reverted, I added >> >> fprintf(stderr, "stat %s %d\n", Filename.str().c_str(), openFile); >> >> right before the call to getStatValue() in getFile, and >> >> if (openFile) fprintf(stderr, "opened %s\n", Filename.str().c_str()); >> UFE.File = std::move(F); >> >> at the very bottom of that function, and changed getBufferForFile() to >> have >> >> if (ShouldCloseOpenFile) { >> fprintf(stderr, "closing %s\n", Entry->getName().str().c_str()); >> Entry->closeFile(); >> } >> >> >> The output is: >> >> Nicos-MacBook-Pro:llvm-mono-2 thakis$ out/gn/bin/clang-cl /c /Ycpch.h >> /FIpch.h pch.cc >> stat pch.cc 1 >> opened pch.cc >> closing pch.cc >> stat ./pch.h 1 >> opened ./pch.h >> closing ./pch.h >> stat ./foo.h 1 >> opened ./foo.h >> closing ./foo.h >> stat pch.cc 1 >> opened pch.cc >> stat pch.pch 1 >> opened pch.pch >> closing pch.pch >> stat /Users/thakis/src/llvm-mono-2/foo.h 0 >> stat /Users/thakis/src/llvm-mono-2/pch.h 0 >> stat /Users/thakis/src/llvm-mono-2/pch.cc 0 >> closing /Users/thakis/src/llvm-mono-2/pch.cc >> stat ./pch.h 1 >> Nicos-MacBook-Pro:llvm-mono-2 thakis$ out/gn/bin/clang-cl /c /Yupch.h >> /FIpch.h client.cc >> stat client.cc 1 >> opened client.cc >> stat pch.pch 1 >> opened pch.pch >> closing pch.pch >> stat /Users/thakis/src/llvm-mono-2/foo.h 0 >> stat /Users/thakis/src/llvm-mono-2/pch.h 0 >> stat /Users/thakis/src/llvm-mono-2/pch.cc 0 >> closing client.cc >> stat ./pch.h 1 >> stat ./foo2.h 1 >> opened ./foo2.h >> closing ./foo2.h >> stat ./foo.h 1 >> >> >> Note how foo.h at the end is stat'd with openFile = 1, but we don't keep >> that file handle around. >> >> Now with your patch applied, where put the >> >> if (openFile) fprintf(stderr, "opened %s\n", Filename.str().c_str()); >> UFE.File = std::move(F); >> >> print in the block you moved up. >> >> Nicos-MacBook-Pro:llvm-mono-2 thakis$ out/gn/bin/clang-cl /c /Ycpch.h >> /FIpch.h pch.cc >> stat pch.cc 1 >> opened pch.cc >> closing pch.cc >> stat ./pch.h 1 >> opened ./pch.h >> closing ./pch.h >> stat ./foo.h 1 >> opened ./foo.h >> closing ./foo.h >> stat pch.cc 1 >> opened pch.cc >> stat pch.pch 1 >> opened pch.pch >> closing pch.pch >> stat /Users/thakis/src/llvm-mono-2/foo.h 0 >> stat /Users/thakis/src/llvm-mono-2/pch.h 0 >> stat /Users/thakis/src/llvm-mono-2/pch.cc 0 >> closing /Users/thakis/src/llvm-mono-2/pch.cc >> stat ./pch.h 1 >> opened ./pch.h >> Nicos-MacBook-Pro:llvm-mono-2 thakis$ out/gn/bin/clang-cl /c /Yupch.h >> /FIpch.h client.cc >> stat client.cc 1 >> opened client.cc >> stat pch.pch 1 >> opened pch.pch >> closing pch.pch >> stat /Users/thakis/src/llvm-mono-2/foo.h 0 >> stat /Users/thakis/src/llvm-mono-2/pch.h 0 >> stat /Users/thakis/src/llvm-mono-2/pch.cc 0 >> closing client.cc >> stat ./pch.h 1 >> opened ./pch.h >> stat ./foo2.h 1 >> opened ./foo2.h >> closing ./foo2.h >> stat ./foo.h 1 >> opened ./foo.h >> closing ./foo.h >> >> >> Notice how pch.pch gets opened twice but never closed in the version with >> your patch. >> > > Sorry, I mean pch.h. But that's probably just from the /FI flag. While > this is an example of a file that's opened and not closed with your patch, > it'd be nice to have a repro that shows this from an #include line, not > from an /FI flag. Let me look at this a bit more. Sorry for the noise. > > >> I think this is enough to show that your patch is introducing assumptions >> made by clang's PCH code. Even though the issue isn't understood in detail, >> this is imho enough to revert and fix and debug async, unless you're able >> to fix very quickly. >> >> >> >> On Wed, Jan 23, 2019 at 1:23 PM Nico Weber <tha...@chromium.org> wrote: >> >>> The way things worked before your patch is that getFile() calls for >>> headers that are loaded from a PCH file hit the early-ish return in >>> >>> if (UFE.isValid()) { // Already have an entry with this inode, return >>> it. >>> >>> The first stack I posted (with ReadControlBlock() in it) populates >>> this UniqueRealFiles cache, and then getFile() for includes in a pch when >>> called from the preprocessor just return "early", at least before the file >>> is opened. (Stack for that: >>> >>> (lldb) bt >>> * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint >>> 3.1 >>> * frame #0: 0x000000010005a2cf >>> clang-cl`clang::FileManager::getFile(this=0x000000011200a190, >>> Filename=(Data = >>> "../../third_party/blink/renderer/core/layout/api/third_party/skia/include/core/SkPoint3.h/paint/third_party/skia/include/core/SkPoint3.hܲ?\x01", >>> Length = 89), openFile=true, CacheFailure=true) at FileManager.cpp:198 >>> frame #1: 0x0000000102ca1cb2 >>> clang-cl`clang::HeaderSearch::getFileAndSuggestModule(this=0x000000011282e600, >>> FileName=(Data = >>> "../../third_party/blink/renderer/core/layout/api/third_party/skia/include/core/SkPoint3.h/paint/third_party/skia/include/core/SkPoint3.hܲ?\x01", >>> Length = 89), IncludeLoc=(ID = 4980551), Dir=0x000000011071e500, >>> IsSystemHeaderDir=false, RequestingModule=0x0000000000000000, >>> SuggestedModule=0x00007fff5fbf9020) at HeaderSearch.cpp:313 >>> frame #2: 0x0000000102ca37aa >>> clang-cl`clang::HeaderSearch::LookupFile(this=0x000000011282e600, >>> Filename=(Data = "third_party/skia/include/core/SkPoint3.h", Length = 40), >>> IncludeLoc=(ID = 4980551), isAngled=false, FromDir=0x0000000000000000, >>> CurDir=0x00007fff5fbf9848, Includers=ArrayRef<std::__1::pair<const >>> clang::FileEntry *, const clang::DirectoryEntry *> > @ 0x00007fff5fbf7c78, >>> SearchPath=0x00007fff5fbf9438, RelativePath=0x00007fff5fbf9028, >>> RequestingModule=0x0000000000000000, SuggestedModule=0x00007fff5fbf9020, >>> IsMapped=0x00007fff5fbf9857, SkipCache=false, BuildSystemModule=false) at >>> HeaderSearch.cpp:756 >>> frame #3: 0x0000000102d01898 >>> clang-cl`clang::Preprocessor::LookupFile(this=0x000000011282f618, >>> FilenameLoc=(ID = 4980551), Filename=(Data = >>> "third_party/skia/include/core/SkPoint3.h", Length = 40), isAngled=false, >>> FromDir=0x0000000000000000, FromFile=0x0000000000000000, >>> CurDir=0x00007fff5fbf9848, SearchPath=0x00007fff5fbf9438, >>> RelativePath=0x00007fff5fbf9028, SuggestedModule=0x00007fff5fbf9020, >>> IsMapped=0x00007fff5fbf9857, SkipCache=false) at PPDirectives.cpp:740 >>> frame #4: 0x0000000102d033c4 >>> clang-cl`clang::Preprocessor::HandleIncludeDirective(this=0x000000011282f618, >>> HashLoc=(ID = 4980542), IncludeTok=0x000000011180a810, >>> LookupFrom=0x0000000000000000, LookupFromFile=0x0000000000000000, >>> isImport=false) at PPDirectives.cpp:1773 >>> frame #5: 0x0000000102d05e3a >>> clang-cl`clang::Preprocessor::HandleDirective(this=0x000000011282f618, >>> Result=0x000000011180a810) at PPDirectives.cpp:942 >>> frame #6: 0x0000000102cbff1f >>> clang-cl`clang::Lexer::LexTokenInternal(this=0x000000011bc567a0, >>> Result=0x000000011180a810, TokAtPhysicalStartOfLine=true) at Lexer.cpp:3931 >>> frame #7: 0x0000000102cbc1b8 >>> clang-cl`clang::Lexer::Lex(this=0x000000011bc567a0, >>> Result=0x000000011180a810) at Lexer.cpp:3152 >>> frame #8: 0x0000000102d54dcb >>> clang-cl`clang::Preprocessor::Lex(this=0x000000011282f618, >>> Result=0x000000011180a810) at Preprocessor.cpp:868 >>> frame #9: 0x0000000102f235f9 >>> clang-cl`clang::Parser::ConsumeBrace(this=0x000000011180a800) at >>> Parser.h:563 >>> frame #10: 0x0000000102f2a21a >>> clang-cl`clang::BalancedDelimiterTracker::consumeClose(this=0x00007fff5fbfa560) >>> at RAIIObjectsForParser.h:429 >>> frame #11: 0x0000000102e788e5 >>> clang-cl`clang::Parser::ParseInnerNamespace(this=0x000000011180a800, >>> InnerNSs=0x00007fff5fbfa6e0, index=0, InlineLoc=0x00007fff5fbfa7a0, >>> attrs=0x00007fff5fbfa6b8, Tracker=0x00007fff5fbfa560) at >>> ParseDeclCXX.cpp:250 >>> frame #12: 0x0000000102e77dd6 >>> clang-cl`clang::Parser::ParseNamespace(this=0x000000011180a800, >>> Context=FileContext, DeclEnd=0x00007fff5fbfaa70, InlineLoc=(ID = 0)) at >>> ParseDeclCXX.cpp:223 >>> frame #13: 0x0000000102e5af29 >>> clang-cl`clang::Parser::ParseDeclaration(this=0x000000011180a800, >>> Context=FileContext, DeclEnd=0x00007fff5fbfaa70, attrs=0x00007fff5fbfac40) >>> at ParseDecl.cpp:1714 >>> frame #14: 0x0000000102f25dc3 >>> clang-cl`clang::Parser::ParseExternalDeclaration(this=0x000000011180a800, >>> attrs=0x00007fff5fbfac40, DS=0x0000000000000000) at Parser.cpp:788 >>> frame #15: 0x0000000102f24f06 >>> clang-cl`clang::Parser::ParseTopLevelDecl(this=0x000000011180a800, >>> Result=0x00007fff5fbfad78) at Parser.cpp:609 >>> frame #16: 0x0000000102e4a076 >>> clang-cl`clang::ParseAST(S=0x00000001118fb600, PrintStats=true, >>> SkipFunctionBodies=false) at ParseAST.cpp:156 >>> frame #17: 0x0000000100add312 >>> clang-cl`clang::ASTFrontendAction::ExecuteAction(this=0x0000000112007eb0) >>> at FrontendAction.cpp:1035 >>> frame #18: 0x00000001004f6cbd >>> clang-cl`clang::CodeGenAction::ExecuteAction(this=0x0000000112007eb0) at >>> CodeGenAction.cpp:1047 >>> frame #19: 0x0000000100adc920 >>> clang-cl`clang::FrontendAction::Execute(this=0x0000000112007eb0) at >>> FrontendAction.cpp:934 >>> frame #20: 0x0000000100a4ce4e >>> clang-cl`clang::CompilerInstance::ExecuteAction(this=0x0000000112005f70, >>> Act=0x0000000112007eb0) at CompilerInstance.cpp:954 >>> frame #21: 0x0000000100b5c25f >>> clang-cl`clang::ExecuteCompilerInvocation(Clang=0x0000000112005f70) at >>> ExecuteCompilerInvocation.cpp:267 >>> frame #22: 0x0000000100001ab9 clang-cl`cc1_main(Argv=ArrayRef<const >>> char *> @ 0x00007fff5fbfb4c8, >>> Argv0="../../../../llvm-mono-2/out/gn/bin/clang-cl", >>> MainAddr=0x0000000100028100) at cc1_main.cpp:218 >>> frame #23: 0x000000010002998f >>> clang-cl`ExecuteCC1Tool(argv=ArrayRef<const char *> @ 0x00007fff5fbfba78, >>> Tool=(Data = "", Length = 0)) at driver.cpp:309 >>> frame #24: 0x0000000100028a71 clang-cl`main(argc_=409, >>> argv_=0x00007fff5fbfd170) at driver.cpp:381 >>> frame #25: 0x00007fffb015c235 libdyld.dylib`start + 1 >>> >>> ). >>> >>> >>> After your patch, we open the file before that cache check, and then >>> open way more files, and don't the ones from the PCH for some reason. >>> Closing is normally happening in through >>> >>> Preprocessor::HandleIncludeDirective() -> >>> Preprocessor::EnterSourceFile() -> SourceManager::getBuffer() -> >>> ContentCache::getBuffer() >>> -> FileManager::getBufferForFile(ShouldCloseOpenFile) >>> >>> but apparently that's not getting called for headers from PCH files. >>> >>> On Wed, Jan 23, 2019 at 12:38 PM Nico Weber <tha...@chromium.org> wrote: >>> >>>> Stacks for getFile() from PCH files look like so: >>>> >>>> (lldb) bt >>>> * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint >>>> 1.1 >>>> * frame #0: 0x000000010005a1fb >>>> clang-cl`clang::FileManager::getFile(this=0x00000001106111f0, >>>> Filename=(Data = >>>> "/Users/thakis/src/chrome/src/out/gnwin/../../third_party/skia/include/core/SkPoint3.h", >>>> Length = 85), openFile=false, CacheFailure=true) at FileManager.cpp:187 >>>> frame #1: 0x0000000103c44b2e >>>> clang-cl`clang::ASTReader::getInputFile(this=0x000000011104c200, >>>> F=0x000000011104fc00, ID=3, Complain=true) at ASTReader.cpp:2120 >>>> frame #2: 0x0000000103c5173b >>>> clang-cl`clang::ASTReader::ReadControlBlock(this=0x000000011104c200, >>>> F=0x000000011104fc00, Loaded=0x00007fff5fbfa130, >>>> ImportedBy=0x0000000000000000, ClientLoadCapabilities=0) at >>>> ASTReader.cpp:2398 >>>> frame #3: 0x0000000103c5381b >>>> clang-cl`clang::ASTReader::ReadASTCore(this=0x000000011104c200, >>>> FileName=(Data = >>>> "obj/third_party/blink/renderer/core/layout/layout_cc.pch", Length = 56), >>>> Type=MK_PCH, ImportLoc=(ID = 0), ImportedBy=0x0000000000000000, >>>> Loaded=0x00007fff5fbfa130, ExpectedSize=0, ExpectedModTime=0, >>>> ExpectedSignature=ASTFileSignature @ 0x00007fff5fbf9d58, >>>> ClientLoadCapabilities=0) at ASTReader.cpp:4208 >>>> frame #4: 0x0000000103c5fe95 >>>> clang-cl`clang::ASTReader::ReadAST(this=0x000000011104c200, FileName=(Data >>>> = "obj/third_party/blink/renderer/core/layout/layout_cc.pch", Length = 56), >>>> Type=MK_PCH, ImportLoc=(ID = 0), ClientLoadCapabilities=0, >>>> Imported=0x0000000000000000) at ASTReader.cpp:3883 >>>> frame #5: 0x0000000100a49542 >>>> clang-cl`clang::CompilerInstance::createPCHExternalASTSource(Path=(Data = >>>> "obj/third_party/blink/renderer/core/layout/layout_cc.pch", Length = 56), >>>> Sysroot=(Data = "/", Length = 1), DisablePCHValidation=false, >>>> AllowPCHWithCompilerErrors=false, PP=0x0000000111037e18, >>>> Context=0x0000000111042200, PCHContainerRdr=0x000000011060d2b0, >>>> Extensions=ArrayRef<std::__1::shared_ptr<clang::ModuleFileExtension> > @ >>>> 0x00007fff5fbfa430, DependencyFile=0x0000000000000000, >>>> DependencyCollectors=ArrayRef<std::__1::shared_ptr<clang::DependencyCollector> >>>> > @ 0x00007fff5fbfa448, DeserializationListener=0x0000000000000000, >>>> OwnDeserializationListener=false, Preamble=false, >>>> UseGlobalModuleIndex=true) at CompilerInstance.cpp:532 >>>> frame #6: 0x0000000100a4909b >>>> clang-cl`clang::CompilerInstance::createPCHExternalASTSource(this=0x000000011060d000, >>>> Path=(Data = "obj/third_party/blink/renderer/core/layout/layout_cc.pch", >>>> Length = 56), DisablePCHValidation=false, AllowPCHWithCompilerErrors=false, >>>> DeserializationListener=0x0000000000000000, >>>> OwnDeserializationListener=false) at CompilerInstance.cpp:490 >>>> frame #7: 0x0000000100ada301 >>>> clang-cl`clang::FrontendAction::BeginSourceFile(this=0x000000011060eee0, >>>> CI=0x000000011060d000, RealInput=0x0000000110614a60) at >>>> FrontendAction.cpp:859 >>>> frame #8: 0x0000000100a4cdf8 >>>> clang-cl`clang::CompilerInstance::ExecuteAction(this=0x000000011060d000, >>>> Act=0x000000011060eee0) at CompilerInstance.cpp:953 >>>> frame #9: 0x0000000100b5c21f >>>> clang-cl`clang::ExecuteCompilerInvocation(Clang=0x000000011060d000) at >>>> ExecuteCompilerInvocation.cpp:267 >>>> frame #10: 0x0000000100001ac9 clang-cl`cc1_main(Argv=ArrayRef<const >>>> char *> @ 0x00007fff5fbfb4c8, >>>> Argv0="../../../../llvm-mono-2/out/gn/bin/clang-cl", >>>> MainAddr=0x0000000100028110) at cc1_main.cpp:218 >>>> frame #11: 0x000000010002999f >>>> clang-cl`ExecuteCC1Tool(argv=ArrayRef<const char *> @ 0x00007fff5fbfba78, >>>> Tool=(Data = "", Length = 0)) at driver.cpp:309 >>>> frame #12: 0x0000000100028a81 clang-cl`main(argc_=409, >>>> argv_=0x00007fff5fbfd170) at driver.cpp:381 >>>> frame #13: 0x00007fffb015c235 libdyld.dylib`start + 1 >>>> >>>> (lldb) bt >>>> * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint >>>> 1.1 >>>> * frame #0: 0x000000010005a1fb >>>> clang-cl`clang::FileManager::getFile(this=0x00000001106111f0, >>>> Filename=(Data = >>>> "/Users/thakis/src/chrome/src/out/gnwin/../../third_party/skia/include/core/SkPoint3.h", >>>> Length = 85), openFile=false, CacheFailure=true) at FileManager.cpp:187 >>>> frame #1: 0x0000000103c476e3 >>>> clang-cl`clang::serialization::reader::HeaderFileInfoTrait::EqualKey(this=0x00007fff5fbf5f80, >>>> Key=0x00007fff5fbf6068)::$_1::operator()(clang::serialization::reader::HeaderFileInfoTrait::internal_key_type >>>> const&) const at ASTReader.cpp:1723 >>>> frame #2: 0x0000000103c4759f >>>> clang-cl`clang::serialization::reader::HeaderFileInfoTrait::EqualKey(this=0x0000000113a16c88, >>>> a=0x00007fff5fbf6068, b=0x00007fff5fbf6138) at ASTReader.cpp:1726 >>>> frame #3: 0x0000000103cd5c1e >>>> clang-cl`llvm::OnDiskChainedHashTable<clang::serialization::reader::HeaderFileInfoTrait>::find_hashed(this=0x0000000113a16c70, >>>> IKey=0x00007fff5fbf6138, KeyHash=986574196, InfoPtr=0x0000000113a16c88) at >>>> OnDiskHashTable.h:390 >>>> frame #4: 0x0000000103cd59b8 >>>> clang-cl`llvm::OnDiskChainedHashTable<clang::serialization::reader::HeaderFileInfoTrait>::find(this=0x0000000113a16c70, >>>> EKey=0x00007fff5fbf6538, InfoPtr=0x0000000000000000) at >>>> OnDiskHashTable.h:345 >>>> frame #5: 0x0000000103cd58b9 clang-cl`(anonymous >>>> namespace)::HeaderFileInfoVisitor::operator(this=0x00007fff5fbf6538, >>>> M=0x000000011104fc00)(clang::serialization::ModuleFile&) at >>>> ASTReader.cpp:5683 >>>> frame #6: 0x0000000103cd5850 clang-cl`bool llvm::function_ref<bool >>>> (clang::serialization::ModuleFile&)>::callback_fn<(anonymous >>>> namespace)::HeaderFileInfoVisitor>(callable=140734799766840, >>>> params=0x000000011104fc00) at STLExtras.h:125 >>>> frame #7: 0x0000000103e338cc clang-cl`llvm::function_ref<bool >>>> (clang::serialization::ModuleFile&)>::operator(this=0x00007fff5fbf64a0, >>>> params=0x000000011104fc00)(clang::serialization::ModuleFile&) const at >>>> STLExtras.h:142 >>>> frame #8: 0x0000000103e33507 >>>> clang-cl`clang::serialization::ModuleManager::visit(this=0x000000011104c298, >>>> Visitor=function_ref<bool (clang::serialization::ModuleFile &)> @ >>>> 0x00007fff5fbf64a0, ModuleFilesHit=0x0000000000000000)>, >>>> llvm::SmallPtrSetImpl<clang::serialization::ModuleFile*>*) at >>>> ModuleManager.cpp:411 >>>> frame #9: 0x0000000103c69ade >>>> clang-cl`clang::ASTReader::GetHeaderFileInfo(this=0x000000011104c200, >>>> FE=0x0000000113a00030) at ASTReader.cpp:5698 >>>> frame #10: 0x0000000103c69d03 clang-cl`non-virtual thunk to >>>> clang::ASTReader::GetHeaderFileInfo(this=0x000000011104c200, >>>> FE=0x0000000113a00030) at ASTReader.cpp:0 >>>> frame #11: 0x0000000102ca607c >>>> clang-cl`clang::HeaderSearch::getExistingFileInfo(this=0x0000000111036e00, >>>> FE=0x0000000113a00030, WantExternal=true) const at HeaderSearch.cpp:1140 >>>> frame #12: 0x0000000102ca6faf >>>> clang-cl`clang::HeaderSearch::findModuleForHeader(this=0x0000000111036e00, >>>> File=0x0000000113a00030, AllowTextual=true) const at HeaderSearch.cpp:1334 >>>> frame #13: 0x0000000102ca700a >>>> clang-cl`suggestModule(HS=0x0000000111036e00, File=0x0000000113a00030, >>>> RequestingModule=0x0000000000000000, SuggestedModule=0x00007fff5fbf9020) at >>>> HeaderSearch.cpp:1343 >>>> frame #14: 0x0000000102ca1dd2 >>>> clang-cl`clang::HeaderSearch::findUsableModuleForHeader(this=0x0000000111036e00, >>>> File=0x0000000113a00030, Root=0x00000001106126d0, >>>> RequestingModule=0x0000000000000000, SuggestedModule=0x00007fff5fbf9020, >>>> IsSystemHeaderDir=false) at HeaderSearch.cpp:1367 >>>> frame #15: 0x0000000102ca1cee >>>> clang-cl`clang::HeaderSearch::getFileAndSuggestModule(this=0x0000000111036e00, >>>> FileName=(Data = "../../third_party/skia/include/core/SkPoint3.h", Length = >>>> 46), IncludeLoc=(ID = 4980551), Dir=0x00000001106126d0, >>>> IsSystemHeaderDir=false, RequestingModule=0x0000000000000000, >>>> SuggestedModule=0x00007fff5fbf9020) at HeaderSearch.cpp:318 >>>> frame #16: 0x0000000102ca20ad >>>> clang-cl`clang::DirectoryLookup::LookupFile(this=0x000000011060f1e0, >>>> Filename=0x00007fff5fbf7c20, HS=0x0000000111036e00, IncludeLoc=(ID = >>>> 4980551), SearchPath=0x00007fff5fbf9438, RelativePath=0x00007fff5fbf9028, >>>> RequestingModule=0x0000000000000000, SuggestedModule=0x00007fff5fbf9020, >>>> InUserSpecifiedSystemFramework=0x00007fff5fbf763f, >>>> HasBeenMapped=0x00007fff5fbf763e, MappedName=0x00007fff5fbf7640) const at >>>> HeaderSearch.cpp:357 >>>> frame #17: 0x0000000102ca3e15 >>>> clang-cl`clang::HeaderSearch::LookupFile(this=0x0000000111036e00, >>>> Filename=(Data = "third_party/skia/include/core/SkPoint3.h", Length = 40), >>>> IncludeLoc=(ID = 4980551), isAngled=false, FromDir=0x0000000000000000, >>>> CurDir=0x00007fff5fbf9848, Includers=ArrayRef<std::__1::pair<const >>>> clang::FileEntry *, const clang::DirectoryEntry *> > @ 0x00007fff5fbf7c78, >>>> SearchPath=0x00007fff5fbf9438, RelativePath=0x00007fff5fbf9028, >>>> RequestingModule=0x0000000000000000, SuggestedModule=0x00007fff5fbf9020, >>>> IsMapped=0x00007fff5fbf9857, SkipCache=false, BuildSystemModule=false) at >>>> HeaderSearch.cpp:854 >>>> frame #18: 0x0000000102d01858 >>>> clang-cl`clang::Preprocessor::LookupFile(this=0x0000000111037e18, >>>> FilenameLoc=(ID = 4980551), Filename=(Data = >>>> "third_party/skia/include/core/SkPoint3.h", Length = 40), isAngled=false, >>>> FromDir=0x0000000000000000, FromFile=0x0000000000000000, >>>> CurDir=0x00007fff5fbf9848, SearchPath=0x00007fff5fbf9438, >>>> RelativePath=0x00007fff5fbf9028, SuggestedModule=0x00007fff5fbf9020, >>>> IsMapped=0x00007fff5fbf9857, SkipCache=false) at PPDirectives.cpp:740 >>>> frame #19: 0x0000000102d03384 >>>> clang-cl`clang::Preprocessor::HandleIncludeDirective(this=0x0000000111037e18, >>>> HashLoc=(ID = 4980542), IncludeTok=0x000000011080ac10, >>>> LookupFrom=0x0000000000000000, LookupFromFile=0x0000000000000000, >>>> isImport=false) at PPDirectives.cpp:1773 >>>> frame #20: 0x0000000102d05dfa >>>> clang-cl`clang::Preprocessor::HandleDirective(this=0x0000000111037e18, >>>> Result=0x000000011080ac10) at PPDirectives.cpp:942 >>>> frame #21: 0x0000000102cbfedf >>>> clang-cl`clang::Lexer::LexTokenInternal(this=0x000000011a6f1430, >>>> Result=0x000000011080ac10, TokAtPhysicalStartOfLine=true) at Lexer.cpp:3931 >>>> frame #22: 0x0000000102cbc178 >>>> clang-cl`clang::Lexer::Lex(this=0x000000011a6f1430, >>>> Result=0x000000011080ac10) at Lexer.cpp:3152 >>>> frame #23: 0x0000000102d54d8b >>>> clang-cl`clang::Preprocessor::Lex(this=0x0000000111037e18, >>>> Result=0x000000011080ac10) at Preprocessor.cpp:868 >>>> frame #24: 0x0000000102f235b9 >>>> clang-cl`clang::Parser::ConsumeBrace(this=0x000000011080ac00) at >>>> Parser.h:563 >>>> frame #25: 0x0000000102f2a1da >>>> clang-cl`clang::BalancedDelimiterTracker::consumeClose(this=0x00007fff5fbfa560) >>>> at RAIIObjectsForParser.h:429 >>>> frame #26: 0x0000000102e788a5 >>>> clang-cl`clang::Parser::ParseInnerNamespace(this=0x000000011080ac00, >>>> InnerNSs=0x00007fff5fbfa6e0, index=0, InlineLoc=0x00007fff5fbfa7a0, >>>> attrs=0x00007fff5fbfa6b8, Tracker=0x00007fff5fbfa560) at >>>> ParseDeclCXX.cpp:250 >>>> frame #27: 0x0000000102e77d96 >>>> clang-cl`clang::Parser::ParseNamespace(this=0x000000011080ac00, >>>> Context=FileContext, DeclEnd=0x00007fff5fbfaa70, InlineLoc=(ID = 0)) at >>>> ParseDeclCXX.cpp:223 >>>> frame #28: 0x0000000102e5aee9 >>>> clang-cl`clang::Parser::ParseDeclaration(this=0x000000011080ac00, >>>> Context=FileContext, DeclEnd=0x00007fff5fbfaa70, attrs=0x00007fff5fbfac40) >>>> at ParseDecl.cpp:1714 >>>> frame #29: 0x0000000102f25d83 >>>> clang-cl`clang::Parser::ParseExternalDeclaration(this=0x000000011080ac00, >>>> attrs=0x00007fff5fbfac40, DS=0x0000000000000000) at Parser.cpp:788 >>>> frame #30: 0x0000000102f24ec6 >>>> clang-cl`clang::Parser::ParseTopLevelDecl(this=0x000000011080ac00, >>>> Result=0x00007fff5fbfad78) at Parser.cpp:609 >>>> frame #31: 0x0000000102e4a036 >>>> clang-cl`clang::ParseAST(S=0x00000001108fba00, PrintStats=true, >>>> SkipFunctionBodies=false) at ParseAST.cpp:156 >>>> frame #32: 0x0000000100add2d2 >>>> clang-cl`clang::ASTFrontendAction::ExecuteAction(this=0x000000011060eee0) >>>> at FrontendAction.cpp:1035 >>>> frame #33: 0x00000001004f6c7d >>>> clang-cl`clang::CodeGenAction::ExecuteAction(this=0x000000011060eee0) at >>>> CodeGenAction.cpp:1047 >>>> frame #34: 0x0000000100adc8e0 >>>> clang-cl`clang::FrontendAction::Execute(this=0x000000011060eee0) at >>>> FrontendAction.cpp:934 >>>> frame #35: 0x0000000100a4ce0e >>>> clang-cl`clang::CompilerInstance::ExecuteAction(this=0x000000011060d000, >>>> Act=0x000000011060eee0) at CompilerInstance.cpp:954 >>>> frame #36: 0x0000000100b5c21f >>>> clang-cl`clang::ExecuteCompilerInvocation(Clang=0x000000011060d000) at >>>> ExecuteCompilerInvocation.cpp:267 >>>> frame #37: 0x0000000100001ac9 clang-cl`cc1_main(Argv=ArrayRef<const >>>> char *> @ 0x00007fff5fbfb4c8, >>>> Argv0="../../../../llvm-mono-2/out/gn/bin/clang-cl", >>>> MainAddr=0x0000000100028110) at cc1_main.cpp:218 >>>> frame #38: 0x000000010002999f >>>> clang-cl`ExecuteCC1Tool(argv=ArrayRef<const char *> @ 0x00007fff5fbfba78, >>>> Tool=(Data = "", Length = 0)) at driver.cpp:309 >>>> frame #39: 0x0000000100028a81 clang-cl`main(argc_=409, >>>> argv_=0x00007fff5fbfd170) at driver.cpp:381 >>>> frame #40: 0x00007fffb015c235 libdyld.dylib`start + 1 >>>> >>>> >>>> For regular includes they look like so: >>>> >>>> (lldb) bt >>>> * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint >>>> 1.1 >>>> * frame #0: 0x0000000100059d29 >>>> clang-cl`clang::FileManager::getStatValue(this=0x0000000110611270, >>>> Path=(Data = >>>> "../../third_party/blink/renderer/platform/scheduler/public/scheduling_lifecycle_state.h", >>>> Length = 87), Data=0x00007fff5fbf6640, isFile=true, F=0x00007fff5fbf6680) >>>> at FileManager.cpp:465 >>>> frame #1: 0x000000010005a471 >>>> clang-cl`clang::FileManager::getFile(this=0x0000000110611270, >>>> Filename=(Data = >>>> "../../third_party/blink/renderer/platform/scheduler/public/scheduling_lifecycle_state.h", >>>> Length = 87), openFile=true, CacheFailure=true) at FileManager.cpp:230 >>>> frame #2: 0x0000000102ca1ca2 >>>> clang-cl`clang::HeaderSearch::getFileAndSuggestModule(this=0x0000000111036e00, >>>> FileName=(Data = >>>> "../../third_party/blink/renderer/platform/scheduler/public/scheduling_lifecycle_state.h", >>>> Length = 87), IncludeLoc=(ID = 9004850), Dir=0x0000000110502730, >>>> IsSystemHeaderDir=false, RequestingModule=0x0000000000000000, >>>> SuggestedModule=0x00007fff5fbf9030) at HeaderSearch.cpp:313 >>>> frame #3: 0x0000000102ca20dd >>>> clang-cl`clang::DirectoryLookup::LookupFile(this=0x0000000110503850, >>>> Filename=0x00007fff5fbf7c30, HS=0x0000000111036e00, IncludeLoc=(ID = >>>> 9004850), SearchPath=0x00007fff5fbf9448, RelativePath=0x00007fff5fbf9038, >>>> RequestingModule=0x0000000000000000, SuggestedModule=0x00007fff5fbf9030, >>>> InUserSpecifiedSystemFramework=0x00007fff5fbf764f, >>>> HasBeenMapped=0x00007fff5fbf764e, MappedName=0x00007fff5fbf7650) const at >>>> HeaderSearch.cpp:357 >>>> frame #4: 0x0000000102ca3e45 >>>> clang-cl`clang::HeaderSearch::LookupFile(this=0x0000000111036e00, >>>> Filename=(Data = >>>> "third_party/blink/renderer/platform/scheduler/public/scheduling_lifecycle_state.h", >>>> Length = 81), IncludeLoc=(ID = 9004850), isAngled=false, >>>> FromDir=0x0000000000000000, CurDir=0x00007fff5fbf9858, >>>> Includers=ArrayRef<std::__1::pair<const clang::FileEntry *, const >>>> clang::DirectoryEntry *> > @ 0x00007fff5fbf7c88, >>>> SearchPath=0x00007fff5fbf9448, RelativePath=0x00007fff5fbf9038, >>>> RequestingModule=0x0000000000000000, SuggestedModule=0x00007fff5fbf9030, >>>> IsMapped=0x00007fff5fbf9867, SkipCache=false, BuildSystemModule=false) at >>>> HeaderSearch.cpp:854 >>>> frame #5: 0x0000000102d01888 >>>> clang-cl`clang::Preprocessor::LookupFile(this=0x0000000111037e18, >>>> FilenameLoc=(ID = 9004850), Filename=(Data = >>>> "third_party/blink/renderer/platform/scheduler/public/scheduling_lifecycle_state.h", >>>> Length = 81), isAngled=false, FromDir=0x0000000000000000, >>>> FromFile=0x0000000000000000, CurDir=0x00007fff5fbf9858, >>>> SearchPath=0x00007fff5fbf9448, RelativePath=0x00007fff5fbf9038, >>>> SuggestedModule=0x00007fff5fbf9030, IsMapped=0x00007fff5fbf9867, >>>> SkipCache=false) at PPDirectives.cpp:740 >>>> frame #6: 0x0000000102d033b4 >>>> clang-cl`clang::Preprocessor::HandleIncludeDirective(this=0x0000000111037e18, >>>> HashLoc=(ID = 9004841), IncludeTok=0x0000000115068810, >>>> LookupFrom=0x0000000000000000, LookupFromFile=0x0000000000000000, >>>> isImport=false) at PPDirectives.cpp:1773 >>>> frame #7: 0x0000000102d05e2a >>>> clang-cl`clang::Preprocessor::HandleDirective(this=0x0000000111037e18, >>>> Result=0x0000000115068810) at PPDirectives.cpp:942 >>>> frame #8: 0x0000000102cbff0f >>>> clang-cl`clang::Lexer::LexTokenInternal(this=0x000000011d98b010, >>>> Result=0x0000000115068810, TokAtPhysicalStartOfLine=true) at Lexer.cpp:3931 >>>> frame #9: 0x0000000102cbc1a8 >>>> clang-cl`clang::Lexer::Lex(this=0x000000011d98b010, >>>> Result=0x0000000115068810) at Lexer.cpp:3152 >>>> frame #10: 0x0000000102d54dbb >>>> clang-cl`clang::Preprocessor::Lex(this=0x0000000111037e18, >>>> Result=0x0000000115068810) at Preprocessor.cpp:868 >>>> frame #11: 0x0000000102f235e9 >>>> clang-cl`clang::Parser::ConsumeBrace(this=0x0000000115068800) at >>>> Parser.h:563 >>>> frame #12: 0x0000000102f2a20a >>>> clang-cl`clang::BalancedDelimiterTracker::consumeClose(this=0x00007fff5fbfa570) >>>> at RAIIObjectsForParser.h:429 >>>> frame #13: 0x0000000102e788d5 >>>> clang-cl`clang::Parser::ParseInnerNamespace(this=0x0000000115068800, >>>> InnerNSs=0x00007fff5fbfa6f0, index=0, InlineLoc=0x00007fff5fbfa7b0, >>>> attrs=0x00007fff5fbfa6c8, Tracker=0x00007fff5fbfa570) at >>>> ParseDeclCXX.cpp:250 >>>> frame #14: 0x0000000102e77dc6 >>>> clang-cl`clang::Parser::ParseNamespace(this=0x0000000115068800, >>>> Context=FileContext, DeclEnd=0x00007fff5fbfaa80, InlineLoc=(ID = 0)) at >>>> ParseDeclCXX.cpp:223 >>>> frame #15: 0x0000000102e5af19 >>>> clang-cl`clang::Parser::ParseDeclaration(this=0x0000000115068800, >>>> Context=FileContext, DeclEnd=0x00007fff5fbfaa80, attrs=0x00007fff5fbfac50) >>>> at ParseDecl.cpp:1714 >>>> frame #16: 0x0000000102f25db3 >>>> clang-cl`clang::Parser::ParseExternalDeclaration(this=0x0000000115068800, >>>> attrs=0x00007fff5fbfac50, DS=0x0000000000000000) at Parser.cpp:788 >>>> frame #17: 0x0000000102f24ef6 >>>> clang-cl`clang::Parser::ParseTopLevelDecl(this=0x0000000115068800, >>>> Result=0x00007fff5fbfad88) at Parser.cpp:609 >>>> frame #18: 0x0000000102e4a066 >>>> clang-cl`clang::ParseAST(S=0x0000000115061a00, PrintStats=false, >>>> SkipFunctionBodies=false) at ParseAST.cpp:156 >>>> frame #19: 0x0000000100add302 >>>> clang-cl`clang::ASTFrontendAction::ExecuteAction(this=0x000000011060ef90) >>>> at FrontendAction.cpp:1035 >>>> frame #20: 0x00000001004f6cad >>>> clang-cl`clang::CodeGenAction::ExecuteAction(this=0x000000011060ef90) at >>>> CodeGenAction.cpp:1047 >>>> frame #21: 0x0000000100adc910 >>>> clang-cl`clang::FrontendAction::Execute(this=0x000000011060ef90) at >>>> FrontendAction.cpp:934 >>>> frame #22: 0x0000000100a4ce3e >>>> clang-cl`clang::CompilerInstance::ExecuteAction(this=0x000000011060d050, >>>> Act=0x000000011060ef90) at CompilerInstance.cpp:954 >>>> frame #23: 0x0000000100b5c24f >>>> clang-cl`clang::ExecuteCompilerInvocation(Clang=0x000000011060d050) at >>>> ExecuteCompilerInvocation.cpp:267 >>>> frame #24: 0x0000000100001b19 clang-cl`cc1_main(Argv=ArrayRef<const >>>> char *> @ 0x00007fff5fbfb4d8, >>>> Argv0="../../../../llvm-mono-2/out/gn/bin/clang-cl", >>>> MainAddr=0x0000000100028160) at cc1_main.cpp:218 >>>> frame #25: 0x00000001000299ef >>>> clang-cl`ExecuteCC1Tool(argv=ArrayRef<const char *> @ 0x00007fff5fbfba88, >>>> Tool=(Data = "", Length = 0)) at driver.cpp:309 >>>> frame #26: 0x0000000100028ad1 clang-cl`main(argc_=408, >>>> argv_=0x00007fff5fbfd188) at driver.cpp:381 >>>> frame #27: 0x00007fffb015c235 libdyld.dylib`start + 1 >>>> frame #28: 0x00007fffb015c235 libdyld.dylib`start + 1 >>>> >>>> >>>> >>>> On Wed, Jan 23, 2019 at 12:10 PM Sam McCall <sammcc...@google.com> >>>> wrote: >>>> >>>>> Thanks! given that we don't see an earlier stat, I guess these files >>>>> were being treated as virtual (file metadata deserialized from PCH). >>>>> Previously despite the open=true these never actually got opened, and that >>>>> worked fine. >>>>> >>>>> I'm away from my computer but will verify later tonight or in the >>>>> morning (CET) and try to find a fix. If it's not obvious, we should revert >>>>> the patch at least on the release branch. >>>>> >>>>> A stack trace at the relevant breakpoint might well be useful - can't >>>>> remember if there are lots of entry points here. >>>>> >>>>> Cheers, Sam >>>>> >>>>> On Wed, Jan 23, 2019, 16:38 Nico Weber <tha...@chromium.org wrote: >>>>> >>>>>> With your patch reverted locally, at the same breakpoint I instead get >>>>>> >>>>>> $ lsof -p 95842 | wc -l >>>>>> 94 >>>>>> >>>>>> So your patch seems to increase number of open file handles by ~260%. >>>>>> >>>>>> On Wed, Jan 23, 2019 at 10:27 AM Nico Weber <tha...@chromium.org> >>>>>> wrote: >>>>>> >>>>>>> On Wed, Jan 23, 2019 at 9:54 AM Sam McCall <sammcc...@google.com> >>>>>>> wrote: >>>>>>> >>>>>>>> (Email is better than IRC if that's OK - I don't know this code >>>>>>>> that well so it takes me a while). >>>>>>>> >>>>>>>> Thanks, that's definitely interesting and not what I expected. I >>>>>>>> thought every call sequence r347205 changed the behavior of would have >>>>>>>> resulted in two calls to getStatValue(). >>>>>>>> I guess the "pch"/"main" output is printed before the corresponding >>>>>>>> lines in run.sh? >>>>>>>> >>>>>>> >>>>>>> Correct. >>>>>>> >>>>>>> >>>>>>>> Weird that we don't get any output from building the PCH, but I >>>>>>>> don't know well how PCH builds work. >>>>>>>> >>>>>>>> > It looks like FS->getCurrentWorkingDirectory() is set >>>>>>>> yet FileSystemOpts.WorkingDir.empty() is also true. Is that expected? >>>>>>>> I think so. The FileManager and the VFS each have their own concept >>>>>>>> of working directory, I guess for historical reasons. >>>>>>>> Making use of the VFS one but not the FileManager one seems >>>>>>>> reasonable. >>>>>>>> >>>>>>>> So the weirdness is that FileSystemStatCache::get() is returning >>>>>>>> true (i.e. file doesn't exist), when the file does exist. >>>>>>>> Possibilities: >>>>>>>> 1) we're serving this result from the FileSystemStatCache (and >>>>>>>> maybe it's being poisoned in a PCH-related way somehow). Except as far >>>>>>>> as I >>>>>>>> can tell, FileSystemStatCache is always null >>>>>>>> (FileManager::setStateCache >>>>>>>> has no callers). >>>>>>>> 2) the FS.openFileForRead call failed (ultimately ::open, if FS is >>>>>>>> the real FS) >>>>>>>> 3) the OwnedFile->status() call failed (ultimately ::fstat) >>>>>>>> 4) I'm misreading the code somehow >>>>>>>> >>>>>>> >>>>>>> ::open() fails with errno == 24, EMFILE. >>>>>>> >>>>>>> This log statement here: >>>>>>> >>>>>>> diff --git a/clang/lib/Basic/FileSystemStatCache.cpp >>>>>>> b/clang/lib/Basic/FileSystemStatCache.cpp >>>>>>> index d29ebb750fc..63fc4780237 100644 >>>>>>> --- a/clang/lib/Basic/FileSystemStatCache.cpp >>>>>>> +++ b/clang/lib/Basic/FileSystemStatCache.cpp >>>>>>> @@ -70,9 +70,13 @@ bool FileSystemStatCache::get(StringRef Path, >>>>>>> FileData &Data, bool isFile, >>>>>>> // >>>>>>> // Because of this, check to see if the file exists with >>>>>>> 'open'. If the >>>>>>> // open succeeds, use fstat to get the stat info. >>>>>>> - auto OwnedFile = FS.openFileForRead(Path); >>>>>>> + llvm::ErrorOr<std::unique_ptr<llvm::vfs::File>> OwnedFile = >>>>>>> + FS.openFileForRead(Path); >>>>>>> >>>>>>> if (!OwnedFile) { >>>>>>> +if (Path.endswith("scheduling_lifecycle_state.h")) { >>>>>>> +fprintf(stderr, "hmm failed %s\n", >>>>>>> OwnedFile.getError().message().c_str()); >>>>>>> +} >>>>>>> // If the open fails, our "stat" fails. >>>>>>> R = CacheMissing; >>>>>>> } else { >>>>>>> >>>>>>> >>>>>>> causes clang to print "hmm failed Too many open files". That path >>>>>>> should maybe check if `OwnedFile.getError().value() == EMFILE && >>>>>>> OwnedFile.getError().category() == std::generic_category()` on mac and >>>>>>> abort or diag or something more visible. >>>>>>> >>>>>>> `ulimit -n` on macOS is pretty small -- do you see how your patch >>>>>>> could cause clang to keep more file handles open? >>>>>>> >>>>>>> Here's how many files clang had open when I had a breakpoint in that >>>>>>> error path: >>>>>>> >>>>>>> $ lsof -p 91890 | wc -l >>>>>>> 343 >>>>>>> >>>>>>> >>>>>>> >>>>>>>> >>>>>>>> Could you find out which of these is going on? Either running in a >>>>>>>> debugger or adding some similar printfs to FileSystemStatCache::get() >>>>>>>> should be doable. >>>>>>>> I'm also going to try to work out how the patch could have affected >>>>>>>> this, but new vs correct much easier for me to compare than new vs >>>>>>>> old... >>>>>>>> >>>>>>>
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits