https://github.com/hussam-alhassan updated https://github.com/llvm/llvm-project/pull/225071
>From 4ab286bb15ad315cbd7f505c7aa01263323075f6 Mon Sep 17 00:00:00 2001 From: Hussam Alhassan <[email protected]> Date: Fri, 18 Sep 2026 12:42:25 +0100 Subject: [PATCH 1/3] [clang] Set _GNU_SOURCE for AArch64 bare-metal targets Set the _GNU_SOURCE macro when compiling for aarch64-none-elf in C++ mode to enable libc++ headers to use GNU interfaces --- clang/lib/Basic/Targets/AArch64.cpp | 11 +++++++++-- clang/test/Preprocessor/init-aarch64.c | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index a4841514be35e4..9aac476a078f54 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -402,8 +402,9 @@ void AArch64TargetInfo::getTargetDefinesARMV97A(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__"); @@ -415,7 +416,13 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, Builder.defineMacro("__aarch64__"); } - if (getTriple().isLFI()) + // For bare-metal none-elf. + if (T.getOS() == llvm::Triple::UnknownOS && T.getEnvironmentName() == "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 44b92ea2331b0a..51aabb40242c2d 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-none-elf < /dev/null | FileCheck -match-full-lines -check-prefix AARCH64-NONE-ELF-CXX %s +// AARCH64-NONE-ELF-CXX: #define _GNU_SOURCE 1 >From 2487f266b2ce56bf9e77c6778feaf7dbbc5947bf Mon Sep 17 00:00:00 2001 From: Hussam Alhassan <[email protected]> Date: Thu, 8 Oct 2026 16:42:03 +0100 Subject: [PATCH 2/3] Update triple in the init-aarch64.c test to the canonical clang triple --- clang/test/Preprocessor/init-aarch64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Preprocessor/init-aarch64.c b/clang/test/Preprocessor/init-aarch64.c index 51aabb40242c2d..25d89e432502e0 100644 --- a/clang/test/Preprocessor/init-aarch64.c +++ b/clang/test/Preprocessor/init-aarch64.c @@ -1171,5 +1171,5 @@ // CMODEL_SMALL: #define __AARCH64_CMODEL_SMALL__ 1 // CMODEL_LARGE: #define __AARCH64_CMODEL_LARGE__ 1 -// RUN: %clang_cc1 -x c++ -E -dM -ffreestanding -triple=aarch64-none-elf < /dev/null | FileCheck -match-full-lines -check-prefix AARCH64-NONE-ELF-CXX %s +// 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 >From 506fc1a4a4f0a7d29c400702c3f2ffe4ad71ae1e Mon Sep 17 00:00:00 2001 From: Hussam Alhassan <[email protected]> Date: Fri, 9 Oct 2026 10:05:54 +0100 Subject: [PATCH 3/3] Detect aarch64 bare-metal by examining env and object enums instead of env name --- clang/lib/Basic/Targets/AArch64.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 9aac476a078f54..c5b853feda3ad8 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; @@ -417,8 +418,9 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, } // For bare-metal none-elf. - if (T.getOS() == llvm::Triple::UnknownOS && T.getEnvironmentName() == "elf" && - Opts.CPlusPlus) { + if (T.getOS() == llvm::Triple::UnknownOS && + T.getEnvironment() == llvm::Triple::UnknownEnvironment && + T.getObjectFormat() == llvm::Triple::ELF && Opts.CPlusPlus) { Builder.defineMacro("_GNU_SOURCE"); } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
