summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2014-12-11 21:46:36 +0100
committerClifford Wolf <clifford@clifford.at>2014-12-11 21:46:36 +0100
commit7775d2806fe082626103f5abffd95fe9e1fccc27 (patch)
tree70c4e6e4e1feb80df2dbde6ca46361317dc34635
parentdf52eedb3025c5250931c29c2417fbd0129500e1 (diff)
Added IdString::destruct_guard hack
-rw-r--r--kernel/rtlil.cc1
-rw-r--r--kernel/rtlil.h13
2 files changed, 14 insertions, 0 deletions
diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc
index f5dbafe1..5c010dab 100644
--- a/kernel/rtlil.cc
+++ b/kernel/rtlil.cc
@@ -27,6 +27,7 @@
YOSYS_NAMESPACE_BEGIN
+RTLIL::IdString::destruct_guard_t RTLIL::IdString::destruct_guard;
std::vector<int> RTLIL::IdString::global_refcount_storage_;
std::vector<char*> RTLIL::IdString::global_id_storage_;
std::map<char*, int, RTLIL::IdString::char_ptr_cmp> RTLIL::IdString::global_id_index_;
diff --git a/kernel/rtlil.h b/kernel/rtlil.h
index 0157f3b7..29fa9069 100644
--- a/kernel/rtlil.h
+++ b/kernel/rtlil.h
@@ -85,6 +85,12 @@ namespace RTLIL
}
};
+ static struct destruct_guard_t {
+ bool ok = false;
+ destruct_guard_t() { ok = true; }
+ ~destruct_guard_t() { ok = false; }
+ } destruct_guard;
+
static std::vector<int> global_refcount_storage_;
static std::vector<char*> global_id_storage_;
static std::map<char*, int, char_ptr_cmp> global_id_index_;
@@ -98,6 +104,8 @@ namespace RTLIL
static inline int get_reference(const char *p)
{
+ log_assert(destruct_guard.ok);
+
if (p[0]) {
log_assert(p[1] != 0);
log_assert(p[0] == '$' || p[0] == '\\');
@@ -126,6 +134,11 @@ namespace RTLIL
static inline void put_reference(int idx)
{
+ // put_reference() may be called from destructors after the destructor of
+ // global_refcount_storage_ has been run. in this case we simply do nothing.
+ if (!destruct_guard.ok)
+ return;
+
log_assert(global_refcount_storage_.at(idx) > 0);
if (--global_refcount_storage_.at(idx) != 0)