From ec3f384dca8755f0f71cb995def1fc2873963fba Mon Sep 17 00:00:00 2001 From: Robert O'Callahan Date: Thu, 3 Jul 2025 23:47:25 +0000 Subject: [PATCH] Remove `log_str()` functions and convert their `log_signal()` users to return `std::string` This is a small but easy step towards removing the `log_id_cache`. See issue #5210. --- kernel/drivertools.cc | 30 +++++++++++++++--------------- kernel/drivertools.h | 11 ++++++----- kernel/functional.cc | 10 +++++----- kernel/log.cc | 10 ---------- kernel/log.h | 2 -- passes/cmds/example_dt.cc | 4 ++-- 6 files changed, 28 insertions(+), 39 deletions(-) diff --git a/kernel/drivertools.cc b/kernel/drivertools.cc index b8905d68c..6290f4470 100644 --- a/kernel/drivertools.cc +++ b/kernel/drivertools.cc @@ -865,41 +865,41 @@ DriveSpec DriverMap::operator()(DriveSpec spec) return result; } -const char *log_signal(DriveChunkWire const &chunk) +std::string log_signal(DriveChunkWire const &chunk) { const char *id = log_id(chunk.wire->name); if (chunk.is_whole()) return id; if (chunk.width == 1) - return log_str(stringf("%s [%d]", id, chunk.offset)); - return log_str(stringf("%s [%d:%d]", id, chunk.offset + chunk.width - 1, chunk.offset)); + return stringf("%s [%d]", id, chunk.offset); + return stringf("%s [%d:%d]", id, chunk.offset + chunk.width - 1, chunk.offset); } -const char *log_signal(DriveChunkPort const &chunk) +std::string log_signal(DriveChunkPort const &chunk) { const char *cell_id = log_id(chunk.cell->name); const char *port_id = log_id(chunk.port); if (chunk.is_whole()) - return log_str(stringf("%s <%s>", cell_id, port_id)); + return stringf("%s <%s>", cell_id, port_id); if (chunk.width == 1) - return log_str(stringf("%s <%s> [%d]", cell_id, port_id, chunk.offset)); - return log_str(stringf("%s <%s> [%d:%d]", cell_id, port_id, chunk.offset + chunk.width - 1, chunk.offset)); + return stringf("%s <%s> [%d]", cell_id, port_id, chunk.offset); + return stringf("%s <%s> [%d:%d]", cell_id, port_id, chunk.offset + chunk.width - 1, chunk.offset); } -const char *log_signal(DriveChunkMarker const &chunk) +std::string log_signal(DriveChunkMarker const &chunk) { if (chunk.width == 1) - return log_str(stringf(" [%d]", chunk.marker, chunk.offset)); - return log_str(stringf(" [%d:%d]", chunk.marker, chunk.offset + chunk.width - 1, chunk.offset)); + return stringf(" [%d]", chunk.marker, chunk.offset); + return stringf(" [%d:%d]", chunk.marker, chunk.offset + chunk.width - 1, chunk.offset); } -const char *log_signal(DriveChunk const &chunk) +std::string log_signal(DriveChunk const &chunk) { switch (chunk.type()) { case DriveType::NONE: - return log_str(stringf("", chunk.size())); + return stringf("", chunk.size()); case DriveType::CONSTANT: return log_const(chunk.constant()); case DriveType::WIRE: @@ -917,14 +917,14 @@ const char *log_signal(DriveChunk const &chunk) str += log_signal(single); } str += ">"; - return log_str(str); + return str; } default: log_abort(); } } -const char *log_signal(DriveSpec const &spec) +std::string log_signal(DriveSpec const &spec) { auto &chunks = spec.chunks(); if (chunks.empty()) @@ -943,7 +943,7 @@ const char *log_signal(DriveSpec const &spec) } str += " }"; - return log_str(str); + return str; } YOSYS_NAMESPACE_END diff --git a/kernel/drivertools.h b/kernel/drivertools.h index d46217da5..ba7b2aa84 100644 --- a/kernel/drivertools.h +++ b/kernel/drivertools.h @@ -20,6 +20,7 @@ #ifndef DRIVERTOOLS_H #define DRIVERTOOLS_H +#include #include #include "kernel/rtlil.h" @@ -39,11 +40,11 @@ struct DriveChunk; struct DriveSpec; -const char *log_signal(DriveChunkWire const &chunk); -const char *log_signal(DriveChunkPort const &chunk); -const char *log_signal(DriveChunkMarker const &chunk); -const char *log_signal(DriveChunk const &chunk); -const char *log_signal(DriveSpec const &chunk); +std::string log_signal(DriveChunkWire const &chunk); +std::string log_signal(DriveChunkPort const &chunk); +std::string log_signal(DriveChunkMarker const &chunk); +std::string log_signal(DriveChunk const &chunk); +std::string log_signal(DriveSpec const &chunk); enum class DriveType : unsigned char { diff --git a/kernel/functional.cc b/kernel/functional.cc index adf7bfb0c..0d845631b 100644 --- a/kernel/functional.cc +++ b/kernel/functional.cc @@ -635,15 +635,15 @@ private: } } } - void undriven(const char *name) { + void undriven(const std::string& name) { log_error("The design contains an undriven signal %s. This is not supported by the functional backend. " - "Call setundef with appropriate options to avoid this error.\n", name); + "Call setundef with appropriate options to avoid this error.\n", name.c_str()); } // we perform this check separately to give better error messages that include the wire or port name void check_undriven(DriveSpec const& spec, std::string const& name) { for(auto const &chunk : spec.chunks()) if(chunk.is_none()) - undriven(name.c_str()); + undriven(name); } public: void process_queue() @@ -706,11 +706,11 @@ public: factory.update_pending(pending, node); } else if (chunk.is_multiple()) { log_error("Signal %s has multiple drivers. This is not supported by the functional backend. " - "If tristate drivers are used, call tristate -formal to avoid this error.\n", log_signal(chunk)); + "If tristate drivers are used, call tristate -formal to avoid this error.\n", log_signal(chunk).c_str()); } else if (chunk.is_none()) { undriven(log_signal(chunk)); } else { - log_error("unhandled drivespec: %s\n", log_signal(chunk)); + log_error("unhandled drivespec: %s\n", log_signal(chunk).c_str()); log_abort(); } } else { diff --git a/kernel/log.cc b/kernel/log.cc index fabbe09fd..bf7c9cefe 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -675,16 +675,6 @@ 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 e26ef072c..53da99655 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -206,8 +206,6 @@ 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 static inline const char *log_id(T *obj, const char *nullstr = nullptr) { if (nullstr && obj == nullptr) diff --git a/passes/cmds/example_dt.cc b/passes/cmds/example_dt.cc index 2870e062b..362a3bff1 100644 --- a/passes/cmds/example_dt.cc +++ b/passes/cmds/example_dt.cc @@ -173,7 +173,7 @@ struct ExampleDtPass : public Pass node.set_function(ID($$undriven)); } else { - log_error("unhandled drivespec: %s\n", log_signal(chunk)); + log_error("unhandled drivespec: %s\n", log_signal(chunk).c_str()); log_abort(); } } else { @@ -243,7 +243,7 @@ struct ExampleDtPass : public Pass log(")\n"); if (ref.has_sparse_attr()) log("// wire %s\n", log_id(ref.sparse_attr())); - log("// was #%d %s\n", ref.attr(), log_signal(queue[ref.attr()])); + log("// was #%d %s\n", ref.attr(), log_signal(queue[ref.attr()]).c_str()); } for (auto const &key : compute_graph.keys())