Author: Alvin Wong Date: 2022-08-29T11:30:44+03:00 New Revision: 00d648bdb5a8b71785269b4851b651c883de2cd9
URL: https://github.com/llvm/llvm-project/commit/00d648bdb5a8b71785269b4851b651c883de2cd9 DIFF: https://github.com/llvm/llvm-project/commit/00d648bdb5a8b71785269b4851b651c883de2cd9.diff LOG: [clang] Make guard(nocf) attribute available only for Windows Control Flow Guard is only supported on Windows target, therefore there is no point to make it an accepted attribute for other targets. Reviewed By: rnk, aaron.ballman Differential Revision: https://reviews.llvm.org/D132661 Added: Modified: clang/docs/ReleaseNotes.rst clang/include/clang/Basic/Attr.td clang/test/Sema/attr-guard_nocf.c Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index b19a81e848387..cdcb6007ab836 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -146,7 +146,8 @@ Attribute Changes in Clang ``[[clang::guard(nocf)]]``, which is equivalent to ``__declspec(guard(nocf))`` when using the MSVC environment. This is to support enabling Windows Control Flow Guard checks with the ability to disable them for specific functions when - using the MinGW environment. + using the MinGW environment. This attribute is only available for Windows + targets. Windows Support --------------- diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index f962f84f3b7a7..3b0e3e2971803 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -399,6 +399,9 @@ def TargetRISCV : TargetArch<["riscv32", "riscv64"]>; def TargetX86 : TargetArch<["x86"]>; def TargetAnyX86 : TargetArch<["x86", "x86_64"]>; def TargetWebAssembly : TargetArch<["wasm32", "wasm64"]>; +def TargetWindows : TargetSpec { + let OSes = ["Win32"]; +} def TargetHasDLLImportExport : TargetSpec { let CustomCode = [{ Target.getTriple().hasDLLImportExport() }]; } @@ -3494,7 +3497,7 @@ def MSAllocator : InheritableAttr { let Documentation = [MSAllocatorDocs]; } -def CFGuard : InheritableAttr { +def CFGuard : InheritableAttr, TargetSpecificAttr<TargetWindows> { // Currently only the __declspec(guard(nocf)) modifier is supported. In future // we might also want to support __declspec(guard(suppress)). let Spellings = [Declspec<"guard">, Clang<"guard">]; diff --git a/clang/test/Sema/attr-guard_nocf.c b/clang/test/Sema/attr-guard_nocf.c index 7d7708e766473..c40884f45b7b7 100644 --- a/clang/test/Sema/attr-guard_nocf.c +++ b/clang/test/Sema/attr-guard_nocf.c @@ -2,10 +2,14 @@ // RUN: %clang_cc1 -triple %ms_abi_triple -fms-extensions -verify -std=c++11 -fsyntax-only -x c++ %s // RUN: %clang_cc1 -triple x86_64-w64-windows-gnu -verify -fsyntax-only %s // RUN: %clang_cc1 -triple x86_64-w64-windows-gnu -verify -std=c++11 -fsyntax-only -x c++ %s +// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -verify -fsyntax-only %s +// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -verify -std=c++11 -fsyntax-only -x c++ %s // The x86_64-w64-windows-gnu version tests mingw target, which relies on // __declspec(...) being defined as __attribute__((...)) by compiler built-in. +#if defined(_WIN32) + // Function definition. __declspec(guard(nocf)) void testGuardNoCF(void) { // no warning } @@ -35,3 +39,9 @@ __declspec(guard(nocf, nocf)) void testGuardNoCFTooManyParams(void) { // expecte // 'guard' Attribute argument must be a supported identifier. __declspec(guard(cf)) void testGuardNoCFInvalidParam(void) { // expected-warning {{'guard' attribute argument not supported: 'cf'}} } + +#else + +__attribute((guard(nocf))) void testGNUStyleGuardNoCF(void) {} // expected-warning {{unknown attribute 'guard' ignored}} + +#endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits