Skip to content

Commit 0e3faa2

Browse files
author
Esme
authored
[XCOFF][obj2yaml] support parsing auxiliary symbols for XCOFF (#70642)
This PR adds the support for parsing auxiliary symbols of XCOFF object file for obj2yaml.
1 parent 986287e commit 0e3faa2

File tree

5 files changed

+638
-13
lines changed

5 files changed

+638
-13
lines changed

llvm/include/llvm/Object/XCOFFObjectFile.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,13 +411,13 @@ class XCOFFCsectAuxRef {
411411
return Entry64->AuxType;
412412
}
413413

414-
private:
415414
uint8_t getSymbolAlignmentAndType() const {
416415
return GETVALUE(SymbolAlignmentAndType);
417416
}
418417

419418
#undef GETVALUE
420419

420+
private:
421421
const XCOFFCsectAuxEnt32 *Entry32 = nullptr;
422422
const XCOFFCsectAuxEnt64 *Entry64 = nullptr;
423423
};

llvm/lib/ObjectYAML/XCOFFYAML.cpp

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -282,45 +282,57 @@ static void auxSymMapping(IO &IO, XCOFFYAML::SectAuxEntForStat &AuxSym) {
282282

283283
void MappingTraits<std::unique_ptr<XCOFFYAML::AuxSymbolEnt>>::mapping(
284284
IO &IO, std::unique_ptr<XCOFFYAML::AuxSymbolEnt> &AuxSym) {
285-
assert(!IO.outputting() && "We don't dump aux symbols currently.");
285+
286+
auto ResetAuxSym = [&](auto *AuxEnt) {
287+
if (!IO.outputting())
288+
AuxSym.reset(AuxEnt);
289+
};
290+
286291
const bool Is64 =
287292
static_cast<XCOFFYAML::Object *>(IO.getContext())->Header.Magic ==
288293
(llvm::yaml::Hex16)XCOFF::XCOFF64;
294+
289295
XCOFFYAML::AuxSymbolType AuxType;
296+
if (IO.outputting())
297+
AuxType = AuxSym.get()->Type;
290298
IO.mapRequired("Type", AuxType);
291299
switch (AuxType) {
292300
case XCOFFYAML::AUX_EXCEPT:
293-
if (!Is64)
301+
if (!Is64) {
294302
IO.setError("an auxiliary symbol of type AUX_EXCEPT cannot be defined in "
295303
"XCOFF32");
296-
AuxSym.reset(new XCOFFYAML::ExcpetionAuxEnt());
304+
return;
305+
}
306+
ResetAuxSym(new XCOFFYAML::ExcpetionAuxEnt());
297307
auxSymMapping(IO, *cast<XCOFFYAML::ExcpetionAuxEnt>(AuxSym.get()));
298308
break;
299309
case XCOFFYAML::AUX_FCN:
300-
AuxSym.reset(new XCOFFYAML::FunctionAuxEnt());
310+
ResetAuxSym(new XCOFFYAML::FunctionAuxEnt());
301311
auxSymMapping(IO, *cast<XCOFFYAML::FunctionAuxEnt>(AuxSym.get()), Is64);
302312
break;
303313
case XCOFFYAML::AUX_SYM:
304-
AuxSym.reset(new XCOFFYAML::BlockAuxEnt());
314+
ResetAuxSym(new XCOFFYAML::BlockAuxEnt());
305315
auxSymMapping(IO, *cast<XCOFFYAML::BlockAuxEnt>(AuxSym.get()), Is64);
306316
break;
307317
case XCOFFYAML::AUX_FILE:
308-
AuxSym.reset(new XCOFFYAML::FileAuxEnt());
318+
ResetAuxSym(new XCOFFYAML::FileAuxEnt());
309319
auxSymMapping(IO, *cast<XCOFFYAML::FileAuxEnt>(AuxSym.get()));
310320
break;
311321
case XCOFFYAML::AUX_CSECT:
312-
AuxSym.reset(new XCOFFYAML::CsectAuxEnt());
322+
ResetAuxSym(new XCOFFYAML::CsectAuxEnt());
313323
auxSymMapping(IO, *cast<XCOFFYAML::CsectAuxEnt>(AuxSym.get()), Is64);
314324
break;
315325
case XCOFFYAML::AUX_SECT:
316-
AuxSym.reset(new XCOFFYAML::SectAuxEntForDWARF());
326+
ResetAuxSym(new XCOFFYAML::SectAuxEntForDWARF());
317327
auxSymMapping(IO, *cast<XCOFFYAML::SectAuxEntForDWARF>(AuxSym.get()));
318328
break;
319329
case XCOFFYAML::AUX_STAT:
320-
if (Is64)
330+
if (Is64) {
321331
IO.setError(
322332
"an auxiliary symbol of type AUX_STAT cannot be defined in XCOFF64");
323-
AuxSym.reset(new XCOFFYAML::SectAuxEntForStat());
333+
return;
334+
}
335+
ResetAuxSym(new XCOFFYAML::SectAuxEntForStat());
324336
auxSymMapping(IO, *cast<XCOFFYAML::SectAuxEntForStat>(AuxSym.get()));
325337
break;
326338
}
@@ -334,8 +346,7 @@ void MappingTraits<XCOFFYAML::Symbol>::mapping(IO &IO, XCOFFYAML::Symbol &S) {
334346
IO.mapOptional("Type", S.Type);
335347
IO.mapOptional("StorageClass", S.StorageClass);
336348
IO.mapOptional("NumberOfAuxEntries", S.NumberOfAuxEntries);
337-
if (!IO.outputting())
338-
IO.mapOptional("AuxEntries", S.AuxEntries);
349+
IO.mapOptional("AuxEntries", S.AuxEntries);
339350
}
340351

341352
void MappingTraits<XCOFFYAML::StringTable>::mapping(IO &IO, XCOFFYAML::StringTable &Str) {

llvm/test/tools/obj2yaml/XCOFF/aix.yaml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,30 @@
5252
# CHECK32-NEXT: Type: 0x0
5353
# CHECK32-NEXT: StorageClass: C_EXT
5454
# CHECK32-NEXT: NumberOfAuxEntries: 1
55+
# CHECK32-NEXT: AuxEntries:
56+
# CHECK32-NEXT: - Type: AUX_CSECT
57+
# CHECK32-NEXT: ParameterHashIndex: 0
58+
# CHECK32-NEXT: TypeChkSectNum: 0
59+
# CHECK32-NEXT: SymbolAlignmentAndType: 0
60+
# CHECK32-NEXT: StorageMappingClass: XMC_PR
61+
# CHECK32-NEXT: SectionOrLength: 0
62+
# CHECK32-NEXT: StabInfoIndex: 0
63+
# CHECK32-NEXT: StabSectNum: 0
5564
# CHECK32-NEXT: - Name: .data
5665
# CHECK32-NEXT: Value: 0x70
5766
# CHECK32-NEXT: Section: .data
5867
# CHECK32-NEXT: Type: 0x0
5968
# CHECK32-NEXT: StorageClass: C_HIDEXT
6069
# CHECK32-NEXT: NumberOfAuxEntries: 1
70+
# CHECK32-NEXT: AuxEntries:
71+
# CHECK32-NEXT: - Type: AUX_CSECT
72+
# CHECK32-NEXT: ParameterHashIndex: 0
73+
# CHECK32-NEXT: TypeChkSectNum: 0
74+
# CHECK32-NEXT: SymbolAlignmentAndType: 0
75+
# CHECK32-NEXT: StorageMappingClass: XMC_PR
76+
# CHECK32-NEXT: SectionOrLength: 0
77+
# CHECK32-NEXT: StabInfoIndex: 0
78+
# CHECK32-NEXT: StabSectNum: 0
6179

6280
# CHECK64: --- !XCOFF
6381
# CHECK64-NEXT: FileHeader:
@@ -106,12 +124,28 @@
106124
# CHECK64-NEXT: Type: 0x0
107125
# CHECK64-NEXT: StorageClass: C_EXT
108126
# CHECK64-NEXT: NumberOfAuxEntries: 1
127+
# CHECK64-NEXT: AuxEntries:
128+
# CHECK64-NEXT: - Type: AUX_CSECT
129+
# CHECK64-NEXT: ParameterHashIndex: 0
130+
# CHECK64-NEXT: TypeChkSectNum: 0
131+
# CHECK64-NEXT: SymbolAlignmentAndType: 0
132+
# CHECK64-NEXT: StorageMappingClass: XMC_PR
133+
# CHECK64-NEXT: SectionOrLengthLo: 0
134+
# CHECK64-NEXT: SectionOrLengthHi: 0
109135
# CHECK64-NEXT: - Name: .data
110136
# CHECK64-NEXT: Value: 0x70
111137
# CHECK64-NEXT: Section: .data
112138
# CHECK64-NEXT: Type: 0x0
113139
# CHECK64-NEXT: StorageClass: C_HIDEXT
114140
# CHECK64-NEXT: NumberOfAuxEntries: 1
141+
# CHECK64-NEXT: AuxEntries:
142+
# CHECK64-NEXT: - Type: AUX_CSECT
143+
# CHECK64-NEXT: ParameterHashIndex: 0
144+
# CHECK64-NEXT: TypeChkSectNum: 0
145+
# CHECK64-NEXT: SymbolAlignmentAndType: 0
146+
# CHECK64-NEXT: StorageMappingClass: XMC_PR
147+
# CHECK64-NEXT: SectionOrLengthLo: 0
148+
# CHECK64-NEXT: SectionOrLengthHi: 0
115149

116150
--- !XCOFF
117151
FileHeader:
@@ -140,9 +174,13 @@ Symbols:
140174
Type: 0x0
141175
StorageClass: C_EXT
142176
NumberOfAuxEntries: 1
177+
AuxEntries:
178+
- Type: AUX_CSECT
143179
- Name: .data
144180
Value: 0x70
145181
Section: .data
146182
Type: 0x0
147183
StorageClass: C_HIDEXT
148184
NumberOfAuxEntries: 1
185+
AuxEntries:
186+
- Type: AUX_CSECT

0 commit comments

Comments
 (0)