From fbdea180c0e9a42026ea4389a2b96792fc00169d Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Tue, 16 Dec 2014 05:53:25 +0000 Subject: [PATCH] ARM: diagnose deprecated syntax The use of SP and PC in the register list for stores is deprecated on ARM (ARM ARM A.8.8.199): ARM deprecates the use of ARM instructions that include the SP or the PC in the list. Provide a deprecation warning from the assembler in the case that the syntax is ever seen. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224319 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMInstrInfo.td | 3 +- .../ARM/MCTargetDesc/ARMMCTargetDesc.cpp | 14 ++ test/MC/ARM/arm-store-deprecated.s | 147 ++++++++++++++++++ 3 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 test/MC/ARM/arm-store-deprecated.s diff --git a/lib/Target/ARM/ARMInstrInfo.td b/lib/Target/ARM/ARMInstrInfo.td index 5b0c6f384e8..db58ea8fca2 100644 --- a/lib/Target/ARM/ARMInstrInfo.td +++ b/lib/Target/ARM/ARMInstrInfo.td @@ -3167,7 +3167,8 @@ defm LDM : arm_ldst_mult<"ldm", "", 1, 0, LdStMulFrm, IIC_iLoad_m, let mayStore = 1, hasExtraSrcRegAllocReq = 1 in defm STM : arm_ldst_mult<"stm", "", 0, 0, LdStMulFrm, IIC_iStore_m, - IIC_iStore_mu>; + IIC_iStore_mu>, + ComplexDeprecationPredicate<"ARMStore">; } // hasSideEffects diff --git a/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp index 50c890cac7d..76107924095 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp +++ b/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp @@ -75,6 +75,20 @@ static bool getITDeprecationInfo(MCInst &MI, MCSubtargetInfo &STI, return false; } +static bool getARMStoreDeprecationInfo(MCInst &MI, MCSubtargetInfo &STI, + std::string &Info) { + assert(MI.getNumOperands() > 4 && "expected >4 arguments"); + for (unsigned OI = 4, OE = MI.getNumOperands(); OI < OE; ++OI) { + assert(MI.getOperand(OI).isReg() && "expected register"); + if (MI.getOperand(OI).getReg() == ARM::SP || + MI.getOperand(OI).getReg() == ARM::PC) { + Info = "use of SP or PC in the list is deprecated"; + return true; + } + } + return false; +} + #define GET_INSTRINFO_MC_DESC #include "ARMGenInstrInfo.inc" diff --git a/test/MC/ARM/arm-store-deprecated.s b/test/MC/ARM/arm-store-deprecated.s new file mode 100644 index 00000000000..d8c10e2f94a --- /dev/null +++ b/test/MC/ARM/arm-store-deprecated.s @@ -0,0 +1,147 @@ +@ RUN: llvm-mc -triple armv7-linux-eabi -filetype asm -o /dev/null %s 2>&1 \ +@ RUN: | FileCheck %s + + .syntax unified + .arm + + .global stm + .type stm,%function +stm: + stm sp!, {r0, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stm sp!, {r0, pc} +@ CHECK: ^ + stm r0!, {r0, sp} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stm r0!, {r0, sp} +@ CHECK: ^ + stm r1!, {r0, sp, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stm r1!, {r0, sp, pc} +@ CHECK: ^ + stm r2!, {sp, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stm r2!, {sp, pc} +@ CHECK: ^ + stm sp!, {pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stm sp!, {pc} +@ CHECK: ^ + stm r0!, {sp} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stm r0!, {sp} +@ CHECK: ^ + + .global stmda + .type stmda,%function +stmda: + stmda sp!, {r0, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmda sp!, {r0, pc} +@ CHECK: ^ + stmda r0!, {r0, sp} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmda r0!, {r0, sp} +@ CHECK: ^ + stmda r1!, {r0, sp, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmda r1!, {r0, sp, pc} +@ CHECK: ^ + stmda r2!, {sp, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmda r2!, {sp, pc} +@ CHECK: ^ + stmda sp!, {pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmda sp!, {pc} +@ CHECK: ^ + stmda r0!, {sp} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmda r0!, {sp} +@ CHECK: ^ + + .global stmdb + .type stmdb,%function +stmdb: + stmdb sp!, {r0, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmdb sp!, {r0, pc} +@ CHECK: ^ + stmdb r0!, {r0, sp} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmdb r0!, {r0, sp} +@ CHECK: ^ + stmdb r1!, {r0, sp, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmdb r1!, {r0, sp, pc} +@ CHECK: ^ + stmdb r2!, {sp, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmdb r2!, {sp, pc} +@ CHECK: ^ + stmdb sp!, {pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmdb sp!, {pc} +@ CHECK: ^ + stmdb r0!, {sp} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmdb r0!, {sp} +@ CHECK: ^ + + .global stmib + .type stmib,%function +stmib: + stmib sp!, {r0, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmib sp!, {r0, pc} +@ CHECK: ^ + stmib r0!, {r0, sp} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmib r0!, {r0, sp} +@ CHECK: ^ + stmib r1!, {r0, sp, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmib r1!, {r0, sp, pc} +@ CHECK: ^ + stmib r2!, {sp, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmib r2!, {sp, pc} +@ CHECK: ^ + stmib sp!, {pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmib sp!, {pc} +@ CHECK: ^ + stmib r0!, {sp} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: stmib r0!, {sp} +@ CHECK: ^ + + + .global push + .type push,%function +push: + push {r0, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: push {r0, pc} +@ CHECK: ^ + push {r0, sp} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: push {r0, sp} +@ CHECK: ^ + push {r0, sp, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: push {r0, sp, pc} +@ CHECK: ^ + push {sp, pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: push {sp, pc} +@ CHECK: ^ + push {pc} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: push {pc} +@ CHECK: ^ + push {sp} +@ CHECK: warning: use of SP or PC in the list is deprecated +@ CHECK: push {sp} +@ CHECK: ^ + -- 2.34.1