aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--backends/blif/blif.cc2
-rw-r--r--backends/btor/btor.cc2
-rw-r--r--kernel/log.cc2
-rw-r--r--kernel/rtlil.cc2
-rw-r--r--kernel/yosys.h11
-rw-r--r--passes/cmds/show.cc2
6 files changed, 16 insertions, 5 deletions
diff --git a/backends/blif/blif.cc b/backends/blif/blif.cc
index c257e4964..af6f8726a 100644
--- a/backends/blif/blif.cc
+++ b/backends/blif/blif.cc
@@ -61,7 +61,7 @@ struct BlifDumper
{
}
- std::vector<std::string> cstr_buf;
+ vector<shared_str> cstr_buf;
const char *cstr(RTLIL::IdString id)
{
diff --git a/backends/btor/btor.cc b/backends/btor/btor.cc
index bcee505be..079a82a2f 100644
--- a/backends/btor/btor.cc
+++ b/backends/btor/btor.cc
@@ -155,7 +155,7 @@ struct BtorDumper
}
- std::vector<std::string> cstr_buf;
+ vector<shared_str> cstr_buf;
const char *cstr(const RTLIL::IdString id)
{
diff --git a/kernel/log.cc b/kernel/log.cc
index dbc94ce8c..91d857723 100644
--- a/kernel/log.cc
+++ b/kernel/log.cc
@@ -52,7 +52,7 @@ string log_last_error;
vector<int> header_count;
pool<RTLIL::IdString> log_id_cache;
-vector<string> string_buf;
+vector<shared_str> string_buf;
int string_buf_index = -1;
static struct timeval initial_tv = { 0, 0 };
diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc
index 373a3a5e6..5deef8507 100644
--- a/kernel/rtlil.cc
+++ b/kernel/rtlil.cc
@@ -147,7 +147,7 @@ RTLIL::Const RTLIL::Const::from_string(std::string str)
std::string RTLIL::Const::decode_string() const
{
std::string string;
- std::vector <char> string_chars;
+ std::vector<char> string_chars;
for (int i = 0; i < int (bits.size()); i += 8) {
char ch = 0;
for (int j = 0; j < 8 && i + j < int (bits.size()); j++)
diff --git a/kernel/yosys.h b/kernel/yosys.h
index db8161c5d..14277ade8 100644
--- a/kernel/yosys.h
+++ b/kernel/yosys.h
@@ -140,6 +140,17 @@ using std::vector;
using std::string;
using std::pair;
+// A primitive shared string implementation that does not
+// move its .c_str() when the object is copied or moved.
+struct shared_str {
+ std::shared_ptr<string> content;
+ shared_str() { }
+ shared_str(string s) { content = std::shared_ptr<string>(new string(s)); }
+ shared_str(const char *s) { content = std::shared_ptr<string>(new string(s)); }
+ const char *c_str() { return content->c_str(); }
+ const string &str() { return *content; }
+};
+
using hashlib::mkhash;
using hashlib::mkhash_init;
using hashlib::mkhash_add;
diff --git a/passes/cmds/show.cc b/passes/cmds/show.cc
index 81321665c..0bcc76893 100644
--- a/passes/cmds/show.cc
+++ b/passes/cmds/show.cc
@@ -41,7 +41,7 @@ struct ShowWorker
{
CellTypes ct;
- std::vector<std::string> dot_escape_store;
+ vector<shared_str> dot_escape_store;
std::map<RTLIL::IdString, int> dot_id2num_store;
std::map<RTLIL::IdString, int> autonames;
int single_idx_count;