[llvm] 559540d - [llvm-exegesis][AArch64] Disable pauth and ldgm as unsupported instructions (#132346)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 8 21:11:46 PDT 2025
Author: Lakshay Kumar
Date: 2025-04-09T09:41:43+05:30
New Revision: 559540dc2738af0ab3f0b48eb4993095b8a8c627
URL: https://github.com/llvm/llvm-project/commit/559540dc2738af0ab3f0b48eb4993095b8a8c627
DIFF: https://github.com/llvm/llvm-project/commit/559540dc2738af0ab3f0b48eb4993095b8a8c627.diff
LOG: [llvm-exegesis][AArch64] Disable pauth and ldgm as unsupported instructions (#132346)
[llvm-exegesis][AArch64] Disable pauth and ldgm as unsupported
instructions.
Skipping AUT and LDGM opcode variants which currently throws "illegal
instruction".
- Checking opcodes specifically for LDGM and AUT opcode instruction
variants.
- Gracefully exiting with " : Unsupported opcode:
isPointerAuth/isUncheckedAccess"
- Added corresponding test cases to check exit message.
Added:
llvm/test/tools/llvm-exegesis/AArch64/skip_unsupported_instructions.s
Modified:
llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
Removed:
################################################################################
diff --git a/llvm/test/tools/llvm-exegesis/AArch64/skip_unsupported_instructions.s b/llvm/test/tools/llvm-exegesis/AArch64/skip_unsupported_instructions.s
new file mode 100644
index 0000000000000..acefbce2e94c5
--- /dev/null
+++ b/llvm/test/tools/llvm-exegesis/AArch64/skip_unsupported_instructions.s
@@ -0,0 +1,8 @@
+# REQUIRES: aarch64-registered-target
+
+# Check for skipping of illegal instruction errors (AUT and LDGM)
+# RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --opcode-name=AUTIA --benchmark-phase=assemble-measured-code 2>&1 | FileCheck %s --check-prefix=CHECK-AUTIA
+# CHECK-AUTIA-NOT: snippet crashed while running: Illegal instruction
+
+# RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --opcode-name=LDGM --benchmark-phase=assemble-measured-code 2>&1 | FileCheck %s --check-prefix=CHECK-LDGM
+# CHECK-LDGM: LDGM: Unsupported opcode: load tag multiple
diff --git a/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp b/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
index bf2b053003ce3..1aca258603590 100644
--- a/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
@@ -9,12 +9,58 @@
#include "AArch64.h"
#include "AArch64RegisterInfo.h"
+#ifdef __linux__
+#include <linux/prctl.h> // For PR_PAC_* constants
+#include <sys/prctl.h>
+#endif
+
#define GET_AVAILABLE_OPCODE_CHECKER
#include "AArch64GenInstrInfo.inc"
namespace llvm {
namespace exegesis {
+bool isPointerAuth(unsigned Opcode) {
+ switch (Opcode) {
+ default:
+ return false;
+
+ // FIXME: Pointer Authentication instructions.
+ // We would like to measure these instructions, but they can behave
+ //
diff erently on
diff erent platforms, and maybe the snippets need to look
+ //
diff erent for these instructions,
+ // Platform-specific handling: On Linux, we disable authentication, may
+ // interfere with measurements. On non-Linux platforms, disable opcodes for
+ // now.
+ case AArch64::AUTDA:
+ case AArch64::AUTDB:
+ case AArch64::AUTDZA:
+ case AArch64::AUTDZB:
+ case AArch64::AUTIA:
+ case AArch64::AUTIA1716:
+ case AArch64::AUTIASP:
+ case AArch64::AUTIAZ:
+ case AArch64::AUTIB:
+ case AArch64::AUTIB1716:
+ case AArch64::AUTIBSP:
+ case AArch64::AUTIBZ:
+ case AArch64::AUTIZA:
+ case AArch64::AUTIZB:
+ return true;
+ }
+}
+
+bool isLoadTagMultiple(unsigned Opcode) {
+ switch (Opcode) {
+ default:
+ return false;
+
+ // Load tag multiple instruction
+ case AArch64::LDGM:
+ return true;
+ }
+}
+
static unsigned getLoadImmediateOpcode(unsigned RegBitWidth) {
switch (RegBitWidth) {
case 32:
@@ -134,6 +180,35 @@ class ExegesisAArch64Target : public ExegesisTarget {
// Function return is a pseudo-instruction that needs to be expanded
PM.add(createAArch64ExpandPseudoPass());
}
+
+ const char *getIgnoredOpcodeReasonOrNull(const LLVMState &State,
+ unsigned Opcode) const override {
+ if (const char *Reason =
+ ExegesisTarget::getIgnoredOpcodeReasonOrNull(State, Opcode))
+ return Reason;
+
+ if (isPointerAuth(Opcode)) {
+#ifdef __linux__
+ // Disable all PAC keys. Note that while we expect the measurements to
+ // be the same with PAC keys disabled, they could potentially be lower
+ // since authentication checks are bypassed.
+ if (prctl(PR_PAC_SET_ENABLED_KEYS,
+ PR_PAC_APIAKEY | PR_PAC_APIBKEY | PR_PAC_APDAKEY |
+ PR_PAC_APDBKEY, // all keys
+ 0, // disable all
+ 0, 0) < 0) {
+ return "Failed to disable PAC keys";
+ }
+#else
+ return "Unsupported opcode: isPointerAuth";
+#endif
+ }
+
+ if (isLoadTagMultiple(Opcode))
+ return "Unsupported opcode: load tag multiple";
+
+ return nullptr;
+ }
};
} // namespace
More information about the llvm-commits
mailing list