Use std::set instead of std::vector for TargetRegisterDescriptors

This commit is contained in:
Nav
2021-08-30 22:23:27 +01:00
parent 4c4bde45cf
commit 3b458bd12d
6 changed files with 18 additions and 22 deletions

View File

@@ -27,36 +27,31 @@ void AvrGdbRsp::loadRegisterNumberToDescriptorMapping() {
throw Exception("Unexpected general purpose register count"); throw Exception("Unexpected general purpose register count");
} }
auto& gpRegisterDescriptors = registerDescriptorsByType.at(TargetRegisterType::GENERAL_PURPOSE_REGISTER); auto& gpRegisterDescriptors = registerDescriptorsByType.at(TargetRegisterType::GENERAL_PURPOSE_REGISTER);
std::sort(
gpRegisterDescriptors.begin(),
gpRegisterDescriptors.end(),
[](const TargetRegisterDescriptor& descriptorA, const TargetRegisterDescriptor& descriptorB) {
return descriptorA.startAddress.value() < descriptorB.startAddress.value();
}
);
for (std::size_t descriptorIndex = 0; descriptorIndex < gpRegisterDescriptors.size(); descriptorIndex++) { std::size_t descriptorIndex = 0;
for (auto& descriptor : gpRegisterDescriptors) {
this->registerNumberToDescriptorMapping.insert(std::pair( this->registerNumberToDescriptorMapping.insert(std::pair(
static_cast<GdbRegisterNumber>(descriptorIndex), static_cast<GdbRegisterNumber>(descriptorIndex),
gpRegisterDescriptors[descriptorIndex] descriptor
)); ));
descriptorIndex++;
} }
this->registerNumberToDescriptorMapping.insert(std::pair( this->registerNumberToDescriptorMapping.insert(std::pair(
static_cast<GdbRegisterNumber>(32), static_cast<GdbRegisterNumber>(32),
registerDescriptorsByType.at(TargetRegisterType::STATUS_REGISTER).front() *(registerDescriptorsByType.at(TargetRegisterType::STATUS_REGISTER).begin())
)); ));
this->registerNumberToDescriptorMapping.insert(std::pair( this->registerNumberToDescriptorMapping.insert(std::pair(
static_cast<GdbRegisterNumber>(33), static_cast<GdbRegisterNumber>(33),
registerDescriptorsByType.at(TargetRegisterType::STACK_POINTER).front() *(registerDescriptorsByType.at(TargetRegisterType::STACK_POINTER).begin())
)); ));
this->registerNumberToDescriptorMapping.insert(std::pair( this->registerNumberToDescriptorMapping.insert(std::pair(
static_cast<GdbRegisterNumber>(34), static_cast<GdbRegisterNumber>(34),
registerDescriptorsByType.at(TargetRegisterType::PROGRAM_COUNTER).front() *(registerDescriptorsByType.at(TargetRegisterType::PROGRAM_COUNTER).begin())
)); ));
} }

View File

@@ -268,12 +268,12 @@ void GdbRspDebugServer::handleGdbPacket(CommandPackets::ReadRegisters& packet) {
if (packet.registerNumber.has_value()) { if (packet.registerNumber.has_value()) {
Logger::debug("Reading register number: " + std::to_string(packet.registerNumber.value())); Logger::debug("Reading register number: " + std::to_string(packet.registerNumber.value()));
descriptors.push_back(this->getRegisterDescriptorFromNumber(packet.registerNumber.value())); descriptors.insert(this->getRegisterDescriptorFromNumber(packet.registerNumber.value()));
} else { } else {
// Read all descriptors // Read all descriptors
for (auto& descriptor : registerNumberToDescriptorMapping.getMap()) { for (auto& descriptor : registerNumberToDescriptorMapping.getMap()) {
descriptors.push_back(descriptor.second); descriptors.insert(descriptor.second);
} }
} }

View File

@@ -67,7 +67,7 @@ void Avr8::loadTargetRegisterDescriptors() {
generalPurposeRegisterDescriptor.name = "R" + std::to_string(i); generalPurposeRegisterDescriptor.name = "R" + std::to_string(i);
generalPurposeRegisterDescriptor.groupName = "General Purpose CPU Registers"; generalPurposeRegisterDescriptor.groupName = "General Purpose CPU Registers";
this->targetRegisterDescriptorsByType[generalPurposeRegisterDescriptor.type].emplace_back( this->targetRegisterDescriptorsByType[generalPurposeRegisterDescriptor.type].insert(
generalPurposeRegisterDescriptor generalPurposeRegisterDescriptor
); );
} }
@@ -101,13 +101,13 @@ void Avr8::loadTargetRegisterDescriptors() {
programCounterRegisterDescriptor.groupName = "CPU"; programCounterRegisterDescriptor.groupName = "CPU";
programCounterRegisterDescriptor.description = "Program Counter"; programCounterRegisterDescriptor.description = "Program Counter";
this->targetRegisterDescriptorsByType[stackPointerRegisterDescriptor.type].emplace_back( this->targetRegisterDescriptorsByType[stackPointerRegisterDescriptor.type].insert(
stackPointerRegisterDescriptor stackPointerRegisterDescriptor
); );
this->targetRegisterDescriptorsByType[statusRegisterDescriptor.type].emplace_back( this->targetRegisterDescriptorsByType[statusRegisterDescriptor.type].insert(
statusRegisterDescriptor statusRegisterDescriptor
); );
this->targetRegisterDescriptorsByType[programCounterRegisterDescriptor.type].emplace_back( this->targetRegisterDescriptorsByType[programCounterRegisterDescriptor.type].insert(
programCounterRegisterDescriptor programCounterRegisterDescriptor
); );
} }

View File

@@ -29,7 +29,7 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
std::optional<TargetParameters> targetParameters; std::optional<TargetParameters> targetParameters;
std::map<std::string, PadDescriptor> padDescriptorsByName; std::map<std::string, PadDescriptor> padDescriptorsByName;
std::map<int, TargetVariant> targetVariantsById; std::map<int, TargetVariant> targetVariantsById;
std::map<TargetRegisterType, std::vector<TargetRegisterDescriptor>> targetRegisterDescriptorsByType; std::map<TargetRegisterType, TargetRegisterDescriptors> targetRegisterDescriptorsByType;
/** /**
* Resolves the appropriate TDF for the AVR8 target and populates this->targetDescriptionFile. * Resolves the appropriate TDF for the AVR8 target and populates this->targetDescriptionFile.

View File

@@ -15,7 +15,7 @@ namespace Bloom::Targets
std::string name; std::string name;
std::string id; std::string id;
std::uint32_t ramSize; std::uint32_t ramSize;
std::map<TargetRegisterType, std::vector<TargetRegisterDescriptor>> registerDescriptorsByType; std::map<TargetRegisterType, TargetRegisterDescriptors> registerDescriptorsByType;
std::vector<TargetVariant> variants; std::vector<TargetVariant> variants;
}; };
} }

View File

@@ -6,6 +6,7 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <map> #include <map>
#include <set>
#include "TargetMemory.hpp" #include "TargetMemory.hpp"
@@ -76,7 +77,7 @@ namespace Bloom::Targets
}; };
using TargetRegisters = std::vector<TargetRegister>; using TargetRegisters = std::vector<TargetRegister>;
using TargetRegisterDescriptors = std::vector<TargetRegisterDescriptor>; using TargetRegisterDescriptors = std::set<TargetRegisterDescriptor>;
} }
namespace std namespace std