diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Basic/Targets.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 6 | ||||
| -rw-r--r-- | clang/test/Sema/arm-interrupt-attr.c | 22 | 
3 files changed, 23 insertions, 6 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 78b03b1c314..16aa82f1385 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -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); diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index d63151ef675..849e978e2d8 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -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 diff --git a/clang/test/Sema/arm-interrupt-attr.c b/clang/test/Sema/arm-interrupt-attr.c index 3a6cdbe0e07..60691ab7f8e 100644 --- a/clang/test/Sema/arm-interrupt-attr.c +++ b/clang/test/Sema/arm-interrupt-attr.c @@ -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  | 

