Skip to content

Commit

Permalink
[LLVM][OHOS] Clang toolchain and targets
Browse files Browse the repository at this point in the history
Add a clang part of OpenHarmony target

Related LLVM part: D138202

~~~

Huawei RRI, OS Lab

Reviewed By: DavidSpickett

Differential Revision: https://reviews.llvm.org/D145227
  • Loading branch information
kpdev committed Mar 20, 2023
1 parent a348ba2 commit 28997fe
Show file tree
Hide file tree
Showing 57 changed files with 1,038 additions and 13 deletions.
1 change: 1 addition & 0 deletions clang/include/clang/Basic/Attr.td
Expand Up @@ -925,6 +925,7 @@ def Availability : InheritableAttr {
.Case("maccatalyst_app_extension", "macCatalyst (App Extension)")
.Case("swift", "Swift")
.Case("shadermodel", "HLSL ShaderModel")
.Case("ohos", "OpenHarmony OS")
.Default(llvm::StringRef());
}
static llvm::StringRef getPlatformNameSourceSpelling(llvm::StringRef Platform) {
Expand Down
2 changes: 1 addition & 1 deletion clang/include/clang/Driver/ToolChain.h
Expand Up @@ -494,7 +494,7 @@ class ToolChain {

// Returns <ResourceDir>/lib/<OSName>/<arch>. This is used by runtimes (such
// as OpenMP) to find arch-specific libraries.
std::string getArchSpecificLibPath() const;
virtual std::string getArchSpecificLibPath() const;

// Returns <OSname> part of above.
virtual StringRef getOSLibName() const;
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Basic/TargetInfo.cpp
Expand Up @@ -99,7 +99,8 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
// https://www.gnu.org/software/libc/manual/html_node/Malloc-Examples.html.
// This alignment guarantee also applies to Windows and Android. On Darwin
// and OpenBSD, the alignment is 16 bytes on both 64-bit and 32-bit systems.
if (T.isGNUEnvironment() || T.isWindowsMSVCEnvironment() || T.isAndroid())
if (T.isGNUEnvironment() || T.isWindowsMSVCEnvironment() || T.isAndroid() ||
T.isOHOSFamily())
NewAlign = Triple.isArch64Bit() ? 128 : Triple.isArch32Bit() ? 64 : 0;
else if (T.isOSDarwin() || T.isOSOpenBSD())
NewAlign = 128;
Expand Down
32 changes: 28 additions & 4 deletions clang/lib/Basic/Targets.cpp
Expand Up @@ -148,7 +148,12 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple,
case llvm::Triple::Fuchsia:
return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
case llvm::Triple::Linux:
return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
switch (Triple.getEnvironment()) {
default:
return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
case llvm::Triple::OpenHOS:
return new OHOSTargetInfo<AArch64leTargetInfo>(Triple, Opts);
}
case llvm::Triple::NetBSD:
return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
case llvm::Triple::OpenBSD:
Expand Down Expand Up @@ -188,7 +193,14 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple,
case llvm::Triple::CloudABI:
return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
case llvm::Triple::Linux:
return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
switch (Triple.getEnvironment()) {
default:
return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
case llvm::Triple::OpenHOS:
return new OHOSTargetInfo<ARMleTargetInfo>(Triple, Opts);
}
case llvm::Triple::LiteOS:
return new OHOSTargetInfo<ARMleTargetInfo>(Triple, Opts);
case llvm::Triple::FreeBSD:
return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
case llvm::Triple::NetBSD:
Expand Down Expand Up @@ -263,7 +275,12 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple,
case llvm::Triple::mipsel:
switch (os) {
case llvm::Triple::Linux:
return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
switch (Triple.getEnvironment()) {
default:
return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
case llvm::Triple::OpenHOS:
return new OHOSTargetInfo<MipsTargetInfo>(Triple, Opts);
}
case llvm::Triple::RTEMS:
return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
case llvm::Triple::FreeBSD:
Expand Down Expand Up @@ -423,7 +440,12 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple,
case llvm::Triple::Fuchsia:
return new FuchsiaTargetInfo<RISCV64TargetInfo>(Triple, Opts);
case llvm::Triple::Linux:
return new LinuxTargetInfo<RISCV64TargetInfo>(Triple, Opts);
switch (Triple.getEnvironment()) {
default:
return new LinuxTargetInfo<RISCV64TargetInfo>(Triple, Opts);
case llvm::Triple::OpenHOS:
return new OHOSTargetInfo<RISCV64TargetInfo>(Triple, Opts);
}
default:
return new RISCV64TargetInfo(Triple, Opts);
}
Expand Down Expand Up @@ -561,6 +583,8 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple,
return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
case llvm::Triple::Android:
return new AndroidX86_64TargetInfo(Triple, Opts);
case llvm::Triple::OpenHOS:
return new OHOSX86_64TargetInfo(Triple, Opts);
}
}
case llvm::Triple::DragonFly:
Expand Down
1 change: 1 addition & 0 deletions clang/lib/Basic/Targets/ARM.cpp
Expand Up @@ -310,6 +310,7 @@ ARMTargetInfo::ARMTargetInfo(const llvm::Triple &Triple,
case llvm::Triple::GNUEABIHF:
case llvm::Triple::MuslEABI:
case llvm::Triple::MuslEABIHF:
case llvm::Triple::OpenHOS:
setABI("aapcs-linux");
break;
case llvm::Triple::EABIHF:
Expand Down
62 changes: 62 additions & 0 deletions clang/lib/Basic/Targets/OSTargets.h
Expand Up @@ -1007,6 +1007,68 @@ class LLVM_LIBRARY_VISIBILITY EmscriptenTargetInfo
}
};

