Skip to content

Commit cf83a7f

Browse files
authored
[SHT_LLVM_BB_ADDR_MAP] Add an option to skip emitting bb entries (#114447)
Sometimes we want to use a `PgoAnalysisMap` feature that doesn't require the BB entries info, e.g. only the `FuncEntryCount`, but the BB entries is emitted by default, so I'm adding an option to skip the info for this case to save the binary size(can save ~90% size of the section). For implementation, it extends a new field(`OmitBBEntries`) in `BBAddrMap::Features` for this and it's controlled by a switch `--basic-block-address-map-skip-bb-entries`. Note that this naturally supports backwards compatibility as the field is zero for the old version, matches the decoding in the new version llvm.
1 parent 1434d2a commit cf83a7f

File tree

9 files changed

+188
-65
lines changed

9 files changed

+188
-65
lines changed

llvm/include/llvm/Object/ELFTypes.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,7 @@ struct BBAddrMap {
830830
bool BBFreq : 1;
831831
bool BrProb : 1;
832832
bool MultiBBRange : 1;
833+
bool OmitBBEntries : 1;
833834

834835
bool hasPGOAnalysis() const { return FuncEntryCount || BBFreq || BrProb; }
835836

@@ -840,15 +841,17 @@ struct BBAddrMap {
840841
return (static_cast<uint8_t>(FuncEntryCount) << 0) |
841842
(static_cast<uint8_t>(BBFreq) << 1) |
842843
(static_cast<uint8_t>(BrProb) << 2) |
843-
(static_cast<uint8_t>(MultiBBRange) << 3);
844+
(static_cast<uint8_t>(MultiBBRange) << 3) |
845+
(static_cast<uint8_t>(OmitBBEntries) << 4);
844846
}
845847

846848
// Decodes from minimum bit width representation and validates no
847849
// unnecessary bits are used.
848850
static Expected<Features> decode(uint8_t Val) {
849851
Features Feat{
850852
static_cast<bool>(Val & (1 << 0)), static_cast<bool>(Val & (1 << 1)),
851-
static_cast<bool>(Val & (1 << 2)), static_cast<bool>(Val & (1 << 3))};
853+
static_cast<bool>(Val & (1 << 2)), static_cast<bool>(Val & (1 << 3)),
854+
static_cast<bool>(Val & (1 << 4))};
852855
if (Feat.encode() != Val)
853856
return createStringError(
854857
std::error_code(), "invalid encoding for BBAddrMap::Features: 0x%x",
@@ -857,9 +860,10 @@ struct BBAddrMap {
857860
}
858861

859862
bool operator==(const Features &Other) const {
860-
return std::tie(FuncEntryCount, BBFreq, BrProb, MultiBBRange) ==
863+
return std::tie(FuncEntryCount, BBFreq, BrProb, MultiBBRange,
864+
OmitBBEntries) ==
861865
std::tie(Other.FuncEntryCount, Other.BBFreq, Other.BrProb,
862-
Other.MultiBBRange);
866+
Other.MultiBBRange, Other.OmitBBEntries);
863867
}
864868
};
865869

llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,13 @@ static cl::bits<PGOMapFeaturesEnum> PgoAnalysisMapFeatures(
161161
"Enable extended information within the SHT_LLVM_BB_ADDR_MAP that is "
162162
"extracted from PGO related analysis."));
163163

