summaryrefslogtreecommitdiffstats
path: root/clang/lib/Lex/ModuleMap.cpp
diff options
context:
space:
mode:
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>2016-03-30 23:54:25 +0000
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>2016-03-30 23:54:25 +0000
commite62cfd7c17e3985f7e273f02de56ee7bcc21578f (patch)
tree5cd18109f26f754e8f26275ce90945de45d7eeeb /clang/lib/Lex/ModuleMap.cpp
parentd712b34167624ce3ca2f96dcef8d5cd5115d0ae9 (diff)
downloadbcm5719-llvm-e62cfd7c17e3985f7e273f02de56ee7bcc21578f.tar.gz
bcm5719-llvm-e62cfd7c17e3985f7e273f02de56ee7bcc21578f.zip
[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 llvm-svn: 264971
Diffstat (limited to 'clang/lib/Lex/ModuleMap.cpp')
-rw-r--r--clang/lib/Lex/ModuleMap.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp
index 69cb574e2a0..4b782a3e8ec 100644
--- a/clang/lib/Lex/ModuleMap.cpp
+++ b/clang/lib/Lex/ModuleMap.cpp
@@ -811,6 +811,10 @@ void ModuleMap::addHeader(Module *Mod, Module::Header Header,
HeaderInfo.MarkFileModuleHeader(Header.Entry, Role,
isCompilingModuleHeader);
}
+
+ // Notify callbacks that we just added a new header.
+ for (const auto &Cb : Callbacks)
+ Cb->moduleMapAddHeader(*Header.Entry);
}
void ModuleMap::excludeHeader(Module *Mod, Module::Header Header) {
OpenPOWER on IntegriCloud