[clang] [clang][LoongArch] Add OHOS target (PR #127555)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 17 18:30:19 PST 2025
https://github.com/Ami-zhang created https://github.com/llvm/llvm-project/pull/127555
Add support for OHOS on LoongArch.
This patch is taken from part of the
https://gitee.com/openharmony/third_party_llvm-project/pulls/554, the original author is @caiwei.
>From e53bc2f03be0d2088f27e336167f74a4f7e1ba25 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 LoongArch.
This patch is taken from part of the
https://gitee.com/openharmony/third_party_llvm-project/pulls/554,
the original author is @caiwei.
Co-authored-by: caiwei <wei.cai at archermind.com>
---
clang/lib/Basic/Targets.cpp | 24 ++++++++++++++++++++----
clang/lib/Driver/ToolChains/Gnu.cpp | 3 ++-
clang/lib/Driver/ToolChains/OHOS.cpp | 13 ++++++++++++-
clang/test/Preprocessor/ohos.c | 2 ++
4 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 281aebdb1c35d..f345e3596df39 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -741,16 +741,32 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
case llvm::Triple::loongarch32:
switch (os) {
case llvm::Triple::Linux:
- return std::make_unique<LinuxTargetInfo<LoongArch32TargetInfo>>(Triple,
- Opts);
+ // OHOS_LOCAL begin
+ switch (Triple.getEnvironment()) {
+ default:
+ return std::make_unique<LinuxTargetInfo<LoongArch32TargetInfo>>(Triple,
+ Opts);
+ case llvm::Triple::OpenHOS:
+ return std::make_unique<OHOSTargetInfo<LoongArch32TargetInfo>>(Triple,
+ Opts);
+ }
+ // OHOS_LOCAL end
default:
return std::make_unique<LoongArch32TargetInfo>(Triple, Opts);
}
case llvm::Triple::loongarch64:
switch (os) {
case llvm::Triple::Linux:
- return std::make_unique<LinuxTargetInfo<LoongArch64TargetInfo>>(Triple,
- Opts);
+ // OHOS_LOCAL begin
+ switch (Triple.getEnvironment()) {
+ default:
+ return std::make_unique<LinuxTargetInfo<LoongArch64TargetInfo>>(Triple,
+ Opts);
+ case llvm::Triple::OpenHOS:
+ return std::make_unique<OHOSTargetInfo<LoongArch64TargetInfo>>(Triple,
+ Opts);
+ }
+ // OHOS_LOCAL end
case llvm::Triple::FreeBSD:
return std::make_unique<FreeBSDTargetInfo<LoongArch64TargetInfo>>(Triple,
Opts);
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
index f56eeda3cb5f6..0b560be1d28e7 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -2458,7 +2458,8 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
static const char *const LoongArch64LibDirs[] = {"/lib64", "/lib"};
static const char *const LoongArch64Triples[] = {
- "loongarch64-linux-gnu", "loongarch64-unknown-linux-gnu"};
+ "loongarch64-linux-gnu", "loongarch64-unknown-linux-gnu",
+ "loongarch64-linux-ohos"}; // OHOS_LOCAL
static const char *const M68kLibDirs[] = {"/lib"};
static const char *const M68kTriples[] = {"m68k-unknown-linux-gnu",
diff --git a/clang/lib/Driver/ToolChains/OHOS.cpp b/clang/lib/Driver/ToolChains/OHOS.cpp
index 6e1a09ae908b2..cd4351a2c614d 100644
--- a/clang/lib/Driver/ToolChains/OHOS.cpp
+++ b/clang/lib/Driver/ToolChains/OHOS.cpp
@@ -111,6 +111,10 @@ std::string OHOS::getMultiarchTriple(const llvm::Triple &T) const {
return "x86_64-linux-ohos";
case llvm::Triple::aarch64:
return "aarch64-linux-ohos";
+ // OHOS_LOCAL begin
+ case llvm::Triple::loongarch64:
+ return "loongarch64-linux-ohos";
+ // OHOS_LOCAL end
}
return T.str();
}
@@ -368,7 +372,14 @@ 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");
+ // OHOS_LOCAL begin
+ // LoongArch needs page size 16K
+ if (getArch() == llvm::Triple::loongarch64) {
+ CmdArgs.push_back("max-page-size=16384");
+ } else {
+ CmdArgs.push_back("max-page-size=4096");
+ }
+ // OHOS_LOCAL end
// .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/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