diff --git a/kernel/log.cc b/kernel/log.cc
index 9a61e8f08..55895da06 100644
--- a/kernel/log.cc
+++ b/kernel/log.cc
@@ -662,6 +662,16 @@ const char *log_id(const RTLIL::IdString &str)
 	return p+1;
 }
 
+const char *log_str(const char *str)
+{
+	log_id_cache.push_back(strdup(str));
+	return log_id_cache.back();
+}
+
+const char *log_str(std::string const &str) {
+	return log_str(str.c_str());
+}
+
 void log_module(RTLIL::Module *module, std::string indent)
 {
 	std::stringstream buf;
diff --git a/kernel/log.h b/kernel/log.h
index 53aae58c6..4b90cf9dc 100644
--- a/kernel/log.h
+++ b/kernel/log.h
@@ -206,6 +206,8 @@ void log_check_expected();
 const char *log_signal(const RTLIL::SigSpec &sig, bool autoint = true);
 const char *log_const(const RTLIL::Const &value, bool autoint = true);
 const char *log_id(const RTLIL::IdString &id);
+const char *log_str(const char *str);
+const char *log_str(std::string const &str);
 
 template<typename T> static inline const char *log_id(T *obj, const char *nullstr = nullptr) {
 	if (nullstr && obj == nullptr)