Skip to content

Commit 0532cc4

Browse files
author
git apple-llvm automerger
committed
Merge commit 'a3f61c8bfd27' from llvm.org/main into next
2 parents ced9816 + a3f61c8 commit 0532cc4

File tree

3 files changed

+352
-0
lines changed

3 files changed

+352
-0
lines changed
Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
## Check how obj2yaml produces YAML PGO Analysis Map in .llvm_bb_addr_map.
2+
3+
## Check that obj2yaml uses the "Entries" tag to describe an .llvm_bb_addr_map section.
4+
5+
# RUN: yaml2obj --docnum=1 %s -o %t1
6+
# RUN: obj2yaml %t1 | FileCheck %s --check-prefix=VALID
7+
8+
# VALID: --- !ELF
9+
# VALID-NEXT: FileHeader:
10+
# VALID-NEXT: Class: ELFCLASS64
11+
# VALID-NEXT: Data: ELFDATA2LSB
12+
# VALID-NEXT: Type: ET_EXEC
13+
# VALID-NEXT: Sections:
14+
# VALID-NEXT: - Name: .llvm_bb_addr_map
15+
# VALID-NEXT: Type: SHT_LLVM_BB_ADDR_MAP
16+
# VALID-NEXT: Entries:
17+
# VALID-NEXT: - Version: 2
18+
# VALID-NEXT: Feature: 0x7
19+
## The 'BaseAddress' field is omitted when it's zero.
20+
# VALID-NEXT: BBRanges:
21+
# VALID-NEXT: - BBEntries:
22+
# VALID-NEXT: - ID: 0
23+
# VALID-NEXT: AddressOffset: 0x1
24+
# VALID-NEXT: Size: 0x2
25+
# VALID-NEXT: Metadata: 0x3
26+
# VALID-NEXT: - ID: 2
27+
# VALID-NEXT: AddressOffset: 0x4
28+
# VALID-NEXT: Size: 0x5
29+
# VALID-NEXT: Metadata: 0x6
30+
# VALID-NEXT: - ID: 4
31+
# VALID-NEXT: AddressOffset: 0xFFFFFFFFFFFFFFF7
32+
# VALID-NEXT: Size: 0xFFFFFFFFFFFFFFF8
33+
# VALID-NEXT: Metadata: 0xFFFFFFFFFFFFFFF9
34+
# VALID-NEXT: - Version: 2
35+
# VALID-NEXT: Feature: 0xA
36+
# VALID-NEXT: BBRanges:
37+
# VALID-NEXT: - BaseAddress: 0xFFFFFFFFFFFFFF20
38+
# VALID-NEXT: BBEntries:
39+
# VALID-NEXT: - ID: 6
40+
# VALID-NEXT: AddressOffset: 0xA
41+
# VALID-NEXT: Size: 0xB
42+
# VALID-NEXT: Metadata: 0xC
43+
# VALID-NEXT: PGOAnalyses:
44+
# VALID-NEXT: - FuncEntryCount: 100
45+
# VALID-NEXT: PGOBBEntries:
46+
# VALID-NEXT: - BBFreq: 100
47+
# VALID-NEXT: Successors:
48+
# VALID-NEXT: - ID: 2
49+
# VALID-NEXT: BrProb: 0x80000000
50+
# VALID-NEXT: - ID: 4
51+
# VALID-NEXT: BrProb: 0x80000000
52+
# VALID-NEXT: - BBFreq: 50
53+
# VALID-NEXT: Successors:
54+
# VALID-NEXT: - ID: 4
55+
# VALID-NEXT: BrProb: 0xFFFFFFFF
56+
# VALID-NEXT: - BBFreq: 100
57+
# VALID-NEXT: Successors: []
58+
# VALID-NEXT: PGOBBEntries:
59+
# VALID-NEXT: - BBFreq: 20
60+
61+
--- !ELF
62+
FileHeader:
63+
Class: ELFCLASS64
64+
Data: ELFDATA2LSB
65+
Type: ET_EXEC
66+
Sections:
67+
- Name: .llvm_bb_addr_map
68+
Type: SHT_LLVM_BB_ADDR_MAP
69+
ShSize: [[SIZE=<none>]]
70+
Entries:
71+
- Version: 2
72+
Feature: 0x7
73+
BBRanges:
74+
- BaseAddress: 0x0
75+
BBEntries:
76+
- ID: 0
77+
AddressOffset: 0x1
78+
Size: 0x2
79+
Metadata: 0x3
80+
- ID: 2
81+
AddressOffset: 0x4
82+
Size: 0x5
83+
Metadata: 0x6
84+
- ID: 4
85+
AddressOffset: 0xFFFFFFFFFFFFFFF7
86+
Size: 0xFFFFFFFFFFFFFFF8
87+
Metadata: 0xFFFFFFFFFFFFFFF9
88+
- Version: 2
89+
Feature: 0xA
90+
BBRanges:
91+
- BaseAddress: 0xFFFFFFFFFFFFFF20
92+
BBEntries:
93+
- ID: 6
94+
AddressOffset: 0xA
95+
Size: 0xB
96+
Metadata: 0xC
97+
PGOAnalyses:
98+
- FuncEntryCount: 100
99+
PGOBBEntries:
100+
- BBFreq: 100
101+
Successors:
102+
- ID: 2
103+
BrProb: 0x80000000
104+
- ID: 4
105+
BrProb: 0x80000000
106+
- BBFreq: 50
107+
Successors:
108+
- ID: 4
109+
BrProb: 0xFFFFFFFF
110+
- BBFreq: 100
111+
Successors: []
112+
- PGOBBEntries:
113+
- BBFreq: 20
114+
115+
## Check obj2yaml can dump multiple .llvm_bb_addr_map sections.
116+
117+
# RUN: yaml2obj --docnum=2 %s -o %t2
118+
# RUN: obj2yaml %t2 | FileCheck %s --check-prefix=MULTI
119+
120+
# MULTI: --- !ELF
121+
# MULTI-NEXT: FileHeader:
122+
# MULTI-NEXT: Class: ELFCLASS64
123+
# MULTI-NEXT: Data: ELFDATA2LSB
124+
# MULTI-NEXT: Type: ET_EXEC
125+
# MULTI-NEXT: Sections:
126+
# MULTI-NEXT: - Name: .llvm_bb_addr_map
127+
# MULTI-NEXT: Type: SHT_LLVM_BB_ADDR_MAP
128+
# MULTI-NEXT: Entries:
129+
## Fieldx 'BaseAddress' is omitted when it is zero.
130+
# MULTI-NEXT: - Version: 0
131+
# MULTI-NEXT: Feature: 0x3
132+
# MULTI-NEXT: BBRanges:
133+
# MULTI-NEXT: - BBEntries:
134+
# MULTI-NEXT: - ID: 0
135+
# MULTI-NEXT: AddressOffset: 0x1
136+
# MULTI-NEXT: Size: 0x2
137+
# MULTI-NEXT: Metadata: 0x3
138+
# MULTI-NEXT: PGOAnalyses:
139+
# MULTI-NEXT: - FuncEntryCount: 0
140+
# MULTI-NEXT: PGOBBEntries:
141+
# MULTI-NEXT: - BBFreq: 0
142+
# MULTI-NEXT: - Name: '.llvm_bb_addr_map (1)'
143+
# MULTI-NEXT: Type: SHT_LLVM_BB_ADDR_MAP
144+
# MULTI-NEXT: Entries:
145+
# MULTI-NEXT: - Version: 0
146+
# MULTI-NEXT: Feature: 0x1
147+
# MULTI-NEXT: BBRanges:
148+
# MULTI-NEXT: - BaseAddress: 0x20
149+
# MULTI-NEXT: BBEntries: []
150+
# MULTI-NEXT: PGOAnalyses:
151+
# MULTI-NEXT: - FuncEntryCount: 0
152+
153+
--- !ELF
154+
FileHeader:
155+
Class: ELFCLASS64
156+
Data: ELFDATA2LSB
157+
Type: ET_EXEC
158+
Sections:
159+
- Name: .llvm_bb_addr_map
160+
Type: SHT_LLVM_BB_ADDR_MAP
161+
Entries:
162+
## Check that obj2yaml does not emit the 'BaseAddress' and 'Feature' fields when
163+
## they are zero.
164+
- Version: 0
165+
Feature: 0x3
166+
BBRanges:
167+
- BaseAddress: 0x0
168+
BBEntries:
169+
- AddressOffset: 0x1
170+
Size: 0x2
171+
Metadata: 0x3
172+
PGOAnalyses:
173+
- FuncEntryCount: 0
174+
PGOBBEntries:
175+
- BBFreq: 0
176+
- Name: '.llvm_bb_addr_map (1)'
177+
Type: SHT_LLVM_BB_ADDR_MAP
178+
Entries:
179+
- Version: 0
180+
Feature: 0x1
181+
BBRanges:
182+
- BaseAddress: 0x20
183+
PGOAnalyses:
184+
- FuncEntryCount: 0
185+
186+
## Check that obj2yaml uses the "Content" tag to describe an .llvm_bb_addr_map section
187+
## when it can't extract the entries, for example, when the section is truncated.
188+
189+
# RUN: yaml2obj --docnum=1 -DSIZE=0x1D %s -o %t3
190+
# RUN: obj2yaml %t3 | FileCheck %s --check-prefixes=TRUNCATED,INVALID
191+
192+
# INVALID: --- !ELF
193+
# INVALID-NEXT: FileHeader:
194+
# INVALID-NEXT: Class: ELFCLASS64
195+
# INVALID-NEXT: Data: ELFDATA2LSB
196+
# INVALID-NEXT: Type: ET_EXEC
197+
# INVALID-NEXT: Sections:
198+
# INVALID-NEXT: - Name: .llvm_bb_addr_map
199+
# INVALID-NEXT: Type: SHT_LLVM_BB_ADDR_MAP
200+
# TRUNCATED-NEXT: Content: {{([[:xdigit:]]{58})}}{{$}}
201+
# TRUNCATED-NEXT: Content: {{([[:xdigit:]]{58})}}{{$}}
202+
203+
## Check that obj2yaml uses the "Content" tag when original YAML does not
204+
## provide a PGO field that was enabled in the feature byte
205+
206+
# RUN: yaml2obj --docnum=3 %s -o %t4
207+
# RUN: obj2yaml %t4 | FileCheck %s --check-prefix=MISSING-FEC
208+
209+
--- !ELF
210+
FileHeader:
211+
Class: ELFCLASS64
212+
Data: ELFDATA2LSB
213+
Type: ET_EXEC
214+
Sections:
215+
- Name: '.llvm_bb_addr_map'
216+
Type: SHT_LLVM_BB_ADDR_MAP
217+
Entries:
218+
- Version: 0
219+
Feature: 0x1
220+
BBRanges:
221+
- BaseAddress: 0x20
222+
223+
# MISSING-FEC: --- !ELF
224+
# MISSING-FEC-NEXT: FileHeader:
225+
# MISSING-FEC-NEXT: Class: ELFCLASS64
226+
# MISSING-FEC-NEXT: Data: ELFDATA2LSB
227+
# MISSING-FEC-NEXT: Type: ET_EXEC
228+
# MISSING-FEC-NEXT: Sections:
229+
# MISSING-FEC-NEXT: - Name: .llvm_bb_addr_map
230+
# MISSING-FEC-NEXT: Type: SHT_LLVM_BB_ADDR_MAP
231+
# MISSING-FEC-NEXT: Content: '{{([[:xdigit:]]+)}}'{{$}}
232+
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
## Check how yaml2obj produces PGO Analysis Map in .llvm_bb_addr_map section.
2+
3+
# RUN: yaml2obj --docnum=1 %s -o %t1
4+
# RUN: llvm-readobj --sections --section-data %t1 | FileCheck %s
5+
6+
# Case 4: Specify Entries.
7+
# CHECK: Name: .llvm_bb_addr_map (1)
8+
# CHECK: SectionData (
9+
# CHECK-NEXT: 0000: 02072000 00000000 0000010B 010203E8
10+
# CHECK-NEXT: 0010: 07E80702 0CEEDDBB F70E0D91 A2C48801
11+
# CHECK-NEXT: )
12+
13+
# Case 7: Not including a field which is enabled in feature doesn't emit value
14+
# CHECK: Name: .llvm_bb_addr_map (1)
15+
# CHECK: SectionData (
16+
# CHECK-NEXT: 0000: 02012000 00000000 0000020D 010203 |
17+
# CHECK-NEXT: )
18+
19+
--- !ELF
20+
FileHeader:
21+
Class: ELFCLASS64
22+
Data: ELFDATA2LSB
23+
Type: ET_EXEC
24+
Sections:
25+
26+
## Test the following cases:
27+
28+
## 1) We can produce an .llvm_bb_addr_map section from a description with
29+
## Entries and PGO Analysis data.
30+
- Name: '.llvm_bb_addr_map (1)'
31+
Type: SHT_LLVM_BB_ADDR_MAP
32+
Entries:
33+
- Version: 2
34+
Feature: 0x7
35+
BBRanges:
36+
- BaseAddress: 0x0000000000000020
37+
BBEntries:
38+
- ID: 11
39+
AddressOffset: 0x00000001
40+
Size: 0x00000002
41+
Metadata: 0x00000003
42+
PGOAnalyses:
43+
- FuncEntryCount: 1000
44+
PGOBBEntries:
45+
- BBFreq: 1000
46+
Successors:
47+
- ID: 12
48+
BrProb: 0xeeeeeeee
49+
- ID: 13
50+
BrProb: 0x11111111
51+
52+
## 2) According to feature we have FuncEntryCount but none is provided in yaml
53+
- Name: '.llvm_bb_addr_map (2)'
54+
Type: SHT_LLVM_BB_ADDR_MAP
55+
Entries:
56+
- Version: 2
57+
Feature: 0x1
58+
BBRanges:
59+
- BaseAddress: 0x0000000000000020
60+
NumBlocks: 2
61+
BBEntries:
62+
- ID: 13
63+
AddressOffset: 0x00000001
64+
Size: 0x00000002
65+
Metadata: 0x00000003
66+
67+
## Check that yaml2obj generates a warning when we use unsupported feature.
68+
# RUN: yaml2obj --docnum=2 %s 2>&1 | FileCheck %s --check-prefix=INVALID-FEATURE
69+
# INVALID-FEATURE: warning: invalid encoding for BBAddrMap::Features: 0xff
70+
71+
--- !ELF
72+
FileHeader:
73+
Class: ELFCLASS64
74+
Data: ELFDATA2LSB
75+
Type: ET_EXEC
76+
Sections:
77+
- Name: '.llvm_bb_addr_map'
78+
Type: SHT_LLVM_BB_ADDR_MAP
79+
Entries:
80+
- Version: 2
81+
## Specify unsupported feature
82+
Feature: 0xFF
83+

llvm/tools/obj2yaml/elf2yaml.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,8 @@ ELFDumper<ELFT>::dumpBBAddrMapSection(const Elf_Shdr *Shdr) {
889889
DataExtractor Data(Content, Obj.isLE(), ELFT::Is64Bits ? 8 : 4);
890890

891891
std::vector<ELFYAML::BBAddrMapEntry> Entries;
892+
bool HasAnyPGOAnalysisMapEntry = false;
893+
std::vector<ELFYAML::PGOAnalysisMapEntry> PGOAnalyses;
892894
DataExtractor::Cursor Cur(0);
893895
uint8_t Version = 0;
894896
uint8_t Feature = 0;
@@ -905,6 +907,7 @@ ELFDumper<ELFT>::dumpBBAddrMapSection(const Elf_Shdr *Shdr) {
905907
}
906908
uint64_t NumBBRanges = 1;
907909
uint64_t NumBlocks = 0;
910+
uint32_t TotalNumBlocks = 0;
908911
auto FeatureOrErr = llvm::object::BBAddrMap::Features::decode(Feature);
909912
if (!FeatureOrErr)
910913
return FeatureOrErr.takeError();
@@ -934,10 +937,42 @@ ELFDumper<ELFT>::dumpBBAddrMapSection(const Elf_Shdr *Shdr) {
934937
uint64_t Metadata = Data.getULEB128(Cur);
935938
BBEntries.push_back({ID, Offset, Size, Metadata});
936939
}
940+
TotalNumBlocks += BBEntries.size();
937941
BBRanges.push_back({BaseAddress, /*NumBlocks=*/{}, BBEntries});
938942
}
939943
Entries.push_back(
940944
{Version, Feature, /*NumBBRanges=*/{}, std::move(BBRanges)});
945+
946+
ELFYAML::PGOAnalysisMapEntry &PGOAnalysis = PGOAnalyses.emplace_back();
947+
if (FeatureOrErr->hasPGOAnalysis()) {
948+
HasAnyPGOAnalysisMapEntry = true;
949+
950+
if (FeatureOrErr->FuncEntryCount)
951+
PGOAnalysis.FuncEntryCount = Data.getULEB128(Cur);
952+
953+
if (FeatureOrErr->hasPGOAnalysisBBData()) {
954+
auto &PGOBBEntries = PGOAnalysis.PGOBBEntries.emplace();
955+
for (uint64_t BlockIndex = 0; Cur && BlockIndex < TotalNumBlocks;
956+
++BlockIndex) {
957+
auto &PGOBBEntry = PGOBBEntries.emplace_back();
958+
if (FeatureOrErr->BBFreq) {
959+
PGOBBEntry.BBFreq = Data.getULEB128(Cur);
960+
if (!Cur)
961+
break;
962+
}
963+
964+
if (FeatureOrErr->BrProb) {
965+
auto &SuccEntries = PGOBBEntry.Successors.emplace();
966+
uint64_t SuccCount = Data.getULEB128(Cur);
967+
for (uint64_t SuccIdx = 0; Cur && SuccIdx < SuccCount; ++SuccIdx) {
968+
uint32_t ID = Data.getULEB128(Cur);
969+
uint32_t BrProb = Data.getULEB128(Cur);
970+
SuccEntries.push_back({ID, BrProb});
971+
}
972+
}
973+
}
974+
}
975+
}
941976
}
942977

943978
if (!Cur) {
@@ -946,6 +981,8 @@ ELFDumper<ELFT>::dumpBBAddrMapSection(const Elf_Shdr *Shdr) {
946981
S->Content = yaml::BinaryRef(Content);
947982
} else {
948983
S->Entries = std::move(Entries);
984+
if (HasAnyPGOAnalysisMapEntry)
985+
S->PGOAnalyses = std::move(PGOAnalyses);
949986
}
950987

951988
return S.release();

0 commit comments

Comments
 (0)