Skip to content

Commit e462937

Browse files
author
esmeyi
committed
Reland "[XCOFF][obj2yaml] support parsing auxiliary symbols for XCOFF (#70642)"
This PR adds the support for parsing auxiliary symbols of XCOFF object file for obj2yaml. The sanitizer error is clean now.
1 parent 54b6bc4 commit e462937

File tree

5 files changed

+639
-13
lines changed

5 files changed

+639
-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: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -280,47 +280,60 @@ static void auxSymMapping(IO &IO, XCOFFYAML::SectAuxEntForStat &AuxSym) {
280280
IO.mapOptional("NumberOfLineNum", AuxSym.NumberOfLineNum);
281281
}
282282

283+
template <typename AuxEntT>
284+
static void ResetAuxSym(IO &IO,
285+
std::unique_ptr<XCOFFYAML::AuxSymbolEnt> &AuxSym) {
286+
if (!IO.outputting())
287+
AuxSym.reset(new AuxEntT);
288+
}
289+
283290
void MappingTraits<std::unique_ptr<XCOFFYAML::AuxSymbolEnt>>::mapping(
284291
IO &IO, std::unique_ptr<XCOFFYAML::AuxSymbolEnt> &AuxSym) {
285-
assert(!IO.outputting() && "We don't dump aux symbols currently.");
286292
const bool Is64 =
287293
static_cast<XCOFFYAML::Object *>(IO.getContext())->Header.Magic ==
288294
(llvm::yaml::Hex16)XCOFF::XCOFF64;
295+
289296
XCOFFYAML::AuxSymbolType AuxType;
297+
if (IO.outputting())
298+
AuxType = AuxSym.get()->Type;
290299
IO.mapRequired("Type", AuxType);
291300
switch (AuxType) {
292301
case XCOFFYAML::AUX_EXCEPT:
293-
if (!Is64)
302+
if (!Is64) {
294303
IO.setError("an auxiliary symbol of type AUX_EXCEPT cannot be defined in "
295304
"XCOFF32");
296-
AuxSym.reset(new XCOFFYAML::ExcpetionAuxEnt());
305+
return;
306+
}
307+
ResetAuxSym<XCOFFYAML::ExcpetionAuxEnt>(IO, AuxSym);
297308
auxSymMapping(IO, *cast<XCOFFYAML::ExcpetionAuxEnt>(AuxSym.get()));
298309
break;
299310
case XCOFFYAML::AUX_FCN:
300-
AuxSym.reset(new XCOFFYAML::FunctionAuxEnt());
311+
ResetAuxSym<XCOFFYAML::FunctionAuxEnt>(IO, AuxSym);
301312
auxSymMapping(IO, *cast<XCOFFYAML::FunctionAuxEnt>(AuxSym.get()), Is64);
302313
break;
303314
case XCOFFYAML::AUX_SYM:
304-
AuxSym.reset(new XCOFFYAML::BlockAuxEnt());
315+
ResetAuxSym<XCOFFYAML::BlockAuxEnt>(IO, AuxSym);
305316
auxSymMapping(IO, *cast<XCOFFYAML::BlockAuxEnt>(AuxSym.get()), Is64);
306317
break;
307318
case XCOFFYAML::AUX_FILE:
308-
AuxSym.reset(new XCOFFYAML::FileAuxEnt());
319+
ResetAuxSym<XCOFFYAML::FileAuxEnt>(IO, AuxSym);
309320
auxSymMapping(IO, *cast<XCOFFYAML::FileAuxEnt>(AuxSym.get()));
310321
break;
311322
case XCOFFYAML::AUX_CSECT:
312-
AuxSym.reset(new XCOFFYAML::CsectAuxEnt());
323+
ResetAuxSym<XCOFFYAML::CsectAuxEnt>(IO, AuxSym);
313324
auxSymMapping(IO, *cast<XCOFFYAML::CsectAuxEnt>(AuxSym.get()), Is64);
314325
break;
315326
case XCOFFYAML::AUX_SECT:
316-
AuxSym.reset(new XCOFFYAML::SectAuxEntForDWARF());
327+
ResetAuxSym<XCOFFYAML::SectAuxEntForDWARF>(IO, AuxSym);
317328
auxSymMapping(IO, *cast<XCOFFYAML::SectAuxEntForDWARF>(AuxSym.get()));
318329
break;
319330
case XCOFFYAML::AUX_STAT:
320-
if (Is64)
331+
if (Is64) {
321332
IO.setError(
322333
"an auxiliary symbol of type AUX_STAT cannot be defined in XCOFF64");
323-
AuxSym.reset(new XCOFFYAML::SectAuxEntForStat());
334+
return;
335+
}
336+
ResetAuxSym<XCOFFYAML::SectAuxEntForStat>(IO, AuxSym);
324337
auxSymMapping(IO, *cast<XCOFFYAML::SectAuxEntForStat>(AuxSym.get()));
325338
break;
326339
}
@@ -334,8 +347,7 @@ void MappingTraits<XCOFFYAML::Symbol>::mapping(IO &IO, XCOFFYAML::Symbol &S) {
334347
IO.mapOptional("Type", S.Type);
335348
IO.mapOptional("StorageClass", S.StorageClass);
336349
IO.mapOptional("NumberOfAuxEntries", S.NumberOfAuxEntries);
337-
if (!IO.outputting())
338-
IO.mapOptional("AuxEntries", S.AuxEntries);
350+
IO.mapOptional("AuxEntries", S.AuxEntries);
339351
}
340352

341353
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)