Fix potential failure to invalidate instruction decoding after bp.

Updated simple assembler to allow setting data segment origin.

PiperOrigin-RevId: 805868787
Change-Id: I3b20c3897a0a0d33d3000e487058bc59f08484d7
diff --git a/mpact/sim/util/asm/simple_assembler.cc b/mpact/sim/util/asm/simple_assembler.cc
index afb2c13..8fd27f2 100644
--- a/mpact/sim/util/asm/simple_assembler.cc
+++ b/mpact/sim/util/asm/simple_assembler.cc
@@ -500,10 +500,13 @@
   uint64_t data_segment_start = 0;
   uint64_t bss_segment_start = 0;
   if ((data_section_ != nullptr) || (bss_section_ != nullptr)) {
-    data_segment_start =
-        (text_segment_start + section_address_map_[text_section_] + 4095) &
-        ~4095ULL;
-
+    if (data_segment_start_ != 0) {
+      data_segment_start = data_segment_start_;
+    } else {
+      data_segment_start =
+          (text_segment_start + section_address_map_[text_section_] + 4095) &
+          ~4095ULL;
+    }
     data_segment = writer_.segments.add();
     if (data_segment == nullptr) {
       return absl::InternalError("Failed to create elf segment for data");
diff --git a/mpact/sim/util/asm/simple_assembler.h b/mpact/sim/util/asm/simple_assembler.h
index c684685..e2ed324 100644
--- a/mpact/sim/util/asm/simple_assembler.h
+++ b/mpact/sim/util/asm/simple_assembler.h
@@ -114,6 +114,9 @@
   void set_data_address_unit(unsigned data_address_unit) {
     data_address_unit_ = data_address_unit;
   }
+  void set_data_segment_start(uint64_t data_segment_start) {
+    data_segment_start_ = data_segment_start;
+  }
 
  private:
   // Helper function to update the symbol table entries.
@@ -189,6 +192,7 @@
   absl::flat_hash_set<std::string> undefined_symbols_;
   // Data address unit - by default 1 for byte addressable.
   unsigned data_address_unit_ = 1;
+  uint64_t data_segment_start_ = 0;
 };
 
 }  // namespace assembler