Skip to content
Snippets Groups Projects
  1. Mar 21, 2017
  2. Mar 20, 2017
  3. Mar 19, 2017
  4. Mar 18, 2017
  5. Mar 17, 2017
    • Duncan P. N. Exon Smith's avatar
      Modules: Cache PCMs in memory and avoid a use-after-free · 4c3cdee2
      Duncan P. N. Exon Smith authored
      Clang's internal build system for implicit modules uses lock files to
      ensure that after a process writes a PCM it will read the same one back
      in (without contention from other -cc1 commands).  Since PCMs are read
      from disk repeatedly while invalidating, building, and importing, the
      lock is not released quickly.  Furthermore, the LockFileManager is not
      robust in every environment.  Other -cc1 commands can stall until
      timeout (after about eight minutes).
      
      This commit changes the lock file from being necessary for correctness
      to a (possibly dubious) performance hack.  The remaining benefit is to
      reduce duplicate work in competing -cc1 commands which depend on the
      same module.  Follow-up commits will change the internal build system to
      continue after a timeout, and reduce the timeout.  Perhaps we should
      reconsider blocking at all.
      
      This also fixes a use-after-free, when one part of a compilation
      validates a PCM and starts using it, and another tries to swap out the
      PCM for something new.
      
      The PCMCache is a new type called MemoryBufferCache, which saves memory
      buffers based on their filename.  Its ownership is shared by the
      CompilerInstance and ModuleManager.
      
        - The ModuleManager stores PCMs there that it loads from disk, never
          touching the disk if the cache is hot.
      
        - When modules fail to validate, they're removed from the cache.
      
        - When a CompilerInstance is spawned to build a new module, each
          already-loaded PCM is assumed to be valid, and is frozen to avoid
          the use-after-free.
      
        - Any newly-built module is written directly to the cache to avoid the
          round-trip to the filesystem, making lock files unnecessary for
          correctness.
      
      Original patch by Manman Ren; most testcases by Adrian Prantl!
      
      git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@298165 91177308-0d34-0410-b5e6-96231b3b80d8
      4c3cdee2
Loading