llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Rahul Joshi (jurahul) <details> <summary>Changes</summary> Change NeonEmitter to use const RecordKeeper. This is a part of effort to have better const correctness in TableGen backends: https://discourse.llvm.org/t/psa-planned-changes-to-tablegen-getallderiveddefinitions-api-potential-downstream-breakages/81089 --- Full diff: https://github.com/llvm/llvm-project/pull/108501.diff 2 Files Affected: - (modified) clang/utils/TableGen/NeonEmitter.cpp (+28-33) - (modified) clang/utils/TableGen/TableGenBackends.h (+6-6) ``````````diff diff --git a/clang/utils/TableGen/NeonEmitter.cpp b/clang/utils/TableGen/NeonEmitter.cpp index 4707ce1ea3b792..9e5480be20adac 100644 --- a/clang/utils/TableGen/NeonEmitter.cpp +++ b/clang/utils/TableGen/NeonEmitter.cpp @@ -59,7 +59,7 @@ namespace { // While globals are generally bad, this one allows us to perform assertions // liberally and somehow still trace them back to the def they indirectly // came from. -static Record *CurrentRecord = nullptr; +static const Record *CurrentRecord = nullptr; static void assert_with_loc(bool Assertion, const std::string &Str) { if (!Assertion) { if (CurrentRecord) @@ -308,7 +308,7 @@ class Variable { /// a particular typespec and prototype. class Intrinsic { /// The Record this intrinsic was created from. - Record *R; + const Record *R; /// The unmangled name. std::string Name; /// The input and output typespecs. InTS == OutTS except when @@ -371,7 +371,7 @@ class Intrinsic { } public: - Intrinsic(Record *R, StringRef Name, StringRef Proto, TypeSpec OutTS, + Intrinsic(const Record *R, StringRef Name, StringRef Proto, TypeSpec OutTS, TypeSpec InTS, ClassKind CK, ListInit *Body, NeonEmitter &Emitter, StringRef ArchGuard, StringRef TargetGuard, bool IsUnavailable, bool BigEndianSafe) @@ -442,7 +442,7 @@ class Intrinsic { } /// Get the Record that this intrinsic is based off. - Record *getRecord() const { return R; } + const Record *getRecord() const { return R; } /// Get the set of Intrinsics that this intrinsic calls. /// this is the set of immediate dependencies, NOT the /// transitive closure. @@ -576,12 +576,12 @@ class Intrinsic { //===----------------------------------------------------------------------===// class NeonEmitter { - RecordKeeper &Records; - DenseMap<Record *, ClassKind> ClassMap; + const RecordKeeper &Records; + DenseMap<const Record *, ClassKind> ClassMap; std::map<std::string, std::deque<Intrinsic>> IntrinsicMap; unsigned UniqueNumber; - void createIntrinsic(Record *R, SmallVectorImpl<Intrinsic *> &Out); + void createIntrinsic(const Record *R, SmallVectorImpl<Intrinsic *> &Out); void genBuiltinsDef(raw_ostream &OS, SmallVectorImpl<Intrinsic *> &Defs); void genStreamingSVECompatibleList(raw_ostream &OS, SmallVectorImpl<Intrinsic *> &Defs); @@ -601,15 +601,15 @@ class NeonEmitter { /// Called by Intrinsic - returns a globally-unique number. unsigned getUniqueNumber() { return UniqueNumber++; } - NeonEmitter(RecordKeeper &R) : Records(R), UniqueNumber(0) { - Record *SI = R.getClass("SInst"); - Record *II = R.getClass("IInst"); - Record *WI = R.getClass("WInst"); - Record *SOpI = R.getClass("SOpInst"); - Record *IOpI = R.getClass("IOpInst"); - Record *WOpI = R.getClass("WOpInst"); - Record *LOpI = R.getClass("LOpInst"); - Record *NoTestOpI = R.getClass("NoTestOpInst"); + NeonEmitter(const RecordKeeper &R) : Records(R), UniqueNumber(0) { + const Record *SI = R.getClass("SInst"); + const Record *II = R.getClass("IInst"); + const Record *WI = R.getClass("WInst"); + const Record *SOpI = R.getClass("SOpInst"); + const Record *IOpI = R.getClass("IOpInst"); + const Record *WOpI = R.getClass("WOpInst"); + const Record *LOpI = R.getClass("LOpInst"); + const Record *NoTestOpI = R.getClass("NoTestOpInst"); ClassMap[SI] = ClassS; ClassMap[II] = ClassI; @@ -1979,12 +1979,12 @@ Intrinsic &NeonEmitter::getIntrinsic(StringRef Name, ArrayRef<Type> Types, return *GoodVec.front(); } -void NeonEmitter::createIntrinsic(Record *R, +void NeonEmitter::createIntrinsic(const Record *R, SmallVectorImpl<Intrinsic *> &Out) { std::string Name = std::string(R->getValueAsString("Name")); std::string Proto = std::string(R->getValueAsString("Prototype")); std::string Types = std::string(R->getValueAsString("Types")); - Record *OperationRec = R->getValueAsDef("Operation"); + const Record *OperationRec = R->getValueAsDef("Operation"); bool BigEndianSafe = R->getValueAsBit("BigEndianSafe"); std::string ArchGuard = std::string(R->getValueAsString("ArchGuard")); std::string TargetGuard = std::string(R->getValueAsString("TargetGuard")); @@ -2240,10 +2240,8 @@ void NeonEmitter::genIntrinsicRangeCheckCode( /// 2. the SemaChecking code for the type overload checking. /// 3. the SemaChecking code for validation of intrinsic immediate arguments. void NeonEmitter::runHeader(raw_ostream &OS) { - std::vector<Record *> RV = Records.getAllDerivedDefinitions("Inst"); - SmallVector<Intrinsic *, 128> Defs; - for (auto *R : RV) + for (const Record *R : Records.getAllDerivedDefinitions("Inst")) createIntrinsic(R, Defs); // Generate shared BuiltinsXXX.def @@ -2402,8 +2400,7 @@ void NeonEmitter::run(raw_ostream &OS) { "__nodebug__))\n\n"; SmallVector<Intrinsic *, 128> Defs; - std::vector<Record *> RV = Records.getAllDerivedDefinitions("Inst"); - for (auto *R : RV) + for (const Record *R : Records.getAllDerivedDefinitions("Inst")) createIntrinsic(R, Defs); for (auto *I : Defs) @@ -2510,8 +2507,7 @@ void NeonEmitter::runFP16(raw_ostream &OS) { "__nodebug__))\n\n"; SmallVector<Intrinsic *, 128> Defs; - std::vector<Record *> RV = Records.getAllDerivedDefinitions("Inst"); - for (auto *R : RV) + for (const Record *R : Records.getAllDerivedDefinitions("Inst")) createIntrinsic(R, Defs); for (auto *I : Defs) @@ -2619,8 +2615,7 @@ void NeonEmitter::runBF16(raw_ostream &OS) { "__nodebug__))\n\n"; SmallVector<Intrinsic *, 128> Defs; - std::vector<Record *> RV = Records.getAllDerivedDefinitions("Inst"); - for (auto *R : RV) + for (const Record *R : Records.getAllDerivedDefinitions("Inst")) createIntrinsic(R, Defs); for (auto *I : Defs) @@ -2674,26 +2669,26 @@ void NeonEmitter::runBF16(raw_ostream &OS) { OS << "#endif\n"; } -void clang::EmitNeon(RecordKeeper &Records, raw_ostream &OS) { +void clang::EmitNeon(const RecordKeeper &Records, raw_ostream &OS) { NeonEmitter(Records).run(OS); } -void clang::EmitFP16(RecordKeeper &Records, raw_ostream &OS) { +void clang::EmitFP16(const RecordKeeper &Records, raw_ostream &OS) { NeonEmitter(Records).runFP16(OS); } -void clang::EmitBF16(RecordKeeper &Records, raw_ostream &OS) { +void clang::EmitBF16(const RecordKeeper &Records, raw_ostream &OS) { NeonEmitter(Records).runBF16(OS); } -void clang::EmitNeonSema(RecordKeeper &Records, raw_ostream &OS) { +void clang::EmitNeonSema(const RecordKeeper &Records, raw_ostream &OS) { NeonEmitter(Records).runHeader(OS); } -void clang::EmitVectorTypes(RecordKeeper &Records, raw_ostream &OS) { +void clang::EmitVectorTypes(const RecordKeeper &Records, raw_ostream &OS) { NeonEmitter(Records).runVectorTypes(OS); } -void clang::EmitNeonTest(RecordKeeper &Records, raw_ostream &OS) { +void clang::EmitNeonTest(const RecordKeeper &Records, raw_ostream &OS) { llvm_unreachable("Neon test generation no longer implemented!"); } diff --git a/clang/utils/TableGen/TableGenBackends.h b/clang/utils/TableGen/TableGenBackends.h index 01d16d2dc3e5f1..7db1014791cdee 100644 --- a/clang/utils/TableGen/TableGenBackends.h +++ b/clang/utils/TableGen/TableGenBackends.h @@ -113,12 +113,12 @@ void EmitClangSyntaxNodeList(llvm::RecordKeeper &Records, void EmitClangSyntaxNodeClasses(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); -void EmitNeon(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); -void EmitFP16(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); -void EmitBF16(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); -void EmitNeonSema(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); -void EmitVectorTypes(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); -void EmitNeonTest(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); +void EmitNeon(const llvm::RecordKeeper &Records, llvm::raw_ostream &OS); +void EmitFP16(const llvm::RecordKeeper &Records, llvm::raw_ostream &OS); +void EmitBF16(const llvm::RecordKeeper &Records, llvm::raw_ostream &OS); +void EmitNeonSema(const llvm::RecordKeeper &Records, llvm::raw_ostream &OS); +void EmitVectorTypes(const llvm::RecordKeeper &Records, llvm::raw_ostream &OS); +void EmitNeonTest(const llvm::RecordKeeper &Records, llvm::raw_ostream &OS); void EmitImmCheckTypes(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); void EmitSveHeader(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); `````````` </details> https://github.com/llvm/llvm-project/pull/108501 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits