mirror of
https://github.com/YosysHQ/yosys
synced 2025-05-14 11:14:44 +00:00
Fix Crashes with GCC 15 #5088
When building `WITH_PYTHON`, where a global list of modules is maintained, deleting a module also erases the entry in said global list. This can lead to memory corruption if the global list is destructed before the module. Using `on_shutdown()` instead means the module destructor is explicitly called before the global list can be destructed, preventing the issue. Also add a comment to `Pass::~Pass()` to suggest the same for future passes that might try to use that (and see this commit in the blame if they need a reason why).
This commit is contained in:
parent
c4af97c1c4
commit
af75dce660
2 changed files with 2 additions and 1 deletions
|
@ -29,6 +29,7 @@ struct Pass
|
||||||
{
|
{
|
||||||
std::string pass_name, short_help;
|
std::string pass_name, short_help;
|
||||||
Pass(std::string name, std::string short_help = "** document me **");
|
Pass(std::string name, std::string short_help = "** document me **");
|
||||||
|
// Prefer overriding 'Pass::on_shutdown()' if possible
|
||||||
virtual ~Pass();
|
virtual ~Pass();
|
||||||
|
|
||||||
virtual void help();
|
virtual void help();
|
||||||
|
|
|
@ -28,7 +28,7 @@ std::vector<RTLIL::Design*> pushed_designs;
|
||||||
|
|
||||||
struct DesignPass : public Pass {
|
struct DesignPass : public Pass {
|
||||||
DesignPass() : Pass("design", "save, restore and reset current design") { }
|
DesignPass() : Pass("design", "save, restore and reset current design") { }
|
||||||
~DesignPass() override {
|
void on_shutdown() override {
|
||||||
for (auto &it : saved_designs)
|
for (auto &it : saved_designs)
|
||||||
delete it.second;
|
delete it.second;
|
||||||
saved_designs.clear();
|
saved_designs.clear();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue