From 5e6f0c45a851ccb53a7bf1847b967d3cd42de724 Mon Sep 17 00:00:00 2001 From: Ankit Aggarwal Date: Thu, 26 Feb 2026 16:24:13 -0800 Subject: [PATCH] [Clang][Hexagon] Add QURT as recognized OS in target triple (#183622) Add support for the QURT as a recognized OS type in the LLVM triple system, and define the __qurt__ predefined macro when targeting it. --- clang/lib/Basic/Targets.cpp | 2 ++ clang/lib/Basic/Targets/OSTargets.h | 13 +++++++++++++ clang/test/Preprocessor/hexagon-predefines.c | 6 ++++++ llvm/include/llvm/TargetParser/Triple.h | 6 +++++- llvm/lib/TargetParser/Triple.cpp | 3 +++ 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index cd5b29db07a9..dc6ef6ed8f3f 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -126,6 +126,8 @@ std::unique_ptr AllocateTarget(const llvm::Triple &Triple, if (os == llvm::Triple::Linux && Triple.getEnvironment() == llvm::Triple::Musl) return std::make_unique>(Triple, Opts); + if (Triple.isOSQurt()) + return std::make_unique>(Triple, Opts); return std::make_unique(Triple, Opts); case llvm::Triple::lanai: diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h index 24bc300f3774..16337d56f82c 100644 --- a/clang/lib/Basic/Targets/OSTargets.h +++ b/clang/lib/Basic/Targets/OSTargets.h @@ -1091,6 +1091,19 @@ public: } }; +// QURT Target +template +class LLVM_LIBRARY_VISIBILITY QURTTargetInfo : public OSTargetInfo { +protected: + void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, + MacroBuilder &Builder) const override { + Builder.defineMacro("__qurt__"); + } + +public: + using OSTargetInfo::OSTargetInfo; +}; + } // namespace targets } // namespace clang #endif // LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H diff --git a/clang/test/Preprocessor/hexagon-predefines.c b/clang/test/Preprocessor/hexagon-predefines.c index bdedcf45ab11..164d750d33f1 100644 --- a/clang/test/Preprocessor/hexagon-predefines.c +++ b/clang/test/Preprocessor/hexagon-predefines.c @@ -236,3 +236,9 @@ // RUN: %s -check-prefix CHECK-INTERFERENCE-73 // CHECK-INTERFERENCE-73: #define __GCC_CONSTRUCTIVE_SIZE 64 // CHECK-INTERFERENCE-73: #define __GCC_DESTRUCTIVE_SIZE 64 + +// RUN: %clang_cc1 -E -dM -triple hexagon-unknown-qurt %s | FileCheck \ +// RUN: %s -check-prefix CHECK-QURT +// CHECK-QURT: #define __hexagon__ 1 +// CHECK-QURT: #define __qurt__ 1 +// CHECK-QURT-NOT: #define __linux__ diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h index a940236c6aca..910c8ce55fd7 100644 --- a/llvm/include/llvm/TargetParser/Triple.h +++ b/llvm/include/llvm/TargetParser/Triple.h @@ -255,7 +255,8 @@ public: OpenCL, ChipStar, Firmware, - LastOSType = Firmware + QURT, + LastOSType = QURT }; enum EnvironmentType { UnknownEnvironment, @@ -795,6 +796,9 @@ public: return getOS() == Triple::Serenity; } + /// Tests whether the OS is QURT. + bool isOSQurt() const { return getOS() == Triple::QURT; } + /// Tests whether the OS uses the ELF binary format. bool isOSBinFormatELF() const { return getObjectFormat() == Triple::ELF; diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp index 0a775fda7e54..cf8a1415b48d 100644 --- a/llvm/lib/TargetParser/Triple.cpp +++ b/llvm/lib/TargetParser/Triple.cpp @@ -347,6 +347,8 @@ StringRef Triple::getOSTypeName(OSType Kind) { return "chipstar"; case Firmware: return "firmware"; + case QURT: + return "qurt"; } llvm_unreachable("Invalid OSType"); @@ -761,6 +763,7 @@ static Triple::OSType parseOS(StringRef OSName) { .StartsWith("opencl", Triple::OpenCL) .StartsWith("chipstar", Triple::ChipStar) .StartsWith("firmware", Triple::Firmware) + .StartsWith("qurt", Triple::QURT) .Default(Triple::UnknownOS); }