No public description

PiperOrigin-RevId: 915568086
Change-Id: I15d9e6e191a7b1678a01a9c38c7b5a224e061458
diff --git a/mpact/sim/decoder/instruction.h b/mpact/sim/decoder/instruction.h
index 9f89586..a7a4520 100644
--- a/mpact/sim/decoder/instruction.h
+++ b/mpact/sim/decoder/instruction.h
@@ -18,7 +18,7 @@
 #include <string>
 #include <vector>
 
-#include "absl/container/flat_hash_map.h"
+#include "absl/container/btree_map.h"
 #include "absl/status/statusor.h"
 #include "absl/strings/string_view.h"
 #include "mpact/sim/decoder/opcode.h"
@@ -97,7 +97,7 @@
     return disasm_format_vec_;
   }
 
-  const absl::flat_hash_map<std::string, TemplateExpression*>& attribute_map()
+  const absl::btree_map<std::string, TemplateExpression*>& attribute_map()
       const {
     return attribute_map_;
   }
@@ -112,7 +112,7 @@
   std::vector<const ResourceReference*> resource_acquire_vec_;
   std::string semfunc_code_string_;
   std::vector<DisasmFormat*> disasm_format_vec_;
-  absl::flat_hash_map<std::string, TemplateExpression*> attribute_map_;
+  absl::btree_map<std::string, TemplateExpression*> attribute_map_;
 };
 
 }  // namespace instruction_set
diff --git a/mpact/sim/decoder/slot.cc b/mpact/sim/decoder/slot.cc
index 0a8bd0e..85756e4 100644
--- a/mpact/sim/decoder/slot.cc
+++ b/mpact/sim/decoder/slot.cc
@@ -230,7 +230,9 @@
 // instructions can share attribute setter functions.
 std::string Slot::CreateAttributeLookupKey(const Instruction* inst) const {
   std::string key;
+  int count = attribute_names_.size();
   for (auto const& [name, expr] : inst->attribute_map()) {
+    count--;
     std::string value;
     auto result = expr->GetValue();
     if (!result.ok()) {
@@ -244,6 +246,9 @@
     }
     absl::StrAppend(&key, name, "[", *value_ptr, "]:");
   }
+  for (int i = 0; i < count; ++i) {
+    absl::StrAppend(&key, "[]:");
+  }
   return key;
 }
 
diff --git a/mpact/sim/util/gdbserver/gdbserver.cc b/mpact/sim/util/gdbserver/gdbserver.cc
index 378f4e5..97a895e 100644
--- a/mpact/sim/util/gdbserver/gdbserver.cc
+++ b/mpact/sim/util/gdbserver/gdbserver.cc
@@ -575,6 +575,7 @@
       halt_reason_str = "T03thread:1;";
       break;
     case *HaltReason::kProgramDone:
+    case *HaltReason::kSemihostHaltRequest:
       halt_reason_str = "W00thread:1;";
       break;
   }
@@ -721,7 +722,8 @@
   // done.
   bool all_done = true;
   for (int tid = 1; tid <= core_debug_interfaces_.size(); ++tid) {
-    all_done &= (halt_reasons_[tid - 1] == *HaltReason::kProgramDone);
+    all_done &= ((halt_reasons_[tid - 1] == *HaltReason::kProgramDone) ||
+                 (halt_reasons_[tid - 1] == *HaltReason::kSemihostHaltRequest));
   }
   if (all_done) {
     return Respond("W00");
@@ -777,6 +779,7 @@
     case *HaltReason::kUserRequest:
       return Respond(absl::StrCat("T03thread:1;", encoded_pc));
     case *HaltReason::kProgramDone:
+    case *HaltReason::kSemihostHaltRequest:
       return Respond("W00");
   }
 }