Skip to content

Commit 627512a

Browse files
committed
[llvm-readobj] [Object] [NFC] Introduce inline helpers for chpe_range_entry.
Reviewed By: jhenderson, MaskRay Differential Revision: https://reviews.llvm.org/D156797
1 parent d04d645 commit 627512a

File tree

4 files changed

+42
-7
lines changed

4 files changed

+42
-7
lines changed

llvm/include/llvm/Object/COFF.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -745,12 +745,18 @@ struct chpe_metadata {
745745
support::ulittle32_t AuxiliaryIATCopy;
746746
};
747747

748+
enum chpe_range_type { Arm64 = 0, Arm64EC = 1, Amd64 = 2 };
749+
748750
struct chpe_range_entry {
749751
support::ulittle32_t StartOffset;
750752
support::ulittle32_t Length;
751-
};
752753

753-
enum chpe_range_type { CHPE_RANGE_ARM64, CHPE_RANGE_ARM64EC, CHPE_RANGE_AMD64 };
754+
// The two low bits of StartOffset contain a range type.
755+
static constexpr uint32_t TypeMask = 3;
756+
757+
uint32_t getStart() const { return StartOffset & ~TypeMask; }
758+
uint16_t getType() const { return StartOffset & TypeMask; }
759+
};
754760

755761
struct chpe_code_range_entry {
756762
support::ulittle32_t StartRva;

llvm/tools/llvm-readobj/COFFDumper.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -854,17 +854,17 @@ void COFFDumper::printCOFFLoadConfig() {
854854
reportError(std::move(E), Obj->getFileName());
855855
auto CodeMap = reinterpret_cast<const chpe_range_entry *>(CodeMapInt);
856856
for (uint32_t i = 0; i < CHPE->CodeMapCount; i++) {
857-
uint32_t Start = CodeMap[i].StartOffset & ~3;
857+
uint32_t Start = CodeMap[i].getStart();
858858
W.startLine() << W.hex(Start) << " - "
859859
<< W.hex(Start + CodeMap[i].Length) << " ";
860-
switch (CodeMap[i].StartOffset & 3) {
861-
case CHPE_RANGE_ARM64:
860+
switch (CodeMap[i].getType()) {
861+
case chpe_range_type::Arm64:
862862
W.getOStream() << "ARM64\n";
863863
break;
864-
case CHPE_RANGE_ARM64EC:
864+
case chpe_range_type::Arm64EC:
865865
W.getOStream() << "ARM64EC\n";
866866
break;
867-
case CHPE_RANGE_AMD64:
867+
case chpe_range_type::Amd64:
868868
W.getOStream() << "X64\n";
869869
break;
870870
default:

llvm/unittests/Object/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ set(LLVM_LINK_COMPONENTS
77

88
add_llvm_unittest(ObjectTests
99
ArchiveTest.cpp
10+
COFFObjectFileTest.cpp
1011
DXContainerTest.cpp
1112
ELFObjectFileTest.cpp
1213
ELFTypesTest.cpp
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//===- COFFObjectFileTest.cpp - Tests for COFFObjectFile ----------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "llvm/Object/COFF.h"
10+
#include "gtest/gtest.h"
11+
12+
using namespace llvm::object;
13+
14+
TEST(COFFObjectFileTest, CHPERangeEntry) {
15+
chpe_range_entry range;
16+
17+
range.StartOffset = 0x1000;
18+
EXPECT_EQ(range.getStart(), 0x1000u);
19+
EXPECT_EQ(range.getType(), chpe_range_type::Arm64);
20+
21+
range.StartOffset = 0x2000 | chpe_range_type::Arm64EC;
22+
EXPECT_EQ(range.getStart(), 0x2000u);
23+
EXPECT_EQ(range.getType(), chpe_range_type::Arm64EC);
24+
25+
range.StartOffset = 0x3000 | chpe_range_type::Amd64;
26+
EXPECT_EQ(range.getStart(), 0x3000u);
27+
EXPECT_EQ(range.getType(), chpe_range_type::Amd64);
28+
}

0 commit comments

Comments
 (0)