New alignment service

This commit is contained in:
Nav
2025-01-28 00:08:38 +00:00
parent 3c1916a0c9
commit 333c927454
4 changed files with 64 additions and 0 deletions

View File

@@ -11,6 +11,7 @@ target_sources(
${CMAKE_CURRENT_SOURCE_DIR}/Services/ProcessService.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Services/StringService.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Services/IntegerService.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Services/AlignmentService.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Services/Avr8InstructionService.cpp
# Helpers & other

View File

@@ -12,6 +12,7 @@
#include "src/Targets/RiscV/Opcodes/Opcode.hpp"
#include "src/Services/AlignmentService.hpp"
#include "src/Services/StringService.hpp"
#include "src/Exceptions/InternalFatalErrorException.hpp"

View File

@@ -0,0 +1,36 @@
#include "AlignmentService.hpp"
#include <cmath>
namespace Services
{
Targets::TargetMemoryAddress AlignmentService::alignMemoryAddress(
Targets::TargetMemoryAddress address,
Targets::TargetMemorySize alignTo
) {
return (address / alignTo) * alignTo;
}
Targets::TargetMemorySize AlignmentService::alignMemorySize(
Targets::TargetMemorySize size,
Targets::TargetMemorySize alignTo
) {
return (size % alignTo) != 0
? static_cast<Targets::TargetMemorySize>(
std::ceil(static_cast<double>(size) / static_cast<double>(alignTo)) * alignTo
)
: size;
}
Targets::TargetMemoryAddressRange AlignmentService::alignAddressRange(
const Targets::TargetMemoryAddressRange& from,
Targets::TargetMemorySize alignTo
) {
const auto alignedStartAddress = AlignmentService::alignMemoryAddress(from.startAddress, alignTo);
return Targets::TargetMemoryAddressRange{
alignedStartAddress,
alignedStartAddress + AlignmentService::alignMemorySize(from.size()
+ (from.startAddress - alignedStartAddress), alignTo) - 1
};
}
}

View File

@@ -0,0 +1,26 @@
#pragma once
#include "src/Targets/TargetMemory.hpp"
#include "src/Targets/TargetMemoryAddressRange.hpp"
namespace Services
{
class AlignmentService
{
public:
static Targets::TargetMemoryAddress alignMemoryAddress(
Targets::TargetMemoryAddress address,
Targets::TargetMemorySize alignTo
);
static Targets::TargetMemorySize alignMemorySize(
Targets::TargetMemorySize size,
Targets::TargetMemorySize alignTo
);
static Targets::TargetMemoryAddressRange alignAddressRange(
const Targets::TargetMemoryAddressRange& from,
Targets::TargetMemorySize alignTo
);
};
}