164+
static cl::opt<bool> BBAddrMapSkipEmitBBEntries(
165+
"basic-block-address-map-skip-bb-entries",
166+
cl::desc("Skip emitting basic block entries in the SHT_LLVM_BB_ADDR_MAP "
167+
"section. It's used to save binary size when BB entries are "
168+
"unnecessary for some PGOAnalysisMap features."),
169+
cl::Hidden, cl::init(false));
170+
164171
static cl::opt<bool> EmitJumpTableSizesSection(
165172
"emit-jump-table-sizes-section",
166173
cl::desc("Emit a section containing jump table addresses and sizes"),
@@ -1411,8 +1418,15 @@ getBBAddrMapFeature(const MachineFunction &MF, int NumMBBSectionRanges) {
14111418
bool BrProbEnabled =
14121419
AllFeatures ||
14131420
(!NoFeatures && PgoAnalysisMapFeatures.isSet(PGOMapFeaturesEnum::BrProb));
1421+
1422+
if ((BBFreqEnabled || BrProbEnabled) && BBAddrMapSkipEmitBBEntries) {
1423+
MF.getFunction().getContext().emitError(
1424+
"BB entries info is required for BBFreq and BrProb "
1425+
"features");
1426+
}
14141427
return {FuncEntryCountEnabled, BBFreqEnabled, BrProbEnabled,
1415-
MF.hasBBSections() && NumMBBSectionRanges > 1};
1428+
MF.hasBBSections() && NumMBBSectionRanges > 1,
1429+
static_cast<bool>(BBAddrMapSkipEmitBBEntries)};
14161430
}
14171431

