[Lldb-commits] [lldb] [lldb] Fix mod-while-iteration in IRForTarget (PR #203035)

via lldb-commits lldb-commits at lists.llvm.org
Wed Jun 10 09:24:13 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lldb

Author: Raphael Isemann (Teemperor)

<details>
<summary>Changes</summary>

We modify the IR module here while iterating over it. Use the usual list trick to delay modification until after the loop.

This was uncovered by bccd1b9cb744e5dd96ee59baa4bf4583457feea3

---
Full diff: https://github.com/llvm/llvm-project/pull/203035.diff


1 Files Affected:

- (modified) lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp (+13-7) 


``````````diff
diff --git a/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp b/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp
index 532c1f129dab3..fa2222185669b 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp
+++ b/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp
@@ -544,6 +544,9 @@ bool IRForTarget::RewriteObjCConstStrings() {
 
   ValueSymbolTable &value_symbol_table = m_module->getValueSymbolTable();
 
+  std::vector<std::pair<GlobalVariable *, GlobalVariable *>>
+      nsstring_to_cstr_list;
+
   for (StringMapEntry<llvm::Value *> &value_symbol : value_symbol_table) {
     llvm::StringRef value_name = value_symbol.first();
 
@@ -684,14 +687,17 @@ bool IRForTarget::RewriteObjCConstStrings() {
       if (!cstr_array)
         cstr_global = nullptr;
 
-      if (!RewriteObjCConstString(nsstring_global, cstr_global)) {
-        LLDB_LOG(log, "Error rewriting the constant string");
-
-        // We don't print an error message here because RewriteObjCConstString
-        // has done so for us.
+      // Queue up replacing the string as we are currently iterating
+      // over the module.
+      nsstring_to_cstr_list.emplace_back(nsstring_global, cstr_global);
+    }
+  }
 
-        return false;
-      }
+  for (const auto &nsstring_and_cstr : nsstring_to_cstr_list) {
+    auto [nsstring_global, cstr_global] = nsstring_and_cstr;
+    if (!RewriteObjCConstString(nsstring_global, cstr_global)) {
+      LLDB_LOG(log, "Error rewriting the constant string");
+      return false;
     }
   }
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/203035


More information about the lldb-commits mailing list