[Lldb-commits] [PATCH] D128166: ManagedStatic: Destroy from destructor
Nicolai Hähnle via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Mon Jun 20 02:28:45 PDT 2022
nhaehnle created this revision.
Herald added a reviewer: deadalnix.
Herald added subscribers: bzcheeseman, ayermolo, sdasgup3, wenzhicui, wrengr, dcaballe, cota, teijeong, rdzhabarov, tatianashp, msifontes, jurahul, Kayjukh, grosul1, jvesely, Joonsoo, liufengdb, aartbik, mgester, arpith-jacob, antiagainst, shauheen, rriddle, mehdi_amini, mstorsjo, hiraditya, mgorny.
Herald added a reviewer: bollu.
Herald added a reviewer: MaskRay.
Herald added a reviewer: rafauler.
Herald added a reviewer: Amir.
Herald added a reviewer: maksfb.
Herald added a project: All.
nhaehnle requested review of this revision.
Herald added subscribers: lldb-commits, cfe-commits, yota9, StephenFan, stephenneuendorffer, nicolasvasilache.
Herald added projects: clang, LLDB, MLIR, LLVM.
This allows LLVM to be safely loaded and unloaded as a shared library
without leaking memory:
Consider the scenario where shared library Foo links against LLVM as
a shared library, and Foo may be loaded and unloaded multiple times
in the same process. Should Foo call llvm_shutdown or not? If it does
not, and LLVM is also loaded and unloaded multiple times, then
memory is leaked. If it does call llvm_shutdown and LLVM *isn't*
also unloaded, the state of LLVM's global statics is corrupted because
while the ManagedStatics may be re-initialized, *other* global
constructors aren't re-run.
Keep in mind that Foo itself may use ManagedStatic. If Foo is unloaded
but LLVM isn't, those statics should be destroyed.
The safe solution is to skip llvm_shutdown() altogether and destroy
managed statics from their destructor.
LLD relies on being able to call _exit() and still get some side-effects
of managed static destructors. We make this expectation much more
explicit.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D128166
Files:
bolt/tools/driver/llvm-bolt.cpp
bolt/tools/merge-fdata/merge-fdata.cpp
clang/include/clang/Frontend/CompilerInstance.h
clang/tools/clang-repl/ClangRepl.cpp
clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp
clang/unittests/Interpreter/InterpreterTest.cpp
clang/utils/TableGen/TableGen.cpp
libclc/utils/prepare-builtins.cpp
lld/Common/ErrorHandler.cpp
lldb/tools/driver/Driver.cpp
lldb/tools/lldb-test/lldb-test.cpp
lldb/unittests/Utility/LogTest.cpp
lldb/utils/TableGen/LLDBTableGen.cpp
llvm/docs/ProgrammersManual.rst
llvm/examples/BrainF/BrainFDriver.cpp
llvm/examples/HowToUseJIT/HowToUseJIT.cpp
llvm/include/llvm-c/Core.h
llvm/include/llvm/ADT/Statistic.h
llvm/include/llvm/PassRegistry.h
llvm/include/llvm/Support/DynamicLibrary.h
llvm/include/llvm/Support/FastShutdown.h
llvm/include/llvm/Support/InitLLVM.h
llvm/include/llvm/Support/ManagedStatic.h
llvm/lib/IR/Core.cpp
llvm/lib/IR/Pass.cpp
llvm/lib/IR/PassRegistry.cpp
llvm/lib/Support/CMakeLists.txt
llvm/lib/Support/FastShutdown.cpp
llvm/lib/Support/InitLLVM.cpp
llvm/lib/Support/ManagedStatic.cpp
llvm/lib/Support/Parallel.cpp
llvm/lib/Support/Statistic.cpp
llvm/lib/Support/Unix/DynamicLibrary.inc
llvm/lib/Support/Unix/Signals.inc
llvm/lib/Support/Windows/DynamicLibrary.inc
llvm/tools/gold/gold-plugin.cpp
llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
llvm/unittests/ExecutionEngine/ExecutionEngineTest.cpp
llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp
llvm/utils/KillTheDoctor/KillTheDoctor.cpp
mlir/tools/mlir-vulkan-runner/mlir-vulkan-runner.cpp
polly/lib/External/isl/interface/extract_interface.cc
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D128166.438306.patch
Type: text/x-patch
Size: 35267 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20220620/51fb4118/attachment-0001.bin>
More information about the lldb-commits
mailing list