This fixes github issuyes 11 and 12.

This also addresses an illegal shift amount in bit manipulation inst tests.

Minor cleanup of compiler warnings.

PiperOrigin-RevId: 818757811
Change-Id: I285eb2ada723315a92a1e65a7c4aa491aee02573
diff --git a/mpact/sim/decoder/proto_encoding_group.h b/mpact/sim/decoder/proto_encoding_group.h
index 200cd7f..d86bb7f 100644
--- a/mpact/sim/decoder/proto_encoding_group.h
+++ b/mpact/sim/decoder/proto_encoding_group.h
@@ -94,7 +94,7 @@
                                  absl::string_view message_type_name);
 
   ProtoInstructionGroup* inst_group_ = nullptr;
-  ProtoEncodingGroup* parent_ = nullptr;
+  [[maybe_unused]] ProtoEncodingGroup* parent_ = nullptr;
   DecoderErrorListener* error_listener_ = nullptr;
   FieldInfo* differentiator_ = nullptr;
   int64_t value_;
diff --git a/mpact/sim/util/asm/simple_assembler.cc b/mpact/sim/util/asm/simple_assembler.cc
index 8fd27f2..f9af385 100644
--- a/mpact/sim/util/asm/simple_assembler.cc
+++ b/mpact/sim/util/asm/simple_assembler.cc
@@ -301,12 +301,10 @@
 absl::Status SimpleAssembler::Parse(std::istream& is,
                                     ResolverInterface* zero_resolver) {
   // A trivial symbol resolver that always returns 0.
-  bool own_zero_resolver = false;
   std::function<void()> cleanup = []() {};
   if (zero_resolver == nullptr) {
     zero_resolver = new ZeroResolver(
         absl::bind_front(&SimpleAssembler::SimpleAddSymbol, this));
-    own_zero_resolver = true;
     cleanup = [zero_resolver]() { delete zero_resolver; };
   }
   // First pass of parsing the input stream. This will add symbols to the symbol
diff --git a/mpact/sim/util/program_loader/elf_program_loader.cc b/mpact/sim/util/program_loader/elf_program_loader.cc
index ec4beea..1f33b91 100644
--- a/mpact/sim/util/program_loader/elf_program_loader.cc
+++ b/mpact/sim/util/program_loader/elf_program_loader.cc
@@ -126,6 +126,12 @@
     // If the section isn 't loadable, continue.
     if (segment->get_type() != PT_LOAD) continue;
     if (segment->get_file_size() == 0) continue;
+    // Compute the destination address - use paddr if available, else use
+    // vaddr.
+    uint64_t dest_addr = segment->get_physical_address();
+    if (dest_addr == 0) {
+      dest_addr = segment->get_virtual_address();
+    }
     // Read the data from the elf file.
     if (dbg_if_ == nullptr) {  // Use memory interfaces.
       auto size = segment->get_file_size();
@@ -134,32 +140,28 @@
       if (memories_ == nullptr) {
         if (segment->get_flags() &
             PF_X) {  // Executable, so write to code memory.
-          code_memory_->Store(segment->get_virtual_address(), db);
+          code_memory_->Store(dest_addr, db);
         } else {  // Write to data memory.
-          data_memory_->Store(segment->get_virtual_address(), db);
+          data_memory_->Store(dest_addr, db);
         }
       } else {
-        int i = 0;
         for (auto& memory : *memories_) {
           if (memory.predicate_fcn(*segment)) {
             if (memory.address_fcn) {
-              memory.memory->Store(
-                  memory.address_fcn(segment->get_virtual_address()), db);
+              memory.memory->Store(memory.address_fcn(dest_addr), db);
             } else {
-              memory.memory->Store(segment->get_virtual_address(), db);
+              memory.memory->Store(dest_addr, db);
             }
             break;
           }
-          i++;
         }
       }
       db->DecRef();
       continue;
     }
     // Use debug interface.
-    auto res =
-        dbg_if_->WriteMemory(segment->get_virtual_address(),
-                             segment->get_data(), segment->get_file_size());
+    auto res = dbg_if_->WriteMemory(dest_addr, segment->get_data(),
+                                    segment->get_file_size());
     if (!res.ok() || (res.value() != segment->get_file_size())) {
       return absl::InternalError("Write error while loading elf segment");
     }