From 51ee2537009688aa574a53eae4a48af89ba433ef Mon Sep 17 00:00:00 2001 From: Tim Haines Date: Sun, 12 Jan 2025 09:32:56 -0600 Subject: [PATCH 1/9] Add stub --- MachRegister/CMakeLists.txt | 1 + MachRegister/type_queries/CMakeLists.txt | 1 + MachRegister/type_queries/type_query_check.h | 46 ++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 MachRegister/type_queries/CMakeLists.txt create mode 100644 MachRegister/type_queries/type_query_check.h diff --git a/MachRegister/CMakeLists.txt b/MachRegister/CMakeLists.txt index 269c510..1bbd323 100644 --- a/MachRegister/CMakeLists.txt +++ b/MachRegister/CMakeLists.txt @@ -1,3 +1,4 @@ project(MachRegister LANGUAGES CXX) add_subdirectory(base_registers) +add_subdirectory(type_queries) diff --git a/MachRegister/type_queries/CMakeLists.txt b/MachRegister/type_queries/CMakeLists.txt new file mode 100644 index 0000000..6c7cf6e --- /dev/null +++ b/MachRegister/type_queries/CMakeLists.txt @@ -0,0 +1 @@ +project(type_query LANGUAGES CXX) \ No newline at end of file diff --git a/MachRegister/type_queries/type_query_check.h b/MachRegister/type_queries/type_query_check.h new file mode 100644 index 0000000..7fe4122 --- /dev/null +++ b/MachRegister/type_queries/type_query_check.h @@ -0,0 +1,46 @@ +#ifndef DYNINST_UNIT_TESTS_MACHREGISTER_TYPE_QUERIES_H +#define DYNINST_UNIT_TESTS_MACHREGISTER_TYPE_QUERIES_H + +#include "registers/MachRegister.h" +#include "registers/abstract_regs.h" + +#include +#include + +std::ostream& operator<<(std::ostream &os, Dyninst::MachRegister const& r) { + os << r.name() << "[" << r.size() << "] (0x" << std::hex << r.val() << ")\n"; + return os; +} + +#define TYPE_QUERIES_CHECK_FALSE(reg, type_func) \ + if((reg).type_func()) { \ + std::cerr << "FAILED " #reg "." #type_func "\n"; \ + return EXIT_FAILURE; \ + } + + +#define TYPE_QUERIES_ASSERT_TRUE(reg, stmt) \ + if(!(stmt)) { \ + std::cerr << "FAILED " << reg.name() \ + << " '" #stmt "'\n"; \ + return EXIT_FAILURE; \ + } + +#define TYPE_QUERIES_CHECK(reg, type_func) \ + if(!(reg).type_func()) { \ + std::cerr << "FAILED " #reg "." #type_func "\n"; \ + return EXIT_FAILURE; \ + } \ + +#define TYPE_QUERIES_CHECK_INVALID(type_func, arch) \ +{ \ + auto bad_reg = Dyninst::InvalidReg; \ + if(Dyninst::MachRegister::type_func(arch) != bad_reg) { \ + std::cerr << "FAILED " #type_func "(" #arch ")\n"; \ + return EXIT_FAILURE; \ + } \ +} + +#endif + +#define TYPE_QUERIES_ASSERT_FALSE TYPE_QUERIES_CHECK_FALSE From 70dd247eb24bb115c38b085bcd2e9dc912273ec5 Mon Sep 17 00:00:00 2001 From: Tim Haines Date: Sun, 12 Jan 2025 09:33:24 -0600 Subject: [PATCH 2/9] Add x86 --- MachRegister/type_queries/CMakeLists.txt | 8 +- MachRegister/type_queries/x86.cpp | 290 +++++++++++++++++++++++ 2 files changed, 297 insertions(+), 1 deletion(-) create mode 100644 MachRegister/type_queries/x86.cpp diff --git a/MachRegister/type_queries/CMakeLists.txt b/MachRegister/type_queries/CMakeLists.txt index 6c7cf6e..c55d7e7 100644 --- a/MachRegister/type_queries/CMakeLists.txt +++ b/MachRegister/type_queries/CMakeLists.txt @@ -1 +1,7 @@ -project(type_query LANGUAGES CXX) \ No newline at end of file +project(type_query LANGUAGES CXX) + +add_executable(type_query_x86 x86.cpp) +target_compile_options(type_query_x86 PRIVATE ${UNIT_TESTS_WARNING_FLAGS}) +target_include_directories(type_query_x86 PRIVATE ${UNIT_TESTS_INCLUDES}) +target_link_libraries(type_query_x86 PRIVATE Dyninst::common) +add_test(NAME machregister_type_query_x86 COMMAND type_query_x86) \ No newline at end of file diff --git a/MachRegister/type_queries/x86.cpp b/MachRegister/type_queries/x86.cpp new file mode 100644 index 0000000..2f87d72 --- /dev/null +++ b/MachRegister/type_queries/x86.cpp @@ -0,0 +1,290 @@ +#include "registers/MachRegister.h" +#include "registers/x86_regs.h" +#include "type_query_check.h" + +static bool is_vec(Dyninst::MachRegister); +static bool is_x87(Dyninst::MachRegister); +static bool is_fpctl(Dyninst::MachRegister); + +namespace dreg = Dyninst::x86; +constexpr auto arch = Dyninst::Arch_x86; +using mreg = Dyninst::MachRegister; + +int main() { + TYPE_QUERIES_CHECK(dreg::eip, isPC); + TYPE_QUERIES_CHECK(mreg::getPC(arch), isPC); + + TYPE_QUERIES_CHECK(dreg::bp, isFramePointer); + TYPE_QUERIES_CHECK(dreg::ebp, isFramePointer); + TYPE_QUERIES_CHECK(mreg::getFramePointer(arch), isFramePointer); + + + TYPE_QUERIES_CHECK(dreg::sp, isStackPointer); + TYPE_QUERIES_CHECK(dreg::esp, isStackPointer); + TYPE_QUERIES_CHECK(mreg::getStackPointer(arch), isStackPointer); + + TYPE_QUERIES_CHECK(dreg::al, isSyscallNumberReg); + TYPE_QUERIES_CHECK(dreg::ah, isSyscallNumberReg); + TYPE_QUERIES_CHECK(dreg::ax, isSyscallNumberReg); + TYPE_QUERIES_CHECK(dreg::eax, isSyscallNumberReg); + TYPE_QUERIES_CHECK(mreg::getSyscallNumberReg(arch), isSyscallNumberReg); + + TYPE_QUERIES_CHECK(dreg::al, isSyscallReturnValueReg); + TYPE_QUERIES_CHECK(dreg::ah, isSyscallReturnValueReg); + TYPE_QUERIES_CHECK(dreg::ax, isSyscallReturnValueReg); + TYPE_QUERIES_CHECK(dreg::eax, isSyscallReturnValueReg); + + /********************************************************************* + * General Purpose + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::al, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::ah, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::ax, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::eax, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::bl, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::bh, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::bx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::ebx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::cl, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::ch, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::cx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::ecx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::dl, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::dh, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::dx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::edx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::si, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::esi, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::di, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::edi, isGeneralPurpose); + + TYPE_QUERIES_CHECK_FALSE(dreg::mm0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::mm7, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::xmm0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::xmm7, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::ymm0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::ymm7, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::zmm0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::zmm7, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::k0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::k7, isGeneralPurpose); + + /********************************************************************* + * Flags + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::cf, isFlag); + TYPE_QUERIES_CHECK(dreg::flag1, isFlag); + TYPE_QUERIES_CHECK(dreg::pf, isFlag); + TYPE_QUERIES_CHECK(dreg::flag3, isFlag); + TYPE_QUERIES_CHECK(dreg::af, isFlag); + TYPE_QUERIES_CHECK(dreg::flag5, isFlag); + TYPE_QUERIES_CHECK(dreg::zf, isFlag); + TYPE_QUERIES_CHECK(dreg::sf, isFlag); + TYPE_QUERIES_CHECK(dreg::tf, isFlag); + TYPE_QUERIES_CHECK(dreg::if_, isFlag); + TYPE_QUERIES_CHECK(dreg::df, isFlag); + TYPE_QUERIES_CHECK(dreg::of, isFlag); + TYPE_QUERIES_CHECK(dreg::flagc, isFlag); + TYPE_QUERIES_CHECK(dreg::flagd, isFlag); + TYPE_QUERIES_CHECK(dreg::nt_, isFlag); + TYPE_QUERIES_CHECK(dreg::flagf, isFlag); + TYPE_QUERIES_CHECK(dreg::rf, isFlag); + TYPE_QUERIES_CHECK(dreg::vm, isFlag); + TYPE_QUERIES_CHECK(dreg::ac, isFlag); + TYPE_QUERIES_CHECK(dreg::vif, isFlag); + TYPE_QUERIES_CHECK(dreg::vip, isFlag); + TYPE_QUERIES_CHECK(dreg::id, isFlag); + + /********************************************************************* + * Zero Flag + *********************************************************************/ + TYPE_QUERIES_CHECK_FALSE(dreg::flags, isZeroFlag); + TYPE_QUERIES_CHECK(dreg::zf, isZeroFlag); + TYPE_QUERIES_CHECK(mreg::getZeroFlag(arch), isZeroFlag); + + /********************************************************************* + * Control/Status + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::fcw, isControlStatus); + TYPE_QUERIES_CHECK(dreg::fsw, isControlStatus); + TYPE_QUERIES_CHECK(dreg::mxcsr, isControlStatus); + TYPE_QUERIES_CHECK(dreg::cr0, isControlStatus); + TYPE_QUERIES_CHECK(dreg::cr7, isControlStatus); + TYPE_QUERIES_CHECK(dreg::k0, isControlStatus); + TYPE_QUERIES_CHECK(dreg::k7, isControlStatus); + + TYPE_QUERIES_CHECK_FALSE(dreg::flags, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::zf, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::zf.getBaseRegister(), isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::mm0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::mm7, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::xmm0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::xmm7, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::ymm0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::ymm7, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::zmm0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::zmm7, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::eax, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::ebx, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::ecx, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::edx, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::eip, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::esp, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::eax, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::ebx, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::ecx, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::edx, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::eip, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::esp, isControlStatus); + + /********************************************************************* + * Floating-Point + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::st0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::st7, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::mm0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::mm7, isFloatingPoint); + + TYPE_QUERIES_CHECK(dreg::fcw, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::fsw, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::mxcsr, isFloatingPoint); + + TYPE_QUERIES_CHECK(dreg::xmm0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::xmm7, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::ymm0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::ymm7, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zmm0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zmm7, isFloatingPoint); + + TYPE_QUERIES_CHECK_FALSE(dreg::k0, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::k7, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::eax, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::ebx, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::ecx, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::edx, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::eip, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::esp, isFloatingPoint); + + /********************************************************************* + * Vector + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::xmm0, isVector); + TYPE_QUERIES_CHECK(dreg::xmm7, isVector); + TYPE_QUERIES_CHECK(dreg::ymm0, isVector); + TYPE_QUERIES_CHECK(dreg::ymm7, isVector); + TYPE_QUERIES_CHECK(dreg::zmm0, isVector); + TYPE_QUERIES_CHECK(dreg::zmm7, isVector); + TYPE_QUERIES_CHECK(dreg::mm0, isVector); + TYPE_QUERIES_CHECK(dreg::mm7, isVector); + TYPE_QUERIES_CHECK(dreg::k0, isVector); + TYPE_QUERIES_CHECK(dreg::k7, isVector); + TYPE_QUERIES_CHECK(dreg::mxcsr, isVector); + + TYPE_QUERIES_CHECK_FALSE(dreg::st0, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::st7, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::fcw, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::fsw, isVector); + + TYPE_QUERIES_CHECK_FALSE(dreg::flags, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::zf, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::zf.getBaseRegister(), isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::eax, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::ebx, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::ecx, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::edx, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::eip, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::esp, isVector); + + /********************************************************************* + * Filtering + *********************************************************************/ + { + for(auto reg : mreg::getAllRegistersForArch(arch)) { + if(reg.isFloatingPoint() && !reg.isControlStatus() && !reg.isVector()) { + TYPE_QUERIES_ASSERT_TRUE(reg, is_x87(reg)); + } + if(is_x87(reg)) { + TYPE_QUERIES_ASSERT_TRUE(reg, reg.isFloatingPoint() && !reg.isControlStatus() && !reg.isVector()); + } + if(reg.isVector() && !reg.isControlStatus()) { + TYPE_QUERIES_ASSERT_TRUE(reg, is_vec(reg)); + } + if(is_vec(reg)) { + TYPE_QUERIES_ASSERT_TRUE(reg, reg.isVector() && !reg.isControlStatus()); + } + if(reg.isFloatingPoint() && reg.isControlStatus()) { + TYPE_QUERIES_ASSERT_TRUE(reg, is_fpctl(reg)); + } + if(is_fpctl(reg)) { + TYPE_QUERIES_ASSERT_TRUE(reg, reg.isFloatingPoint() && reg.isControlStatus()); + } + } + } + + return EXIT_SUCCESS; +} + +static bool is_fpctl(Dyninst::MachRegister reg) { + switch(reg) { + case dreg::imxcsr: + case dreg::ifcw: + case dreg::ifsw: + return true; + } + return false; +} + +static bool is_x87(Dyninst::MachRegister reg) { + switch(reg) { + case dreg::ist0: + case dreg::ist1: + case dreg::ist2: + case dreg::ist3: + case dreg::ist4: + case dreg::ist5: + case dreg::ist6: + case dreg::ist7: + return true; + } + return false; +} + +static bool is_vec(Dyninst::MachRegister reg) { + switch(reg) { + case dreg::imm0: + case dreg::imm1: + case dreg::imm2: + case dreg::imm3: + case dreg::imm4: + case dreg::imm5: + case dreg::imm6: + case dreg::imm7: + case dreg::ixmm0: + case dreg::ixmm1: + case dreg::ixmm2: + case dreg::ixmm3: + case dreg::ixmm4: + case dreg::ixmm5: + case dreg::ixmm6: + case dreg::ixmm7: + case dreg::iymm0: + case dreg::iymm1: + case dreg::iymm2: + case dreg::iymm3: + case dreg::iymm4: + case dreg::iymm5: + case dreg::iymm6: + case dreg::iymm7: + case dreg::izmm0: + case dreg::izmm1: + case dreg::izmm2: + case dreg::izmm3: + case dreg::izmm4: + case dreg::izmm5: + case dreg::izmm6: + case dreg::izmm7: + return true; + } + return false; +} + From c6d5f8888e63f9a2439103128b4811c497c9cece Mon Sep 17 00:00:00 2001 From: Tim Haines Date: Sun, 12 Jan 2025 09:33:50 -0600 Subject: [PATCH 3/9] Add x86_64 --- MachRegister/type_queries/CMakeLists.txt | 8 +- MachRegister/type_queries/x86_64.cpp | 408 +++++++++++++++++++++++ 2 files changed, 415 insertions(+), 1 deletion(-) create mode 100644 MachRegister/type_queries/x86_64.cpp diff --git a/MachRegister/type_queries/CMakeLists.txt b/MachRegister/type_queries/CMakeLists.txt index c55d7e7..604b5b9 100644 --- a/MachRegister/type_queries/CMakeLists.txt +++ b/MachRegister/type_queries/CMakeLists.txt @@ -4,4 +4,10 @@ add_executable(type_query_x86 x86.cpp) target_compile_options(type_query_x86 PRIVATE ${UNIT_TESTS_WARNING_FLAGS}) target_include_directories(type_query_x86 PRIVATE ${UNIT_TESTS_INCLUDES}) target_link_libraries(type_query_x86 PRIVATE Dyninst::common) -add_test(NAME machregister_type_query_x86 COMMAND type_query_x86) \ No newline at end of file +add_test(NAME machregister_type_query_x86 COMMAND type_query_x86) + +add_executable(type_query_x86_64 x86_64.cpp) +target_compile_options(type_query_x86_64 PRIVATE ${UNIT_TESTS_WARNING_FLAGS}) +target_include_directories(type_query_x86_64 PRIVATE ${UNIT_TESTS_INCLUDES}) +target_link_libraries(type_query_x86_64 PRIVATE Dyninst::common) +add_test(NAME machregister_type_query_x86_64 COMMAND type_query_x86_64) diff --git a/MachRegister/type_queries/x86_64.cpp b/MachRegister/type_queries/x86_64.cpp new file mode 100644 index 0000000..47ec3f1 --- /dev/null +++ b/MachRegister/type_queries/x86_64.cpp @@ -0,0 +1,408 @@ +#include "registers/MachRegister.h" +#include "registers/x86_64_regs.h" +#include "type_query_check.h" + +static bool is_vec(Dyninst::MachRegister); +static bool is_x87(Dyninst::MachRegister); +static bool is_fpctl(Dyninst::MachRegister); + +namespace dreg = Dyninst::x86_64; +constexpr auto arch = Dyninst::Arch_x86; +using mreg = Dyninst::MachRegister; + +int main() { + TYPE_QUERIES_CHECK(dreg::eip, isPC); + TYPE_QUERIES_CHECK(dreg::rip, isPC); + TYPE_QUERIES_CHECK(mreg::getPC(arch), isPC); + + TYPE_QUERIES_CHECK(dreg::bp, isFramePointer); + TYPE_QUERIES_CHECK(dreg::ebp, isFramePointer); + TYPE_QUERIES_CHECK(dreg::rbp, isFramePointer); + TYPE_QUERIES_CHECK(mreg::getFramePointer(arch), isFramePointer); + + TYPE_QUERIES_CHECK(dreg::sp, isStackPointer); + TYPE_QUERIES_CHECK(dreg::esp, isStackPointer); + TYPE_QUERIES_CHECK(dreg::rsp, isStackPointer); + TYPE_QUERIES_CHECK(mreg::getStackPointer(arch), isStackPointer); + + TYPE_QUERIES_CHECK(dreg::al, isSyscallNumberReg); + TYPE_QUERIES_CHECK(dreg::ah, isSyscallNumberReg); + TYPE_QUERIES_CHECK(dreg::ax, isSyscallNumberReg); + TYPE_QUERIES_CHECK(dreg::eax, isSyscallNumberReg); + TYPE_QUERIES_CHECK(dreg::rax, isSyscallNumberReg); + TYPE_QUERIES_CHECK(mreg::getSyscallNumberReg(arch), isSyscallNumberReg); + + TYPE_QUERIES_CHECK(dreg::al, isSyscallReturnValueReg); + TYPE_QUERIES_CHECK(dreg::ah, isSyscallReturnValueReg); + TYPE_QUERIES_CHECK(dreg::ax, isSyscallReturnValueReg); + TYPE_QUERIES_CHECK(dreg::eax, isSyscallReturnValueReg); + TYPE_QUERIES_CHECK(dreg::rax, isSyscallReturnValueReg); + + /********************************************************************* + * Flags + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::cf, isFlag); + TYPE_QUERIES_CHECK(dreg::flag1, isFlag); + TYPE_QUERIES_CHECK(dreg::pf, isFlag); + TYPE_QUERIES_CHECK(dreg::flag3, isFlag); + TYPE_QUERIES_CHECK(dreg::af, isFlag); + TYPE_QUERIES_CHECK(dreg::flag5, isFlag); + TYPE_QUERIES_CHECK(dreg::zf, isFlag); + TYPE_QUERIES_CHECK(dreg::sf, isFlag); + TYPE_QUERIES_CHECK(dreg::tf, isFlag); + TYPE_QUERIES_CHECK(dreg::if_, isFlag); + TYPE_QUERIES_CHECK(dreg::df, isFlag); + TYPE_QUERIES_CHECK(dreg::of, isFlag); + TYPE_QUERIES_CHECK(dreg::flagc, isFlag); + TYPE_QUERIES_CHECK(dreg::flagd, isFlag); + TYPE_QUERIES_CHECK(dreg::nt_, isFlag); + TYPE_QUERIES_CHECK(dreg::flagf, isFlag); + TYPE_QUERIES_CHECK(dreg::rf, isFlag); + TYPE_QUERIES_CHECK(dreg::vm, isFlag); + TYPE_QUERIES_CHECK(dreg::ac, isFlag); + TYPE_QUERIES_CHECK(dreg::vif, isFlag); + TYPE_QUERIES_CHECK(dreg::vip, isFlag); + TYPE_QUERIES_CHECK(dreg::id, isFlag); + + /********************************************************************* + * Zero Flag + *********************************************************************/ + TYPE_QUERIES_CHECK_FALSE(dreg::flags, isZeroFlag); + TYPE_QUERIES_CHECK(dreg::zf, isZeroFlag); + TYPE_QUERIES_CHECK(mreg::getZeroFlag(arch), isZeroFlag); + + + /********************************************************************* + * General Purpose + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::al, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::ah, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::ax, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::eax, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::rax, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::bl, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::bh, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::bx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::ebx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::rbx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::cl, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::ch, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::cx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::ecx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::rcx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::dl, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::dh, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::dx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::edx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::rdx, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::si, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::esi, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::rsi, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::sil, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::di, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::edi, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::rdi, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::dil, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r8, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r8b, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r8w, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r8d, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r9, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r9b, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r9w, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r9d, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r10, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r10b, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r10w, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r10d, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r11, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r11b, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r11w, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r11d, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r12, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r12b, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r12w, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r12d, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r13, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r13b, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r13w, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r13d, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r14, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r14b, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r14w, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r14d, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r15, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r15b, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r15w, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::r15d, isGeneralPurpose); + + TYPE_QUERIES_CHECK_FALSE(dreg::mm0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::mm7, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::xmm0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::xmm31, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::ymm0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::ymm31, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::zmm0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::zmm31, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::k0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(dreg::k7, isGeneralPurpose); + + /********************************************************************* + * Control/Status + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::fcw, isControlStatus); + TYPE_QUERIES_CHECK(dreg::fsw, isControlStatus); + TYPE_QUERIES_CHECK(dreg::mxcsr, isControlStatus); + TYPE_QUERIES_CHECK(dreg::cr0, isControlStatus); + TYPE_QUERIES_CHECK(dreg::cr7, isControlStatus); + TYPE_QUERIES_CHECK(dreg::k0, isControlStatus); + TYPE_QUERIES_CHECK(dreg::k7, isControlStatus); + + TYPE_QUERIES_CHECK_FALSE(dreg::flags, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::zf, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::zf.getBaseRegister(), isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::mm0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::mm7, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::xmm0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::xmm31, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::ymm0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::ymm31, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::zmm0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::zmm31, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::rax, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::rbx, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::rcx, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::rdx, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::rip, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::rsp, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::rax, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::rbx, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::rcx, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::rdx, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::rip, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(dreg::rsp, isControlStatus); + + /********************************************************************* + * Floating-Point + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::st0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::st7, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::mm0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::mm7, isFloatingPoint); + + TYPE_QUERIES_CHECK(dreg::fcw, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::fsw, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::mxcsr, isFloatingPoint); + + TYPE_QUERIES_CHECK(dreg::xmm0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::xmm31, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::ymm0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::ymm31, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zmm0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zmm31, isFloatingPoint); + + TYPE_QUERIES_CHECK_FALSE(dreg::k0, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::k7, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::rax, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::rbx, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::rcx, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::rdx, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::rip, isFloatingPoint); + TYPE_QUERIES_CHECK_FALSE(dreg::rsp, isFloatingPoint); + + /********************************************************************* + * Vector + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::xmm0, isVector); + TYPE_QUERIES_CHECK(dreg::xmm31, isVector); + TYPE_QUERIES_CHECK(dreg::ymm0, isVector); + TYPE_QUERIES_CHECK(dreg::ymm31, isVector); + TYPE_QUERIES_CHECK(dreg::zmm0, isVector); + TYPE_QUERIES_CHECK(dreg::zmm31, isVector); + TYPE_QUERIES_CHECK(dreg::mm0, isVector); + TYPE_QUERIES_CHECK(dreg::mm7, isVector); + TYPE_QUERIES_CHECK(dreg::k0, isVector); + TYPE_QUERIES_CHECK(dreg::k7, isVector); + TYPE_QUERIES_CHECK(dreg::mxcsr, isVector); + + TYPE_QUERIES_CHECK_FALSE(dreg::st0, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::st7, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::fcw, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::fsw, isVector); + + TYPE_QUERIES_CHECK_FALSE(dreg::flags, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::zf, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::zf.getBaseRegister(), isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::rax, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::rbx, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::rcx, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::rdx, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::rip, isVector); + TYPE_QUERIES_CHECK_FALSE(dreg::rsp, isVector); + + /********************************************************************* + * Filtering + *********************************************************************/ + { + using mreg = Dyninst::MachRegister; + for(auto reg : mreg::getAllRegistersForArch(Dyninst::Arch_x86_64)) { + if(reg.isFloatingPoint() && !reg.isControlStatus() && !reg.isVector()) { + TYPE_QUERIES_ASSERT_TRUE(reg, is_x87(reg)); + } + if(is_x87(reg)) { + TYPE_QUERIES_ASSERT_TRUE(reg, reg.isFloatingPoint() && !reg.isControlStatus() && !reg.isVector()); + } + if(reg.isVector() && !reg.isControlStatus()) { + TYPE_QUERIES_ASSERT_TRUE(reg, is_vec(reg)); + } + if(is_vec(reg)) { + TYPE_QUERIES_ASSERT_TRUE(reg, reg.isVector() && !reg.isControlStatus()); + } + if(reg.isFloatingPoint() && reg.isControlStatus()) { + TYPE_QUERIES_ASSERT_TRUE(reg, is_fpctl(reg)); + } + if(is_fpctl(reg)) { + TYPE_QUERIES_ASSERT_TRUE(reg, reg.isFloatingPoint() && reg.isControlStatus()); + } + } + } + + return EXIT_SUCCESS; +} + +static bool is_fpctl(Dyninst::MachRegister reg) { + switch(reg) { + case dreg::imxcsr: + case dreg::ifcw: + case dreg::ifsw: + return true; + } + return false; +} + +static bool is_x87(Dyninst::MachRegister reg) { + switch(reg) { + case dreg::ist0: + case dreg::ist1: + case dreg::ist2: + case dreg::ist3: + case dreg::ist4: + case dreg::ist5: + case dreg::ist6: + case dreg::ist7: + return true; + } + return false; +} + +static bool is_vec(Dyninst::MachRegister reg) { + switch(reg) { + case dreg::imm0: + case dreg::imm1: + case dreg::imm2: + case dreg::imm3: + case dreg::imm4: + case dreg::imm5: + case dreg::imm6: + case dreg::imm7: + case dreg::ixmm0: + case dreg::ixmm1: + case dreg::ixmm2: + case dreg::ixmm3: + case dreg::ixmm4: + case dreg::ixmm5: + case dreg::ixmm6: + case dreg::ixmm7: + case dreg::ixmm8: + case dreg::ixmm9: + case dreg::ixmm10: + case dreg::ixmm11: + case dreg::ixmm12: + case dreg::ixmm13: + case dreg::ixmm14: + case dreg::ixmm15: + case dreg::ixmm16: + case dreg::ixmm17: + case dreg::ixmm18: + case dreg::ixmm19: + case dreg::ixmm20: + case dreg::ixmm21: + case dreg::ixmm22: + case dreg::ixmm23: + case dreg::ixmm24: + case dreg::ixmm25: + case dreg::ixmm26: + case dreg::ixmm27: + case dreg::ixmm28: + case dreg::ixmm29: + case dreg::ixmm30: + case dreg::ixmm31: + case dreg::iymm0: + case dreg::iymm1: + case dreg::iymm2: + case dreg::iymm3: + case dreg::iymm4: + case dreg::iymm5: + case dreg::iymm6: + case dreg::iymm7: + case dreg::iymm8: + case dreg::iymm9: + case dreg::iymm10: + case dreg::iymm11: + case dreg::iymm12: + case dreg::iymm13: + case dreg::iymm14: + case dreg::iymm15: + case dreg::iymm16: + case dreg::iymm17: + case dreg::iymm18: + case dreg::iymm19: + case dreg::iymm20: + case dreg::iymm21: + case dreg::iymm22: + case dreg::iymm23: + case dreg::iymm24: + case dreg::iymm25: + case dreg::iymm26: + case dreg::iymm27: + case dreg::iymm28: + case dreg::iymm29: + case dreg::iymm30: + case dreg::iymm31: + case dreg::izmm0: + case dreg::izmm1: + case dreg::izmm2: + case dreg::izmm3: + case dreg::izmm4: + case dreg::izmm5: + case dreg::izmm6: + case dreg::izmm7: + case dreg::izmm8: + case dreg::izmm9: + case dreg::izmm10: + case dreg::izmm11: + case dreg::izmm12: + case dreg::izmm13: + case dreg::izmm14: + case dreg::izmm15: + case dreg::izmm16: + case dreg::izmm17: + case dreg::izmm18: + case dreg::izmm19: + case dreg::izmm20: + case dreg::izmm21: + case dreg::izmm22: + case dreg::izmm23: + case dreg::izmm24: + case dreg::izmm25: + case dreg::izmm26: + case dreg::izmm27: + case dreg::izmm28: + case dreg::izmm29: + case dreg::izmm30: + case dreg::izmm31: + return true; + } + return false; +} + From 1b13c57cd425e58cb763506accbb61b9300909c9 Mon Sep 17 00:00:00 2001 From: Tim Haines Date: Sun, 12 Jan 2025 09:34:25 -0600 Subject: [PATCH 4/9] Add ppc64 --- MachRegister/type_queries/CMakeLists.txt | 6 ++ MachRegister/type_queries/ppc64.cpp | 132 +++++++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 MachRegister/type_queries/ppc64.cpp diff --git a/MachRegister/type_queries/CMakeLists.txt b/MachRegister/type_queries/CMakeLists.txt index 604b5b9..56a8441 100644 --- a/MachRegister/type_queries/CMakeLists.txt +++ b/MachRegister/type_queries/CMakeLists.txt @@ -11,3 +11,9 @@ target_compile_options(type_query_x86_64 PRIVATE ${UNIT_TESTS_WARNING_FLAGS}) target_include_directories(type_query_x86_64 PRIVATE ${UNIT_TESTS_INCLUDES}) target_link_libraries(type_query_x86_64 PRIVATE Dyninst::common) add_test(NAME machregister_type_query_x86_64 COMMAND type_query_x86_64) + +add_executable(type_query_ppc64 ppc64.cpp) +target_compile_options(type_query_ppc64 PRIVATE ${UNIT_TESTS_WARNING_FLAGS}) +target_include_directories(type_query_ppc64 PRIVATE ${UNIT_TESTS_INCLUDES}) +target_link_libraries(type_query_ppc64 PRIVATE Dyninst::common) +add_test(NAME machregister_type_query_ppc64 COMMAND type_query_ppc64) diff --git a/MachRegister/type_queries/ppc64.cpp b/MachRegister/type_queries/ppc64.cpp new file mode 100644 index 0000000..aca4f13 --- /dev/null +++ b/MachRegister/type_queries/ppc64.cpp @@ -0,0 +1,132 @@ +#include "registers/MachRegister.h" +#include "registers/ppc64_regs.h" +#include "type_query_check.h" +#include + +constexpr auto arch = Dyninst::Arch_ppc64; +using mreg = Dyninst::MachRegister; + +int main() { + TYPE_QUERIES_CHECK(Dyninst::ppc64::pc, isPC); + TYPE_QUERIES_CHECK(mreg::getPC(arch), isPC); + + TYPE_QUERIES_CHECK(Dyninst::ppc64::r1, isFramePointer); + TYPE_QUERIES_CHECK(mreg::getFramePointer(arch), isFramePointer); + + TYPE_QUERIES_CHECK(Dyninst::ppc64::r1, isStackPointer); + TYPE_QUERIES_CHECK(mreg::getStackPointer(arch), isStackPointer); + + TYPE_QUERIES_CHECK(Dyninst::ppc64::r0, isSyscallNumberReg); + TYPE_QUERIES_CHECK(mreg::getSyscallNumberReg(arch), isSyscallNumberReg); + + TYPE_QUERIES_CHECK(Dyninst::ppc64::r3, isSyscallReturnValueReg); + TYPE_QUERIES_CHECK(mreg::getSyscallReturnValueReg(arch), isSyscallReturnValueReg); + + /********************************************************************* + * General Purpose + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::ppc64::r0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::ppc64::r31, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(Dyninst::ppc64::fpr0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(Dyninst::ppc64::fpr1, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(Dyninst::ppc64::fsr0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(Dyninst::ppc64::fsr1, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(Dyninst::ppc64::vsr0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(Dyninst::ppc64::vsr63, isGeneralPurpose); + + /********************************************************************* + * Flags + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr0l, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr0g, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr0e, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr0s, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr7l, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr7g, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr7e, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr7s, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr0, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr7, isFlag); + TYPE_QUERIES_CHECK_FALSE(Dyninst::ppc64::fpscw, isFlag); + + /********************************************************************* + * Zero Flag + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr0e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr1e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr2e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr3e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr4e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr5e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr6e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc64::cr7e, isZeroFlag); + + /********************************************************************* + * Control/Status + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::ppc64::ctr, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc64::fpscw, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc64::fpscw0, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc64::fpscw1, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc64::fpscw2, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc64::fpscw3, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc64::fpscw4, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc64::fpscw5, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc64::fpscw6, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc64::fpscw7, isControlStatus); + + /********************************************************************* + * Floating-Point + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::ppc64::fpr0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::ppc64::fpr31, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::ppc64::fsr0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::ppc64::fsr31, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::ppc64::vsr0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::ppc64::vsr63, isFloatingPoint); + + /********************************************************************* + * Vector + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::ppc64::vsr0, isVector); + TYPE_QUERIES_CHECK(Dyninst::ppc64::vsr63, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::ppc64::fpscw, isVector); + + /********************************************************************* + * Filtering + *********************************************************************/ + { + auto is_arithmetic_vector = [](mreg reg) { + auto const base = reg.getBaseRegister(); + return base == Dyninst::ppc64::vsr0; + }; + auto is_arithmetic_float = [](mreg reg) { + auto const base = reg.getBaseRegister(); + auto const cat = reg.regClass(); + if(cat == Dyninst::ppc64::FPR) { + return base == Dyninst::ppc64::fpr0; + } + if(cat == Dyninst::ppc64::FSR) { + return base == Dyninst::ppc64::fsr0; + } + return false; + }; + + for(auto reg : mreg::getAllRegistersForArch(arch)) { + if(reg.isVector() && !reg.isControlStatus()) { + TYPE_QUERIES_ASSERT_TRUE(reg, is_arithmetic_vector(reg)); + } + if(is_arithmetic_vector(reg)) { + TYPE_QUERIES_ASSERT_TRUE(reg, reg.isVector() && !reg.isControlStatus()); + } + if(reg.isFloatingPoint() && !reg.isVector() && !reg.isControlStatus()) { + TYPE_QUERIES_ASSERT_TRUE(reg, is_arithmetic_float(reg)); + } + if(is_arithmetic_float(reg)) { + TYPE_QUERIES_ASSERT_TRUE(reg, reg.isFloatingPoint() && !reg.isVector() && !reg.isControlStatus()); + } + } + } + return EXIT_SUCCESS; +} From e5dc8e170095006ad6ac656235d24677830a0294 Mon Sep 17 00:00:00 2001 From: Tim Haines Date: Sun, 12 Jan 2025 09:34:43 -0600 Subject: [PATCH 5/9] Add ppc32 --- MachRegister/type_queries/CMakeLists.txt | 6 ++ MachRegister/type_queries/ppc32.cpp | 111 +++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 MachRegister/type_queries/ppc32.cpp diff --git a/MachRegister/type_queries/CMakeLists.txt b/MachRegister/type_queries/CMakeLists.txt index 56a8441..5807458 100644 --- a/MachRegister/type_queries/CMakeLists.txt +++ b/MachRegister/type_queries/CMakeLists.txt @@ -17,3 +17,9 @@ target_compile_options(type_query_ppc64 PRIVATE ${UNIT_TESTS_WARNING_FLAGS}) target_include_directories(type_query_ppc64 PRIVATE ${UNIT_TESTS_INCLUDES}) target_link_libraries(type_query_ppc64 PRIVATE Dyninst::common) add_test(NAME machregister_type_query_ppc64 COMMAND type_query_ppc64) + +add_executable(type_query_ppc32 ppc32.cpp) +target_compile_options(type_query_ppc32 PRIVATE ${UNIT_TESTS_WARNING_FLAGS}) +target_include_directories(type_query_ppc32 PRIVATE ${UNIT_TESTS_INCLUDES}) +target_link_libraries(type_query_ppc32 PRIVATE Dyninst::common) +add_test(NAME machregister_type_query_ppc32 COMMAND type_query_ppc32) diff --git a/MachRegister/type_queries/ppc32.cpp b/MachRegister/type_queries/ppc32.cpp new file mode 100644 index 0000000..d57a60c --- /dev/null +++ b/MachRegister/type_queries/ppc32.cpp @@ -0,0 +1,111 @@ +#include "registers/MachRegister.h" +#include "registers/ppc32_regs.h" +#include "type_query_check.h" +#include + +constexpr auto arch = Dyninst::Arch_ppc32; +using mreg = Dyninst::MachRegister; + +int main() { + TYPE_QUERIES_CHECK(Dyninst::ppc32::pc, isPC); + TYPE_QUERIES_CHECK(mreg::getPC(arch), isPC); + + TYPE_QUERIES_CHECK(Dyninst::ppc32::r1, isFramePointer); + TYPE_QUERIES_CHECK(mreg::getFramePointer(arch), isFramePointer); + + TYPE_QUERIES_CHECK(Dyninst::ppc32::r1, isStackPointer); + TYPE_QUERIES_CHECK(mreg::getStackPointer(arch), isStackPointer); + + TYPE_QUERIES_CHECK(Dyninst::ppc32::r0, isSyscallNumberReg); + TYPE_QUERIES_CHECK(mreg::getSyscallNumberReg(arch), isSyscallNumberReg); + + TYPE_QUERIES_CHECK(Dyninst::ppc32::r3, isSyscallReturnValueReg); + TYPE_QUERIES_CHECK(mreg::getSyscallReturnValueReg(arch), isSyscallReturnValueReg); + + /********************************************************************* + * General Purpose + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::ppc32::r0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::ppc32::r31, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(Dyninst::ppc32::fpr0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(Dyninst::ppc32::fpr1, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(Dyninst::ppc32::fsr0, isGeneralPurpose); + TYPE_QUERIES_CHECK_FALSE(Dyninst::ppc32::fsr1, isGeneralPurpose); + + /********************************************************************* + * Flags + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr0l, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr0g, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr0e, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr0s, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr7l, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr7g, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr7e, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr7s, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr0, isFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr7, isFlag); + TYPE_QUERIES_CHECK_FALSE(Dyninst::ppc32::fpscw, isFlag); + + /********************************************************************* + * Zero Flag + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr0e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr1e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr2e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr3e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr4e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr5e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr6e, isZeroFlag); + TYPE_QUERIES_CHECK(Dyninst::ppc32::cr7e, isZeroFlag); + + /********************************************************************* + * Control/Status + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::ppc32::ctr, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc32::fpscw, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc32::fpscw0, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc32::fpscw1, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc32::fpscw2, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc32::fpscw3, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc32::fpscw4, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc32::fpscw5, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc32::fpscw6, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::ppc32::fpscw7, isControlStatus); + + /********************************************************************* + * Floating-Point + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::ppc32::fpr0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::ppc32::fpr31, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::ppc32::fsr0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::ppc32::fsr31, isFloatingPoint); + + /********************************************************************* + * Filtering + *********************************************************************/ + { + auto is_arithmetic_float = [](mreg reg) { + auto const base = reg.getBaseRegister(); + auto const cat = reg.regClass(); + if(cat == Dyninst::ppc32::FPR) { + return base == Dyninst::ppc32::fpr0; + } + if(cat == Dyninst::ppc32::FSR) { + return base == Dyninst::ppc32::fsr0; + } + return false; + }; + + for(auto reg : mreg::getAllRegistersForArch(arch)) { + if(reg.isFloatingPoint() && !reg.isVector() && !reg.isControlStatus()) { + TYPE_QUERIES_ASSERT_TRUE(reg, is_arithmetic_float(reg)); + } + if(is_arithmetic_float(reg)) { + TYPE_QUERIES_ASSERT_TRUE(reg, reg.isFloatingPoint() && !reg.isVector() && !reg.isControlStatus()); + } + } + } + return EXIT_SUCCESS; +} From e624396027049a1635067163c448c0c9bb343fb3 Mon Sep 17 00:00:00 2001 From: Tim Haines Date: Sun, 12 Jan 2025 09:35:02 -0600 Subject: [PATCH 6/9] Add aarch64 --- MachRegister/type_queries/CMakeLists.txt | 6 + MachRegister/type_queries/aarch64.cpp | 223 +++++++++++++++++++++++ 2 files changed, 229 insertions(+) create mode 100644 MachRegister/type_queries/aarch64.cpp diff --git a/MachRegister/type_queries/CMakeLists.txt b/MachRegister/type_queries/CMakeLists.txt index 5807458..d1725f7 100644 --- a/MachRegister/type_queries/CMakeLists.txt +++ b/MachRegister/type_queries/CMakeLists.txt @@ -23,3 +23,9 @@ target_compile_options(type_query_ppc32 PRIVATE ${UNIT_TESTS_WARNING_FLAGS}) target_include_directories(type_query_ppc32 PRIVATE ${UNIT_TESTS_INCLUDES}) target_link_libraries(type_query_ppc32 PRIVATE Dyninst::common) add_test(NAME machregister_type_query_ppc32 COMMAND type_query_ppc32) + +add_executable(type_query_aarch64 aarch64.cpp) +target_compile_options(type_query_aarch64 PRIVATE ${UNIT_TESTS_WARNING_FLAGS}) +target_include_directories(type_query_aarch64 PRIVATE ${UNIT_TESTS_INCLUDES}) +target_link_libraries(type_query_aarch64 PRIVATE Dyninst::common) +add_test(NAME machregister_type_query_aarch64 COMMAND type_query_aarch64) diff --git a/MachRegister/type_queries/aarch64.cpp b/MachRegister/type_queries/aarch64.cpp new file mode 100644 index 0000000..cc0e628 --- /dev/null +++ b/MachRegister/type_queries/aarch64.cpp @@ -0,0 +1,223 @@ +#include "registers/MachRegister.h" +#include "registers/aarch64_regs.h" +#include "type_query_check.h" +#include + +static bool is_arithmetic_vector(Dyninst::MachRegister); + +namespace dreg = Dyninst::aarch64; +constexpr auto arch = Dyninst::Arch_aarch64; +using mreg = Dyninst::MachRegister; + +int main() { + TYPE_QUERIES_CHECK(dreg::pc, isPC); + TYPE_QUERIES_CHECK(mreg::getPC(arch), isPC); + + TYPE_QUERIES_CHECK(dreg::x29, isFramePointer); + TYPE_QUERIES_CHECK(dreg::fp, isFramePointer); + TYPE_QUERIES_CHECK(mreg::getFramePointer(arch), isFramePointer); + + TYPE_QUERIES_CHECK(dreg::sp, isStackPointer); + TYPE_QUERIES_CHECK(dreg::wsp, isStackPointer); + TYPE_QUERIES_CHECK(dreg::wsp.getBaseRegister(), isStackPointer); + TYPE_QUERIES_CHECK(mreg::getStackPointer(arch), isStackPointer); + + TYPE_QUERIES_CHECK(dreg::w8, isSyscallNumberReg); + TYPE_QUERIES_CHECK(dreg::x8, isSyscallNumberReg); + TYPE_QUERIES_CHECK(mreg::getSyscallNumberReg(arch), isSyscallNumberReg); + + TYPE_QUERIES_CHECK(dreg::w0, isSyscallReturnValueReg); + TYPE_QUERIES_CHECK(dreg::x0, isSyscallReturnValueReg); + + /********************************************************************* + * General Purpose + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::w0, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::w30, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::x0, isGeneralPurpose); + TYPE_QUERIES_CHECK(dreg::x30, isGeneralPurpose); + + /********************************************************************* + * Flags + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::pstate, isFlag); + TYPE_QUERIES_CHECK(dreg::n, isFlag); + TYPE_QUERIES_CHECK(dreg::z, isFlag); + TYPE_QUERIES_CHECK(dreg::c, isFlag); + TYPE_QUERIES_CHECK(dreg::v, isFlag); + TYPE_QUERIES_CHECK(dreg::pstate.getBaseRegister(), isFlag); + TYPE_QUERIES_CHECK(dreg::n.getBaseRegister(), isFlag); + TYPE_QUERIES_CHECK(dreg::z.getBaseRegister(), isFlag); + TYPE_QUERIES_CHECK(dreg::c.getBaseRegister(), isFlag); + TYPE_QUERIES_CHECK(dreg::v.getBaseRegister(), isFlag); + + /********************************************************************* + * Zero Flag + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::z, isZeroFlag); + TYPE_QUERIES_CHECK_FALSE(dreg::pstate, isZeroFlag); + TYPE_QUERIES_CHECK_FALSE(dreg::n, isZeroFlag); + TYPE_QUERIES_CHECK_FALSE(dreg::c, isZeroFlag); + TYPE_QUERIES_CHECK_FALSE(dreg::v, isZeroFlag); + TYPE_QUERIES_CHECK(mreg::getZeroFlag(arch), isZeroFlag); + + /********************************************************************* + * Control/Status + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::p0, isControlStatus); + TYPE_QUERIES_CHECK(dreg::p15, isControlStatus); + TYPE_QUERIES_CHECK(dreg::fpcr, isControlStatus); + TYPE_QUERIES_CHECK(dreg::fpsr, isControlStatus); + TYPE_QUERIES_CHECK(dreg::ffr, isControlStatus); + TYPE_QUERIES_CHECK(dreg::vg, isControlStatus); + TYPE_QUERIES_CHECK(dreg::zt0, isControlStatus); + + /********************************************************************* + * Floating-Point + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::b0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::b31, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::d0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::d31, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::h0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::h31, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::q0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::q31, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::s0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::s31, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::hq0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::hq31, isFloatingPoint); + + TYPE_QUERIES_CHECK(dreg::fpcr, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::fpsr, isFloatingPoint); + + TYPE_QUERIES_CHECK(dreg::ffr, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::vg, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zt0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::za, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zab0, isFloatingPoint); + + TYPE_QUERIES_CHECK(dreg::p0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::p15, isFloatingPoint); + + TYPE_QUERIES_CHECK(dreg::z0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::z31, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zad0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zad7, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zah0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zah1, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zaq0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zaq15, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zas0, isFloatingPoint); + TYPE_QUERIES_CHECK(dreg::zas3, isFloatingPoint); + + /********************************************************************* + * Vector + *********************************************************************/ + TYPE_QUERIES_CHECK(dreg::ffr, isVector); + TYPE_QUERIES_CHECK(dreg::vg, isVector); + TYPE_QUERIES_CHECK(dreg::zt0, isVector); + TYPE_QUERIES_CHECK(dreg::za, isVector); + TYPE_QUERIES_CHECK(dreg::zab0, isVector); + TYPE_QUERIES_CHECK(dreg::p0, isVector); + TYPE_QUERIES_CHECK(dreg::p15, isVector); + TYPE_QUERIES_CHECK(dreg::z0, isVector); + TYPE_QUERIES_CHECK(dreg::z31, isVector); + TYPE_QUERIES_CHECK(dreg::zad0, isVector); + TYPE_QUERIES_CHECK(dreg::zad7, isVector); + TYPE_QUERIES_CHECK(dreg::zah0, isVector); + TYPE_QUERIES_CHECK(dreg::zah1, isVector); + TYPE_QUERIES_CHECK(dreg::zaq0, isVector); + TYPE_QUERIES_CHECK(dreg::zaq15, isVector); + TYPE_QUERIES_CHECK(dreg::zas0, isVector); + TYPE_QUERIES_CHECK(dreg::zas3, isVector); + + + /********************************************************************* + * Filtering + *********************************************************************/ + { + using mr = Dyninst::MachRegister; + for(auto reg : mr::getAllRegistersForArch(arch)) { + if(reg.isVector() && !reg.isControlStatus()) { + TYPE_QUERIES_ASSERT_TRUE(reg, is_arithmetic_vector(reg)); + } + if(is_arithmetic_vector(reg)) { + TYPE_QUERIES_ASSERT_TRUE(reg, reg.isVector() && !reg.isControlStatus()); + } + } + } + + return EXIT_SUCCESS; +} + +static bool is_arithmetic_vector(Dyninst::MachRegister reg) { + switch(reg) { + case dreg::iz0: + case dreg::iz1: + case dreg::iz2: + case dreg::iz3: + case dreg::iz4: + case dreg::iz5: + case dreg::iz6: + case dreg::iz7: + case dreg::iz8: + case dreg::iz9: + case dreg::iz10: + case dreg::iz11: + case dreg::iz12: + case dreg::iz13: + case dreg::iz14: + case dreg::iz15: + case dreg::iz16: + case dreg::iz17: + case dreg::iz18: + case dreg::iz19: + case dreg::iz20: + case dreg::iz21: + case dreg::iz22: + case dreg::iz23: + case dreg::iz24: + case dreg::iz25: + case dreg::iz26: + case dreg::iz27: + case dreg::iz28: + case dreg::iz29: + case dreg::iz30: + case dreg::iz31: + case dreg::iza: + case dreg::izab0: + case dreg::izad0: + case dreg::izad1: + case dreg::izad2: + case dreg::izad3: + case dreg::izad4: + case dreg::izad5: + case dreg::izad6: + case dreg::izad7: + case dreg::izah0: + case dreg::izah1: + case dreg::izaq0: + case dreg::izaq1: + case dreg::izaq2: + case dreg::izaq3: + case dreg::izaq4: + case dreg::izaq5: + case dreg::izaq6: + case dreg::izaq7: + case dreg::izaq8: + case dreg::izaq9: + case dreg::izaq10: + case dreg::izaq11: + case dreg::izaq12: + case dreg::izaq13: + case dreg::izaq14: + case dreg::izaq15: + case dreg::izas0: + case dreg::izas1: + case dreg::izas2: + case dreg::izas3: + return true; + } + return false; +} From b55db24c37fbd8e641789ab3b7e452bbf4ca5295 Mon Sep 17 00:00:00 2001 From: Tim Haines Date: Sun, 12 Jan 2025 09:35:22 -0600 Subject: [PATCH 7/9] Add amdgpu_gfx908 --- MachRegister/type_queries/CMakeLists.txt | 6 ++ MachRegister/type_queries/amdgpu_gfx908.cpp | 111 ++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 MachRegister/type_queries/amdgpu_gfx908.cpp diff --git a/MachRegister/type_queries/CMakeLists.txt b/MachRegister/type_queries/CMakeLists.txt index d1725f7..d1aa523 100644 --- a/MachRegister/type_queries/CMakeLists.txt +++ b/MachRegister/type_queries/CMakeLists.txt @@ -29,3 +29,9 @@ target_compile_options(type_query_aarch64 PRIVATE ${UNIT_TESTS_WARNING_FLAGS}) target_include_directories(type_query_aarch64 PRIVATE ${UNIT_TESTS_INCLUDES}) target_link_libraries(type_query_aarch64 PRIVATE Dyninst::common) add_test(NAME machregister_type_query_aarch64 COMMAND type_query_aarch64) + +add_executable(type_query_amdgpu_gfx908 amdgpu_gfx908.cpp) +target_compile_options(type_query_amdgpu_gfx908 PRIVATE ${UNIT_TESTS_WARNING_FLAGS}) +target_include_directories(type_query_amdgpu_gfx908 PRIVATE ${UNIT_TESTS_INCLUDES}) +target_link_libraries(type_query_amdgpu_gfx908 PRIVATE Dyninst::common) +add_test(NAME machregister_type_query_amdgpu_gfx908 COMMAND type_query_amdgpu_gfx908) diff --git a/MachRegister/type_queries/amdgpu_gfx908.cpp b/MachRegister/type_queries/amdgpu_gfx908.cpp new file mode 100644 index 0000000..7216dc6 --- /dev/null +++ b/MachRegister/type_queries/amdgpu_gfx908.cpp @@ -0,0 +1,111 @@ +#include "registers/MachRegister.h" +#include "registers/AMDGPU/amdgpu_gfx908_regs.h" +#include "type_query_check.h" + +namespace dreg = Dyninst::amdgpu_gfx908; +constexpr auto arch = Dyninst::Arch_amdgpu_gfx908; +using mreg = Dyninst::MachRegister; + +int main() { + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::pc_all, isPC); + + TYPE_QUERIES_CHECK_INVALID(getFramePointer, Dyninst::Arch_amdgpu_gfx908); + TYPE_QUERIES_CHECK_INVALID(getStackPointer, Dyninst::Arch_amdgpu_gfx908); + TYPE_QUERIES_CHECK_INVALID(getSyscallNumberReg, Dyninst::Arch_amdgpu_gfx908); + TYPE_QUERIES_CHECK_INVALID(getSyscallReturnValueReg, Dyninst::Arch_amdgpu_gfx908); + TYPE_QUERIES_CHECK_INVALID(getSyscallNumberOReg, Dyninst::Arch_amdgpu_gfx908); + TYPE_QUERIES_CHECK_INVALID(getZeroFlag, Dyninst::Arch_amdgpu_gfx908); + + /********************************************************************* + * General Purpose + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::s0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::s101, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::ttmp0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::ttmp15, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::s0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::s101, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::v0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::v255, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::acc0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::acc255, isGeneralPurpose); + + /********************************************************************* + * Control/Status + *********************************************************************/ + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::s0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::s101, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::v0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::v255, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::acc0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::acc255, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::vcc, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::vcc_lo, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::vcc_hi, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::exec, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::exec_lo, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::exec_hi, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::src_scc, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::src_vccz, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::src_execz, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::xnack_mask_lo, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::xnack_mask_hi, isControlStatus); + + /********************************************************************* + * Floating-Point + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::s0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::s101, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::v0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::v255, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::acc0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::acc255, isFloatingPoint); + + /********************************************************************* + * Vector + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::v0, isVector); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::v255, isVector); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::acc0, isVector); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx908::acc255, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::ttmp0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::ttmp15, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::mrt0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::mrt7, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::null, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::pos0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::pos3, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::param0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::param31, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::attr0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::attr31, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::s0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx908::s101, isVector); + + /********************************************************************* + * Filtering + *********************************************************************/ + { + auto is_arithmetic_vector = [](mreg reg) { + auto const base = reg.getBaseRegister(); + auto const cat = reg.regClass(); + if(cat == Dyninst::amdgpu_gfx908::ACC_VGPR) { + return base == Dyninst::amdgpu_gfx908::acc0; + } + if(cat == Dyninst::amdgpu_gfx908::VGPR) { + return base == Dyninst::amdgpu_gfx908::v0; + } + return false; + }; + + for(auto reg : mreg::getAllRegistersForArch(arch)) { + if(reg.isVector() && !reg.isControlStatus()) { + TYPE_QUERIES_ASSERT_TRUE(reg, is_arithmetic_vector(reg)); + } + if(is_arithmetic_vector(reg)) { + TYPE_QUERIES_ASSERT_TRUE(reg, reg.isVector() && !reg.isControlStatus()); + } + } + } + return EXIT_SUCCESS; +} From 78af2e89393dc88c359b4c8bb4bb13a880126c10 Mon Sep 17 00:00:00 2001 From: Tim Haines Date: Sun, 12 Jan 2025 09:35:58 -0600 Subject: [PATCH 8/9] Add amdgpu_gfx90a --- MachRegister/type_queries/CMakeLists.txt | 6 ++ MachRegister/type_queries/amdgpu_gfx90a.cpp | 111 ++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 MachRegister/type_queries/amdgpu_gfx90a.cpp diff --git a/MachRegister/type_queries/CMakeLists.txt b/MachRegister/type_queries/CMakeLists.txt index d1aa523..36b1c7f 100644 --- a/MachRegister/type_queries/CMakeLists.txt +++ b/MachRegister/type_queries/CMakeLists.txt @@ -35,3 +35,9 @@ target_compile_options(type_query_amdgpu_gfx908 PRIVATE ${UNIT_TESTS_WARNING_FLA target_include_directories(type_query_amdgpu_gfx908 PRIVATE ${UNIT_TESTS_INCLUDES}) target_link_libraries(type_query_amdgpu_gfx908 PRIVATE Dyninst::common) add_test(NAME machregister_type_query_amdgpu_gfx908 COMMAND type_query_amdgpu_gfx908) + +add_executable(type_query_amdgpu_gfx90a amdgpu_gfx90a.cpp) +target_compile_options(type_query_amdgpu_gfx90a PRIVATE ${UNIT_TESTS_WARNING_FLAGS}) +target_include_directories(type_query_amdgpu_gfx90a PRIVATE ${UNIT_TESTS_INCLUDES}) +target_link_libraries(type_query_amdgpu_gfx90a PRIVATE Dyninst::common) +add_test(NAME machregister_type_query_amdgpu_gfx90a COMMAND type_query_amdgpu_gfx90a) diff --git a/MachRegister/type_queries/amdgpu_gfx90a.cpp b/MachRegister/type_queries/amdgpu_gfx90a.cpp new file mode 100644 index 0000000..1e40c59 --- /dev/null +++ b/MachRegister/type_queries/amdgpu_gfx90a.cpp @@ -0,0 +1,111 @@ +#include "registers/MachRegister.h" +#include "registers/AMDGPU/amdgpu_gfx90a_regs.h" +#include "type_query_check.h" + +namespace dreg = Dyninst::amdgpu_gfx90a; +constexpr auto arch = Dyninst::Arch_amdgpu_gfx90a; +using mreg = Dyninst::MachRegister; + +int main() { + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::pc_all, isPC); + + TYPE_QUERIES_CHECK_INVALID(getFramePointer, Dyninst::Arch_amdgpu_gfx90a); + TYPE_QUERIES_CHECK_INVALID(getStackPointer, Dyninst::Arch_amdgpu_gfx90a); + TYPE_QUERIES_CHECK_INVALID(getSyscallNumberReg, Dyninst::Arch_amdgpu_gfx90a); + TYPE_QUERIES_CHECK_INVALID(getSyscallReturnValueReg, Dyninst::Arch_amdgpu_gfx90a); + TYPE_QUERIES_CHECK_INVALID(getSyscallNumberOReg, Dyninst::Arch_amdgpu_gfx90a); + TYPE_QUERIES_CHECK_INVALID(getZeroFlag, Dyninst::Arch_amdgpu_gfx90a); + + /********************************************************************* + * General Purpose + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::s0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::s101, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::ttmp0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::ttmp15, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::s0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::s101, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::v0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::v255, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::acc0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::acc255, isGeneralPurpose); + + /********************************************************************* + * Control/Status + *********************************************************************/ + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::s0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::s101, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::v0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::v255, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::acc0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::acc255, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::vcc, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::vcc_lo, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::vcc_hi, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::exec, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::exec_lo, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::exec_hi, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::src_scc, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::src_vccz, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::src_execz, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::xnack_mask_lo, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::xnack_mask_hi, isControlStatus); + + /********************************************************************* + * Floating-Point + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::s0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::s101, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::v0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::v255, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::acc0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::acc255, isFloatingPoint); + + /********************************************************************* + * Vector + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::v0, isVector); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::v255, isVector); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::acc0, isVector); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx90a::acc255, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::ttmp0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::ttmp15, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::mrt0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::mrt7, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::null, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::pos0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::pos3, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::param0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::param31, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::attr0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::attr31, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::s0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx90a::s101, isVector); + + /********************************************************************* + * Filtering + *********************************************************************/ + { + auto is_arithmetic_vector = [](mreg reg) { + auto const base = reg.getBaseRegister(); + auto const cat = reg.regClass(); + if(cat == Dyninst::amdgpu_gfx90a::ACC_VGPR) { + return base == Dyninst::amdgpu_gfx90a::acc0; + } + if(cat == Dyninst::amdgpu_gfx90a::VGPR) { + return base == Dyninst::amdgpu_gfx90a::v0; + } + return false; + }; + + for(auto reg : mreg::getAllRegistersForArch(arch)) { + if(reg.isVector() && !reg.isControlStatus()) { + TYPE_QUERIES_ASSERT_TRUE(reg, is_arithmetic_vector(reg)); + } + if(is_arithmetic_vector(reg)) { + TYPE_QUERIES_ASSERT_TRUE(reg, reg.isVector() && !reg.isControlStatus()); + } + } + } + return EXIT_SUCCESS; +} From 969d0b0184cb18ea61c82da4282bc4b9e6bdd975 Mon Sep 17 00:00:00 2001 From: Tim Haines Date: Sun, 12 Jan 2025 09:36:13 -0600 Subject: [PATCH 9/9] Add amdgpu_gfx940 --- MachRegister/type_queries/CMakeLists.txt | 6 ++ MachRegister/type_queries/amdgpu_gfx940.cpp | 111 ++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 MachRegister/type_queries/amdgpu_gfx940.cpp diff --git a/MachRegister/type_queries/CMakeLists.txt b/MachRegister/type_queries/CMakeLists.txt index 36b1c7f..7506c77 100644 --- a/MachRegister/type_queries/CMakeLists.txt +++ b/MachRegister/type_queries/CMakeLists.txt @@ -41,3 +41,9 @@ target_compile_options(type_query_amdgpu_gfx90a PRIVATE ${UNIT_TESTS_WARNING_FLA target_include_directories(type_query_amdgpu_gfx90a PRIVATE ${UNIT_TESTS_INCLUDES}) target_link_libraries(type_query_amdgpu_gfx90a PRIVATE Dyninst::common) add_test(NAME machregister_type_query_amdgpu_gfx90a COMMAND type_query_amdgpu_gfx90a) + +add_executable(type_query_amdgpu_gfx940 amdgpu_gfx940.cpp) +target_compile_options(type_query_amdgpu_gfx940 PRIVATE ${UNIT_TESTS_WARNING_FLAGS}) +target_include_directories(type_query_amdgpu_gfx940 PRIVATE ${UNIT_TESTS_INCLUDES}) +target_link_libraries(type_query_amdgpu_gfx940 PRIVATE Dyninst::common) +add_test(NAME machregister_type_query_amdgpu_gfx940 COMMAND type_query_amdgpu_gfx940) diff --git a/MachRegister/type_queries/amdgpu_gfx940.cpp b/MachRegister/type_queries/amdgpu_gfx940.cpp new file mode 100644 index 0000000..6e8d8ea --- /dev/null +++ b/MachRegister/type_queries/amdgpu_gfx940.cpp @@ -0,0 +1,111 @@ +#include "registers/MachRegister.h" +#include "registers/AMDGPU/amdgpu_gfx940_regs.h" +#include "type_query_check.h" + +namespace dreg = Dyninst::amdgpu_gfx940; +constexpr auto arch = Dyninst::Arch_amdgpu_gfx940; +using mreg = Dyninst::MachRegister; + +int main() { + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::pc_all, isPC); + + TYPE_QUERIES_CHECK_INVALID(getFramePointer, Dyninst::Arch_amdgpu_gfx940); + TYPE_QUERIES_CHECK_INVALID(getStackPointer, Dyninst::Arch_amdgpu_gfx940); + TYPE_QUERIES_CHECK_INVALID(getSyscallNumberReg, Dyninst::Arch_amdgpu_gfx940); + TYPE_QUERIES_CHECK_INVALID(getSyscallReturnValueReg, Dyninst::Arch_amdgpu_gfx940); + TYPE_QUERIES_CHECK_INVALID(getSyscallNumberOReg, Dyninst::Arch_amdgpu_gfx940); + TYPE_QUERIES_CHECK_INVALID(getZeroFlag, Dyninst::Arch_amdgpu_gfx940); + + /********************************************************************* + * General Purpose + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::s0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::s101, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::ttmp0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::ttmp15, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::s0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::s101, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::v0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::v255, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::acc0, isGeneralPurpose); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::acc255, isGeneralPurpose); + + /********************************************************************* + * Control/Status + *********************************************************************/ + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::s0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::s101, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::v0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::v255, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::acc0, isControlStatus); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::acc255, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::vcc, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::vcc_lo, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::vcc_hi, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::exec, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::exec_lo, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::exec_hi, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::src_scc, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::src_vccz, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::src_execz, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::xnack_mask_lo, isControlStatus); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::xnack_mask_hi, isControlStatus); + + /********************************************************************* + * Floating-Point + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::s0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::s101, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::v0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::v255, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::acc0, isFloatingPoint); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::acc255, isFloatingPoint); + + /********************************************************************* + * Vector + *********************************************************************/ + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::v0, isVector); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::v255, isVector); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::acc0, isVector); + TYPE_QUERIES_CHECK(Dyninst::amdgpu_gfx940::acc255, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::ttmp0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::ttmp15, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::mrt0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::mrt7, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::null, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::pos0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::pos3, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::param0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::param31, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::attr0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::attr31, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::s0, isVector); + TYPE_QUERIES_CHECK_FALSE(Dyninst::amdgpu_gfx940::s101, isVector); + + /********************************************************************* + * Filtering + *********************************************************************/ + { + auto is_arithmetic_vector = [](mreg reg) { + auto const base = reg.getBaseRegister(); + auto const cat = reg.regClass(); + if(cat == Dyninst::amdgpu_gfx940::ACC_VGPR) { + return base == Dyninst::amdgpu_gfx940::acc0; + } + if(cat == Dyninst::amdgpu_gfx940::VGPR) { + return base == Dyninst::amdgpu_gfx940::v0; + } + return false; + }; + + for(auto reg : mreg::getAllRegistersForArch(arch)) { + if(reg.isVector() && !reg.isControlStatus()) { + TYPE_QUERIES_ASSERT_TRUE(reg, is_arithmetic_vector(reg)); + } + if(is_arithmetic_vector(reg)) { + TYPE_QUERIES_ASSERT_TRUE(reg, reg.isVector() && !reg.isControlStatus()); + } + } + } + return EXIT_SUCCESS; +}