|
18 | 18 | #include "llvm/ADT/ArrayRef.h"
|
19 | 19 | #include "llvm/ADT/StringExtras.h"
|
20 | 20 | #include "llvm/ADT/StringMap.h"
|
| 21 | +#include "llvm/ADT/StringRef.h" |
21 | 22 | #include "llvm/ADT/StringSwitch.h"
|
22 | 23 | #include "llvm/ADT/Twine.h"
|
23 | 24 | #include "llvm/TableGen/Error.h"
|
24 | 25 | #include "llvm/TableGen/Record.h"
|
| 26 | +#include "llvm/TableGen/StringToOffsetTable.h" |
25 | 27 | #include <optional>
|
26 | 28 |
|
27 | 29 | using namespace llvm;
|
@@ -498,31 +500,68 @@ void RVVEmitter::createBuiltins(raw_ostream &OS) {
|
498 | 500 | std::vector<std::unique_ptr<RVVIntrinsic>> Defs;
|
499 | 501 | createRVVIntrinsics(Defs);
|
500 | 502 |
|
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"); |
503 | 509 |
|
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; |
508 | 513 | 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()); |
518 | 520 | continue;
|
519 | 521 | }
|
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"; |
524 | 563 | }
|
525 |
| - OS << "#undef RISCVV_BUILTIN\n"; |
| 564 | + OS << "#endif // GET_RISCVV_BUILTIN_INFOS\n\n"; |
526 | 565 | }
|
527 | 566 |
|
528 | 567 | void RVVEmitter::createCodeGen(raw_ostream &OS) {
|
|
0 commit comments