// OHOS target
template <typename Target>
class LLVM_LIBRARY_VISIBILITY OHOSTargetInfo : public OSTargetInfo<Target> {
protected:
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
MacroBuilder &Builder) const override {
// Linux defines; list based off of gcc output
DefineStd(Builder, "unix", Opts);

Builder.defineMacro("__ELF__");

// Generic OHOS target defines
if (Triple.isOHOSFamily()) {
Builder.defineMacro("__OHOS_FAMILY__", "1");

auto Version = Triple.getEnvironmentVersion();
this->PlatformName = "ohos";
this->PlatformMinVersion = Version;
Builder.defineMacro("__OHOS_Major__", Twine(Version.getMajor()));
if (auto Minor = Version.getMinor())
Builder.defineMacro("__OHOS_Minor__", Twine(*Minor));
if (auto Subminor = Version.getSubminor())
Builder.defineMacro("__OHOS_Micro__", Twine(*Subminor));
}

if (Triple.isOpenHOS())
Builder.defineMacro("__OHOS__");

if (Triple.isOSLinux()) {
DefineStd(Builder, "linux", Opts);
} else if (Triple.isOSLiteOS()) {
Builder.defineMacro("__LITEOS__");
}

if (Opts.POSIXThreads)
Builder.defineMacro("_REENTRANT");
if (Opts.CPlusPlus)
Builder.defineMacro("_GNU_SOURCE");
if (this->HasFloat128)
Builder.defineMacro("__FLOAT128__");
}

public:
OHOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
: OSTargetInfo<Target>(Triple, Opts) {
this->WIntType = TargetInfo::UnsignedInt;

switch (Triple.getArch()) {
default:
break;
case llvm::Triple::x86:
case llvm::Triple::x86_64:
this->HasFloat128 = true;
break;
}
}

const char *getStaticInitSectionSpecifier() const override {
return ".text.startup";
}
};

} // namespace targets
} // namespace clang
#endif // LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H
22 changes: 22 additions & 0 deletions clang/lib/Basic/Targets/X86.h
Expand Up @@ -966,6 +966,28 @@ class LLVM_LIBRARY_VISIBILITY AndroidX86_64TargetInfo
LongDoubleFormat = &llvm::APFloat::IEEEquad();
}
};

// x86_32 OHOS target
class LLVM_LIBRARY_VISIBILITY OHOSX86_32TargetInfo
: public OHOSTargetInfo<X86_32TargetInfo> {
public:
OHOSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
: OHOSTargetInfo<X86_32TargetInfo>(Triple, Opts) {
SuitableAlign = 32;
LongDoubleWidth = 64;
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
}
};

// x86_64 OHOS target
class LLVM_LIBRARY_VISIBILITY OHOSX86_64TargetInfo
: public OHOSTargetInfo<X86_64TargetInfo> {
public:
OHOSX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
: OHOSTargetInfo<X86_64TargetInfo>(Triple, Opts) {
LongDoubleFormat = &llvm::APFloat::IEEEquad();
}
};
} // namespace targets
} // namespace clang
#endif // LLVM_CLANG_LIB_BASIC_TARGETS_X86_H
1 change: 1 addition & 0 deletions clang/lib/CodeGen/ABIInfo.h
Expand Up @@ -81,6 +81,7 @@ namespace CodeGen {
QualType Ty) const = 0;

