Use a cache for log_id() memory management
authorClifford Wolf <clifford@clifford.at>
Sat, 8 Nov 2014 11:38:22 +0000 (12:38 +0100)
committerClifford Wolf <clifford@clifford.at>
Sat, 8 Nov 2014 11:38:22 +0000 (12:38 +0100)
kernel/log.cc

index 99e92e44ddff5393791842353c91225c56e079f0..9f5f03b2f15ea0507b6a75133e084f3c5dee7db5 100644 (file)
@@ -44,6 +44,7 @@ bool log_cmd_error_throw = false;
 int log_verbose_level;
 
 std::vector<int> header_count;
+std::set<RTLIL::IdString> log_id_cache;
 std::list<std::string> string_buf;
 int string_buf_size = 0;
 
@@ -214,6 +215,7 @@ void log_push()
 void log_pop()
 {
        header_count.pop_back();
+       log_id_cache.clear();
        string_buf.clear();
        string_buf_size = 0;
        log_flush();
@@ -223,6 +225,7 @@ void log_reset_stack()
 {
        while (header_count.size() > 1)
                header_count.pop_back();
+       log_id_cache.clear();
        string_buf.clear();
        string_buf_size = 0;
        log_flush();
@@ -257,8 +260,8 @@ const char *log_signal(const RTLIL::SigSpec &sig, bool autoint)
 
 const char *log_id(RTLIL::IdString str)
 {
+       log_id_cache.insert(str);
        const char *p = str.c_str();
-       log_assert(RTLIL::IdString::global_refcount_storage_[str.index_] > 1);
        if (p[0] == '\\' && p[1] != '$' && p[1] != 0)
                return p+1;
        return p;