Author: Hussam Alhassan
Date: 2026-10-13T10:07:46+01:00
New Revision: 877d12353203410f80fe4c482e3aac5b454a8bd2

URL: 
https://github.com/llvm/llvm-project/commit/877d12353203410f80fe4c482e3aac5b454a8bd2
DIFF: 
https://github.com/llvm/llvm-project/commit/877d12353203410f80fe4c482e3aac5b454a8bd2.diff

LOG: [clang] Set _GNU_SOURCE for AArch64 bare-metal targets (#225071)

Set the _GNU_SOURCE macro when compiling for aarch64-none-elf in C++
mode. This enables GNU interfaces globally so libc++ headers can use
libc functions such as `strtof_l`. This also matches ARM.cpp when
compiling for arm-none-eabi, further aligning aarch64 and arm bare-metal
behaviour.

Added: 
    

Modified: 
    clang/lib/Basic/Targets/AArch64.cpp
    clang/test/Preprocessor/init-aarch64.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index 58ae2f807c558..2e1c9336152f8 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -20,6 +20,7 @@
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/TargetParser/AArch64TargetParser.h"
 #include "llvm/TargetParser/ARMTargetParserCommon.h"
+#include "llvm/TargetParser/Triple.h"
 #include <optional>
 
 using namespace clang;
@@ -425,8 +426,9 @@ void AArch64TargetInfo::getTargetDefinesARMV98A(const 
LangOptions &Opts,
 
 void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
                                          MacroBuilder &Builder) const {
+  const llvm::Triple &T = getTriple();
   // Target identification.
-  if (getTriple().isWindowsArm64EC()) {
+  if (T.isWindowsArm64EC()) {
     // Define the same set of macros as would be defined on x86_64 to ensure 
that
     // ARM64EC datatype layouts match those of x86_64 compiled code
     Builder.defineMacro("__amd64__");
@@ -438,7 +440,14 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
     Builder.defineMacro("__aarch64__");
   }
 
-  if (getTriple().isLFI())
+  // For bare-metal none-elf.
+  if (T.getOS() == llvm::Triple::UnknownOS &&
+      T.getEnvironment() == llvm::Triple::UnknownEnvironment &&
+      T.getObjectFormat() == llvm::Triple::ELF && Opts.CPlusPlus) {
+    Builder.defineMacro("_GNU_SOURCE");
+  }
+
+  if (T.isLFI())
     Builder.defineMacro("__LFI__");
 
   // Inline assembly supports AArch64 flag outputs.

diff  --git a/clang/test/Preprocessor/init-aarch64.c 
b/clang/test/Preprocessor/init-aarch64.c
index 44b92ea2331b0..25d89e432502e 100644
--- a/clang/test/Preprocessor/init-aarch64.c
+++ b/clang/test/Preprocessor/init-aarch64.c
@@ -1170,3 +1170,6 @@
 // CMODEL_TINY: #define __AARCH64_CMODEL_TINY__ 1
 // CMODEL_SMALL: #define __AARCH64_CMODEL_SMALL__ 1
 // CMODEL_LARGE: #define __AARCH64_CMODEL_LARGE__ 1
+
+// RUN: %clang_cc1 -x c++ -E -dM -ffreestanding 
-triple=aarch64-unknown-none-elf < /dev/null | FileCheck -match-full-lines 
-check-prefix AARCH64-NONE-ELF-CXX %s
+// AARCH64-NONE-ELF-CXX: #define _GNU_SOURCE 1


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to