Skip to content

[clang][ARM] Include arm_acle.h in intrin.h on supported platforms #144172

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

sarnex
Copy link
Member

@sarnex sarnex commented Jun 13, 2025

Warnings should suggest changes that are valid on both MSVC and Clang where possible.
Right now when using ARM intrinsics without including arm_acle.h, we throw a warning saying to include it or provide a declaration for the function.
MSVC doesn't have any ARM-intrinsic specific header, so include Clang's ARM intrinsic header (arm_acle.h) in intrin.h, and update the intrinsic usage warnings to suggest intrin.h.

See #140910 for more info.

@sarnex sarnex marked this pull request as ready for review June 17, 2025 15:40
@llvmbot llvmbot added clang Clang issues not falling into any other category backend:ARM backend:AArch64 backend:X86 clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:headers Headers provided by Clang, e.g. for intrinsics labels Jun 17, 2025
@llvmbot
Copy link
Member

llvmbot commented Jun 17, 2025

@llvm/pr-subscribers-backend-arm
@llvm/pr-subscribers-backend-aarch64

@llvm/pr-subscribers-backend-x86

Author: Nick Sarnie (sarnex)

Changes

Warnings should suggest changes that are valid on both MSVC and Clang where possible.
Right now when using ARM intrinsics without including arm_acle.h, we throw a warning saying to include it or provide a declaration for the function.
MSVC doesn't have any ARM-intrinsic specific header, so include Clang's ARM intrinsic header (arm_acle.h) in intrin.h, and update the intrinsic usage warnings to suggest intrin.h.

See #140910 for more info.


Full diff: https://github.com/llvm/llvm-project/pull/144172.diff

7 Files Affected:

  • (modified) clang/include/clang/Basic/BuiltinHeaders.def (-1)
  • (modified) clang/include/clang/Basic/BuiltinsAArch64.def (+8-8)
  • (modified) clang/include/clang/Basic/BuiltinsARM.def (+8-8)
  • (modified) clang/lib/Headers/intrin.h (+4)
  • (modified) clang/test/CodeGen/arm-former-microsoft-intrinsics-header-warning.c (+8-8)
  • (modified) clang/test/CodeGen/arm64-former-microsoft-intrinsics-header-warning.c (+8-8)
  • (added) clang/test/Headers/arm-acle-no-direct-include.c (+7)
diff --git a/clang/include/clang/Basic/BuiltinHeaders.def b/clang/include/clang/Basic/BuiltinHeaders.def
index 22668ec7a3396..8e4a2f9bee9aa 100644
--- a/clang/include/clang/Basic/BuiltinHeaders.def
+++ b/clang/include/clang/Basic/BuiltinHeaders.def
@@ -12,7 +12,6 @@
 //===----------------------------------------------------------------------===//
 
 HEADER(NO_HEADER, nullptr)
-HEADER(ARMACLE_H, "arm_acle.h")
 HEADER(BLOCKS_H, "Blocks.h")
 HEADER(COMPLEX_H, "complex.h")
 HEADER(CTYPE_H, "ctype.h")
diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def b/clang/include/clang/Basic/BuiltinsAArch64.def
index 8867a9fe09fb9..4a1db34b9b30f 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -50,11 +50,11 @@ BUILTIN(__builtin_arm_wfi, "v", "")
 BUILTIN(__builtin_arm_sev, "v", "")
 BUILTIN(__builtin_arm_sevl, "v", "")
 BUILTIN(__builtin_arm_chkfeat, "WUiWUi", "")
