aboutsummaryrefslogtreecommitdiff
path: root/llvm
diff options
context:
space:
mode:
authorRahul Joshi <rjoshi@nvidia.com>2024-09-25 12:01:17 -0700
committerGitHub <noreply@github.com>2024-09-25 12:01:17 -0700
commit2f43e65955565f92d3103b4bd57f17d02385d0e3 (patch)
tree3528c61e39c3810e6cea05f72bf961d385a837dc /llvm
parentc3334dad732e3a3a53e57c028bdb337766e01598 (diff)
downloadllvm-2f43e65955565f92d3103b4bd57f17d02385d0e3.zip
llvm-2f43e65955565f92d3103b4bd57f17d02385d0e3.tar.gz
llvm-2f43e65955565f92d3103b4bd57f17d02385d0e3.tar.bz2
[LLVM][TableGen] Check name conflicts between target dep and independent intrinsics (#109826)
Validate that for target independent intrinsics the second dotted component of their name (after the `llvm.`) does not match any existing target names (for which atleast one intrinsic has been defined). Doing so is invalid as LLVM will search for that intrinsic in that target's intrinsic table and not find it, and conclude that its an unknown intrinsic.
Diffstat (limited to 'llvm')
-rw-r--r--llvm/test/TableGen/intrinsic-target-prefix-for-target-independent.td9
-rw-r--r--llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp23
-rw-r--r--llvm/utils/TableGen/Basic/CodeGenIntrinsics.h1
3 files changed, 33 insertions, 0 deletions
diff --git a/llvm/test/TableGen/intrinsic-target-prefix-for-target-independent.td b/llvm/test/TableGen/intrinsic-target-prefix-for-target-independent.td
new file mode 100644
index 0000000..84e365f
--- /dev/null
+++ b/llvm/test/TableGen/intrinsic-target-prefix-for-target-independent.td
@@ -0,0 +1,9 @@
+// RUN: not llvm-tblgen -gen-intrinsic-enums -I %p/../../include %s 2>&1 | FileCheck %s -DFILE=%s
+
+include "llvm/IR/Intrinsics.td"
+
+// Check that target independent intrinsics with a prefix that matches a target
+// name are flagged.
+// CHECK: [[FILE]]:[[@LINE+1]]:5: error: target independent intrinsic `llvm.aarch64.foo' has prefix `llvm.aarch64` that conflicts with intrinsics for target `aarch64`
+def int_aarch64_foo : Intrinsic<[],[]>;
+
diff --git a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp
index a30dc72..c3bd7ef 100644
--- a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp
+++ b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp
@@ -75,6 +75,7 @@ CodeGenIntrinsicTable::CodeGenIntrinsicTable(const RecordKeeper &RC) {
Targets.back().Count = Intrinsics.size() - Targets.back().Offset;
CheckDuplicateIntrinsics();
+ CheckTargetIndependentIntrinsics();
}
// Check for duplicate intrinsic names.
@@ -101,6 +102,28 @@ void CodeGenIntrinsicTable::CheckDuplicateIntrinsics() const {
PrintFatalNote(First.TheDef, "Previous definition here");
}
+// For target independent intrinsics, check that their second dotted component
+// does not match any target name.
+void CodeGenIntrinsicTable::CheckTargetIndependentIntrinsics() const {
+ SmallDenseSet<StringRef> TargetNames;
+ for (const auto &Target : ArrayRef(Targets).drop_front())
+ TargetNames.insert(Target.Name);
+
+ // Set of target independent intrinsics.
+ const auto &Set = Targets[0];
+ for (const auto &Int : ArrayRef(&Intrinsics[Set.Offset], Set.Count)) {
+ StringRef Name = Int.Name;
+ StringRef Prefix = Name.drop_front(5).split('.').first;
+ if (!TargetNames.contains(Prefix))
+ continue;
+ PrintFatalError(Int.TheDef,
+ "target independent intrinsic `" + Name +
+ "' has prefix `llvm." + Prefix +
+ "` that conflicts with intrinsics for target `" +
+ Prefix + "`");
+ }
+}
+
CodeGenIntrinsic &CodeGenIntrinsicMap::operator[](const Record *Record) {
if (!Record->isSubClassOf("Intrinsic"))
PrintFatalError("Intrinsic defs should be subclass of 'Intrinsic' class");
diff --git a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h
index 2df598d..1cdeaac 100644
--- a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h
+++ b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h
@@ -192,6 +192,7 @@ public:
private:
void CheckDuplicateIntrinsics() const;
+ void CheckTargetIndependentIntrinsics() const;
};
// This class builds `CodeGenIntrinsic` on demand for a given Def.