@@ -280,47 +280,60 @@ static void auxSymMapping(IO &IO, XCOFFYAML::SectAuxEntForStat &AuxSym) {
280
280
IO.mapOptional (" NumberOfLineNum" , AuxSym.NumberOfLineNum );
281
281
}
282
282
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
+
283
290
void MappingTraits<std::unique_ptr<XCOFFYAML::AuxSymbolEnt>>::mapping(
284
291
IO &IO, std::unique_ptr<XCOFFYAML::AuxSymbolEnt> &AuxSym) {
285
- assert (!IO.outputting () && " We don't dump aux symbols currently." );
286
292
const bool Is64 =
287
293
static_cast <XCOFFYAML::Object *>(IO.getContext ())->Header .Magic ==
288
294
(llvm::yaml::Hex16)XCOFF::XCOFF64;
295
+
289
296
XCOFFYAML::AuxSymbolType AuxType;
297
+ if (IO.outputting ())
298
+ AuxType = AuxSym.get ()->Type ;
290
299
IO.mapRequired (" Type" , AuxType);
291
300
switch (AuxType) {
292
301
case XCOFFYAML::AUX_EXCEPT:
293
- if (!Is64)
302
+ if (!Is64) {
294
303
IO.setError (" an auxiliary symbol of type AUX_EXCEPT cannot be defined in "
295
304
" XCOFF32" );
296
- AuxSym.reset (new XCOFFYAML::ExcpetionAuxEnt ());
305
+ return ;
306
+ }
307
+ ResetAuxSym<XCOFFYAML::ExcpetionAuxEnt>(IO, AuxSym);
297
308
auxSymMapping (IO, *cast<XCOFFYAML::ExcpetionAuxEnt>(AuxSym.get ()));
298
309
break ;
299
310
case XCOFFYAML::AUX_FCN:
300
- AuxSym. reset ( new XCOFFYAML::FunctionAuxEnt () );
311
+ ResetAuxSym< XCOFFYAML::FunctionAuxEnt>(IO, AuxSym );
301
312
auxSymMapping (IO, *cast<XCOFFYAML::FunctionAuxEnt>(AuxSym.get ()), Is64);
302
313
break ;
303
314
case XCOFFYAML::AUX_SYM:
304
- AuxSym. reset ( new XCOFFYAML::BlockAuxEnt () );
315
+ ResetAuxSym< XCOFFYAML::BlockAuxEnt>(IO, AuxSym );
305
316
auxSymMapping (IO, *cast<XCOFFYAML::BlockAuxEnt>(AuxSym.get ()), Is64);
306
317
break ;
307
318
case XCOFFYAML::AUX_FILE:
308
- AuxSym. reset ( new XCOFFYAML::FileAuxEnt () );
319
+ ResetAuxSym< XCOFFYAML::FileAuxEnt>(IO, AuxSym );
309
320
auxSymMapping (IO, *cast<XCOFFYAML::FileAuxEnt>(AuxSym.get ()));
310
321
break ;
311
322
case XCOFFYAML::AUX_CSECT:
312
- AuxSym. reset ( new XCOFFYAML::CsectAuxEnt () );
323
+ ResetAuxSym< XCOFFYAML::CsectAuxEnt>(IO, AuxSym );
313
324
auxSymMapping (IO, *cast<XCOFFYAML::CsectAuxEnt>(AuxSym.get ()), Is64);
314
325
break ;
315
326
case XCOFFYAML::AUX_SECT:
316
- AuxSym. reset ( new XCOFFYAML::SectAuxEntForDWARF () );
327
+ ResetAuxSym< XCOFFYAML::SectAuxEntForDWARF>(IO, AuxSym );
317
328
auxSymMapping (IO, *cast<XCOFFYAML::SectAuxEntForDWARF>(AuxSym.get ()));
318
329
break ;
319
330
case XCOFFYAML::AUX_STAT:
320
- if (Is64)
331
+ if (Is64) {
321
332
IO.setError (
322
333
" 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);
324
337
auxSymMapping (IO, *cast<XCOFFYAML::SectAuxEntForStat>(AuxSym.get ()));
325
338
break ;
326
339
}
@@ -334,8 +347,7 @@ void MappingTraits<XCOFFYAML::Symbol>::mapping(IO &IO, XCOFFYAML::Symbol &S) {
334
347
IO.mapOptional (" Type" , S.Type );
335
348
IO.mapOptional (" StorageClass" , S.StorageClass );
336
349
IO.mapOptional (" NumberOfAuxEntries" , S.NumberOfAuxEntries );
337
- if (!IO.outputting ())
338
- IO.mapOptional (" AuxEntries" , S.AuxEntries );
350
+ IO.mapOptional (" AuxEntries" , S.AuxEntries );
339
351
}
340
352
341
353
void MappingTraits<XCOFFYAML::StringTable>::mapping(IO &IO, XCOFFYAML::StringTable &Str) {
0 commit comments