Improve log print
PiperOrigin-RevId: 561734464
diff --git a/sim/BUILD b/sim/BUILD
index bbc4d99..dc21c6e 100644
--- a/sim/BUILD
+++ b/sim/BUILD
@@ -20,6 +20,7 @@
"@com_google_absl//absl/functional:any_invocable",
"@com_google_absl//absl/log:check",
"@com_google_absl//absl/strings",
+ "@com_google_absl//absl/strings:str_format",
"@com_google_mpact-riscv//riscv:riscv_state",
],
)
diff --git a/sim/kelvin_state.cc b/sim/kelvin_state.cc
index 7e800cc..06b823b 100644
--- a/sim/kelvin_state.cc
+++ b/sim/kelvin_state.cc
@@ -8,6 +8,7 @@
#include <string>
#include "absl/log/check.h"
+#include "absl/strings/str_format.h"
#include "absl/strings/string_view.h"
namespace kelvin::sim {
@@ -47,6 +48,7 @@
// Print the logging message based on log_args_.
void KelvinState::PrintLog(absl::string_view format_string) {
char *print_ptr = const_cast<char *>(format_string.data());
+ std::string log_string = "";
while (*print_ptr) {
if (*print_ptr == '%') {
CHECK_GT(log_args_.size(), 0)
@@ -54,15 +56,17 @@
if (log_args_[0].type() == typeid(uint32_t)) {
switch (print_ptr[1]) {
case 'u':
- std::cout << std::dec << std::any_cast<uint32_t>(log_args_[0]);
+ log_string +=
+ absl::StrFormat("%u", std::any_cast<uint32_t>(log_args_[0]));
break;
case 'd':
- std::cout << std::dec
- << static_cast<int32_t>(
- std::any_cast<uint32_t>(log_args_[0]));
+ log_string += absl::StrFormat(
+ "%d",
+ static_cast<int32_t>(std::any_cast<uint32_t>(log_args_[0])));
break;
case 'x':
- std::cout << std::hex << std::any_cast<uint32_t>(log_args_[0]);
+ log_string +=
+ absl::StrFormat("%x", std::any_cast<uint32_t>(log_args_[0]));
break;
default:
std::cerr << "incorrect format" << std::endl;
@@ -71,17 +75,18 @@
}
if (log_args_[0].type() == typeid(std::string)) {
if (print_ptr[1] == 's') {
- std::cout << std::any_cast<std::string>(log_args_[0]);
+ log_string += std::any_cast<std::string>(log_args_[0]);
} else {
std::cerr << "incorrect format" << std::endl;
}
}
log_args_.erase(log_args_.begin());
print_ptr += 2; // skip the format specifier too.
- } else {
- std::cout << *print_ptr++;
+ } else { // Default. Just append the character from the format string.
+ log_string += *print_ptr++;
}
}
+ std::cout << log_string;
// Flush log_args_
log_args_.clear();
}
diff --git a/sim/test/kelvin_log_instructions_test.cc b/sim/test/kelvin_log_instructions_test.cc
index e868a62..e86fa35 100644
--- a/sim/test/kelvin_log_instructions_test.cc
+++ b/sim/test/kelvin_log_instructions_test.cc
@@ -160,9 +160,9 @@
}
TEST_F(KelvinLogInstructionsTest, PrintTwoArguments) {
- constexpr char kFormatString[] = "%s World %d\n";
+ constexpr char kFormatString[] = "%s World %x\n";
constexpr uint32_t kCharStream = 0x00006948; // "Hi"
- constexpr uint32_t kPrintNum = 1337;
+ constexpr uint32_t kPrintNum = 0xbaddecaf;
// Initialize memory.
auto *db = state_->db_factory()->Allocate<char>(sizeof(kFormatString));
@@ -207,7 +207,7 @@
instructions[i]->Execute(nullptr);
}
const std::string stdout_str = testing::internal::GetCapturedStdout();
- EXPECT_EQ("Hi World 1337\n", stdout_str);
+ EXPECT_EQ("Hi World baddecaf\n", stdout_str);
}
} // namespace