mirror of
https://github.com/revng/revng
synced 2026-06-21 14:07:57 +00:00
Add abi::Trait specializations for arm ABIs
This commit is contained in:
committed by
Alessandro Di Federico
parent
4069d547b6
commit
c9daab2ce4
@@ -0,0 +1,72 @@
|
||||
#pragma once
|
||||
|
||||
//
|
||||
// This file is distributed under the MIT License. See LICENSE.md for details.
|
||||
//
|
||||
|
||||
#include "revng/Model/ABI.h"
|
||||
#include "revng/Model/Register.h"
|
||||
|
||||
namespace abi {
|
||||
|
||||
template<model::ABI::Values ABI>
|
||||
struct Trait;
|
||||
|
||||
template<>
|
||||
struct Trait<model::ABI::AAPCS64> {
|
||||
static constexpr auto ABI = model::ABI::AAPCS64;
|
||||
|
||||
static constexpr bool ArgumentsArePositionBased = false;
|
||||
static constexpr bool OnlyStartDoubleArgumentsFromAnEvenRegister = true;
|
||||
static constexpr bool ArgumentsCanBeSplitBetweenRegistersAndStack = true;
|
||||
static constexpr bool UsePointerToCopyForStackArguments = false;
|
||||
|
||||
static constexpr size_t MaximumGPRsPerAggregateArgument = 2;
|
||||
static constexpr size_t MaximumGPRsPerAggregateReturnValue = 2;
|
||||
static constexpr size_t MaximumGPRsPerScalarArgument = 2;
|
||||
static constexpr size_t MaximumGPRsPerScalarReturnValue = 2;
|
||||
|
||||
static constexpr std::array GeneralPurposeArgumentRegisters = {
|
||||
model::Register::x0_aarch64, model::Register::x1_aarch64,
|
||||
model::Register::x2_aarch64, model::Register::x3_aarch64,
|
||||
model::Register::x4_aarch64, model::Register::x5_aarch64,
|
||||
model::Register::x6_aarch64, model::Register::x7_aarch64
|
||||
};
|
||||
static constexpr std::array GeneralPurposeReturnValueRegisters = {
|
||||
model::Register::x0_aarch64, model::Register::x1_aarch64,
|
||||
model::Register::x2_aarch64, model::Register::x3_aarch64,
|
||||
model::Register::x4_aarch64, model::Register::x5_aarch64,
|
||||
model::Register::x6_aarch64, model::Register::x7_aarch64
|
||||
};
|
||||
|
||||
static constexpr std::array VectorArgumentRegisters = {
|
||||
model::Register::v0_aarch64, model::Register::v1_aarch64,
|
||||
model::Register::v2_aarch64, model::Register::v3_aarch64,
|
||||
model::Register::v4_aarch64, model::Register::v5_aarch64,
|
||||
model::Register::v6_aarch64, model::Register::v7_aarch64
|
||||
};
|
||||
static constexpr std::array VectorReturnValueRegisters = {
|
||||
model::Register::v0_aarch64, model::Register::v1_aarch64,
|
||||
model::Register::v2_aarch64, model::Register::v3_aarch64,
|
||||
model::Register::v4_aarch64, model::Register::v5_aarch64,
|
||||
model::Register::v6_aarch64, model::Register::v7_aarch64
|
||||
};
|
||||
|
||||
static constexpr std::array CalleeSavedRegisters = {
|
||||
model::Register::x19_aarch64, model::Register::x20_aarch64,
|
||||
model::Register::x21_aarch64, model::Register::x22_aarch64,
|
||||
model::Register::x23_aarch64, model::Register::x24_aarch64,
|
||||
model::Register::x25_aarch64, model::Register::x26_aarch64,
|
||||
model::Register::x27_aarch64, model::Register::x28_aarch64,
|
||||
model::Register::x29_aarch64, model::Register::sp_aarch64,
|
||||
model::Register::v8_aarch64, model::Register::v9_aarch64,
|
||||
model::Register::v10_aarch64, model::Register::v11_aarch64,
|
||||
model::Register::v12_aarch64, model::Register::v13_aarch64,
|
||||
model::Register::v14_aarch64, model::Register::v15_aarch64
|
||||
};
|
||||
|
||||
static constexpr auto
|
||||
ReturnValueLocationRegister = model::Register::x8_aarch64;
|
||||
};
|
||||
|
||||
} // namespace abi
|
||||
@@ -0,0 +1,67 @@
|
||||
#pragma once
|
||||
|
||||
//
|
||||
// This file is distributed under the MIT License. See LICENSE.md for details.
|
||||
//
|
||||
|
||||
#include "revng/Model/ABI.h"
|
||||
#include "revng/Model/Register.h"
|
||||
|
||||
namespace abi {
|
||||
|
||||
template<model::ABI::Values ABI>
|
||||
struct Trait;
|
||||
|
||||
template<>
|
||||
struct Trait<model::ABI::AAPCS> {
|
||||
static constexpr auto ABI = model::ABI::AAPCS;
|
||||
|
||||
static constexpr bool ArgumentsArePositionBased = false;
|
||||
static constexpr bool OnlyStartDoubleArgumentsFromAnEvenRegister = true;
|
||||
static constexpr bool ArgumentsCanBeSplitBetweenRegistersAndStack = true;
|
||||
static constexpr bool UsePointerToCopyForStackArguments = false;
|
||||
|
||||
static constexpr size_t MaximumGPRsPerAggregateArgument = 4;
|
||||
static constexpr size_t MaximumGPRsPerAggregateReturnValue = 1;
|
||||
static constexpr size_t MaximumGPRsPerScalarArgument = 4;
|
||||
static constexpr size_t MaximumGPRsPerScalarReturnValue = 4;
|
||||
|
||||
static constexpr std::array GeneralPurposeArgumentRegisters = {
|
||||
model::Register::r0_arm,
|
||||
model::Register::r1_arm,
|
||||
model::Register::r2_arm,
|
||||
model::Register::r3_arm
|
||||
};
|
||||
static constexpr std::array GeneralPurposeReturnValueRegisters = {
|
||||
model::Register::r0_arm,
|
||||
model::Register::r1_arm,
|
||||
model::Register::r2_arm,
|
||||
model::Register::r3_arm
|
||||
};
|
||||
|
||||
static constexpr std::array VectorArgumentRegisters = {
|
||||
model::Register::q0_arm,
|
||||
model::Register::q1_arm,
|
||||
model::Register::q2_arm,
|
||||
model::Register::q3_arm
|
||||
};
|
||||
static constexpr std::array VectorReturnValueRegisters = {
|
||||
model::Register::q0_arm,
|
||||
model::Register::q1_arm,
|
||||
model::Register::q2_arm,
|
||||
model::Register::q3_arm
|
||||
};
|
||||
|
||||
static constexpr std::array CalleeSavedRegisters = {
|
||||
model::Register::r4_arm, model::Register::r5_arm,
|
||||
model::Register::r6_arm, model::Register::r7_arm,
|
||||
model::Register::r8_arm, model::Register::r10_arm,
|
||||
model::Register::r11_arm, model::Register::r13_arm,
|
||||
model::Register::q4_arm, model::Register::q5_arm,
|
||||
model::Register::q6_arm, model::Register::q7_arm
|
||||
};
|
||||
|
||||
static constexpr auto ReturnValueLocationRegister = model::Register::r0_arm;
|
||||
};
|
||||
|
||||
} // namespace abi
|
||||
@@ -8,6 +8,8 @@
|
||||
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
|
||||
#include "revng/ABI/AArch64/AAPCS64.h"
|
||||
#include "revng/ABI/ARM/AAPCS.h"
|
||||
#include "revng/ABI/x86/Microsoft_x86_cdecl.h"
|
||||
#include "revng/ABI/x86/Microsoft_x86_clrcall.h"
|
||||
#include "revng/ABI/x86/Microsoft_x86_fastcall.h"
|
||||
|
||||
Reference in New Issue
Block a user