14181432
void AsmPrinter::emitBBAddrMapSection(const MachineFunction &MF) {
@@ -1469,24 +1483,28 @@ void AsmPrinter::emitBBAddrMapSection(const MachineFunction &MF) {
14691483
OutStreamer->emitULEB128IntValue(MBBSectionNumBlocks[MBB.getSectionID()]);
14701484
PrevMBBEndSymbol = MBBSymbol;
14711485
}
1472-
// TODO: Remove this check when version 1 is deprecated.
1473-
if (BBAddrMapVersion > 1) {
1474-
OutStreamer->AddComment("BB id");
1475-
// Emit the BB ID for this basic block.
1476-
// We only emit BaseID since CloneID is unset for
1477-
// -basic-block-adress-map.
1478-
// TODO: Emit the full BBID when labels and sections can be mixed
1479-
// together.
1480-
OutStreamer->emitULEB128IntValue(MBB.getBBID()->BaseID);
1486+
1487+
if (!Features.OmitBBEntries) {
1488+
// TODO: Remove this check when version 1 is deprecated.
1489+
if (BBAddrMapVersion > 1) {
1490+
OutStreamer->AddComment("BB id");
1491+
// Emit the BB ID for this basic block.
1492+
// We only emit BaseID since CloneID is unset for
1493+
// -basic-block-adress-map.
1494+
// TODO: Emit the full BBID when labels and sections can be mixed
1495+
// together.
1496+
OutStreamer->emitULEB128IntValue(MBB.getBBID()->BaseID);
1497+
}
1498+
// Emit the basic block offset relative to the end of the previous block.
1499+
// This is zero unless the block is padded due to alignment.
1500+
emitLabelDifferenceAsULEB128(MBBSymbol, PrevMBBEndSymbol);
1501+
// Emit the basic block size. When BBs have alignments, their size cannot
1502+
// always be computed from their offsets.
1503+
emitLabelDifferenceAsULEB128(MBB.getEndSymbol(), MBBSymbol);
1504+
// Emit the Metadata.
1505+
OutStreamer->emitULEB128IntValue(getBBAddrMapMetadata(MBB));
14811506
}
1482-
// Emit the basic block offset relative to the end of the previous block.
1483-
// This is zero unless the block is padded due to alignment.
1484-
emitLabelDifferenceAsULEB128(MBBSymbol, PrevMBBEndSymbol);
1485-
// Emit the basic block size. When BBs have alignments, their size cannot
1486-
// always be computed from their offsets.
1487-
emitLabelDifferenceAsULEB128(MBB.getEndSymbol(), MBBSymbol);
1488-
// Emit the Metadata.
1489-
OutStreamer->emitULEB128IntValue(getBBAddrMapMetadata(MBB));
1507+
14901508
PrevMBBEndSymbol = MBB.getEndSymbol();
14911509
}
14921510

llvm/lib/Object/ELF.cpp

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -851,29 +851,31 @@ decodeBBAddrMapImpl(const ELFFile<ELFT> &EF,
851851
NumBlocksInBBRange = readULEB128As<uint32_t>(Data, Cur, ULEBSizeErr);
852852
}
853853
std::vector<BBAddrMap::BBEntry> BBEntries;
854-
for (uint32_t BlockIndex = 0; !MetadataDecodeErr && !ULEBSizeErr && Cur &&
855-
(BlockIndex < NumBlocksInBBRange);
856-
++BlockIndex) {
857-
uint32_t ID = Version >= 2
858-
? readULEB128As<uint32_t>(Data, Cur, ULEBSizeErr)
859-
: BlockIndex;
860-
uint32_t Offset = readULEB128As<uint32_t>(Data, Cur, ULEBSizeErr);
861-
uint32_t Size = readULEB128As<uint32_t>(Data, Cur, ULEBSizeErr);
862-
uint32_t MD = readULEB128As<uint32_t>(Data, Cur, ULEBSizeErr);
863-
if (Version >= 1) {
864-
// Offset is calculated relative to the end of the previous BB.
865-
Offset += PrevBBEndOffset;
866-
PrevBBEndOffset = Offset + Size;
867-
}
868-
Expected<BBAddrMap::BBEntry::Metadata> MetadataOrErr =
869-
BBAddrMap::BBEntry::Metadata::decode(MD);
870-
if (!MetadataOrErr) {
871-
MetadataDecodeErr = MetadataOrErr.takeError();
872-
break;
854+
if (!FeatEnable.OmitBBEntries) {
855+
for (uint32_t BlockIndex = 0; !MetadataDecodeErr && !ULEBSizeErr &&
856+
Cur && (BlockIndex < NumBlocksInBBRange);
857+
++BlockIndex) {
858+
uint32_t ID = Version >= 2
859+
? readULEB128As<uint32_t>(Data, Cur, ULEBSizeErr)
860+
: BlockIndex;
861+
uint32_t Offset = readULEB128As<uint32_t>(Data, Cur, ULEBSizeErr);
862+
uint32_t Size = readULEB128As<uint32_t>(Data, Cur, ULEBSizeErr);
863+
uint32_t MD = readULEB128As<uint32_t>(Data, Cur, ULEBSizeErr);
864+
if (Version >= 1) {
865+
// Offset is calculated relative to the end of the previous BB.
866+
Offset += PrevBBEndOffset;
867+
PrevBBEndOffset = Offset + Size;
868+
}
869+
Expected<BBAddrMap::BBEntry::Metadata> MetadataOrErr =
870+
BBAddrMap::BBEntry::Metadata::decode(MD);
871+
if (!MetadataOrErr) {
872+
MetadataDecodeErr = MetadataOrErr.takeError();
873+
break;
874+
}
875+
BBEntries.push_back({ID, Offset, Size, *MetadataOrErr});
873876
}
874-
BBEntries.push_back({ID, Offset, Size, *MetadataOrErr});
877+
TotalNumBlocks += BBEntries.size();
875878
}
876-
TotalNumBlocks += BBEntries.size();
877879
BBRangeEntries.push_back({RangeBaseAddress, std::move(BBEntries)});
878880
}
879881
FunctionEntries.push_back({std::move(BBRangeEntries)});

llvm/lib/ObjectYAML/ELFEmitter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1497,7 +1497,7 @@ void ELFState<ELFT>::writeSectionContent(
14971497
BBR.NumBlocks.value_or(BBR.BBEntries ? BBR.BBEntries->size() : 0);
14981498
SHeader.sh_size += sizeof(uintX_t) + CBA.writeULEB128(NumBlocks);
14991499
// Write all BBEntries in this BBRange.
1500-
if (!BBR.BBEntries)
1500+
if (!BBR.BBEntries || FeatureOrErr->OmitBBEntries)
15011501
continue;
15021502
for (const ELFYAML::BBAddrMapEntry::BBEntry &BBE : *BBR.BBEntries) {
15031503
++TotalNumBlocks;

llvm/test/CodeGen/X86/basic-block-address-map-pgo-features.ll

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-address-map -pgo-analysis-map=bb-freq | FileCheck %s --check-prefixes=CHECK,PGO-BBF,BBF-ONLY
1212
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-address-map -pgo-analysis-map=br-prob | FileCheck %s --check-prefixes=CHECK,PGO-BRP,BRP-ONLY
1313

14+
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-address-map -pgo-analysis-map=func-entry-count -basic-block-address-map-skip-bb-entries | FileCheck %s --check-prefixes=SKIP-BB-ENTRIES
15+
; RUN: not llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-address-map -pgo-analysis-map=bb-freq -basic-block-address-map-skip-bb-entries 2>&1 | FileCheck %s --check-prefixes=SKIP-BB-ENTRIES-ERROR
16+
; RUN: not llc < %s -mtriple=x86_64 -function-sections -unique-section-names=true -basic-block-address-map -pgo-analysis-map=br-prob -basic-block-address-map-skip-bb-entries 2>&1 | FileCheck %s --check-prefixes=SKIP-BB-ENTRIES-ERROR
17+
1418
;; Verify that we emit an error if we try and specify values in addition to all/none
1519
; RUN: not llc < %s -mtriple=x86_64 -basic-block-address-map -pgo-analysis-map=all,bb-freq
1620
; RUN: not llc < %s -mtriple=x86_64 -basic-block-address-map -pgo-analysis-map=none,bb-freq
@@ -134,3 +138,10 @@ declare i32 @__gxx_personality_v0(...)
134138
; PGO-BRP-NEXT: .byte 5 # successor BB ID
135139
; PGO-BRP-NEXT: .ascii "\200\200\200\200\b" # successor branch probability
136140

141+
; SKIP-BB-ENTRIES: .byte 17 # feature
142+
; SKIP-BB-ENTRIES-NEXT: .quad .Lfunc_begin0 # function address
143+
; SKIP-BB-ENTRIES-NEXT: .byte 6 # number of basic blocks
144+
; SKIP-BB-ENTRIES-NEXT: .byte 100 # function entry count
145+
; SKIP-BB-ENTRIES-NOT: # BB id
146+
147+
; SKIP-BB-ENTRIES-ERROR: error: BB entries info is required for BBFreq and BrProb features
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
## This test checks how llvm-readobj prints skipped BB entries (-basic-block-address-map-skip-emit-bb-entries).
2+
3+
## Check 64-bit:
4+
# RUN: yaml2obj %s -DBITS=64 -o %t1.x64.o
5+
# RUN: llvm-readobj %t1.x64.o --bb-addr-map 2>&1 | FileCheck --match-full-lines %s -DFILE=%t1.x64.o
6+
7+
## Check 32-bit:
8+
# RUN: yaml2obj %s -DBITS=32 -o %t1.x32.o
9+
# RUN: llvm-readobj %t1.x32.o --bb-addr-map 2>&1 | FileCheck --match-full-lines %s -DFILE=%t1.x32.o
10+
11+
# CHECK: BBAddrMap [
12+
# CHECK-NEXT: Function {
13+
# CHECK-NEXT: At: 0x11111
14+
# CHECK-NEXT: Name: foo
15+
# CHECK-NEXT: BB Ranges [
16+
# CHECK-NEXT: {
17+
# CHECK-NEXT: Base Address: 0x11111
18+
# CHECK-NEXT: BB Entries [
19+
# CHECK-NEXT: ]
20+
# CHECK-NEXT: }
21+
# CHECK-NEXT: ]
22+
# CHECK-NEXT: PGO analyses {
23+
# CHECK-NEXT: FuncEntryCount: 100
24+
# CHECK-NEXT: PGO BB entries [
25+
# CHECK-NEXT: ]
26+
# CHECK-NEXT: }
27+
# CHECK-NEXT: }
28+
# CHECK-NEXT:]
29+
# CHECK-NEXT:BBAddrMap [
30+
# CHECK-NEXT: Function {
31+
# CHECK-NEXT: At: 0x33333
32+
# CHECK-NEXT: Name: bar
33+
# CHECK-NEXT: BB Ranges [
34+
# CHECK-NEXT: {
35+
# CHECK-NEXT: Base Address: 0x33333
36+
# CHECK-NEXT: BB Entries [
37+
# CHECK-NEXT: ]
38+
# CHECK-NEXT: }
39+
# CHECK-NEXT: ]
40+
# CHECK-NEXT: PGO analyses {
41+
# CHECK-NEXT: FuncEntryCount: 89
42+
# CHECK-NEXT: PGO BB entries [
43+
# CHECK-NEXT: ]
44+
# CHECK-NEXT: }
45+
# CHECK-NEXT: }
46+
# CHECK-NEXT:]
47+
48+
--- !ELF
49+
FileHeader:
50+
Class: ELFCLASS[[BITS]]
51+
Data: ELFDATA2LSB
52+
Type: ET_EXEC
53+
Sections:
54+
- Name: .text
55+
Type: SHT_PROGBITS
56+
Flags: [SHF_ALLOC]
57+
- Name: .text.bar
58+
Type: SHT_PROGBITS
59+
Flags: [SHF_ALLOC]
60+
- Name: .llvm_bb_addr_map
61+
Type: SHT_LLVM_BB_ADDR_MAP
62+
ShSize: [[SIZE=<none>]]
63+
Link: .text
64+
Entries:
65+
- Version: 2
66+
Feature: 0x17
67+
BBRanges:
68+
- BaseAddress: 0x11111
69+
PGOAnalyses:
70+
- FuncEntryCount: 100
71+
- Name: '.llvm_bb_addr_map2'
72+
Type: SHT_LLVM_BB_ADDR_MAP
73+
Link: .text.bar
74+
Entries:
75+
- Version: 2
76+
Feature: 0x17
77+
BBRanges:
78+
- BaseAddress: 0x33333
79+
PGOAnalyses:
80+
- FuncEntryCount: 89
81+
Symbols:
82+
- Name: foo
83+
Section: .text
84+
Type: STT_FUNC
85+
Value: 0x11111
86+
- Name: bar
87+
Section: .text.bar
88+
Type: STT_FUNC
89+
Value: 0x33333

llvm/test/tools/yaml2obj/ELF/bb-addr-map-pgo-analysis-map.yaml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ Sections:
6666

6767
## Check that yaml2obj generates a warning when we use unsupported feature.
6868
# RUN: yaml2obj --docnum=2 %s 2>&1 | FileCheck %s --check-prefix=INVALID-FEATURE
69-
# INVALID-FEATURE: warning: invalid encoding for BBAddrMap::Features: 0xff
69+
# INVALID-FEATURE: warning: invalid encoding for BBAddrMap::Features: 0xf0
7070

7171
--- !ELF
7272
FileHeader:
@@ -79,5 +79,4 @@ Sections:
7979
Entries:
8080
- Version: 2
8181
## Specify unsupported feature
82-
Feature: 0xFF
83-
82+
Feature: 0xF0

llvm/unittests/Object/ELFObjectFileTest.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,11 +1148,11 @@ TEST(ELFObjectFileTest, ReadPGOAnalysisMap) {
11481148

11491149
BBAddrMap E1 = {
11501150
{{0x11111, {{1, 0x0, 0x1, {false, true, false, false, false}}}}}};
1151-
PGOAnalysisMap P1 = {892, {}, {true, false, false, false}};
1151+
PGOAnalysisMap P1 = {892, {}, {true, false, false, false, false}};
11521152
BBAddrMap E2 = {
11531153
{{0x22222, {{2, 0x0, 0x2, {false, false, true, false, false}}}}}};
11541154
PGOAnalysisMap P2 = {
1155-
{}, {{BlockFrequency(343), {}}}, {false, true, false, false}};
1155+
{}, {{BlockFrequency(343), {}}}, {false, true, false, false, false}};
11561156
BBAddrMap E3 = {{{0x33333,
11571157
{{0, 0x0, 0x3, {false, true, true, false, false}},
11581158
{1, 0x3, 0x3, {false, false, true, false, false}},
@@ -1163,7 +1163,7 @@ TEST(ELFObjectFileTest, ReadPGOAnalysisMap) {
11631163
{2, BranchProbability::getRaw(0xeeee'eeee)}}},
11641164
{{}, {{2, BranchProbability::getRaw(0xffff'ffff)}}},
11651165
{{}, {}}},
1166-
{false, false, true, false}};
1166+
{false, false, true, false, false}};
11671167
BBAddrMap E4 = {{{0x44444,
11681168
{{0, 0x0, 0x4, {false, false, false, true, true}},
11691169
{1, 0x4, 0x4, {false, false, false, false, false}},
@@ -1180,10 +1180,10 @@ TEST(ELFObjectFileTest, ReadPGOAnalysisMap) {
11801180
{3, BranchProbability::getRaw(0xeeee'eeee)}}},
11811181
{BlockFrequency(18), {{3, BranchProbability::getRaw(0xffff'ffff)}}},
11821182
{BlockFrequency(1000), {}}},
1183-
{true, true, true, false}};
1183+
{true, true, true, false, false}};
11841184
BBAddrMap E5 = {
11851185
{{0x55555, {{2, 0x0, 0x2, {false, false, true, false, false}}}}}};
1186-
PGOAnalysisMap P5 = {{}, {}, {false, false, false, false}};
1186+
PGOAnalysisMap P5 = {{}, {}, {false, false, false, false, false}};
11871187
BBAddrMap E6 = {
11881188
{{0x66666,
11891189
{{0, 0x0, 0x6, {false, true, true, false, false}},
@@ -1195,7 +1195,7 @@ TEST(ELFObjectFileTest, ReadPGOAnalysisMap) {
11951195
{2, BranchProbability::getRaw(0xcccc'cccc)}}},
11961196
{{}, {{2, BranchProbability::getRaw(0x8888'8888)}}},
11971197
{{}, {}}},
1198-
{false, false, true, true}};
1198+
{false, false, true, true, false}};
11991199

12001200
std::vector<BBAddrMap> Section0BBAddrMaps = {E4, E5, E6};
12011201
std::vector<BBAddrMap> Section1BBAddrMaps = {E3};

llvm/unittests/Object/ELFTypesTest.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,15 @@ static_assert(
102102

103103
TEST(ELFTypesTest, BBAddrMapFeaturesEncodingTest) {
104104
const std::array<BBAddrMap::Features, 9> Decoded = {
105-
{{false, false, false, false},
106-
{true, false, false, false},
107-
{false, true, false, false},
108-
{false, false, true, false},
109-
{false, false, false, true},
110-
{true, true, false, false},
111-
{false, true, true, false},
112-
{false, true, true, true},
113-
{true, true, true, true}}};
105+
{{false, false, false, false, false},
106+
{true, false, false, false, false},
107+
{false, true, false, false, false},
108+
{false, false, true, false, false},
109+
{false, false, false, true, false},
110+
{true, true, false, false, false},
111+
{false, true, true, false, false},
112+
{false, true, true, true, false},
113+
{true, true, true, true, false}}};
114114
const std::array<uint8_t, 9> Encoded = {
115115
{0b0000, 0b0001, 0b0010, 0b0100, 0b1000, 0b0011, 0b0110, 0b1110, 0b1111}};
116116
for (const auto &[Feat, EncodedVal] : llvm::zip(Decoded, Encoded))
@@ -125,9 +125,9 @@ TEST(ELFTypesTest, BBAddrMapFeaturesEncodingTest) {
125125

126126
TEST(ELFTypesTest, BBAddrMapFeaturesInvalidEncodingTest) {
127127
const std::array<std::string, 2> Errors = {
128-
"invalid encoding for BBAddrMap::Features: 0x10",
129-
"invalid encoding for BBAddrMap::Features: 0xff"};
130-
const std::array<uint8_t, 2> Values = {{0b10000, 0b1111'1111}};
128+
"invalid encoding for BBAddrMap::Features: 0x20",
129+
"invalid encoding for BBAddrMap::Features: 0xf0"};
130+
const std::array<uint8_t, 2> Values = {{0b10'0000, 0b1111'0000}};
131131
for (const auto &[Val, Error] : llvm::zip(Values, Errors)) {
132132
EXPECT_THAT_ERROR(BBAddrMap::Features::decode(Val).takeError(),
133133
FailedWithMessage(Error));

0 commit comments

Comments
 (0)