diff options
Diffstat (limited to 'clang/utils/TableGen/RISCVVEmitter.cpp')
-rw-r--r-- | clang/utils/TableGen/RISCVVEmitter.cpp | 79 |
1 files changed, 59 insertions, 20 deletions
diff --git a/clang/utils/TableGen/RISCVVEmitter.cpp b/clang/utils/TableGen/RISCVVEmitter.cpp index acba1a3..0cdde20 100644 --- a/clang/utils/TableGen/RISCVVEmitter.cpp +++ b/clang/utils/TableGen/RISCVVEmitter.cpp @@ -18,10 +18,12 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringMap.h" +#include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/ADT/Twine.h" #include "llvm/TableGen/Error.h" #include "llvm/TableGen/Record.h" +#include "llvm/TableGen/StringToOffsetTable.h" #include <optional> using namespace llvm; @@ -498,31 +500,68 @@ void RVVEmitter::createBuiltins(raw_ostream &OS) { std::vector<std::unique_ptr<RVVIntrinsic>> Defs; createRVVIntrinsics(Defs); - // Map to keep track of which builtin names have already been emitted. - StringMap<RVVIntrinsic *> BuiltinMap; + llvm::StringToOffsetTable Table; + // Ensure offset zero is the empty string. + Table.GetOrAddStringOffset(""); + // Hard coded strings used in the builtin structures. + Table.GetOrAddStringOffset("n"); + Table.GetOrAddStringOffset("zve32x"); - OS << "#if defined(TARGET_BUILTIN) && !defined(RISCVV_BUILTIN)\n"; - OS << "#define RISCVV_BUILTIN(ID, TYPE, ATTRS) TARGET_BUILTIN(ID, TYPE, " - "ATTRS, \"zve32x\")\n"; - OS << "#endif\n"; + // Map to unique the builtin names. + StringMap<RVVIntrinsic *> BuiltinMap; + std::vector<RVVIntrinsic *> UniqueDefs; for (auto &Def : Defs) { - auto P = - BuiltinMap.insert(std::make_pair(Def->getBuiltinName(), Def.get())); - if (!P.second) { - // Verf that this would have produced the same builtin definition. - if (P.first->second->hasBuiltinAlias() != Def->hasBuiltinAlias()) - PrintFatalError("Builtin with same name has different hasAutoDef"); - else if (!Def->hasBuiltinAlias() && - P.first->second->getBuiltinTypeStr() != Def->getBuiltinTypeStr()) - PrintFatalError("Builtin with same name has different type string"); + auto P = BuiltinMap.insert({Def->getBuiltinName(), Def.get()}); + if (P.second) { + Table.GetOrAddStringOffset(Def->getBuiltinName()); + if (!Def->hasBuiltinAlias()) + Table.GetOrAddStringOffset(Def->getBuiltinTypeStr()); + UniqueDefs.push_back(Def.get()); continue; } - OS << "RISCVV_BUILTIN(__builtin_rvv_" << Def->getBuiltinName() << ",\""; - if (!Def->hasBuiltinAlias()) - OS << Def->getBuiltinTypeStr(); - OS << "\", \"n\")\n"; + + // Verf that this would have produced the same builtin definition. + if (P.first->second->hasBuiltinAlias() != Def->hasBuiltinAlias()) + PrintFatalError("Builtin with same name has different hasAutoDef"); + else if (!Def->hasBuiltinAlias() && + P.first->second->getBuiltinTypeStr() != Def->getBuiltinTypeStr()) + PrintFatalError("Builtin with same name has different type string"); + } + + // Emit the enumerators of RVV builtins. Note that these are emitted without + // any outer context to enable concatenating them. + OS << "// RISCV Vector builtin enumerators\n"; + OS << "#ifdef GET_RISCVV_BUILTIN_ENUMERATORS\n"; + for (RVVIntrinsic *Def : UniqueDefs) + OS << " BI__builtin_rvv_" << Def->getBuiltinName() << ",\n"; + OS << "#endif // GET_RISCVV_BUILTIN_ENUMERATORS\n\n"; + + // Emit the string table for the RVV builtins. + OS << "// RISCV Vector builtin enumerators\n"; + OS << "#ifdef GET_RISCVV_BUILTIN_STR_TABLE\n"; + Table.EmitStringTableDef(OS, "BuiltinStrings"); + OS << "#endif // GET_RISCVV_BUILTIN_STR_TABLE\n\n"; + + // Emit the info structs of RVV builtins. Note that these are emitted without + // any outer context to enable concatenating them. + OS << "// RISCV Vector builtin infos\n"; + OS << "#ifdef GET_RISCVV_BUILTIN_INFOS\n"; + for (RVVIntrinsic *Def : UniqueDefs) { + OS << " Builtin::Info{Builtin::Info::StrOffsets{" + << Table.GetStringOffset(Def->getBuiltinName()) << " /* " + << Def->getBuiltinName() << " */, "; + if (Def->hasBuiltinAlias()) { + OS << "0, "; + } else { + OS << Table.GetStringOffset(Def->getBuiltinTypeStr()) << " /* " + << Def->getBuiltinTypeStr() << " */, "; + } + OS << Table.GetStringOffset("n") << " /* n */, "; + OS << Table.GetStringOffset("zve32x") << " /* zve32x */}, "; + + OS << "HeaderDesc::NO_HEADER, ALL_LANGUAGES},\n"; } - OS << "#undef RISCVV_BUILTIN\n"; + OS << "#endif // GET_RISCVV_BUILTIN_INFOS\n\n"; } void RVVEmitter::createCodeGen(raw_ostream &OS) { |