Author: Vassil Vassilev Date: 2024-04-20T18:26:59Z New Revision: adc4f6233df734fbe3793118ecc89d3584e0c90f
URL: https://github.com/llvm/llvm-project/commit/adc4f6233df734fbe3793118ecc89d3584e0c90f DIFF: https://github.com/llvm/llvm-project/commit/adc4f6233df734fbe3793118ecc89d3584e0c90f.diff LOG: Revert "[clang-repl] Keep the first llvm::Module empty to avoid invalid memory access. (#89031)" This reverts commit ca090452d64e229b539a66379a3be891c4e8f3d8 and 1faf3148fdef34ce0d556ec6a4049e06cbde71b3 because it broke a darwin bot. Added: Modified: clang/lib/Interpreter/IncrementalParser.cpp clang/lib/Interpreter/IncrementalParser.h Removed: ################################################################################ diff --git a/clang/lib/Interpreter/IncrementalParser.cpp b/clang/lib/Interpreter/IncrementalParser.cpp index b72005d58f8391..5eec2a2fd6d1a6 100644 --- a/clang/lib/Interpreter/IncrementalParser.cpp +++ b/clang/lib/Interpreter/IncrementalParser.cpp @@ -209,10 +209,6 @@ IncrementalParser::IncrementalParser(Interpreter &Interp, if (Err) return; CI->ExecuteAction(*Act); - - if (getCodeGen()) - CachedInCodeGenModule = GenModule(); - std::unique_ptr<ASTConsumer> IncrConsumer = std::make_unique<IncrementalASTConsumer>(Interp, CI->takeASTConsumer()); CI->setASTConsumer(std::move(IncrConsumer)); @@ -228,8 +224,11 @@ IncrementalParser::IncrementalParser(Interpreter &Interp, return; // PTU.takeError(); } - if (getCodeGen()) { - PTU->TheModule = GenModule(); + if (CodeGenerator *CG = getCodeGen()) { + std::unique_ptr<llvm::Module> M(CG->ReleaseModule()); + CG->StartModule("incr_module_" + std::to_string(PTUs.size()), + M->getContext()); + PTU->TheModule = std::move(M); assert(PTU->TheModule && "Failed to create initial PTU"); } } @@ -365,20 +364,6 @@ IncrementalParser::Parse(llvm::StringRef input) { std::unique_ptr<llvm::Module> IncrementalParser::GenModule() { static unsigned ID = 0; if (CodeGenerator *CG = getCodeGen()) { - // Clang's CodeGen is designed to work with a single llvm::Module. In many - // cases for convenience various CodeGen parts have a reference to the - // llvm::Module (TheModule or Module) which does not change when a new - // module is pushed. However, the execution engine wants to take ownership - // of the module which does not map well to CodeGen's design. To work this - // around we created an empty module to make CodeGen happy. We should make - // sure it always stays empty. - assert((!CachedInCodeGenModule || - (CachedInCodeGenModule->empty() && - CachedInCodeGenModule->global_empty() && - CachedInCodeGenModule->alias_empty() && - CachedInCodeGenModule->ifunc_empty() && - CachedInCodeGenModule->named_metadata_empty())) && - "CodeGen wrote to a readonly module"); std::unique_ptr<llvm::Module> M(CG->ReleaseModule()); CG->StartModule("incr_module_" + std::to_string(ID++), M->getContext()); return M; diff --git a/clang/lib/Interpreter/IncrementalParser.h b/clang/lib/Interpreter/IncrementalParser.h index f63bce50acd3b9..e13b74c7f65948 100644 --- a/clang/lib/Interpreter/IncrementalParser.h +++ b/clang/lib/Interpreter/IncrementalParser.h @@ -24,7 +24,6 @@ #include <memory> namespace llvm { class LLVMContext; -class Module; } // namespace llvm namespace clang { @@ -58,10 +57,6 @@ class IncrementalParser { /// of code. std::list<PartialTranslationUnit> PTUs; - /// When CodeGen is created the first llvm::Module gets cached in many places - /// and we must keep it alive. - std::unique_ptr<llvm::Module> CachedInCodeGenModule; - IncrementalParser(); public: _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits