mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 06:32:24 +00:00
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
This commit is contained in:
parent
edfeeb6d70
commit
fbdea180c0
@ -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
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
147
test/MC/ARM/arm-store-deprecated.s
Normal file
147
test/MC/ARM/arm-store-deprecated.s
Normal file
@ -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: ^
|
||||
|
Loading…
x
Reference in New Issue
Block a user