https://github.com/landaire updated 
https://github.com/llvm/llvm-project/pull/235915

>From dd94e27a8755b6e6aafab6a55feca060e3380088 Mon Sep 17 00:00:00 2001
From: Lander Brandt <[email protected]>
Date: Mon, 26 Oct 2026 02:10:14 -0700
Subject: [PATCH] [TargetParser] Recognize the Xbox 360 target

Clang treated xbox360 as an unknown OS and selected the normal powerpc64 type 
model. Black-box compiler probes require 32-bit pointers and long, 64-bit IEEE 
long double, 16-bit unsigned wchar_t, and four predefined target macros.
---
 clang/lib/Basic/Targets.cpp                   |  2 +
 clang/lib/Basic/Targets/OSTargets.h           | 49 ++++++++++++++++---
 clang/lib/Driver/ToolChains/Clang.cpp         |  2 +-
 clang/test/CodeGen/target-data.c              |  4 ++
 clang/test/Driver/xbox360.c                   |  5 ++
 clang/test/Preprocessor/init-xbox360.c        | 18 +++++++
 llvm/include/llvm/TargetParser/Triple.h       |  7 +++
 llvm/include/llvm/TargetParser/TripleName.def |  1 +
 llvm/lib/TargetParser/TargetDataLayout.cpp    | 10 ++--
 9 files changed, 84 insertions(+), 14 deletions(-)
 create mode 100644 clang/test/Driver/xbox360.c
 create mode 100644 clang/test/Preprocessor/init-xbox360.c

diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 6314cdf12728ac..287d6c1af36047 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -403,6 +403,8 @@ std::unique_ptr<TargetInfo> AllocateTarget(const 
llvm::Triple &Triple,
       return std::make_unique<LinuxTargetInfo<PPC64TargetInfo>>(Triple, Opts);
     case llvm::Triple::Lv2:
       return std::make_unique<PS3PPUTargetInfo<PPC64TargetInfo>>(Triple, Opts);
+    case llvm::Triple::Xbox360:
+      return std::make_unique<Xbox360TargetInfo<PPC64TargetInfo>>(Triple, 
Opts);
     case llvm::Triple::FreeBSD:
       return std::make_unique<FreeBSDTargetInfo<PPC64TargetInfo>>(Triple, 
Opts);
     case llvm::Triple::NetBSD:
diff --git a/clang/lib/Basic/Targets/OSTargets.h 
b/clang/lib/Basic/Targets/OSTargets.h
index eeb88370c9b584..80f8a955c86d17 100644
--- a/clang/lib/Basic/Targets/OSTargets.h
+++ b/clang/lib/Basic/Targets/OSTargets.h
@@ -556,9 +556,25 @@ class LLVM_LIBRARY_VISIBILITY OpenBSDTargetInfo : public 
OSTargetInfo<Target> {
   }
 };
 
+template <typename Target>
+class LLVM_LIBRARY_VISIBILITY PPC64ILP32TargetInfo
+    : public OSTargetInfo<Target> {
+public:
+  PPC64ILP32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
+      : OSTargetInfo<Target>(Triple, Opts) {
+    this->LongWidth = this->LongAlign = 32;
+    this->PointerWidth = this->PointerAlign = 32;
+    this->IntMaxType = TargetInfo::SignedLongLong;
+    this->Int64Type = TargetInfo::SignedLongLong;
+    this->SizeType = TargetInfo::UnsignedInt;
+    this->resetDataLayout();
+  }
+};
+
 // PS3 PPU Target
 template <typename Target>
-class LLVM_LIBRARY_VISIBILITY PS3PPUTargetInfo : public OSTargetInfo<Target> {
+class LLVM_LIBRARY_VISIBILITY PS3PPUTargetInfo
+    : public PPC64ILP32TargetInfo<Target> {
 protected:
   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
                     MacroBuilder &Builder) const override {
@@ -572,14 +588,31 @@ class LLVM_LIBRARY_VISIBILITY PS3PPUTargetInfo : public 
OSTargetInfo<Target> {
 
 public:
   PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
-      : OSTargetInfo<Target>(Triple, Opts) {
-    this->LongWidth = this->LongAlign = 32;
-    this->PointerWidth = this->PointerAlign = 32;
-    this->IntMaxType = TargetInfo::SignedLongLong;
-    this->Int64Type = TargetInfo::SignedLongLong;
-    this->SizeType = TargetInfo::UnsignedInt;
-    this->resetDataLayout();
+      : PPC64ILP32TargetInfo<Target>(Triple, Opts) {}
+};
+
+template <typename Target>
+class LLVM_LIBRARY_VISIBILITY Xbox360TargetInfo
+    : public PPC64ILP32TargetInfo<Target> {
+protected:
+  void getOSDefines(const LangOptions &, const llvm::Triple &,
+                    MacroBuilder &Builder) const override {
+    Builder.defineMacro("_XBOX_VER", "200");
+    Builder.defineMacro("_M_PPC", "5401");
+    Builder.defineMacro("_M_PPCBE");
+    Builder.defineMacro("_WIN32");
   }
+
+public:
+  Xbox360TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
+      : PPC64ILP32TargetInfo<Target>(Triple, Opts) {
+    this->LongDoubleWidth = this->LongDoubleAlign = 64;
+    this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
+    this->WCharType = TargetInfo::UnsignedShort;
+    this->ABI.clear();
+  }
+
+  bool setABI(const std::string &) override { return false; }
 };
 
 // Common base class for PS4/PS5 targets.
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 5a1c8531812bd3..89a59afca2f4c3 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -2010,7 +2010,7 @@ void Clang::AddPPCTargetArgs(const ArgList &Args,
 
   // Select the ABI to use.
   const char *ABIName = nullptr;
-  if (T.isOSBinFormatELF()) {
+  if (T.isOSBinFormatELF() && T.getOS() != llvm::Triple::Xbox360) {
     switch (getToolChain().getArch()) {
     case llvm::Triple::ppc64: {
       if (T.isPPC64ELFv2ABI())
diff --git a/clang/test/CodeGen/target-data.c b/clang/test/CodeGen/target-data.c
index d738d5faf18617..fafc4ae7f99c63 100644
--- a/clang/test/CodeGen/target-data.c
+++ b/clang/test/CodeGen/target-data.c
@@ -90,6 +90,10 @@
 // RUN: FileCheck %s -check-prefix=PS3
 // PS3: target datalayout = "E-m:e-p:32:32-Fi64-i64:64-i128:128-n32:64"
 
+// RUN: %clang_cc1 -triple powerpc64-unknown-xbox360 -o - -emit-llvm %s | \
+// RUN: FileCheck %s -check-prefix=XBOX360
+// XBOX360: target datalayout = "E-m:e-p:32:32-Fn32-i64:64-i128:128-n32:64"
+
 // RUN: %clang_cc1 -triple wasm32-unknown-unknown -o - -emit-llvm %s | \
 // RUN: FileCheck %s -check-prefix=WEBASSEMBLY32
 // WEBASSEMBLY32: target datalayout = 
"e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20"
diff --git a/clang/test/Driver/xbox360.c b/clang/test/Driver/xbox360.c
new file mode 100644
index 00000000000000..01d49c2c5d5a2e
--- /dev/null
+++ b/clang/test/Driver/xbox360.c
@@ -0,0 +1,5 @@
+// RUN: %clang -### -target powerpc64-unknown-xbox360 -c %s 2>&1 | FileCheck %s
+
+// CHECK: "-cc1"
+// CHECK: "-triple" "powerpc64-unknown-xbox360"
+// CHECK-NOT: "-target-abi"
diff --git a/clang/test/Preprocessor/init-xbox360.c 
b/clang/test/Preprocessor/init-xbox360.c
new file mode 100644
index 00000000000000..c4ab69d036e3ea
--- /dev/null
+++ b/clang/test/Preprocessor/init-xbox360.c
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -E -dM -ffreestanding -triple=powerpc64-unknown-xbox360 < 
/dev/null | FileCheck -match-full-lines %s
+// RUN: %clang_cc1 -fsyntax-only -ffreestanding 
-triple=powerpc64-unknown-xbox360 %s
+
+// CHECK-DAG: #define _M_PPC 5401
+// CHECK-DAG: #define _M_PPCBE 1
+// CHECK-DAG: #define _WIN32 1
+// CHECK-DAG: #define _XBOX_VER 200
+
+// CHECK-DAG: #define __LDBL_MANT_DIG__ 53
+// CHECK-DAG: #define __SIZEOF_LONG_DOUBLE__ 8
+// CHECK-DAG: #define __SIZEOF_WCHAR_T__ 2
+// CHECK-DAG: #define __WCHAR_TYPE__ unsigned short
+// CHECK-DAG: #define __WCHAR_UNSIGNED__ 1
+
+_Static_assert(sizeof(long double) == 8, "");
+_Static_assert(_Alignof(long double) == 8, "");
+_Static_assert(sizeof(__WCHAR_TYPE__) == 2, "");
+_Static_assert((__WCHAR_TYPE__)-1 > 0, "");
diff --git a/llvm/include/llvm/TargetParser/Triple.h 
b/llvm/include/llvm/TargetParser/Triple.h
index ad1b654dc4076e..cbfaa5047c1364 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -310,6 +310,7 @@ class Triple {
     KFreeBSD,
     Linux,
     Lv2, // PS3
+    Xbox360,
     MacOSX,
     Managarm,
     NetBSD,
@@ -1153,6 +1154,12 @@ class Triple {
     return getArch() == Triple::ppc64 || getArch() == Triple::ppc64le;
   }
 
+  /// Tests whether the target uses the PPC64 ISA with 32-bit pointers.
+  bool isPPC64ILP32ABI() const {
+    return getArch() == Triple::ppc64 &&
+           (getOS() == Triple::Lv2 || getOS() == Triple::Xbox360);
+  }
+
   /// Tests whether the target 64-bit PowerPC big endian ABI is ELFv2.
   bool isPPC64ELFv2ABI() const {
     return (
diff --git a/llvm/include/llvm/TargetParser/TripleName.def 
b/llvm/include/llvm/TargetParser/TripleName.def
index 95026bd39db786..ef063901bc307a 100644
--- a/llvm/include/llvm/TargetParser/TripleName.def
+++ b/llvm/include/llvm/TargetParser/TripleName.def
@@ -43,6 +43,7 @@ TRIPLE_OS(IOS, "ios", "iOS")
 TRIPLE_OS(KFreeBSD, "kfreebsd", "FreeBSD")
 TRIPLE_OS(Linux, "linux", "Linux")
 TRIPLE_OS(Lv2, "lv2", "Generic")
+TRIPLE_OS(Xbox360, "xbox360", "Generic")
 TRIPLE_OS(MacOSX, "macosx", "Darwin")
 TRIPLE_OS_ALIAS(MacOSX, "macos")
 TRIPLE_OS(Managarm, "managarm", "Generic")
diff --git a/llvm/lib/TargetParser/TargetDataLayout.cpp 
b/llvm/lib/TargetParser/TargetDataLayout.cpp
index 763cfb0fc65abc..e0554452ee61aa 100644
--- a/llvm/lib/TargetParser/TargetDataLayout.cpp
+++ b/llvm/lib/TargetParser/TargetDataLayout.cpp
@@ -200,16 +200,16 @@ static std::string computePowerDataLayout(const Triple 
&T, StringRef ABIName) {
   Ret += T.isLittleEndian() ? 'e' : 'E';
   Ret += getManglingComponent(T);
 
-  // PPC32 has 32 bit pointers. The PS3 (OS Lv2) is a PPC64 machine with 32 bit
-  // pointers.
-  if (!is64Bit || T.getOS() == Triple::Lv2)
+  // PPC32 has 32-bit pointers. PS3 and Xbox 360 use the PPC64 ISA with
+  // 32-bit pointers.
+  if (!is64Bit || T.isPPC64ILP32ABI())
     Ret += "-p:32:32";
 
   // If the target ABI uses function descriptors, then the alignment of 
function
   // pointers depends on the alignment used to emit the descriptor. Otherwise,
   // function pointers are aligned to 32 bits because the instructions must be.
-  if ((T.getArch() == Triple::ppc64 &&
-       (!T.isPPC64ELFv2ABI() && ABIName != "elfv2"))) {
+  if (T.getArch() == Triple::ppc64 && T.getOS() != Triple::Xbox360 &&
+      (!T.isPPC64ELFv2ABI() && ABIName != "elfv2")) {
     Ret += "-Fi64";
   } else if (T.isOSAIX()) {
     Ret += is64Bit ? "-Fi64" : "-Fi32";

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

Reply via email to