================ @@ -68,23 +70,144 @@ enum ID { FirstTSBuiltin }; +// The info used to represent each builtin. struct Info { - llvm::StringLiteral Name; - const char *Type, *Attributes; - const char *Features; + // Rather than store pointers to the string literals describing these four + // aspects of builtins, we store offsets into a common string table. + struct StrOffsets { + llvm::StringTable::Offset Name; + llvm::StringTable::Offset Type; + llvm::StringTable::Offset Attributes; + llvm::StringTable::Offset Features; + } Offsets; + HeaderDesc Header; LanguageID Langs; }; +// A constexpr function to construct an infos array from X-macros. +// +// The input array uses the same data structure, but the offsets are actually +// _lengths_ when input. This is all we can compute from the X-macro approach to +// builtins. This function will convert these lengths into actual offsets to a +// string table built up through sequentially appending strings with the given +// lengths. +template <size_t N> +static constexpr std::array<Info, N> MakeInfos(std::array<Info, N> Infos) { + // Translate lengths to offsets. We start past the initial empty string at + // offset zero. + unsigned Offset = 1; + for (auto &I : Infos) { + Info::StrOffsets NewOffsets = {}; + NewOffsets.Name = Offset; + Offset += I.Offsets.Name.value(); + NewOffsets.Type = Offset; + Offset += I.Offsets.Type.value(); + NewOffsets.Attributes = Offset; + Offset += I.Offsets.Attributes.value(); + NewOffsets.Features = Offset; + Offset += I.Offsets.Features.value(); + I.Offsets = NewOffsets; + } + return Infos; +} + +// A detail macro used below to emit a string literal that, after string literal +// concatenation, ends up triggering the `-Woverlength-strings` warning. While +// the warning is useful in general to catch accidentally excessive strings, +// here we are creating them intentionally. +// +// This relies on a subtle aspect of `_Pragma`: that the *diagnostic* ones don't +// turn into actual tokens that would disrupt string literal concatenation. +#ifdef __clang__ +#define CLANG_BUILTIN_DETAIL_STR_TABLE(S) \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Woverlength-strings\"") \ ---------------- chandlerc wrote:
Sadly, yes. I don't understand why either. =[ https://github.com/llvm/llvm-project/pull/120534 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits