bugpoint: Don't remove modules or cells while iterating over them.
authorMarcelina Kościelnicka <mwk@0x04.net>
Tue, 21 Apr 2020 17:56:28 +0000 (19:56 +0200)
committerMarcelina Kościelnicka <mwk@0x04.net>
Tue, 21 Apr 2020 22:09:01 +0000 (00:09 +0200)
Reported by @ZirconiumX.

passes/cmds/bugpoint.cc

index ad6a07fa017325776361cf0751aa426bca403b81..a75927393cdc853ad550ebec38b1e663691a92d6 100644 (file)
@@ -133,6 +133,7 @@ struct BugpointPass : public Pass {
                int index = 0;
                if (modules)
                {
+                       Module *removed_module = nullptr;
                        for (auto module : design_copy->modules())
                        {
                                if (module->get_blackbox_attribute())
@@ -141,10 +142,14 @@ struct BugpointPass : public Pass {
                                if (index++ == seed)
                                {
                                        log("Trying to remove module %s.\n", module->name.c_str());
-                                       design_copy->remove(module);
-                                       return design_copy;
+                                       removed_module = module;
+                                       break;
                                }
                        }
+                       if (removed_module) {
+                               design_copy->remove(removed_module);
+                               return design_copy;
+                       }
                }
                if (ports)
                {
@@ -178,15 +183,20 @@ struct BugpointPass : public Pass {
                                if (mod->get_blackbox_attribute())
                                        continue;
 
+                               Cell *removed_cell = nullptr;
                                for (auto cell : mod->cells())
                                {
                                        if (index++ == seed)
                                        {
                                                log("Trying to remove cell %s.%s.\n", mod->name.c_str(), cell->name.c_str());
-                                               mod->remove(cell);
-                                               return design_copy;
+                                               removed_cell = cell;
+                                               break;
                                        }
                                }
+                               if (removed_cell) {
+                                       mod->remove(removed_cell);
+                                       return design_copy;
+                               }
                        }
                }
                if (connections)