From 5aed2eff43c075b54be81095fdc5917bc32b530a Mon Sep 17 00:00:00 2001 From: Emmmer Date: Mon, 31 Oct 2022 01:35:16 +0800 Subject: [PATCH] Fix buildbot out of memory https://lab.llvm.org/buildbot#builders/17/builds/31659 --- .../Plugins/Instruction/RISCV/RISCVInstructions.h | 26 ++++++++++++++++++++++ .../Instruction/RISCV/TestRISCVEmulator.cpp | 23 ++----------------- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/lldb/source/Plugins/Instruction/RISCV/RISCVInstructions.h b/lldb/source/Plugins/Instruction/RISCV/RISCVInstructions.h index 8fc51d1..b144a7c 100644 --- a/lldb/source/Plugins/Instruction/RISCV/RISCVInstructions.h +++ b/lldb/source/Plugins/Instruction/RISCV/RISCVInstructions.h @@ -36,22 +36,30 @@ struct Rs { bool isDouble); }; +#define DERIVE_EQ(NAME) \ + bool operator==(const NAME &r) const { \ + return std::memcmp(this, &r, sizeof(NAME)) == 0; \ + } + #define I_TYPE_INST(NAME) \ struct NAME { \ Rd rd; \ Rs rs1; \ uint32_t imm; \ + DERIVE_EQ(NAME); \ } #define S_TYPE_INST(NAME) \ struct NAME { \ Rs rs1; \ Rs rs2; \ uint32_t imm; \ + DERIVE_EQ(NAME); \ } #define U_TYPE_INST(NAME) \ struct NAME { \ Rd rd; \ uint32_t imm; \ + DERIVE_EQ(NAME); \ } /// The memory layout are the same in our code. #define J_TYPE_INST(NAME) U_TYPE_INST(NAME) @@ -60,17 +68,20 @@ struct Rs { Rd rd; \ Rs rs1; \ Rs rs2; \ + DERIVE_EQ(NAME); \ } #define R_SHAMT_TYPE_INST(NAME) \ struct NAME { \ Rd rd; \ Rs rs1; \ uint32_t shamt; \ + DERIVE_EQ(NAME); \ } #define R_RS1_TYPE_INST(NAME) \ struct NAME { \ Rd rd; \ Rs rs1; \ + DERIVE_EQ(NAME); \ } #define R4_TYPE_INST(NAME) \ struct NAME { \ @@ -79,11 +90,13 @@ struct Rs { Rs rs2; \ Rs rs3; \ int32_t rm; \ + DERIVE_EQ(NAME); \ } /// The `inst` fields are used for debugging. #define INVALID_INST(NAME) \ struct NAME { \ uint32_t inst; \ + DERIVE_EQ(NAME); \ } // RV32I instructions (The base integer ISA) @@ -92,6 +105,7 @@ struct B { Rs rs2; uint32_t imm; uint32_t funct3; + DERIVE_EQ(B); }; U_TYPE_INST(LUI); U_TYPE_INST(AUIPC); @@ -323,5 +337,17 @@ constexpr uint32_t NanUnBoxing(uint64_t val) { return val & (~0xFFFF'FFFF'0000'0000); } +#undef R_TYPE_INST +#undef R_SHAMT_TYPE_INST +#undef R_RS1_TYPE_INST +#undef R4_TYPE_INST +#undef I_TYPE_INST +#undef S_TYPE_INST +#undef B_TYPE_INST +#undef U_TYPE_INST +#undef J_TYPE_INST +#undef INVALID_INST +#undef DERIVE_EQ + } // namespace lldb_private #endif // LLDB_SOURCE_PLUGINS_INSTRUCTION_RISCV_RISCVINSTRUCTION_H diff --git a/lldb/unittests/Instruction/RISCV/TestRISCVEmulator.cpp b/lldb/unittests/Instruction/RISCV/TestRISCVEmulator.cpp index f00d581..23cdd77 100644 --- a/lldb/unittests/Instruction/RISCV/TestRISCVEmulator.cpp +++ b/lldb/unittests/Instruction/RISCV/TestRISCVEmulator.cpp @@ -281,25 +281,6 @@ struct TestDecode { RISCVInst inst_type; }; -static bool compareInst(const RISCVInst &lhs, const RISCVInst &rhs) { - if (lhs.index() != rhs.index()) - return false; - return std::visit( - [&](auto &&L) { - return std::visit( - [&](auto &&R) { - // guaranteed by - // 1. lhs.index() == rhs.index() - // (they are the same instruction type) - // 2. all instruction representations are plain data objects - // consisting of primitive types. - return std::memcmp(&L, &R, sizeof(L)) == 0; - }, - rhs); - }, - lhs); -} - TEST_F(RISCVEmulatorTester, TestCDecode) { std::vector tests = { {0x0000, INVALID{0x0000}}, @@ -354,7 +335,7 @@ TEST_F(RISCVEmulatorTester, TestCDecode) { for (auto i : tests) { auto decode = this->Decode(i.inst); ASSERT_TRUE(decode.has_value()); - ASSERT_TRUE(compareInst(decode->decoded, i.inst_type)); + ASSERT_EQ(decode->decoded, i.inst_type); } } @@ -374,7 +355,7 @@ TEST_F(RISCVEmulatorTester32, TestCDecodeRV32) { for (auto i : tests) { auto decode = this->Decode(i.inst); ASSERT_TRUE(decode.has_value()); - ASSERT_TRUE(compareInst(decode->decoded, i.inst_type)); + ASSERT_EQ(decode->decoded, i.inst_type); } } -- 2.7.4