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/ProcessService.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/Services/StringService.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/Services/StringService.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/Services/IntegerService.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/Services/IntegerService.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/Services/AlignmentService.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/Services/Avr8InstructionService.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/Services/Avr8InstructionService.cpp
|
||||||
|
|
||||||
# Helpers & other
|
# Helpers & other
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
#include "src/Targets/RiscV/Opcodes/Opcode.hpp"
|
#include "src/Targets/RiscV/Opcodes/Opcode.hpp"
|
||||||
|
|
||||||
|
#include "src/Services/AlignmentService.hpp"
|
||||||
#include "src/Services/StringService.hpp"
|
#include "src/Services/StringService.hpp"
|
||||||
|
|
||||||
#include "src/Exceptions/InternalFatalErrorException.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