Use std::set instead of std::vector for TargetRegisterDescriptors
This commit is contained in:
@@ -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())
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user