-TARGET_HEADER_BUILTIN(__yield, "v", "h", ARMACLE_H, ALL_LANGUAGES, "")
-TARGET_HEADER_BUILTIN(__wfe,   "v", "h", ARMACLE_H, ALL_LANGUAGES, "")
-TARGET_HEADER_BUILTIN(__wfi,   "v", "h", ARMACLE_H, ALL_LANGUAGES, "")
-TARGET_HEADER_BUILTIN(__sev,   "v", "h", ARMACLE_H, ALL_LANGUAGES, "")
-TARGET_HEADER_BUILTIN(__sevl,  "v", "h", ARMACLE_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__yield, "v", "h", INTRIN_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__wfe,   "v", "h", INTRIN_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__wfi,   "v", "h", INTRIN_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__sev,   "v", "h", INTRIN_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__sevl,  "v", "h", INTRIN_H, ALL_LANGUAGES, "")
 
 // Like __builtin_trap but provide an 16-bit immediate reason code (which goes into `brk #N`).
 BUILTIN(__builtin_arm_trap, "vUIs", "nr")
@@ -87,9 +87,9 @@ TARGET_BUILTIN(__builtin_arm_mops_memset_tag, "v*v*iz", "", "mte,mops")
 BUILTIN(__builtin_arm_dmb, "vUi", "nc")
 BUILTIN(__builtin_arm_dsb, "vUi", "nc")
 BUILTIN(__builtin_arm_isb, "vUi", "nc")
-TARGET_HEADER_BUILTIN(__dmb, "vUi", "nch", ARMACLE_H, ALL_LANGUAGES, "")
-TARGET_HEADER_BUILTIN(__dsb, "vUi", "nch", ARMACLE_H, ALL_LANGUAGES, "")
-TARGET_HEADER_BUILTIN(__isb, "vUi", "nch", ARMACLE_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__dmb, "vUi", "nch", INTRIN_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__dsb, "vUi", "nch", INTRIN_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__isb, "vUi", "nch", INTRIN_H, ALL_LANGUAGES, "")
 
 TARGET_BUILTIN(__builtin_arm_jcvt, "Zid", "nc", "v8.3a")
 
diff --git a/clang/include/clang/Basic/BuiltinsARM.def b/clang/include/clang/Basic/BuiltinsARM.def
index 2592e25e95c37..20a41dc248859 100644
--- a/clang/include/clang/Basic/BuiltinsARM.def
+++ b/clang/include/clang/Basic/BuiltinsARM.def
@@ -186,19 +186,19 @@ BUILTIN(__builtin_arm_wfi, "v", "")
 BUILTIN(__builtin_arm_sev, "v", "")
 BUILTIN(__builtin_arm_sevl, "v", "")
 BUILTIN(__builtin_arm_dbg, "vUi", "")
-TARGET_HEADER_BUILTIN(__yield, "v", "h", ARMACLE_H, ALL_LANGUAGES, "")
-TARGET_HEADER_BUILTIN(__wfe, "v", "h", ARMACLE_H, ALL_LANGUAGES, "")
-TARGET_HEADER_BUILTIN(__wfi, "v", "h", ARMACLE_H, ALL_LANGUAGES, "")
-TARGET_HEADER_BUILTIN(__sev, "v", "h", ARMACLE_H, ALL_LANGUAGES, "")
-TARGET_HEADER_BUILTIN(__sevl, "v", "h", ARMACLE_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__yield, "v", "h", INTRIN_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__wfe, "v", "h", INTRIN_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__wfi, "v", "h", INTRIN_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__sev, "v", "h", INTRIN_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__sevl, "v", "h", INTRIN_H, ALL_LANGUAGES, "")
 
 // Data barrier
 BUILTIN(__builtin_arm_dmb, "vUi", "nc")
 BUILTIN(__builtin_arm_dsb, "vUi", "nc")
 BUILTIN(__builtin_arm_isb, "vUi", "nc")
-TARGET_HEADER_BUILTIN(__dmb, "vUi", "nch", ARMACLE_H, ALL_LANGUAGES, "")
-TARGET_HEADER_BUILTIN(__dsb, "vUi", "nch", ARMACLE_H, ALL_LANGUAGES, "")
-TARGET_HEADER_BUILTIN(__isb, "vUi", "nch", ARMACLE_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__dmb, "vUi", "nch", INTRIN_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__dsb, "vUi", "nch", INTRIN_H, ALL_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__isb, "vUi", "nch", INTRIN_H, ALL_LANGUAGES, "")
 
 // Prefetch
 BUILTIN(__builtin_arm_prefetch, "vvC*UiUi", "nc")
diff --git a/clang/lib/Headers/intrin.h b/clang/lib/Headers/intrin.h
index 3dd1eb45817d4..969a5bb4aa81f 100644
--- a/clang/lib/Headers/intrin.h
+++ b/clang/lib/Headers/intrin.h
@@ -30,6 +30,10 @@
 #include <arm64intr.h>
 #endif
 
+#if defined(__ARM_ACLE)
+#include <arm_acle.h>
+#endif
+
 /* For the definition of jmp_buf. */
 #if __STDC_HOSTED__
 #include <setjmp.h>
diff --git a/clang/test/CodeGen/arm-former-microsoft-intrinsics-header-warning.c b/clang/test/CodeGen/arm-former-microsoft-intrinsics-header-warning.c
index 8edcbbeb0375d..19216629373ef 100644
--- a/clang/test/CodeGen/arm-former-microsoft-intrinsics-header-warning.c
+++ b/clang/test/CodeGen/arm-former-microsoft-intrinsics-header-warning.c
@@ -3,48 +3,48 @@
 
 void check__dmb(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __dmb(0);
 }
 
 void check__dsb(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __dsb(0);
 }
 
 void check__isb(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __isb(0);
 }
 
 void check__yield(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __yield();
 }
 
 void check__wfe(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __wfe();
 }
 
 void check__wfi(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __wfi();
 }
 
 void check__sev(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __sev();
 }
 
 void check__sevl(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __sevl();
 }
diff --git a/clang/test/CodeGen/arm64-former-microsoft-intrinsics-header-warning.c b/clang/test/CodeGen/arm64-former-microsoft-intrinsics-header-warning.c
index 52fed49db4dd2..3f829d39b413b 100644
--- a/clang/test/CodeGen/arm64-former-microsoft-intrinsics-header-warning.c
+++ b/clang/test/CodeGen/arm64-former-microsoft-intrinsics-header-warning.c
@@ -6,48 +6,48 @@
 
 void check__dmb(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __dmb(0);
 }
 
 void check__dsb(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __dsb(0);
 }
 
 void check__isb(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __isb(0);
 }
 
 void check__yield(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __yield();
 }
 
 void check__wfe(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __wfe();
 }
 
 void check__wfi(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __wfi();
 }
 
 void check__sev(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __sev();
 }
 
 void check__sevl(void) {
   // expected-warning@+2{{call to undeclared library function}}
-  // expected-note@+1{{include the header <arm_acle.h> or explicitly provide a declaration for}}
+  // expected-note@+1{{include the header <intrin.h> or explicitly provide a declaration for}}
   __sevl();
 }
diff --git a/clang/test/Headers/arm-acle-no-direct-include.c b/clang/test/Headers/arm-acle-no-direct-include.c
new file mode 100644
index 0000000000000..26e7c914ce833
--- /dev/null
+++ b/clang/test/Headers/arm-acle-no-direct-include.c
@@ -0,0 +1,7 @@
+// RUN: %clang_cl --target=aarch64-windows-msvc -Xclang -verify /E -U__STDC_HOSTED__ -Wno-builtin-macro-redefined %s 2>&1 | FileCheck %s
+
+// expected-no-diagnostics
+
+// CHECK: void __yield(void);
+#include <intrin.h>
+void f() { __yield(); }

@sarnex sarnex requested review from nico, rnk and zmodem June 17, 2025 15:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:AArch64 backend:ARM backend:X86 clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:headers Headers provided by Clang, e.g. for intrinsics clang Clang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants