Skip to content

Commit 1cb979f

Browse files
committed
[StrTable] Switch RISCV to leverage sharded, prefixed builtins w/ TableGen
This lets the TableGen-ed code be much cleaner, directly building an efficient string table without duplicates and without the repeated prefix.
1 parent cd269fe commit 1cb979f

File tree

4 files changed

+104
-64
lines changed

4 files changed

+104
-64
lines changed

clang/include/clang/Basic/BuiltinsRISCVVector.def

Lines changed: 0 additions & 22 deletions
This file was deleted.

clang/include/clang/Basic/TargetBuiltins.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,12 @@ namespace clang {
156156
namespace RISCVVector {
157157
enum {
158158
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
159-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
160-
#include "clang/Basic/BuiltinsRISCVVector.def"
159+
#define GET_RISCVV_BUILTIN_ENUMERATORS
160+
#include "clang/Basic/riscv_vector_builtins.inc"
161+
FirstSiFiveBuiltin,
162+
LastRVVBuiltin = FirstSiFiveBuiltin - 1,
163+
#include "clang/Basic/riscv_sifive_vector_builtins.inc"
164+
#undef GET_RISCVV_BUILTIN_ENUMERATORS
161165
FirstTSBuiltin,
162166
};
163167
}

clang/lib/Basic/Targets/RISCV.cpp

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -241,32 +241,50 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
241241
}
242242

243243
static constexpr int NumRVVBuiltins =
244-
clang::RISCVVector::FirstTSBuiltin - Builtin::FirstTSBuiltin;
244+
RISCVVector::FirstSiFiveBuiltin - Builtin::FirstTSBuiltin;
245+
static constexpr int NumRVVSiFiveBuiltins =
246+
RISCVVector::FirstTSBuiltin - RISCVVector::FirstSiFiveBuiltin;
245247
static constexpr int NumRISCVBuiltins =
246-
clang::RISCV::LastTSBuiltin - RISCVVector::FirstTSBuiltin;
248+
RISCV::LastTSBuiltin - RISCVVector::FirstTSBuiltin;
247249
static constexpr int NumBuiltins =
248-
clang::RISCV::LastTSBuiltin - Builtin::FirstTSBuiltin;
249-
static_assert(NumBuiltins == (NumRVVBuiltins + NumRISCVBuiltins));
250-
251-
static constexpr llvm::StringTable BuiltinRVVStrings =
252-
CLANG_BUILTIN_STR_TABLE_START
253-
#define BUILTIN CLANG_BUILTIN_STR_TABLE
254-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
255-
#include "clang/Basic/BuiltinsRISCVVector.def"
256-
;
257-
static constexpr llvm::StringTable BuiltinRISCVStrings =
250+
RISCV::LastTSBuiltin - Builtin::FirstTSBuiltin;
251+
static_assert(NumBuiltins ==
252+
(NumRVVBuiltins + NumRVVSiFiveBuiltins + NumRISCVBuiltins));
253+
254+
namespace RVV {
255+
#define GET_RISCVV_BUILTIN_STR_TABLE
256+
#include "clang/Basic/riscv_vector_builtins.inc"
257+
#undef GET_RISCVV_BUILTIN_STR_TABLE
258+
static_assert(BuiltinStrings.size() < 100'000);
259+
260+
static constexpr std::array<Builtin::Info, NumRVVBuiltins> BuiltinInfos = {
261+
#define GET_RISCVV_BUILTIN_INFOS
262+
#include "clang/Basic/riscv_vector_builtins.inc"
263+
#undef GET_RISCVV_BUILTIN_INFOS
264+
};
265+
} // namespace RVV
266+
267+
namespace RVVSiFive {
268+
#define GET_RISCVV_BUILTIN_STR_TABLE
269+
#include "clang/Basic/riscv_sifive_vector_builtins.inc"
270+
#undef GET_RISCVV_BUILTIN_STR_TABLE
271+
272+
static constexpr std::array<Builtin::Info, NumRVVSiFiveBuiltins> BuiltinInfos =
273+
{
274+
#define GET_RISCVV_BUILTIN_INFOS
275+
#include "clang/Basic/riscv_sifive_vector_builtins.inc"
276+
#undef GET_RISCVV_BUILTIN_INFOS
277+
};
278+
} // namespace RVVSiFive
279+
280+
static constexpr llvm::StringTable BuiltinStrings =
258281
CLANG_BUILTIN_STR_TABLE_START
259282
#define BUILTIN CLANG_BUILTIN_STR_TABLE
260283
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
261284
#include "clang/Basic/BuiltinsRISCV.inc"
262285
;
263286

264-
static constexpr auto BuiltinRVVInfos = Builtin::MakeInfos<NumRVVBuiltins>({
265-
#define BUILTIN CLANG_BUILTIN_ENTRY
266-
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
267-
#include "clang/Basic/BuiltinsRISCVVector.def"
268-
});
269-
static constexpr auto BuiltinRISCVInfos = Builtin::MakeInfos<NumRISCVBuiltins>({
287+
static constexpr auto BuiltinInfos = Builtin::MakeInfos<NumRISCVBuiltins>({
270288
#define BUILTIN CLANG_BUILTIN_ENTRY
271289
#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
272290
#include "clang/Basic/BuiltinsRISCV.inc"
@@ -275,8 +293,9 @@ static constexpr auto BuiltinRISCVInfos = Builtin::MakeInfos<NumRISCVBuiltins>({
275293
llvm::SmallVector<Builtin::InfosShard>
276294
RISCVTargetInfo::getTargetBuiltins() const {
277295
return {
278-
{&BuiltinRVVStrings, BuiltinRVVInfos},
279-
{&BuiltinRISCVStrings, BuiltinRISCVInfos},
296+
{&RVV::BuiltinStrings, RVV::BuiltinInfos, "__builtin_rvv_"},
297+
{&RVVSiFive::BuiltinStrings, RVVSiFive::BuiltinInfos, "__builtin_rvv_"},
298+
{&BuiltinStrings, BuiltinInfos},
280299
};
281300
}
282301

clang/utils/TableGen/RISCVVEmitter.cpp

Lines changed: 59 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
#include "llvm/ADT/ArrayRef.h"
1919
#include "llvm/ADT/StringExtras.h"
2020
#include "llvm/ADT/StringMap.h"
21+
#include "llvm/ADT/StringRef.h"
2122
#include "llvm/ADT/StringSwitch.h"
2223
#include "llvm/ADT/Twine.h"
2324
#include "llvm/TableGen/Error.h"
2425
#include "llvm/TableGen/Record.h"
26+
#include "llvm/TableGen/StringToOffsetTable.h"
2527
#include <optional>
2628

2729
using namespace llvm;
@@ -498,31 +500,68 @@ void RVVEmitter::createBuiltins(raw_ostream &OS) {
498500
std::vector<std::unique_ptr<RVVIntrinsic>> Defs;
499501
createRVVIntrinsics(Defs);
500502

501-
// Map to keep track of which builtin names have already been emitted.
502-
StringMap<RVVIntrinsic *> BuiltinMap;
503+
llvm::StringToOffsetTable Table;
504+
// Ensure offset zero is the empty string.
505+
Table.GetOrAddStringOffset("");
506+
// Hard coded strings used in the builtin structures.
507+
Table.GetOrAddStringOffset("n");
508+
Table.GetOrAddStringOffset("zve32x");
503509

504-
OS << "#if defined(TARGET_BUILTIN) && !defined(RISCVV_BUILTIN)\n";
505-
OS << "#define RISCVV_BUILTIN(ID, TYPE, ATTRS) TARGET_BUILTIN(ID, TYPE, "
506-
"ATTRS, \"zve32x\")\n";
507-
OS << "#endif\n";
510+
// Map to unique the builtin names.
511+
StringMap<RVVIntrinsic *> BuiltinMap;
512+
std::vector<RVVIntrinsic *> UniqueDefs;
508513
for (auto &Def : Defs) {
509-
auto P =
510-
BuiltinMap.insert(std::make_pair(Def->getBuiltinName(), Def.get()));
511-
if (!P.second) {
512-
// Verf that this would have produced the same builtin definition.
513-
if (P.first->second->hasBuiltinAlias() != Def->hasBuiltinAlias())
514-
PrintFatalError("Builtin with same name has different hasAutoDef");
515-
else if (!Def->hasBuiltinAlias() &&
516-
P.first->second->getBuiltinTypeStr() != Def->getBuiltinTypeStr())
517-
PrintFatalError("Builtin with same name has different type string");
514+
auto P = BuiltinMap.insert({Def->getBuiltinName(), Def.get()});
515+
if (P.second) {
516+
Table.GetOrAddStringOffset(Def->getBuiltinName());
517+
if (!Def->hasBuiltinAlias())
518+
Table.GetOrAddStringOffset(Def->getBuiltinTypeStr());
519+
UniqueDefs.push_back(Def.get());
518520
continue;
519521
}
520-
OS << "RISCVV_BUILTIN(__builtin_rvv_" << Def->getBuiltinName() << ",\"";
521-
if (!Def->hasBuiltinAlias())
522-
OS << Def->getBuiltinTypeStr();
523-
OS << "\", \"n\")\n";
522+
523+
// Verf that this would have produced the same builtin definition.
524+
if (P.first->second->hasBuiltinAlias() != Def->hasBuiltinAlias())
525+
PrintFatalError("Builtin with same name has different hasAutoDef");
526+
else if (!Def->hasBuiltinAlias() &&
527+
P.first->second->getBuiltinTypeStr() != Def->getBuiltinTypeStr())
528+
PrintFatalError("Builtin with same name has different type string");
529+
}
530+
531+
// Emit the enumerators of RVV builtins. Note that these are emitted without
532+
// any outer context to enable concatenating them.
533+
OS << "// RISCV Vector builtin enumerators\n";
534+
OS << "#ifdef GET_RISCVV_BUILTIN_ENUMERATORS\n";
535+
for (RVVIntrinsic *Def : UniqueDefs)
536+
OS << " BI__builtin_rvv_" << Def->getBuiltinName() << ",\n";
537+
OS << "#endif // GET_RISCVV_BUILTIN_ENUMERATORS\n\n";
538+
539+
// Emit the string table for the RVV builtins.
540+
OS << "// RISCV Vector builtin enumerators\n";
541+
OS << "#ifdef GET_RISCVV_BUILTIN_STR_TABLE\n";
542+
Table.EmitStringTableDef(OS, "BuiltinStrings");
543+
OS << "#endif // GET_RISCVV_BUILTIN_STR_TABLE\n\n";
544+
545+
// Emit the info structs of RVV builtins. Note that these are emitted without
546+
// any outer context to enable concatenating them.
547+
OS << "// RISCV Vector builtin infos\n";
548+
OS << "#ifdef GET_RISCVV_BUILTIN_INFOS\n";
549+
for (RVVIntrinsic *Def : UniqueDefs) {
550+
OS << " Builtin::Info{Builtin::Info::StrOffsets{"
551+
<< Table.GetStringOffset(Def->getBuiltinName()) << " /* "
552+
<< Def->getBuiltinName() << " */, ";
553+
if (Def->hasBuiltinAlias()) {
554+
OS << "0, ";
555+
} else {
556+
OS << Table.GetStringOffset(Def->getBuiltinTypeStr()) << " /* "
557+
<< Def->getBuiltinTypeStr() << " */, ";
558+
}
559+
OS << Table.GetStringOffset("n") << " /* n */, ";
560+
OS << Table.GetStringOffset("zve32x") << " /* zve32x */}, ";
561+
562+
OS << "HeaderDesc::NO_HEADER, ALL_LANGUAGES},\n";
524563
}
525-
OS << "#undef RISCVV_BUILTIN\n";
564+
OS << "#endif // GET_RISCVV_BUILTIN_INFOS\n\n";
526565
}
527566

528567
void RVVEmitter::createCodeGen(raw_ostream &OS) {

0 commit comments

Comments
 (0)