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"); }