bool isAndroid() const;
bool isOHOSFamily() const;

/// Emit the target dependent code to load a value of
/// \arg Ty from the \c __builtin_ms_va_list pointed to by \arg VAListAddr.
Expand Down
8 changes: 6 additions & 2 deletions clang/lib/CodeGen/TargetInfo.cpp
Expand Up @@ -236,6 +236,10 @@ const CodeGenOptions &ABIInfo::getCodeGenOpts() const {

bool ABIInfo::isAndroid() const { return getTarget().getTriple().isAndroid(); }

bool ABIInfo::isOHOSFamily() const {
return getTarget().getTriple().isOHOSFamily();
}

bool ABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const {
return false;
}
Expand Down Expand Up @@ -5733,7 +5737,7 @@ ABIArgInfo AArch64ABIInfo::coerceIllegalVector(QualType Ty) const {

uint64_t Size = getContext().getTypeSize(Ty);
// Android promotes <2 x i8> to i16, not i32
if (isAndroid() && (Size <= 16)) {
if ((isAndroid() || isOHOSFamily()) && (Size <= 16)) {
llvm::Type *ResType = llvm::Type::getInt16Ty(getVMContext());
return ABIArgInfo::getDirect(ResType);
}
Expand Down Expand Up @@ -6340,7 +6344,7 @@ class ARMABIInfo : public ABIInfo {
case llvm::Triple::MuslEABIHF:
return true;
default:
return false;
return getTarget().getTriple().isOHOSFamily();
}
}

Expand Down
1 change: 1 addition & 0 deletions clang/lib/Driver/CMakeLists.txt
Expand Up @@ -76,6 +76,7 @@ add_clang_library(clangDriver
ToolChains/Myriad.cpp
ToolChains/NaCl.cpp
ToolChains/NetBSD.cpp
ToolChains/OHOS.cpp
ToolChains/OpenBSD.cpp
ToolChains/PS4CPU.cpp
ToolChains/RISCVToolchain.cpp
Expand Down
7 changes: 6 additions & 1 deletion clang/lib/Driver/Driver.cpp
Expand Up @@ -40,6 +40,7 @@
#include "ToolChains/Myriad.h"
#include "ToolChains/NaCl.h"
#include "ToolChains/NetBSD.h"
#include "ToolChains/OHOS.h"
#include "ToolChains/OpenBSD.h"
#include "ToolChains/PPCFreeBSD.h"
#include "ToolChains/PPCLinux.h"
Expand Down Expand Up @@ -6074,7 +6075,8 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
Args);
else if (Target.getArch() == llvm::Triple::ve)
TC = std::make_unique<toolchains::VEToolChain>(*this, Target, Args);

else if (Target.isOHOSFamily())
TC = std::make_unique<toolchains::OHOS>(*this, Target, Args);
else
TC = std::make_unique<toolchains::Linux>(*this, Target, Args);
break;
Expand Down Expand Up @@ -6138,6 +6140,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
case llvm::Triple::Hurd:
TC = std::make_unique<toolchains::Hurd>(*this, Target, Args);
break;
case llvm::Triple::LiteOS:
TC = std::make_unique<toolchains::OHOS>(*this, Target, Args);
break;
case llvm::Triple::ZOS:
TC = std::make_unique<toolchains::ZOS>(*this, Target, Args);
break;
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/Driver/ToolChains/Arch/AArch64.cpp
Expand Up @@ -606,7 +606,7 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
Features.push_back("+fix-cortex-a53-835769");
else
Features.push_back("-fix-cortex-a53-835769");
} else if (Triple.isAndroid()) {
} else if (Triple.isAndroid() || Triple.isOHOSFamily()) {
// Enabled A53 errata (835769) workaround by default on android
Features.push_back("+fix-cortex-a53-835769");
} else if (Triple.isOSFuchsia()) {
Expand Down
9 changes: 9 additions & 0 deletions clang/lib/Driver/ToolChains/Arch/ARM.cpp
Expand Up @@ -278,6 +278,11 @@ void arm::setArchNameInTriple(const Driver &D, const ArgList &Args,

void arm::setFloatABIInTriple(const Driver &D, const ArgList &Args,
llvm::Triple &Triple) {
if (Triple.isOSLiteOS()) {
Triple.setEnvironment(llvm::Triple::OpenHOS);
return;
}

bool isHardFloat =
(arm::getARMFloatABI(D, Triple, Args) == arm::FloatABI::Hard);

Expand All @@ -297,6 +302,8 @@ void arm::setFloatABIInTriple(const Driver &D, const ArgList &Args,
Triple.setEnvironment(isHardFloat ? llvm::Triple::MuslEABIHF
: llvm::Triple::MuslEABI);
break;
case llvm::Triple::OpenHOS:
break;
default: {
arm::FloatABI DefaultABI = arm::getDefaultFloatABI(Triple);
if (DefaultABI != arm::FloatABI::Invalid &&
Expand Down Expand Up @@ -366,6 +373,8 @@ arm::FloatABI arm::getDefaultFloatABI(const llvm::Triple &Triple) {
return FloatABI::SoftFP;

default:
if (Triple.isOHOSFamily())
return FloatABI::Soft;
switch (Triple.getEnvironment()) {
case llvm::Triple::GNUEABIHF:
case llvm::Triple::MuslEABIHF:
Expand Down
12 changes: 11 additions & 1 deletion clang/lib/Driver/ToolChains/CommonArgs.cpp
Expand Up @@ -957,7 +957,7 @@ void tools::linkSanitizerRuntimeDeps(const ToolChain &TC,
CmdArgs.push_back(getAsNeededOption(TC, false));
// There's no libpthread or librt on RTEMS & Android.
if (TC.getTriple().getOS() != llvm::Triple::RTEMS &&
!TC.getTriple().isAndroid()) {
!TC.getTriple().isAndroid() && !TC.getTriple().isOHOSFamily()) {
CmdArgs.push_back("-lpthread");
if (!TC.getTriple().isOSOpenBSD())
CmdArgs.push_back("-lrt");
Expand Down Expand Up @@ -1381,6 +1381,10 @@ tools::ParsePICArgs(const ToolChain &ToolChain, const ArgList &Args) {
}
}

// OHOS-specific defaults for PIC/PIE
if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
PIC = true;

// OpenBSD-specific defaults for PIE
if (Triple.isOSOpenBSD()) {
switch (ToolChain.getArch()) {
Expand Down Expand Up @@ -1667,6 +1671,12 @@ static LibGccType getLibGccType(const ToolChain &TC, const Driver &D,
static void AddUnwindLibrary(const ToolChain &TC, const Driver &D,
ArgStringList &CmdArgs, const ArgList &Args) {
ToolChain::UnwindLibType UNW = TC.GetUnwindLibType(Args);
// By default OHOS binaries are linked statically to libunwind.
if (TC.getTriple().isOHOSFamily() && UNW == ToolChain::UNW_CompilerRT) {
CmdArgs.push_back("-l:libunwind.a");
return;
}

// Targets that don't use unwind libraries.
if ((TC.getTriple().isAndroid() && UNW == ToolChain::UNW_Libgcc) ||
TC.getTriple().isOSIAMCU() || TC.getTriple().isOSBinFormatWasm() ||
Expand Down
7 changes: 5 additions & 2 deletions clang/lib/Driver/ToolChains/Gnu.cpp
Expand Up @@ -405,6 +405,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
const llvm::Triple &Triple = getToolChain().getEffectiveTriple();

const llvm::Triple::ArchType Arch = ToolChain.getArch();
const bool isOHOSFamily = ToolChain.getTriple().isOHOSFamily();
const bool isAndroid = ToolChain.getTriple().isAndroid();
const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU();
const bool IsVE = ToolChain.getTriple().isVE();
Expand Down Expand Up @@ -455,7 +456,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,

// Most Android ARM64 targets should enable the linker fix for erratum
// 843419. Only non-Cortex-A53 devices are allowed to skip this flag.
if (Arch == llvm::Triple::aarch64 && isAndroid) {
if (Arch == llvm::Triple::aarch64 && (isAndroid || isOHOSFamily)) {
std::string CPU = getCPUName(D, Args, Triple);
if (CPU.empty() || CPU == "generic" || CPU == "cortex-a53")
CmdArgs.push_back("--fix-cortex-a53-843419");
Expand Down Expand Up @@ -641,7 +642,9 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("--pop-state");
}

if (WantPthread && !isAndroid)
// We don't need libpthread neither for bionic (Android) nor for musl,
// (used by OHOS as runtime library).
if (WantPthread && !isAndroid && !isOHOSFamily)
CmdArgs.push_back("-lpthread");

if (Args.hasArg(options::OPT_fsplit_stack))
Expand Down

0 comments on commit 28997fe

Please sign in to comment.