Skip to content

Commit 3b33560

Browse files
committed
Revert "[ARM][Thumb] Save FPSCR + FPEXC for save-vfp attribute"
This reverts commit 1f05703.
1 parent 1f05703 commit 3b33560

21 files changed

+29
-1036
lines changed

clang/include/clang/Basic/Attr.td

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -994,22 +994,6 @@ def ARMInterrupt : InheritableAttr, TargetSpecificAttr<TargetARM> {
994994
let Documentation = [ARMInterruptDocs];
995995
}
996996

997-
def ARMInterruptSaveFP : InheritableAttr, TargetSpecificAttr<TargetARM> {
998-
let Spellings = [GNU<"interrupt_save_fp">];
999-
let Args = [EnumArgument<"Interrupt", "InterruptType", /*is_string=*/true,
1000-
["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", ""],
1001-
["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", "Generic"],
1002-
1>];
1003-
let HasCustomParsing = 0;
1004-
let Documentation = [ARMInterruptSaveFPDocs];
1005-
}
1006-
1007-
def ARMSaveFP : InheritableAttr, TargetSpecificAttr<TargetARM> {
1008-
let Spellings = [];
1009-
let Subjects = SubjectList<[Function]>;
1010-
let Documentation = [InternalOnly];
1011-
}
1012-
1013997
def AVRInterrupt : InheritableAttr, TargetSpecificAttr<TargetAVR> {
1014998
let Spellings = [GCC<"interrupt">];
1015999
let Subjects = SubjectList<[Function]>;

clang/include/clang/Basic/AttrDocs.td

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2662,19 +2662,6 @@ The semantics are as follows:
26622662
}];
26632663
}
26642664

