]> granicus.if.org Git - clang/commit
[CrashReproducer] Add a module map callback for added headers
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Wed, 30 Mar 2016 23:54:25 +0000 (23:54 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Wed, 30 Mar 2016 23:54:25 +0000 (23:54 +0000)
commitfd80727d5056ec2380282081f7dbbed4cbae81ac
treeb909bdd07db64c1becda5ff0758ee04f797d61bb
parentbbf584f3c7c2c9c83fbb09d8c116a9048e729a6d
[CrashReproducer] Add a module map callback for added headers

The current ModuleDependencyCollector has a AST listener to collect
header files present in loaded modules, but this isn't enough to collect
all headers needed in the crash reproducer. One of the reasons is that
the AST writer doesn't write symbolic link header paths in the pcm modules,
this makes the listeners on the reader only able to collect the real files.

Since the module maps could contain submodules that use headers which
are symbolic links, not collecting those forbid the reproducer scripts
to regen the modules.

For instance:

usr/include/module.map:
  ...
  module pthread {
    header "pthread.h"
    export *

    module impl {
      header "pthread_impl.h"
      export *
    }
  }
  ...

usr/include/pthread/pthread_impl.h
usr/include/pthread_impl.h -> pthread/pthread_impl.h

The AST dump for the module above:

  <SUBMODULE_HEADER abbrevid=6/> blob data = 'pthread_impl.h'
  <SUBMODULE_TOPHEADER abbrevid=7/> blob data = '/<path_to_sdk>/usr/include/pthread/pthread_impl.h'

Note that we don't have "usr/include/pthread_impl.h" which is requested
by the module.map in case we want to reconstruct the module in the
reproducer. The reason the original symbolic link path isn't used is
because the headers are kept by name and requested through the
FileManager, which unique files and returns the real path only.

To fix that, add a callback to be invoked everytime a header is added
while parsing module maps and hook that up to the module dependecy
collector. This callback is only registered when generating the
reproducer.

Differential Revision: http://reviews.llvm.org/D18585

rdar://problem/24499339

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@264971 91177308-0d34-0410-b5e6-96231b3b80d8
include/clang/Frontend/Utils.h
include/clang/Lex/ModuleMap.h
lib/Frontend/ModuleDependencyCollector.cpp
lib/Lex/ModuleMap.cpp
test/Modules/crash-vfs-path-symlink-topheader.m [new file with mode: 0644]