New alignment service
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
36
src/Services/AlignmentService.cpp
Normal file
36
src/Services/AlignmentService.cpp
Normal 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
|
||||
};
|
||||
}
|
||||
}
|
||||
26
src/Services/AlignmentService.hpp
Normal file
26
src/Services/AlignmentService.hpp
Normal 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
|
||||
);
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user