2665-
def ARMInterruptSaveFPDocs : Documentation {
2666-
let Category = DocCatFunction;
2667-
let Heading = "interrupt_save_fp (ARM)";
2668-
let Content = [{
2669-
Clang supports the GNU style ``__attribute__((interrupt_save_fp("TYPE")))``
2670-
on ARM targets. This attribute behaves the same way as the ARM interrupt
2671-
attribute, except the general purpose floating point registers are also saved,
2672-
along with FPEXC and FPSCR. Note, even on M-class CPUs, where the floating
2673-
point context can be automatically saved depending on the FPCCR, the general
2674-
purpose floating point registers will be saved.
2675-
}];
2676-
}
2677-
26782665
def BPFPreserveAccessIndexDocs : Documentation {
26792666
let Category = DocCatFunction;
26802667
let Content = [{

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -346,14 +346,8 @@ def warn_anyx86_excessive_regsave : Warning<
346346
InGroup<DiagGroup<"excessive-regsave">>;
347347
def warn_arm_interrupt_vfp_clobber : Warning<
348348
"interrupt service routine with vfp enabled may clobber the "
349-
"interruptee's vfp state; "
350-
"consider using the `interrupt_save_fp` attribute to prevent this behavior">,
349+
"interruptee's vfp state">,
351350
InGroup<DiagGroup<"arm-interrupt-vfp-clobber">>;
352-
def warn_arm_interrupt_save_fp_without_vfp_unit : Warning<
353-
"`interrupt_save_fp` only applies to targets that have a VFP unit enabled "
354-
"for this compilation; this will be treated as a regular `interrupt` "
355-
"attribute">,
356-
InGroup<DiagGroup<"arm-interrupt-vfp-clobber">>;
357351
def err_arm_interrupt_called : Error<
358352
"interrupt service routine cannot be called directly">;
359353
def warn_interrupt_signal_attribute_invalid : Warning<

clang/lib/CodeGen/Targets/ARM.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -190,12 +190,6 @@ class ARMTargetCodeGenInfo : public TargetCodeGenInfo {
190190

191191
Fn->addFnAttr("interrupt", Kind);
192192

193-
// Note: the ARMSaveFPAttr can only exist if we also have an interrupt
194-
// attribute
195-
const ARMSaveFPAttr *SaveFPAttr = FD->getAttr<ARMSaveFPAttr>();
196-
if (SaveFPAttr)
197-
Fn->addFnAttr("save-fp");
198-
199193
ARMABIKind ABI = getABIInfo<ARMABIInfo>().getABIKind();
200194
if (ABI == ARMABIKind::APCS)
201195
return;

clang/lib/Sema/SemaARM.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1307,11 +1307,9 @@ void SemaARM::handleInterruptAttr(Decl *D, const ParsedAttr &AL) {
13071307
return;
13081308
}
13091309

1310-
if (!D->hasAttr<ARMSaveFPAttr>()) {
1311-
const TargetInfo &TI = getASTContext().getTargetInfo();
1312-
if (TI.hasFeature("vfp"))
1313-
Diag(D->getLocation(), diag::warn_arm_interrupt_vfp_clobber);
1314-
}
1310+
const TargetInfo &TI = getASTContext().getTargetInfo();
1311+
if (TI.hasFeature("vfp"))
1312+
Diag(D->getLocation(), diag::warn_arm_interrupt_vfp_clobber);
13151313

13161314
D->addAttr(::new (getASTContext())
13171315
ARMInterruptAttr(getASTContext(), AL, Kind));

clang/lib/Sema/SemaDeclAttr.cpp

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5993,20 +5993,6 @@ static void handleAbiTagAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
59935993
AbiTagAttr(S.Context, AL, Tags.data(), Tags.size()));
59945994
}
59955995

5996-
static void handleARMInterruptSaveFPAttr(Sema &S, Decl *D,
5997-
const ParsedAttr &AL) {
5998-
handleARMInterruptAttr(S, D, AL);
5999-
6000-
bool VFP = S.Context.getTargetInfo().hasFeature("vfp");
6001-
6002-
if (!VFP) {
6003-
S.Diag(D->getLocation(), diag::warn_arm_interrupt_save_fp_without_vfp_unit);
6004-
return;
6005-
}
6006-
6007-
D->addAttr(::new (S.Context) ARMSaveFPAttr(S.Context, AL));
6008-
}
6009-
60105996
static bool hasBTFDeclTagAttr(Decl *D, StringRef Tag) {
60115997
for (const auto *I : D->specific_attrs<BTFDeclTagAttr>()) {
60125998
if (I->getBTFDeclTag() == Tag)
@@ -6911,9 +6897,6 @@ ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, const ParsedAttr &AL,
69116897
case ParsedAttr::AT_Interrupt:
69126898
handleInterruptAttr(S, D, AL);
69136899
break;
6914-
case ParsedAttr::AT_ARMInterruptSaveFP:
6915-
handleARMInterruptSaveFPAttr(S, D, AL);
6916-
break;
69176900
case ParsedAttr::AT_X86ForceAlignArgPointer:
69186901
S.X86().handleForceAlignArgPointerAttr(D, AL);
69196902
break;

clang/test/CodeGen/arm-interrupt-save-fp-attr-status-regs.c

Lines changed: 0 additions & 34 deletions
This file was deleted.

clang/test/CodeGen/arm-interrupt-save-fp-attr.c

Lines changed: 0 additions & 39 deletions
This file was deleted.

clang/test/Sema/arm-interrupt-attr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44

55
#ifdef __ARM_FP
6-
__attribute__((interrupt("IRQ"))) void float_irq(void); // expected-warning {{interrupt service routine with vfp enabled may clobber the interruptee's vfp state; consider using the `interrupt_save_fp` attribute to prevent this behavior}}
6+
__attribute__((interrupt("IRQ"))) void float_irq(void); // expected-warning {{interrupt service routine with vfp enabled may clobber the interruptee's vfp state}}
77
#else // !defined(__ARM_FP)
88
__attribute__((interrupt("irq"))) void foo1(void) {} // expected-warning {{'interrupt' attribute argument not supported: irq}}
99
__attribute__((interrupt(IRQ))) void foo(void) {} // expected-error {{'interrupt' attribute requires a string}}

clang/test/Sema/arm-interrupt-save-fp-attr.c

Lines changed: 0 additions & 59 deletions
This file was deleted.

llvm/include/llvm/IR/IntrinsicsARM.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ def int_arm_isb : ClangBuiltin<"__builtin_arm_isb">, MSBuiltin<"__isb">,
311311
// VFP
312312

313313
def int_arm_get_fpscr : ClangBuiltin<"__builtin_arm_get_fpscr">,
314-
DefaultAttrsIntrinsic<[llvm_i32_ty], [], [IntrReadMem]>;
314+
DefaultAttrsIntrinsic<[llvm_i32_ty], [], []>;
315315
def int_arm_set_fpscr : ClangBuiltin<"__builtin_arm_set_fpscr">,
316316
DefaultAttrsIntrinsic<[], [llvm_i32_ty], []>;
317317
def int_arm_vcvtr : DefaultAttrsIntrinsic<[llvm_float_ty],

llvm/lib/Target/ARM/ARMAsmPrinter.cpp

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1207,14 +1207,6 @@ void ARMAsmPrinter::EmitUnwindingInstruction(const MachineInstr *MI) {
12071207
SrcReg = ~0U;
12081208
DstReg = MI->getOperand(0).getReg();
12091209
break;
1210-
case ARM::VMRS:
1211-
SrcReg = ARM::FPSCR;
1212-
DstReg = MI->getOperand(0).getReg();
1213-
break;
1214-
case ARM::VMRS_FPEXC:
1215-
SrcReg = ARM::FPEXC;
1216-
DstReg = MI->getOperand(0).getReg();
1217-
break;
12181210
default:
12191211
SrcReg = MI->getOperand(1).getReg();
12201212
DstReg = MI->getOperand(0).getReg();
@@ -1381,14 +1373,6 @@ void ARMAsmPrinter::EmitUnwindingInstruction(const MachineInstr *MI) {
13811373
// correct ".save" later.
13821374
AFI->EHPrologueRemappedRegs[DstReg] = SrcReg;
13831375
break;
1384-
case ARM::VMRS:
1385-
case ARM::VMRS_FPEXC:
1386-
// If a function spills FPSCR or FPEXC, we copy the values to low
1387-
// registers before pushing them. However, we can't issue annotations
1388-
// for FP status registers because ".save" requires GPR registers, and
1389-
// ".vsave" requires DPR registers, so don't record the copy and simply
1390-
// emit annotations for the source registers used for the store.
1391-
break;
13921376
case ARM::tLDRpci: {
13931377
// Grab the constpool index and check, whether it corresponds to
13941378
// original or cloned constpool entry.

llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp

Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -80,47 +80,13 @@ ARMBaseRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
8080
? CSR_ATPCS_SplitPush_SwiftTail_SaveList
8181
: CSR_AAPCS_SwiftTail_SaveList);
8282
} else if (F.hasFnAttribute("interrupt")) {
83-
84-
// Don't bother saving the floating point registers if target is not hard
85-
// float. This will prevent the Thumb1FrameLowering (cortex-m0) from
86-
// crashing due to an llvm_unreachable being triggered when a D-class
87-
// register is in the calling convention.
88-
if (STI.isTargetHardFloat() && F.hasFnAttribute("save-fp")) {
89-
bool HasNEON = STI.hasNEON();
90-
91-
if (STI.isMClass()) {
92-
assert(!HasNEON && "NEON is only for Cortex-R/A");
93-
return UseSplitPush ? CSR_ATPCS_SplitPush_FP_SaveList
94-
: CSR_AAPCS_FP_SaveList;
95-
}
96-
if (F.getFnAttribute("interrupt").getValueAsString() == "FIQ") {
97-
return HasNEON ? CSR_FIQ_FP_NEON_SaveList : CSR_FIQ_FP_SaveList;
98-
}
99-
return HasNEON ? CSR_GenericInt_FP_NEON_SaveList
100-
: CSR_GenericInt_FP_SaveList;
101-
}
102-
10383
if (STI.isMClass()) {
10484
// M-class CPUs have hardware which saves the registers needed to allow a
10585
// function conforming to the AAPCS to function as a handler.
106-
// Additionally, M Class has hardware support for saving VFP registers,
107-
// but the option can be disabled
108-
if (SaveFP) {
109-
if (HasNEON) {
110-
return UseSplitPush ? CSR_AAPCS_SplitPush_FP_NEON_SaveList
111-
: CSR_AAPCS_FP_NEON_SaveList;
112-
} else {
113-
return UseSplitPush ? CSR_AAPCS_SplitPush_FP_SaveList
114-
: CSR_AAPCS_FP_SaveList;
115-
}
116-
} else {
117-
return PushPopSplit == ARMSubtarget::SplitR7
118-
? CSR_ATPCS_SplitPush_SaveList
119-
: CSR_AAPCS_SaveList;
120-
}
121-
}
122-
123-
if (F.getFnAttribute("interrupt").getValueAsString() == "FIQ") {
86+
return PushPopSplit == ARMSubtarget::SplitR7
87+
? CSR_ATPCS_SplitPush_SaveList
88+
: CSR_AAPCS_SaveList;
89+
} else if (F.getFnAttribute("interrupt").getValueAsString() == "FIQ") {
12490
// Fast interrupt mode gives the handler a private copy of R8-R14, so less
12591
// need to be saved to restore user-mode state.
12692
return CSR_FIQ_SaveList;

0 commit comments

Comments
 (0)