diff --git a/src/Targets/CMakeLists.txt b/src/Targets/CMakeLists.txt index a818e82d..adf97167 100755 --- a/src/Targets/CMakeLists.txt +++ b/src/Targets/CMakeLists.txt @@ -2,6 +2,7 @@ target_sources( Bloom PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/TargetDescription/TargetDescriptionFile.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/TargetAddressSpaceDescriptor.cpp ${CMAKE_CURRENT_SOURCE_DIR}/TargetRegisterDescriptor.cpp ${CMAKE_CURRENT_SOURCE_DIR}/TargetMemoryCache.cpp ${CMAKE_CURRENT_SOURCE_DIR}/TargetPhysicalInterface.cpp diff --git a/src/Targets/TargetAddressSpaceDescriptor.cpp b/src/Targets/TargetAddressSpaceDescriptor.cpp new file mode 100644 index 00000000..44f016fb --- /dev/null +++ b/src/Targets/TargetAddressSpaceDescriptor.cpp @@ -0,0 +1,49 @@ +#include "TargetAddressSpaceDescriptor.hpp" + +#include "src/Exceptions/InternalFatalErrorException.hpp" + +namespace Targets +{ + TargetAddressSpaceDescriptor::TargetAddressSpaceDescriptor( + const std::string& key, + const TargetMemoryAddressRange& addressRange, + TargetMemoryEndianness endianness, + const std::map& segmentDescriptorsByKey + ) + : id(++(TargetAddressSpaceDescriptor::lastAddressSpaceDescriptorId)) + , key(key) + , addressRange(addressRange) + , endianness(endianness) + , segmentDescriptorsByKey(segmentDescriptorsByKey) + {} + + TargetMemorySize TargetAddressSpaceDescriptor::size() const { + return this->addressRange.size(); + } + + std::optional< + std::reference_wrapper + > TargetAddressSpaceDescriptor::tryGetMemorySegmentDescriptor(const std::string& key) const { + const auto segmentIt = this->segmentDescriptorsByKey.find(key); + + if (segmentIt == this->segmentDescriptorsByKey.end()) { + return std::nullopt; + } + + return std::cref(segmentIt->second); + } + + const TargetMemorySegmentDescriptor& TargetAddressSpaceDescriptor::getMemorySegmentDescriptor( + const std::string& key + ) const { + const auto segment = this->tryGetMemorySegmentDescriptor(key); + if (!segment.has_value()) { + throw Exceptions::InternalFatalErrorException( + "Failed to get memory segment descriptor \"" + key + "\" from address space \"" + this->key + + "\" - segment not found" + ); + } + + return segment->get(); + } +} diff --git a/src/Targets/TargetAddressSpaceDescriptor.hpp b/src/Targets/TargetAddressSpaceDescriptor.hpp index b05bfb49..6191d869 100644 --- a/src/Targets/TargetAddressSpaceDescriptor.hpp +++ b/src/Targets/TargetAddressSpaceDescriptor.hpp @@ -8,7 +8,6 @@ #include "TargetMemory.hpp" #include "TargetMemorySegmentDescriptor.hpp" -#include "src/Exceptions/InternalFatalErrorException.hpp" namespace Targets { @@ -28,41 +27,34 @@ namespace Targets const TargetMemoryAddressRange& addressRange, TargetMemoryEndianness endianness, const std::map& segmentDescriptorsByKey - ) - : id(++(TargetAddressSpaceDescriptor::lastAddressSpaceDescriptorId)) - , key(key) - , addressRange(addressRange) - , endianness(endianness) - , segmentDescriptorsByKey(segmentDescriptorsByKey) - {}; + ); - TargetMemorySize size() const { - return this->addressRange.size(); - } + TargetMemorySize size() const; + /** + * Attempts to fetch a memory segment descriptor with the given key. + * + * @param key + * The key of the memory segment descriptor to lookup. + * + * @return + * A reference wrapper of the memory segment descriptor, if found. Otherwise, std::nullopt. + */ std::optional> tryGetMemorySegmentDescriptor( const std::string& key - ) const { - const auto segmentIt = this->segmentDescriptorsByKey.find(key); + ) const; - if (segmentIt == this->segmentDescriptorsByKey.end()) { - return std::nullopt; - } - - return std::cref(segmentIt->second); - } - - const TargetMemorySegmentDescriptor& getMemorySegmentDescriptor(const std::string& key) const { - const auto segment = this->tryGetMemorySegmentDescriptor(key); - if (!segment.has_value()) { - throw Exceptions::InternalFatalErrorException( - "Failed to get memory segment descriptor \"" + key + "\" from address space \"" + this->key - + "\" - segment not found" - ); - } - - return segment->get(); - } + /** + * Fetches a memory segment descriptor with the given key. If the descriptor doesn't exist, an + * InternalFatalErrorException is thrown. + * + * @param key + * The key of the memory segment descriptor to lookup. + * + * @return + * A reference to the memory segment descriptor. + */ + const TargetMemorySegmentDescriptor& getMemorySegmentDescriptor(const std::string& key) const; private: static inline std::atomic lastAddressSpaceDescriptorId = 0;