forked from OSchip/llvm-project
Sema: prevent __declspec(naked) use on x64
MSDN (https://msdn.microsoft.com/en-us/library/h5w10wxs.aspx) indicates that `__declspec(naked)` is only permitted on x86 and ARM targets. Testing with cl does confirm this behaviour. Provide a warning for use of `__declspec(naked)` on x64. llvm-svn: 299774
This commit is contained in:
parent
60d0e982f0
commit
b51bcaf2f0
|
@ -3231,7 +3231,8 @@ def err_attribute_regparm_invalid_number : Error<
|
||||||
"'regparm' parameter must be between 0 and %0 inclusive">;
|
"'regparm' parameter must be between 0 and %0 inclusive">;
|
||||||
def err_attribute_not_supported_in_lang : Error<
|
def err_attribute_not_supported_in_lang : Error<
|
||||||
"%0 attribute is not supported in %select{C|C++|Objective-C}1">;
|
"%0 attribute is not supported in %select{C|C++|Objective-C}1">;
|
||||||
|
def err_attribute_not_supported_on_arch
|
||||||
|
: Error<"%0 attribute is not supported on '%1'">;
|
||||||
|
|
||||||
// Clang-Specific Attributes
|
// Clang-Specific Attributes
|
||||||
def warn_attribute_iboutlet : Warning<
|
def warn_attribute_iboutlet : Warning<
|
||||||
|
|
|
@ -1923,6 +1923,17 @@ static void handleNakedAttr(Sema &S, Decl *D, const AttributeList &Attr) {
|
||||||
Attr.getName()))
|
Attr.getName()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (Attr.isDeclspecAttribute()) {
|
||||||
|
const auto &Triple = S.getASTContext().getTargetInfo().getTriple();
|
||||||
|
const auto &Arch = Triple.getArch();
|
||||||
|
if (Arch != llvm::Triple::x86 &&
|
||||||
|
(Arch != llvm::Triple::arm && Arch != llvm::Triple::thumb)) {
|
||||||
|
S.Diag(Attr.getLoc(), diag::err_attribute_not_supported_on_arch)
|
||||||
|
<< Attr.getName() << Triple.getArchName();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
D->addAttr(::new (S.Context) NakedAttr(Attr.getRange(), S.Context,
|
D->addAttr(::new (S.Context) NakedAttr(Attr.getRange(), S.Context,
|
||||||
Attr.getAttributeSpellingListIndex()));
|
Attr.getAttributeSpellingListIndex()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
// RUN: %clang_cc1 -triple i686-unknown-windows-msvc -fsyntax-only -fdeclspec -verify %s
|
||||||
|
// RUN: %clang_cc1 -triple thumbv7-unknown-windows-msvc -fsyntax-only -fdeclspec -verify %s
|
||||||
|
// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -fsyntax-only -fdeclspec -verify %s
|
||||||
|
#if defined(_M_IX86) || defined(_M_ARM)
|
||||||
|
// CHECK: expected-no-diagnostics
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void __declspec(naked) f(void) {}
|
||||||
|
#if !defined(_M_IX86) && !defined(_M_ARM)
|
||||||
|
// expected-error@-2{{'naked' attribute is not supported on 'x86_64'}}
|
||||||
|
#endif
|
|
@ -1,5 +1,5 @@
|
||||||
// REQUIRES: x86-registered-target
|
// REQUIRES: x86-registered-target
|
||||||
// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -fms-extensions -fasm-blocks -Wno-microsoft -Wunused-label -verify -fsyntax-only
|
// RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fms-extensions -fasm-blocks -Wno-microsoft -Wunused-label -verify -fsyntax-only
|
||||||
|
|
||||||
void t1(void) {
|
void t1(void) {
|
||||||
__asm __asm // expected-error {{__asm used with no assembly instructions}}
|
__asm __asm // expected-error {{__asm used with no assembly instructions}}
|
||||||
|
|
Loading…
Reference in New Issue