[PassManagerBuilder] Remove global extension when a plugin is unloaded
authorElia Geretto <elia.f.geretto@gmail.com>
Wed, 29 Jan 2020 05:45:27 +0000 (05:45 +0000)
committerMehdi Amini <aminim@google.com>
Wed, 29 Jan 2020 16:15:45 +0000 (16:15 +0000)
commitab2300bc154f7bed43f85f74fd3fe31be71d90e0
treea848e2a18183e8ee5b682e11fdf3429e2cd431b8
parent87d98c149504f9b0751189744472d7cc94883960
[PassManagerBuilder] Remove global extension when a plugin is unloaded

This commit fixes PR39321.

GlobalExtensions is not guaranteed to be destroyed when optimizer plugins are unloaded. If it is indeed destroyed after a plugin is dlclose-d, the destructor of the corresponding ExtensionFn is not mapped anymore, causing a call to unmapped memory during destruction.

This commit guarantees that extensions coming from external plugins are removed from GlobalExtensions when the plugin is unloaded if GlobalExtensions has not been destroyed yet.

Differential Revision: https://reviews.llvm.org/D71959
llvm/include/llvm/Transforms/IPO/PassManagerBuilder.h
llvm/lib/Transforms/IPO/PassManagerBuilder.cpp