Author: Mark Murray Date: 2021-01-08T13:21:11Z New Revision: af7cce2fa4d19c3cd09607e1d6ea2e0847cc55b7
URL: https://github.com/llvm/llvm-project/commit/af7cce2fa4d19c3cd09607e1d6ea2e0847cc55b7 DIFF: https://github.com/llvm/llvm-project/commit/af7cce2fa4d19c3cd09607e1d6ea2e0847cc55b7.diff LOG: [AArch64] Add +pauth archictecture option, allowing the v8.3a pointer authentication extension. Differential Revision: https://reviews.llvm.org/D94083 Added: Modified: clang/lib/Basic/Targets/AArch64.cpp clang/lib/Basic/Targets/AArch64.h llvm/include/llvm/Support/AArch64TargetParser.def llvm/include/llvm/Support/AArch64TargetParser.h llvm/lib/Support/AArch64TargetParser.cpp llvm/lib/Target/AArch64/AArch64.td llvm/lib/Target/AArch64/AArch64FrameLowering.cpp llvm/lib/Target/AArch64/AArch64ISelLowering.cpp llvm/lib/Target/AArch64/AArch64InstrInfo.cpp llvm/lib/Target/AArch64/AArch64InstrInfo.td llvm/lib/Target/AArch64/AArch64Subtarget.h llvm/lib/Target/AArch64/AArch64SystemOperands.td llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp llvm/unittests/Support/TargetParserTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index c1abe8e9f75b..d03bca9cfd90 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -510,6 +510,8 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, HasMTE = true; if (Feature == "+tme") HasTME = true; + if (Feature == "+pauth") + HasPAuth = true; if (Feature == "+i8mm") HasMatMul = true; if (Feature == "+bf16") diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index bd576680077e..5f24ab6a4d61 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -36,6 +36,7 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { bool HasFP16FML; bool HasMTE; bool HasTME; + bool HasPAuth; bool HasLS64; bool HasMatMul; bool HasSVE2; diff --git a/llvm/include/llvm/Support/AArch64TargetParser.def b/llvm/include/llvm/Support/AArch64TargetParser.def index f1a5bf734a13..38cc2e753740 100644 --- a/llvm/include/llvm/Support/AArch64TargetParser.def +++ b/llvm/include/llvm/Support/AArch64TargetParser.def @@ -108,6 +108,7 @@ AARCH64_ARCH_EXT_NAME("f64mm", AArch64::AEK_F64MM, "+f64mm", "-f64m AARCH64_ARCH_EXT_NAME("tme", AArch64::AEK_TME, "+tme", "-tme") AARCH64_ARCH_EXT_NAME("ls64", AArch64::AEK_LS64, "+ls64", "-ls64") AARCH64_ARCH_EXT_NAME("brbe", AArch64::AEK_BRBE, "+brbe", "-brbe") +AARCH64_ARCH_EXT_NAME("pauth", AArch64::AEK_PAUTH, "+pauth", "-pauth") #undef AARCH64_ARCH_EXT_NAME #ifndef AARCH64_CPU_NAME diff --git a/llvm/include/llvm/Support/AArch64TargetParser.h b/llvm/include/llvm/Support/AArch64TargetParser.h index a3c9c6a30483..35827517d7fc 100644 --- a/llvm/include/llvm/Support/AArch64TargetParser.h +++ b/llvm/include/llvm/Support/AArch64TargetParser.h @@ -64,6 +64,7 @@ enum ArchExtKind : uint64_t { AEK_F64MM = 1ULL << 32, AEK_LS64 = 1ULL << 33, AEK_BRBE = 1ULL << 34, + AEK_PAUTH = 1ULL << 35, }; enum class ArchKind { diff --git a/llvm/lib/Support/AArch64TargetParser.cpp b/llvm/lib/Support/AArch64TargetParser.cpp index 62761177c8c2..be595e83dbef 100644 --- a/llvm/lib/Support/AArch64TargetParser.cpp +++ b/llvm/lib/Support/AArch64TargetParser.cpp @@ -102,6 +102,8 @@ bool AArch64::getExtensionFeatures(uint64_t Extensions, Features.push_back("+rcpc"); if (Extensions & AEK_BRBE) Features.push_back("+brbe"); + if (Extensions & AEK_PAUTH) + Features.push_back("+pauth"); return true; } diff --git a/llvm/lib/Target/AArch64/AArch64.td b/llvm/lib/Target/AArch64/AArch64.td index 2be006bb647f..1f1bf0ac1657 100644 --- a/llvm/lib/Target/AArch64/AArch64.td +++ b/llvm/lib/Target/AArch64/AArch64.td @@ -261,8 +261,8 @@ def FeatureDotProd : SubtargetFeature< "dotprod", "HasDotProd", "true", "Enable dot product support">; -def FeaturePA : SubtargetFeature< - "pa", "HasPA", "true", +def FeaturePAuth : SubtargetFeature< + "pauth", "HasPAuth", "true", "Enable v8.3-A Pointer Authentication extension">; def FeatureJS : SubtargetFeature< @@ -438,7 +438,7 @@ def HasV8_2aOps : SubtargetFeature<"v8.2a", "HasV8_2aOps", "true", FeaturePAN_RWV, FeatureRAS, FeatureCCPP]>; def HasV8_3aOps : SubtargetFeature<"v8.3a", "HasV8_3aOps", "true", - "Support ARM v8.3a instructions", [HasV8_2aOps, FeatureRCPC, FeaturePA, + "Support ARM v8.3a instructions", [HasV8_2aOps, FeatureRCPC, FeaturePAuth, FeatureJS, FeatureCCIDX, FeatureComplxNum]>; def HasV8_4aOps : SubtargetFeature<"v8.4a", "HasV8_4aOps", "true", @@ -471,7 +471,7 @@ def HasV8_0rOps : SubtargetFeature< FeatureSHA3, FeatureCCPP, FeatureFullFP16, FeaturePAN_RWV, //v8.3 FeatureComplxNum, FeatureCCIDX, FeatureJS, - FeaturePA, FeatureRCPC, + FeaturePAuth, FeatureRCPC, //v8.4 FeatureDotProd, FeatureFP16FML, FeatureTRACEV8_4, FeatureTLB_RMI, FeatureFMI, FeatureDIT, FeatureSEL2, FeatureRCPC_IMMO, @@ -539,7 +539,7 @@ def SVEUnsupported : AArch64Unsupported { } def PAUnsupported : AArch64Unsupported { - let F = [HasPA]; + let F = [HasPAuth]; } include "AArch64SchedA53.td" @@ -703,7 +703,7 @@ def ProcA78C : SubtargetFeature<"cortex-a78c", "ARMProcFamily", FeatureFullFP16, FeatureFuseAES, FeatureNEON, - FeaturePA, + FeaturePAuth, FeaturePerfMon, FeaturePostRAScheduler, FeatureRCPC, @@ -1015,7 +1015,7 @@ def ProcThunderX3T110 : SubtargetFeature<"thunderx3t110", "ARMProcFamily", FeaturePostRAScheduler, FeaturePredictableSelectIsExpensive, FeatureLSE, - FeaturePA, + FeaturePAuth, FeatureUseAA, FeatureBalanceFPOps, FeaturePerfMon, diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp index cbbb0755b124..1687fd0116a5 100644 --- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp @@ -1511,7 +1511,7 @@ static void InsertReturnAddressAuth(MachineFunction &MF, // this instruction can safely used for any v8a architecture. // From v8.3a onwards there are optimised authenticate LR and return // instructions, namely RETA{A,B}, that can be used instead. - if (Subtarget.hasV8_3aOps() && MBBI != MBB.end() && + if (Subtarget.hasPAuth() && MBBI != MBB.end() && MBBI->getOpcode() == AArch64::RET_ReallyLR) { BuildMI(MBB, MBBI, DL, TII->get(MFI.shouldSignWithBKey() ? AArch64::RETAB : AArch64::RETAA)) diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index 80a203b9e7ef..1dff16234bbd 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -7252,7 +7252,7 @@ SDValue AArch64TargetLowering::LowerRETURNADDR(SDValue Op, // Armv8.3-A architectures. On Armv8.3-A and onwards XPACI is available so use // that instead. SDNode *St; - if (Subtarget->hasV8_3aOps()) { + if (Subtarget->hasPAuth()) { St = DAG.getMachineNode(AArch64::XPACI, DL, VT, ReturnAddress); } else { // XPACLRI operates on LR therefore we must move the operand accordingly. diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp index 3dbda0de75a1..8a5447eeeb3c 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -6818,7 +6818,7 @@ static void signOutlinedFunction(MachineFunction &MF, MachineBasicBlock &MBB, // If v8.3a features are available we can replace a RET instruction by // RETAA or RETAB and omit the AUT instructions - if (Subtarget.hasV8_3aOps() && MBBAUT != MBB.end() && + if (Subtarget.hasPAuth() && MBBAUT != MBB.end() && MBBAUT->getOpcode() == AArch64::RET) { BuildMI(MBB, MBBAUT, DL, TII->get(ShouldSignReturnAddrWithAKey ? AArch64::RETAA diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td index efc38292842c..f1fd849dc362 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td @@ -33,8 +33,8 @@ def HasVH : Predicate<"Subtarget->hasVH()">, def HasLOR : Predicate<"Subtarget->hasLOR()">, AssemblerPredicate<(all_of FeatureLOR), "lor">; -def HasPA : Predicate<"Subtarget->hasPA()">, - AssemblerPredicate<(all_of FeaturePA), "pa">; +def HasPAuth : Predicate<"Subtarget->hasPAuth()">, + AssemblerPredicate<(all_of FeaturePAuth), "pauth">; def HasJS : Predicate<"Subtarget->hasJS()">, AssemblerPredicate<(all_of FeatureJS), "jsconv">; @@ -1073,7 +1073,7 @@ def : InstAlias<"autib1716", (AUTIB1716), 0>; def : InstAlias<"xpaclri", (XPACLRI), 0>; // These pointer authentication instructions require armv8.3a -let Predicates = [HasPA] in { +let Predicates = [HasPAuth] in { // When PA is enabled, a better mnemonic should be emitted. def : InstAlias<"paciaz", (PACIAZ), 1>; diff --git a/llvm/lib/Target/AArch64/AArch64Subtarget.h b/llvm/lib/Target/AArch64/AArch64Subtarget.h index ab44d0767dec..66b4b303aa6b 100644 --- a/llvm/lib/Target/AArch64/AArch64Subtarget.h +++ b/llvm/lib/Target/AArch64/AArch64Subtarget.h @@ -126,7 +126,7 @@ class AArch64Subtarget final : public AArch64GenSubtargetInfo { bool HasAES = false; // ARMv8.3 extensions - bool HasPA = false; + bool HasPAuth = false; bool HasJS = false; bool HasCCIDX = false; bool HasComplxNum = false; @@ -186,6 +186,7 @@ class AArch64Subtarget final : public AArch64GenSubtargetInfo { bool HasETE = false; bool HasTRBE = false; bool HasBRBE = false; + bool HasPAUTH = false; bool HasSPE_EEF = false; // HasZeroCycleRegMove - Has zero-cycle register mov instructions. @@ -450,6 +451,7 @@ class AArch64Subtarget final : public AArch64GenSubtargetInfo { bool hasRandGen() const { return HasRandGen; } bool hasMTE() const { return HasMTE; } bool hasTME() const { return HasTME; } + bool hasPAUTH() const { return HasPAUTH; } // Arm SVE2 extensions bool hasSVE2AES() const { return HasSVE2AES; } bool hasSVE2SM4() const { return HasSVE2SM4; } @@ -493,7 +495,7 @@ class AArch64Subtarget final : public AArch64GenSubtargetInfo { bool hasPAN_RWV() const { return HasPAN_RWV; } bool hasCCPP() const { return HasCCPP; } - bool hasPA() const { return HasPA; } + bool hasPAuth() const { return HasPAuth; } bool hasJS() const { return HasJS; } bool hasCCIDX() const { return HasCCIDX; } bool hasComplxNum() const { return HasComplxNum; } diff --git a/llvm/lib/Target/AArch64/AArch64SystemOperands.td b/llvm/lib/Target/AArch64/AArch64SystemOperands.td index a69aa68405d4..01ac52bd875a 100644 --- a/llvm/lib/Target/AArch64/AArch64SystemOperands.td +++ b/llvm/lib/Target/AArch64/AArch64SystemOperands.td @@ -1336,7 +1336,7 @@ def : RWSysReg<"VSESR_EL2", 0b11, 0b100, 0b0101, 0b0010, 0b011>; // v8.3a "Pointer authentication extension" registers // Op0 Op1 CRn CRm Op2 -let Requires = [{ {AArch64::FeaturePA} }] in { +let Requires = [{ {AArch64::FeaturePAuth} }] in { def : RWSysReg<"APIAKeyLo_EL1", 0b11, 0b000, 0b0010, 0b0001, 0b000>; def : RWSysReg<"APIAKeyHi_EL1", 0b11, 0b000, 0b0010, 0b0001, 0b001>; def : RWSysReg<"APIBKeyLo_EL1", 0b11, 0b000, 0b0010, 0b0001, 0b010>; diff --git a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp index c810fcaca766..34dd6760efc2 100644 --- a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp @@ -4958,7 +4958,7 @@ bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I, AArch64::GPR64RegClass); } - if (STI.hasV8_3aOps()) { + if (STI.hasPAuth()) { MIRBuilder.buildInstr(AArch64::XPACI, {DstReg}, {MFReturnAddr}); } else { MIRBuilder.buildCopy({Register(AArch64::LR)}, {MFReturnAddr}); @@ -4986,7 +4986,7 @@ bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I, else { MFI.setReturnAddressIsTaken(true); - if (STI.hasV8_3aOps()) { + if (STI.hasPAuth()) { Register TmpReg = MRI.createVirtualRegister(&AArch64::GPR64RegClass); MIRBuilder.buildInstr(AArch64::LDRXui, {TmpReg}, {FrameAddr}).addImm(1); MIRBuilder.buildInstr(AArch64::XPACI, {DstReg}, {TmpReg}); diff --git a/llvm/unittests/Support/TargetParserTest.cpp b/llvm/unittests/Support/TargetParserTest.cpp index c2721f3da505..349263d7af43 100644 --- a/llvm/unittests/Support/TargetParserTest.cpp +++ b/llvm/unittests/Support/TargetParserTest.cpp @@ -1431,6 +1431,7 @@ TEST(TargetParserTest, AArch64ArchExtFeature) { {"rng", "norng", "+rand", "-rand"}, {"memtag", "nomemtag", "+mte", "-mte"}, {"tme", "notme", "+tme", "-tme"}, + {"pauth", "nopauth", "+pauth", "-pauth"}, {"ssbs", "nossbs", "+ssbs", "-ssbs"}, {"sb", "nosb", "+sb", "-sb"}, {"predres", "nopredres", "+predres", "-predres"}, _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits