forked from OSchip/llvm-project
[ARM] Limit the diagnose when an ISR calls a regular function
Summary: When the function is compiled with soft-float or on CPU with no FPU, we don't need to diagnose for a call from an ISR to a regular function. Reviewers: jroelofs, eli.friedman Reviewed By: jroelofs Subscribers: aemerson, rengolin, javed.absar, cfe-commits Differential Revision: https://reviews.llvm.org/D32918 llvm-svn: 302274
This commit is contained in:
parent
21ebb216ea
commit
be380c711c
|
@ -5443,6 +5443,7 @@ public:
|
|||
.Case("softfloat", SoftFloat)
|
||||
.Case("thumb", isThumb())
|
||||
.Case("neon", (FPU & NeonFPU) && !SoftFloat)
|
||||
.Case("vfp", FPU && !SoftFloat)
|
||||
.Case("hwdiv", HWDiv & HWDivThumb)
|
||||
.Case("hwdiv-arm", HWDiv & HWDivARM)
|
||||
.Default(false);
|
||||
|
|
|
@ -5399,9 +5399,11 @@ Sema::BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl,
|
|||
// that the callee might not preserve them. This is easy to diagnose here,
|
||||
// but can be very challenging to debug.
|
||||
if (auto *Caller = getCurFunctionDecl())
|
||||
if (Caller->hasAttr<ARMInterruptAttr>())
|
||||
if (!FDecl || !FDecl->hasAttr<ARMInterruptAttr>())
|
||||
if (Caller->hasAttr<ARMInterruptAttr>()) {
|
||||
bool VFP = Context.getTargetInfo().hasFeature("vfp");
|
||||
if (VFP && (!FDecl || !FDecl->hasAttr<ARMInterruptAttr>()))
|
||||
Diag(Fn->getExprLoc(), diag::warn_arm_interrupt_calling_convention);
|
||||
}
|
||||
|
||||
// Promote the function operand.
|
||||
// We special-case function promotion here because we only allow promoting
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
// RUN: %clang_cc1 %s -triple arm-apple-darwin -verify -fsyntax-only
|
||||
// RUN: %clang_cc1 %s -triple thumb-apple-darwin -verify -fsyntax-only
|
||||
// RUN: %clang_cc1 %s -triple armeb-none-eabi -verify -fsyntax-only
|
||||
// RUN: %clang_cc1 %s -triple thumbeb-none-eabi -verify -fsyntax-only
|
||||
// RUN: %clang_cc1 %s -triple arm-apple-darwin -target-feature +vfp2 -verify -fsyntax-only
|
||||
// RUN: %clang_cc1 %s -triple thumb-apple-darwin -target-feature +vfp3 -verify -fsyntax-only
|
||||
// RUN: %clang_cc1 %s -triple armeb-none-eabi -target-feature +vfp4 -verify -fsyntax-only
|
||||
// RUN: %clang_cc1 %s -triple thumbeb-none-eabi -target-feature +neon -verify -fsyntax-only
|
||||
// RUN: %clang_cc1 %s -triple thumbeb-none-eabi -target-feature +neon -target-feature +soft-float -DSOFT -verify -fsyntax-only
|
||||
|
||||
__attribute__((interrupt(IRQ))) void foo() {} // expected-error {{'interrupt' attribute requires a string}}
|
||||
__attribute__((interrupt("irq"))) void foo1() {} // expected-warning {{'interrupt' attribute argument not supported: irq}}
|
||||
|
@ -24,6 +25,8 @@ void caller1() {
|
|||
callee1();
|
||||
callee2();
|
||||
}
|
||||
|
||||
#ifndef SOFT
|
||||
__attribute__((interrupt("IRQ"))) void caller2() {
|
||||
callee1(); // expected-warning {{call to function without interrupt attribute could clobber interruptee's VFP registers}}
|
||||
callee2();
|
||||
|
@ -33,3 +36,14 @@ void (*callee3)();
|
|||
__attribute__((interrupt("IRQ"))) void caller3() {
|
||||
callee3(); // expected-warning {{call to function without interrupt attribute could clobber interruptee's VFP registers}}
|
||||
}
|
||||
#else
|
||||
__attribute__((interrupt("IRQ"))) void caller2() {
|
||||
callee1();
|
||||
callee2();
|
||||
}
|
||||
|
||||
void (*callee3)();
|
||||
__attribute__((interrupt("IRQ"))) void caller3() {
|
||||
callee3();
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue