From c9daab2ce4ed0f052d946cdf0fa3b29bc78cdd2b Mon Sep 17 00:00:00 2001 From: Ivan Krysak Date: Fri, 11 Feb 2022 17:39:22 +0200 Subject: [PATCH] Add `abi::Trait` specializations for arm ABIs --- include/revng/ABI/AArch64/AAPCS64.h | 72 +++++++++++++++++++++++++++++ include/revng/ABI/ARM/AAPCS.h | 67 +++++++++++++++++++++++++++ include/revng/ABI/Trait.h | 2 + 3 files changed, 141 insertions(+) create mode 100644 include/revng/ABI/AArch64/AAPCS64.h create mode 100644 include/revng/ABI/ARM/AAPCS.h diff --git a/include/revng/ABI/AArch64/AAPCS64.h b/include/revng/ABI/AArch64/AAPCS64.h new file mode 100644 index 000000000..2f41d4513 --- /dev/null +++ b/include/revng/ABI/AArch64/AAPCS64.h @@ -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 +struct Trait; + +template<> +struct Trait { + 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 diff --git a/include/revng/ABI/ARM/AAPCS.h b/include/revng/ABI/ARM/AAPCS.h new file mode 100644 index 000000000..ccf576927 --- /dev/null +++ b/include/revng/ABI/ARM/AAPCS.h @@ -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 +struct Trait; + +template<> +struct Trait { + 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 diff --git a/include/revng/ABI/Trait.h b/include/revng/ABI/Trait.h index 9b01a2865..c03771294 100644 --- a/include/revng/ABI/Trait.h +++ b/include/revng/ABI/Trait.h @@ -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"