[clang] adc4f62 - Revert "[clang-repl] Keep the first llvm::Module empty to avoid invalid memory access. (#89031)"

Vassil Vassilev via cfe-commits cfe-commits at lists.llvm.org
Sat Apr 20 11:27:39 PDT 2024


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:


        


More information about the cfe-commits mailing list