[clang] [clang][LoongArch] Add OHOS target (PR #127555)

via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 19 01:29:44 PST 2025


https://github.com/Ami-zhang updated https://github.com/llvm/llvm-project/pull/127555

>From 65d913fbd7adc2001aadadadeab93c188445cd79 Mon Sep 17 00:00:00 2001
From: Ami-zhang <zhanglimin at loongson.cn>
Date: Tue, 18 Feb 2025 10:00:25 +0800
Subject: [PATCH] [clang][LoongArch] Add OHOS target

Add support for OHOS on loongarch64.
---
 clang/lib/Basic/Targets.cpp          | 10 ++++++++--
 clang/lib/Driver/ToolChains/OHOS.cpp |  6 +++++-
 clang/test/Driver/ohos-pagesize.c    | 16 ++++++++++++++++
 clang/test/Preprocessor/ohos.c       |  2 ++
 4 files changed, 31 insertions(+), 3 deletions(-)
 create mode 100644 clang/test/Driver/ohos-pagesize.c

diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 281aebdb1c35d..c6d228fe98100 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -749,8 +749,14 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
   case llvm::Triple::loongarch64:
     switch (os) {
     case llvm::Triple::Linux:
-      return std::make_unique<LinuxTargetInfo<LoongArch64TargetInfo>>(Triple,
-                                                                      Opts);
+      switch (Triple.getEnvironment()) {
+      default:
+        return std::make_unique<LinuxTargetInfo<LoongArch64TargetInfo>>(Triple,
+                                                                        Opts);
+      case llvm::Triple::OpenHOS:
+        return std::make_unique<OHOSTargetInfo<LoongArch64TargetInfo>>(Triple,
+                                                                       Opts);
+      }
     case llvm::Triple::FreeBSD:
       return std::make_unique<FreeBSDTargetInfo<LoongArch64TargetInfo>>(Triple,
                                                                         Opts);
diff --git a/clang/lib/Driver/ToolChains/OHOS.cpp b/clang/lib/Driver/ToolChains/OHOS.cpp
index 6e1a09ae908b2..e213c695a9fef 100644
--- a/clang/lib/Driver/ToolChains/OHOS.cpp
+++ b/clang/lib/Driver/ToolChains/OHOS.cpp
@@ -111,6 +111,8 @@ std::string OHOS::getMultiarchTriple(const llvm::Triple &T) const {
     return "x86_64-linux-ohos";
   case llvm::Triple::aarch64:
     return "aarch64-linux-ohos";
+  case llvm::Triple::loongarch64:
+    return "loongarch64-linux-ohos";
   }
   return T.str();
 }
@@ -368,7 +370,9 @@ void OHOS::addExtraOpts(llvm::opt::ArgStringList &CmdArgs) const {
   CmdArgs.push_back("-z");
   CmdArgs.push_back("relro");
   CmdArgs.push_back("-z");
-  CmdArgs.push_back("max-page-size=4096");
+  CmdArgs.push_back(getArch() == llvm::Triple::loongarch64
+                        ? "max-page-size=16384"
+                        : "max-page-size=4096");
   // .gnu.hash section is not compatible with the MIPS target
   if (getArch() != llvm::Triple::mipsel)
     CmdArgs.push_back("--hash-style=both");
diff --git a/clang/test/Driver/ohos-pagesize.c b/clang/test/Driver/ohos-pagesize.c
new file mode 100644
index 0000000000000..7b4705303c161
--- /dev/null
+++ b/clang/test/Driver/ohos-pagesize.c
@@ -0,0 +1,16 @@
+/// Check the max-page-size for OHOS aarch64/loongarch64/riscv64/x86_64.
+
+// RUN: %clang -### --target=aarch64-linux-ohos %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=MAX-PAGE-SIZE-4K %s
+
+// RUN: %clang -### --target=loongarch64-linux-ohos %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=MAX-PAGE-SIZE-16K %s
+
+// RUN: %clang -### --target=riscv64-linux-ohos %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=MAX-PAGE-SIZE-4K %s
+
+// RUN: %clang -### --target=x86_64-linux-ohos %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=MAX-PAGE-SIZE-4K %s
+
+// MAX-PAGE-SIZE-4K: "max-page-size=4096"
+// MAX-PAGE-SIZE-16K: "max-page-size=16384"
diff --git a/clang/test/Preprocessor/ohos.c b/clang/test/Preprocessor/ohos.c
index 0c435c7ed5ab4..7017c9847ccae 100644
--- a/clang/test/Preprocessor/ohos.c
+++ b/clang/test/Preprocessor/ohos.c
@@ -3,6 +3,7 @@
 // RUN: %clang_cc1 -x c++ -E -dM -ffreestanding -triple=riscv64-linux-ohos < /dev/null | FileCheck %s -match-full-lines -check-prefix=RISCV64-OHOS-CXX
 // RUN: %clang_cc1 -x c++ -E -dM -ffreestanding -triple=mipsel-linux-ohos < /dev/null | FileCheck %s -match-full-lines -check-prefix=MIPSEL-OHOS-CXX
 // RUN: %clang_cc1 -x c++ -E -dM -ffreestanding -triple=x86_64-linux-ohos < /dev/null | FileCheck %s -match-full-lines -check-prefix=X86_64-OHOS-CXX
+// RUN: %clang_cc1 -x c++ -E -dM -ffreestanding -triple=loongarch64-linux-ohos < /dev/null | FileCheck %s -match-full-lines -check-prefix=LOONGARCH64-OHOS-CXX
 // RUN: %clang_cc1 -E -dM -ffreestanding -triple=arm-linux-ohos < /dev/null | FileCheck %s -check-prefix=OHOS-DEFS
 
 // ARM-OHOS-CXX: #define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 8U
@@ -10,6 +11,7 @@
 // RISCV64-OHOS-CXX: #define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 16UL
 // MIPSEL-OHOS-CXX: #define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 8U
 // X86_64-OHOS-CXX: #define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 16UL
+// LOONGARCH64-OHOS-CXX: #define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 16UL
 // OHOS-DEFS: __OHOS_FAMILY__
 // OHOS-DEFS: __OHOS__
 // OHOS-DEFS-NOT: __OHOS__



More information about the cfe-commits mailing list