@@ -59,7 +59,13 @@ struct Builtin {
5959 const Record *BuiltinRecord;
6060
6161 void EmitEnumerator (llvm::raw_ostream &OS) const {
62- OS << " BI" << Name << " ,\n " ;
62+ OS << " BI" ;
63+ // If there is a required name prefix, include its spelling in the
64+ // enumerator.
65+ if (auto *PrefixRecord =
66+ BuiltinRecord->getValueAsOptionalDef (" RequiredNamePrefix" ))
67+ OS << PrefixRecord->getValueAsString (" Spelling" );
68+ OS << Name << " ,\n " ;
6369 }
6470
6571 void EmitInfo (llvm::raw_ostream &OS, const StringToOffsetTable &Table) const {
@@ -482,17 +488,42 @@ void clang::EmitClangBuiltins(const RecordKeeper &Records, raw_ostream &OS) {
482488 for (const auto *BuiltinRecord :
483489 Records.getAllDerivedDefinitions (" AtomicBuiltin" ))
484490 collectBuiltins (BuiltinRecord, Builtins);
485-
486491 unsigned NumAtomicBuiltins = Builtins.size ();
487492
488493 for (const auto *BuiltinRecord :
489494 Records.getAllDerivedDefinitions (" Builtin" )) {
490495 if (BuiltinRecord->isSubClassOf (" AtomicBuiltin" ))
491496 continue ;
497+ // Prefixed builtins are also special and we emit them last so they can have
498+ // their own representation that skips the prefix.
499+ if (BuiltinRecord->getValueAsOptionalDef (" RequiredNamePrefix" ))
500+ continue ;
501+
492502 collectBuiltins (BuiltinRecord, Builtins);
493503 }
494504
505+ // Now collect (and count) the prefixed builtins.
506+ unsigned NumPrefixedBuiltins = Builtins.size ();
507+ const Record *FirstPrefix = nullptr ;
508+ for (const auto *BuiltinRecord :
509+ Records.getAllDerivedDefinitions (" Builtin" )) {
510+ auto *Prefix = BuiltinRecord->getValueAsOptionalDef (" RequiredNamePrefix" );
511+ if (!Prefix)
512+ continue ;
513+
514+ if (!FirstPrefix)
515+ FirstPrefix = Prefix;
516+ assert (Prefix == FirstPrefix &&
517+ " Multiple distinct prefixes which is not currently supported!" );
518+ assert (!BuiltinRecord->isSubClassOf (" AtomicBuiltin" ) &&
519+ " Cannot require a name prefix for an atomic builtin." );
520+ collectBuiltins (BuiltinRecord, Builtins);
521+ }
522+ NumPrefixedBuiltins = Builtins.size () - NumPrefixedBuiltins;
523+
495524 auto AtomicBuiltins = ArrayRef (Builtins).slice (0 , NumAtomicBuiltins);
525+ auto UnprefixedBuiltins = ArrayRef (Builtins).drop_back (NumPrefixedBuiltins);
526+ auto PrefixedBuiltins = ArrayRef (Builtins).take_back (NumPrefixedBuiltins);
496527
497528 // Collect strings into a table.
498529 StringToOffsetTable Table;
@@ -524,14 +555,24 @@ void clang::EmitClangBuiltins(const RecordKeeper &Records, raw_ostream &OS) {
524555#endif // GET_BUILTIN_STR_TABLE
525556)c++" ;
526557
527- // Emit a direct set of `Builtin::Info` initializers.
558+ // Emit a direct set of `Builtin::Info` initializers, first for the unprefixed
559+ // builtins and then for the prefixed builtins.
528560 OS << R"c++(
529561#ifdef GET_BUILTIN_INFOS
530562)c++" ;
531- for (const auto &B : Builtins )
563+ for (const auto &B : UnprefixedBuiltins )
532564 B.EmitInfo (OS, Table);
533565 OS << R"c++(
534566#endif // GET_BUILTIN_INFOS
567+ )c++" ;
568+
569+ OS << R"c++(
570+ #ifdef GET_BUILTIN_PREFIXED_INFOS
571+ )c++" ;
572+ for (const auto &B : PrefixedBuiltins)
573+ B.EmitInfo (OS, Table);
574+ OS << R"c++(
575+ #endif // GET_BUILTIN_PREFIXED_INFOS
535576)c++" ;
536577
537578 // Emit X-macros for the atomic builtins to support various custome patterns
0 commit comments