@@ -1286,6 +1286,9 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
12861286 }
12871287 OS << " };\n " ;
12881288
1289+ OS << " \n static const TargetRegisterClass *const "
1290+ << " NullRegClasses[] = { nullptr };\n\n " ;
1291+
12891292 // Emit register class bit mask tables. The first bit mask emitted for a
12901293 // register class, RC, is the set of sub-classes, including RC itself.
12911294 //
@@ -1337,18 +1340,19 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
13371340 SuperRegIdxSeqs.emit (OS, printSubRegIndex);
13381341 OS << " };\n\n " ;
13391342
1340- // Emit super-class lists.
1343+ // Emit NULL terminated super-class lists.
13411344 for (const auto &RC : RegisterClasses) {
13421345 ArrayRef<CodeGenRegisterClass *> Supers = RC.getSuperClasses ();
13431346
1344- // Skip classes without supers.
1347+ // Skip classes without supers. We can reuse NullRegClasses.
13451348 if (Supers.empty ())
13461349 continue ;
13471350
1348- OS << " static unsigned const " << RC.getName () << " Superclasses[] = {\n " ;
1351+ OS << " static const TargetRegisterClass *const " << RC.getName ()
1352+ << " Superclasses[] = {\n " ;
13491353 for (const auto *Super : Supers)
1350- OS << " " << Super->getQualifiedIdName () << " ,\n " ;
1351- OS << " };\n\n " ;
1354+ OS << " & " << Super->getQualifiedName () << " RegClass ,\n " ;
1355+ OS << " nullptr \n };\n\n " ;
13521356 }
13531357
13541358 // Emit methods.
@@ -1402,10 +1406,9 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
14021406 << (RC.CoveredBySubRegs ? " true" : " false" )
14031407 << " , /* CoveredBySubRegs */\n " ;
14041408 if (RC.getSuperClasses ().empty ())
1405- OS << " nullptr, " ;
1409+ OS << " NullRegClasses, \n " ;
14061410 else
1407- OS << RC.getName () << " Superclasses, " ;
1408- OS << RC.getSuperClasses ().size () << " ,\n " ;
1411+ OS << RC.getName () << " Superclasses,\n " ;
14091412 if (RC.AltOrderSelect .empty ())
14101413 OS << " nullptr\n " ;
14111414 else
0 commit comments