diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -86,6 +86,7 @@ #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include #include #include @@ -7596,7 +7597,7 @@ assert(Target && "Expected target to be initialized"); const llvm::Triple &T = Target->getTriple(); // Windows is LLP64 rather than LP64 - if (T.isOSWindows() && T.isArch64Bit()) + if (T.isOSWindows() && llvm::TripleUtils::isArch64Bit(T)) return UnsignedLongLongTy; return UnsignedLongTy; } @@ -7605,7 +7606,7 @@ assert(Target && "Expected target to be initialized"); const llvm::Triple &T = Target->getTriple(); // Windows is LLP64 rather than LP64 - if (T.isOSWindows() && T.isArch64Bit()) + if (T.isOSWindows() && llvm::TripleUtils::isArch64Bit(T)) return LongLongTy; return LongTy; } diff --git a/clang/lib/AST/MicrosoftCXXABI.cpp b/clang/lib/AST/MicrosoftCXXABI.cpp --- a/clang/lib/AST/MicrosoftCXXABI.cpp +++ b/clang/lib/AST/MicrosoftCXXABI.cpp @@ -21,6 +21,7 @@ #include "clang/AST/RecordLayout.h" #include "clang/AST/Type.h" #include "clang/Basic/TargetInfo.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace clang; @@ -315,14 +316,14 @@ // When MSVC does x86_32 record layout, it aligns aggregate member pointers to // 8 bytes. However, __alignof usually returns 4 for data memptrs and 8 for // function memptrs. - if (Ptrs + Ints > 1 && Target.getTriple().isArch32Bit()) + if (Ptrs + Ints > 1 && llvm::TripleUtils::isArch32Bit(Target.getTriple())) MPI.Align = 64; else if (Ptrs) MPI.Align = Target.getPointerAlign(LangAS::Default); else MPI.Align = Target.getIntAlign(); - if (Target.getTriple().isArch64Bit()) { + if (llvm::TripleUtils::isArch64Bit(Target.getTriple())) { MPI.Width = llvm::alignTo(MPI.Width, MPI.Align); MPI.HasPadding = MPI.Width != (Ptrs * PtrSize + Ints * IntSize); } diff --git a/clang/lib/AST/PrintfFormatString.cpp b/clang/lib/AST/PrintfFormatString.cpp --- a/clang/lib/AST/PrintfFormatString.cpp +++ b/clang/lib/AST/PrintfFormatString.cpp @@ -16,6 +16,7 @@ #include "clang/AST/OSLog.h" #include "clang/Basic/TargetInfo.h" #include "llvm/Support/Regex.h" +#include "llvm/TargetParser/TripleUtils.h" using clang::analyze_format_string::ArgType; using clang::analyze_format_string::FormatStringHandler; @@ -529,7 +530,7 @@ case LengthModifier::AsSizeT: return ArgType::makeSizeT(ArgType(Ctx.getSignedSizeType(), "ssize_t")); case LengthModifier::AsInt3264: - return Ctx.getTargetInfo().getTriple().isArch64Bit() + return llvm::TripleUtils::isArch64Bit(Ctx.getTargetInfo().getTriple()) ? ArgType(Ctx.LongLongTy, "__int64") : ArgType(Ctx.IntTy, "__int32"); case LengthModifier::AsPtrDiff: @@ -564,7 +565,7 @@ case LengthModifier::AsSizeT: return ArgType::makeSizeT(ArgType(Ctx.getSizeType(), "size_t")); case LengthModifier::AsInt3264: - return Ctx.getTargetInfo().getTriple().isArch64Bit() + return llvm::TripleUtils::isArch64Bit(Ctx.getTargetInfo().getTriple()) ? ArgType(Ctx.UnsignedLongLongTy, "unsigned __int64") : ArgType(Ctx.UnsignedIntTy, "unsigned __int32"); case LengthModifier::AsPtrDiff: diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -14,12 +14,13 @@ #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclObjC.h" #include "clang/AST/Expr.h" -#include "clang/AST/VTableBuilder.h" #include "clang/AST/RecordLayout.h" +#include "clang/AST/VTableBuilder.h" #include "clang/Basic/TargetInfo.h" #include "llvm/ADT/SmallSet.h" #include "llvm/Support/Format.h" #include "llvm/Support/MathExtras.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace clang; @@ -1624,7 +1625,8 @@ // as [unsigned]. StorageUnitSize = Context.getTypeSize(Context.UnsignedIntTy); } else if (StorageUnitSize > Context.getTypeSize(Context.UnsignedIntTy) && - Context.getTargetInfo().getTriple().isArch32Bit() && + llvm::TripleUtils::isArch32Bit( + Context.getTargetInfo().getTriple()) && FieldSize <= 32) { // Under 32-bit compile mode, the bitcontainer is 32 bits if a single // long long bitfield has length no greater than 32 bits. @@ -2758,9 +2760,10 @@ // In 64-bit mode we always perform an alignment step after laying out vbases. // In 32-bit mode we do not. The check to see if we need to perform alignment // checks the RequiredAlignment field and performs alignment if it isn't 0. - RequiredAlignment = Context.getTargetInfo().getTriple().isArch64Bit() - ? CharUnits::One() - : CharUnits::Zero(); + RequiredAlignment = + llvm::TripleUtils::isArch64Bit(Context.getTargetInfo().getTriple()) + ? CharUnits::One() + : CharUnits::Zero(); // Compute the maximum field alignment. MaxFieldAlignment = CharUnits::Zero(); // Honor the default struct packing maximum alignment flag. diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -20,6 +20,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/TargetParser/TargetParser.h" +#include "llvm/TargetParser/TripleUtils.h" #include using namespace clang; @@ -102,7 +103,9 @@ // and OpenBSD, the alignment is 16 bytes on both 64-bit and 32-bit systems. if (T.isGNUEnvironment() || T.isWindowsMSVCEnvironment() || T.isAndroid() || T.isOHOSFamily()) - NewAlign = Triple.isArch64Bit() ? 128 : Triple.isArch32Bit() ? 64 : 0; + NewAlign = llvm::TripleUtils::isArch64Bit(Triple) ? 128 + : llvm::TripleUtils::isArch32Bit(Triple) ? 64 + : 0; else if (T.isOSDarwin() || T.isOSOpenBSD()) NewAlign = 128; else diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -19,6 +19,7 @@ #include "llvm/ADT/StringSwitch.h" #include "llvm/TargetParser/AArch64TargetParser.h" #include "llvm/TargetParser/ARMTargetParserCommon.h" +#include "llvm/TargetParser/TripleUtils.h" #include using namespace clang; @@ -147,7 +148,7 @@ HasFloat16 = true; HasStrictFP = true; - if (Triple.isArch64Bit()) + if (llvm::TripleUtils::isArch64Bit(Triple)) LongWidth = LongAlign = PointerWidth = PointerAlign = 64; else LongWidth = LongAlign = PointerWidth = PointerAlign = 32; @@ -1374,7 +1375,7 @@ void AArch64leTargetInfo::setDataLayout() { if (getTriple().isOSBinFormatMachO()) { - if(getTriple().isArch32Bit()) + if (llvm::TripleUtils::isArch32Bit(getTriple())) resetDataLayout("e-m:o-p:32:32-i64:64-i128:128-n32:64-S128", "_"); else resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128", "_"); @@ -1500,7 +1501,7 @@ const TargetOptions &Opts) : DarwinTargetInfo(Triple, Opts) { Int64Type = SignedLongLong; - if (getTriple().isArch32Bit()) + if (llvm::TripleUtils::isArch32Bit(getTriple())) IntMaxType = SignedLongLong; WCharType = SignedInt; @@ -1511,7 +1512,7 @@ UseZeroLengthBitfieldAlignment = false; - if (getTriple().isArch32Bit()) { + if (llvm::TripleUtils::isArch32Bit(getTriple())) { UseBitFieldTypeAlignment = false; ZeroLengthBitfieldBoundary = 32; UseZeroLengthBitfieldAlignment = true; @@ -1524,7 +1525,7 @@ const llvm::Triple &Triple, MacroBuilder &Builder) const { Builder.defineMacro("__AARCH64_SIMD__"); - if (Triple.isArch32Bit()) + if (llvm::TripleUtils::isArch32Bit(Triple)) Builder.defineMacro("__ARM64_ARCH_8_32__"); else Builder.defineMacro("__ARM64_ARCH_8__"); diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h --- a/clang/lib/Basic/Targets/OSTargets.h +++ b/clang/lib/Basic/Targets/OSTargets.h @@ -13,6 +13,7 @@ #define LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H #include "Targets.h" +#include "llvm/TargetParser/TripleUtils.h" namespace clang { namespace targets { @@ -89,9 +90,9 @@ else if (Triple.isiOS()) { // 64-bit iOS supported it from 8 onwards, 32-bit device from 9 onwards, // 32-bit simulator from 10 onwards. - if (Triple.isArch64Bit()) + if (llvm::TripleUtils::isArch64Bit(Triple)) this->TLSSupported = !Triple.isOSVersionLT(8); - else if (Triple.isArch32Bit()) { + else if (llvm::TripleUtils::isArch32Bit(Triple)) { if (!Triple.isSimulatorEnvironment()) this->TLSSupported = !Triple.isOSVersionLT(9); else diff --git a/clang/lib/Basic/Targets/OSTargets.cpp b/clang/lib/Basic/Targets/OSTargets.cpp --- a/clang/lib/Basic/Targets/OSTargets.cpp +++ b/clang/lib/Basic/Targets/OSTargets.cpp @@ -126,7 +126,7 @@ MacroBuilder &Builder) { DefineStd(Builder, "WIN32", Opts); DefineStd(Builder, "WINNT", Opts); - if (Triple.isArch64Bit()) { + if (llvm::TripleUtils::isArch64Bit(Triple)) { DefineStd(Builder, "WIN64", Opts); Builder.defineMacro("__MINGW64__"); } @@ -257,7 +257,7 @@ void addWindowsDefines(const llvm::Triple &Triple, const LangOptions &Opts, MacroBuilder &Builder) { Builder.defineMacro("_WIN32"); - if (Triple.isArch64Bit()) + if (llvm::TripleUtils::isArch64Bit(Triple)) Builder.defineMacro("_WIN64"); if (Triple.isWindowsGNUEnvironment()) addMinGWDefines(Triple, Opts, Builder); diff --git a/clang/lib/Basic/Targets/PPC.cpp b/clang/lib/Basic/Targets/PPC.cpp --- a/clang/lib/Basic/Targets/PPC.cpp +++ b/clang/lib/Basic/Targets/PPC.cpp @@ -563,11 +563,11 @@ Features["isa-v30-instructions"] = llvm::StringSwitch(CPU).Case("pwr9", true).Default(false); - Features["quadword-atomics"] = - getTriple().isArch64Bit() && llvm::StringSwitch(CPU) - .Case("pwr9", true) - .Case("pwr8", true) - .Default(false); + Features["quadword-atomics"] = llvm::TripleUtils::isArch64Bit(getTriple()) && + llvm::StringSwitch(CPU) + .Case("pwr9", true) + .Case("pwr8", true) + .Default(false); // Power10 includes all the same features as Power9 plus any features specific // to the Power10 core. diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp --- a/clang/lib/Basic/Targets/RISCV.cpp +++ b/clang/lib/Basic/Targets/RISCV.cpp @@ -17,6 +17,7 @@ #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/RISCVTargetParser.h" +#include "llvm/TargetParser/TripleUtils.h" #include using namespace clang; @@ -302,7 +303,7 @@ /// Perform initialization based on the user configured set of features. bool RISCVTargetInfo::handleTargetFeatures(std::vector &Features, DiagnosticsEngine &Diags) { - unsigned XLen = getTriple().isArch64Bit() ? 64 : 32; + unsigned XLen = llvm::TripleUtils::isArch64Bit(getTriple()) ? 64 : 32; auto ParseResult = llvm::RISCVISAInfo::parseFeatures(XLen, Features); if (!ParseResult) { std::string Buffer; @@ -326,23 +327,23 @@ } bool RISCVTargetInfo::isValidCPUName(StringRef Name) const { - bool Is64Bit = getTriple().isArch64Bit(); + bool Is64Bit = llvm::TripleUtils::isArch64Bit(getTriple()); return llvm::RISCV::parseCPU(Name, Is64Bit); } void RISCVTargetInfo::fillValidCPUList( SmallVectorImpl &Values) const { - bool Is64Bit = getTriple().isArch64Bit(); + bool Is64Bit = llvm::TripleUtils::isArch64Bit(getTriple()); llvm::RISCV::fillValidCPUArchList(Values, Is64Bit); } bool RISCVTargetInfo::isValidTuneCPUName(StringRef Name) const { - bool Is64Bit = getTriple().isArch64Bit(); + bool Is64Bit = llvm::TripleUtils::isArch64Bit(getTriple()); return llvm::RISCV::parseTuneCPU(Name, Is64Bit); } void RISCVTargetInfo::fillValidTuneCPUList( SmallVectorImpl &Values) const { - bool Is64Bit = getTriple().isArch64Bit(); + bool Is64Bit = llvm::TripleUtils::isArch64Bit(getTriple()); llvm::RISCV::fillValidTuneCPUArchList(Values, Is64Bit); } diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -132,8 +132,9 @@ getNVIDIAOffloadTargetTriple(const Driver &D, const ArgList &Args, const llvm::Triple &HostTriple) { if (!Args.hasArg(options::OPT_offload_EQ)) { - return llvm::Triple(HostTriple.isArch64Bit() ? "nvptx64-nvidia-cuda" - : "nvptx-nvidia-cuda"); + return llvm::Triple(llvm::TripleUtils::isArch64Bit(HostTriple) + ? "nvptx64-nvidia-cuda" + : "nvptx-nvidia-cuda"); } auto TT = getOffloadTargetTriple(D, Args); if (TT && (TT->getArch() == llvm::Triple::spirv32 || diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp --- a/clang/lib/Driver/ToolChains/AIX.cpp +++ b/clang/lib/Driver/ToolChains/AIX.cpp @@ -16,6 +16,7 @@ #include "llvm/Option/ArgList.h" #include "llvm/ProfileData/InstrProf.h" #include "llvm/Support/Path.h" +#include "llvm/TargetParser/TripleUtils.h" using AIX = clang::driver::toolchains::AIX; using namespace clang::driver; @@ -32,8 +33,10 @@ const char *LinkingOutput) const { ArgStringList CmdArgs; - const bool IsArch32Bit = getToolChain().getTriple().isArch32Bit(); - const bool IsArch64Bit = getToolChain().getTriple().isArch64Bit(); + const bool IsArch32Bit = + llvm::TripleUtils::isArch32Bit(getToolChain().getTriple()); + const bool IsArch64Bit = + llvm::TripleUtils::isArch64Bit(getToolChain().getTriple()); // Only support 32 and 64 bit. if (!IsArch32Bit && !IsArch64Bit) llvm_unreachable("Unsupported bit width value."); @@ -107,8 +110,10 @@ const Driver &D = ToolChain.getDriver(); ArgStringList CmdArgs; - const bool IsArch32Bit = ToolChain.getTriple().isArch32Bit(); - const bool IsArch64Bit = ToolChain.getTriple().isArch64Bit(); + const bool IsArch32Bit = + llvm::TripleUtils::isArch32Bit(ToolChain.getTriple()); + const bool IsArch64Bit = + llvm::TripleUtils::isArch64Bit(ToolChain.getTriple()); // Only support 32 and 64 bit. if (!(IsArch32Bit || IsArch64Bit)) llvm_unreachable("Unsupported bit width value."); diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp --- a/clang/lib/Driver/ToolChains/AMDGPU.cpp +++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp @@ -663,9 +663,10 @@ // Phase 1 (.cl -> .bc) if (Args.hasArg(options::OPT_c) && Args.hasArg(options::OPT_emit_llvm)) { - DAL->AddFlagArg(nullptr, Opts.getOption(getTriple().isArch64Bit() - ? options::OPT_m64 - : options::OPT_m32)); + DAL->AddFlagArg(nullptr, + Opts.getOption(llvm::TripleUtils::isArch64Bit(getTriple()) + ? options::OPT_m64 + : options::OPT_m32)); // Have to check OPT_O4, OPT_O0 & OPT_Ofast separately // as they defined that way in Options.td diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4181,7 +4181,7 @@ if (DwarfVersion < 3) D.Diag(diag::err_drv_argument_only_allowed_with) << DwarfFormatArg->getAsString(Args) << "DWARFv3 or greater"; - else if (!T.isArch64Bit()) + else if (!llvm::TripleUtils::isArch64Bit(T)) D.Diag(diag::err_drv_argument_only_allowed_with) << DwarfFormatArg->getAsString(Args) << "64 bit architecture"; else if (!T.isOSBinFormatELF()) diff --git a/clang/lib/Driver/ToolChains/Cuda.cpp b/clang/lib/Driver/ToolChains/Cuda.cpp --- a/clang/lib/Driver/ToolChains/Cuda.cpp +++ b/clang/lib/Driver/ToolChains/Cuda.cpp @@ -27,6 +27,7 @@ #include "llvm/Support/VirtualFileSystem.h" #include "llvm/TargetParser/Host.h" #include "llvm/TargetParser/TargetParser.h" +#include "llvm/TargetParser/TripleUtils.h" #include using namespace clang::driver; @@ -399,7 +400,8 @@ } ArgStringList CmdArgs; - CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32"); + CmdArgs.push_back(llvm::TripleUtils::isArch64Bit(TC.getTriple()) ? "-m64" + : "-m32"); DeviceDebugInfoLevel DIKind = mustEmitDebugInfo(Args); if (DIKind == EmitSameDebugInfoAsHost) { // ptxas does not accept -g option if optimization is enabled, so @@ -526,7 +528,8 @@ ArgStringList CmdArgs; if (TC.CudaInstallation.version() <= CudaVersion::CUDA_100) CmdArgs.push_back("--cuda"); - CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32"); + CmdArgs.push_back(llvm::TripleUtils::isArch64Bit(TC.getTriple()) ? "-64" + : "-32"); CmdArgs.push_back(Args.MakeArgString("--create")); CmdArgs.push_back(Args.MakeArgString(Output.getFilename())); if (mustEmitDebugInfo(Args) == EmitSameDebugInfoAsHost) diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -27,6 +27,7 @@ #include "llvm/Support/VirtualFileSystem.h" #include "llvm/TargetParser/TargetParser.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include // ::getenv using namespace clang::driver; @@ -1140,7 +1141,7 @@ CC1Args.push_back("-Werror=undef-prefix"); // For modern targets, promote certain warnings to errors. - if (isTargetWatchOSBased() || getTriple().isArch64Bit()) { + if (isTargetWatchOSBased() || llvm::TripleUtils::isArch64Bit(getTriple())) { // Always enable -Wdeprecated-objc-isa-usage and promote it // to an error. CC1Args.push_back("-Wdeprecated-objc-isa-usage"); @@ -2285,7 +2286,7 @@ } // For 32-bit targets, the deployment target for iOS has to be earlier than // iOS 11. - if (getTriple().isArch32Bit() && Major >= 11) { + if (llvm::TripleUtils::isArch32Bit(getTriple()) && Major >= 11) { // If the deployment target is explicitly specified, print a diagnostic. if (OSTarget->isExplicitlySpecified()) { if (OSTarget->getEnvironment() == MacCatalyst) diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp --- a/clang/lib/Driver/ToolChains/FreeBSD.cpp +++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp @@ -18,6 +18,7 @@ #include "clang/Driver/SanitizerArgs.h" #include "llvm/Option/ArgList.h" #include "llvm/Support/VirtualFileSystem.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace clang::driver; using namespace clang::driver::tools; @@ -376,7 +377,7 @@ // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall // back to '/usr/lib' if it doesn't exist. - if (Triple.isArch32Bit() && + if (llvm::TripleUtils::isArch32Bit(Triple) && D.getVFS().exists(concat(getDriver().SysRoot, "/usr/lib32/crt1.o"))) getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib32")); else diff --git a/clang/lib/Driver/ToolChains/Gnu.h b/clang/lib/Driver/ToolChains/Gnu.h --- a/clang/lib/Driver/ToolChains/Gnu.h +++ b/clang/lib/Driver/ToolChains/Gnu.h @@ -14,6 +14,7 @@ #include "ROCm.h" #include "clang/Driver/Tool.h" #include "clang/Driver/ToolChain.h" +#include "llvm/TargetParser/TripleUtils.h" #include namespace clang { @@ -316,10 +317,14 @@ /// @{ /// Check whether the target triple's architecture is 64-bits. - bool isTarget64Bit() const { return getTriple().isArch64Bit(); } + bool isTarget64Bit() const { + return llvm::TripleUtils::isArch64Bit(getTriple()); + } /// Check whether the target triple's architecture is 32-bits. - bool isTarget32Bit() const { return getTriple().isArch32Bit(); } + bool isTarget32Bit() const { + return llvm::TripleUtils::isArch32Bit(getTriple()); + } void PushPPaths(ToolChain::path_list &PPaths); void AddMultilibPaths(const Driver &D, const std::string &SysRoot, diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -1889,18 +1889,21 @@ // Also handle cases such as 64 on 32, 32 on 64, etc. enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN; const bool IsX32 = TargetTriple.isX32(); - if (TargetTriple.isArch32Bit() && !NonExistent(Alt32)) + if (llvm::TripleUtils::isArch32Bit(TargetTriple) && !NonExistent(Alt32)) Want = WANT64; - if (TargetTriple.isArch32Bit() && !NonExistent(Alt32sparc)) + if (llvm::TripleUtils::isArch32Bit(TargetTriple) && !NonExistent(Alt32sparc)) Want = WANT64; - else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32)) + else if (llvm::TripleUtils::isArch64Bit(TargetTriple) && IsX32 && + !NonExistent(Altx32)) Want = WANT64; - else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64)) + else if (llvm::TripleUtils::isArch64Bit(TargetTriple) && !IsX32 && + !NonExistent(Alt64)) Want = WANT32; - else if (TargetTriple.isArch64Bit() && !NonExistent(Alt32sparc)) + else if (llvm::TripleUtils::isArch64Bit(TargetTriple) && + !NonExistent(Alt32sparc)) Want = WANT64; else { - if (TargetTriple.isArch32Bit()) + if (llvm::TripleUtils::isArch32Bit(TargetTriple)) Want = NeedsBiarchSuffix ? WANT64 : WANT32; else if (IsX32) Want = NeedsBiarchSuffix ? WANT64 : WANTX32; @@ -1934,9 +1937,11 @@ Result.Multilibs.FilterOut(NonExistent); Multilib::flags_list Flags; - addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "-m64", Flags); - addMultilibFlag(TargetTriple.isArch32Bit(), "-m32", Flags); - addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "-mx32", Flags); + addMultilibFlag(llvm::TripleUtils::isArch64Bit(TargetTriple) && !IsX32, + "-m64", Flags); + addMultilibFlag(llvm::TripleUtils::isArch32Bit(TargetTriple), "-m32", Flags); + addMultilibFlag(llvm::TripleUtils::isArch64Bit(TargetTriple) && IsX32, + "-mx32", Flags); if (!Result.Multilibs.select(Flags, Result.SelectedMultilibs)) return false; @@ -2073,9 +2078,10 @@ void Generic_GCC::GCCInstallationDetector::init( const llvm::Triple &TargetTriple, const ArgList &Args, ArrayRef ExtraTripleAliases) { - llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit() - ? TargetTriple.get64BitArchVariant() - : TargetTriple.get32BitArchVariant(); + llvm::Triple BiarchVariantTriple = + llvm::TripleUtils::isArch32Bit(TargetTriple) + ? TargetTriple.get64BitArchVariant() + : TargetTriple.get32BitArchVariant(); // The library directories which may contain GCC installations. SmallVector CandidateLibDirs, CandidateBiarchLibDirs; // The compatible GCC triples for this particular architecture. diff --git a/clang/lib/Driver/ToolChains/Hurd.cpp b/clang/lib/Driver/ToolChains/Hurd.cpp --- a/clang/lib/Driver/ToolChains/Hurd.cpp +++ b/clang/lib/Driver/ToolChains/Hurd.cpp @@ -13,6 +13,7 @@ #include "clang/Driver/Options.h" #include "llvm/Support/Path.h" #include "llvm/Support/VirtualFileSystem.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace clang::driver; using namespace clang::driver::toolchains; @@ -58,7 +59,7 @@ if (Triple.getArch() == llvm::Triple::x86) return "lib32"; - return Triple.isArch32Bit() ? "lib" : "lib64"; + return llvm::TripleUtils::isArch32Bit(Triple) ? "lib" : "lib64"; } Hurd::Hurd(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -23,6 +23,7 @@ #include "llvm/Support/Path.h" #include "llvm/Support/ScopedPrinter.h" #include "llvm/Support/VirtualFileSystem.h" +#include "llvm/TargetParser/TripleUtils.h" #include using namespace clang::driver; @@ -184,7 +185,7 @@ // code for N32 ABI only. if (tools::mips::hasMipsAbiArg(Args, "n32")) return "lib32"; - return Triple.isArch32Bit() ? "lib" : "lib64"; + return llvm::TripleUtils::isArch32Bit(Triple) ? "lib" : "lib64"; } // It happens that only x86, PPC and SPARC use the 'lib32' variant of @@ -206,7 +207,7 @@ if (Triple.getArch() == llvm::Triple::riscv32) return "lib32"; - return Triple.isArch32Bit() ? "lib" : "lib64"; + return llvm::TripleUtils::isArch32Bit(Triple) ? "lib" : "lib64"; } Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) @@ -320,7 +321,7 @@ // find /usr/lib64 as it is referenced as /usr/lib/../lib64. So we handle // this here. if (Triple.getVendor() == llvm::Triple::OpenEmbedded && - Triple.isArch64Bit()) + llvm::TripleUtils::isArch64Bit(Triple)) addPathIfExists(D, concat(SysRoot, "/usr", OSLibDir), Paths); else addPathIfExists(D, concat(SysRoot, "/usr/lib/..", OSLibDir), Paths); @@ -428,14 +429,16 @@ if (Triple.isAndroid()) { if (getSanitizerArgs(Args).needsHwasanRt() && - !Triple.isAndroidVersionLT(34) && Triple.isArch64Bit()) { + !Triple.isAndroidVersionLT(34) && + llvm::TripleUtils::isArch64Bit(Triple)) { // On Android 14 and newer, there is a special linker_hwasan64 that // allows to run HWASan binaries on non-HWASan system images. This // is also available on HWASan system images, so we can just always // use that instead. return "/system/bin/linker_hwasan64"; } - return Triple.isArch64Bit() ? "/system/bin/linker64" : "/system/bin/linker"; + return llvm::TripleUtils::isArch64Bit(Triple) ? "/system/bin/linker64" + : "/system/bin/linker"; } if (Triple.isMusl()) { std::string ArchName; diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp b/clang/lib/Driver/ToolChains/WebAssembly.cpp --- a/clang/lib/Driver/ToolChains/WebAssembly.cpp +++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp @@ -19,6 +19,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include "llvm/Support/VirtualFileSystem.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace clang::driver; using namespace clang::driver::tools; @@ -65,7 +66,7 @@ ArgStringList CmdArgs; CmdArgs.push_back("-m"); - if (ToolChain.getTriple().isArch64Bit()) + if (llvm::TripleUtils::isArch64Bit(ToolChain.getTriple())) CmdArgs.push_back("wasm64"); else CmdArgs.push_back("wasm32"); @@ -173,7 +174,8 @@ const llvm::opt::ArgList &Args) : ToolChain(D, Triple, Args) { - assert(Triple.isArch32Bit() != Triple.isArch64Bit()); + assert(llvm::TripleUtils::isArch32Bit(Triple) != + llvm::TripleUtils::isArch64Bit(Triple)); getProgramPaths().push_back(getDriver().getInstalledDir()); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -87,6 +87,7 @@ #include "llvm/Target/TargetOptions.h" #include "llvm/TargetParser/Host.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include #include #include @@ -3843,11 +3844,12 @@ if (Arg *A = Args.getLastArg(options::OPT_fopenmp_targets_EQ)) { enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit }; auto getArchPtrSize = [](const llvm::Triple &T) { - if (T.isArch16Bit()) + if (llvm::TripleUtils::isArch16Bit(T)) return Arch16Bit; - if (T.isArch32Bit()) + if (llvm::TripleUtils::isArch32Bit(T)) return Arch32Bit; - assert(T.isArch64Bit() && "Expected 64-bit architecture"); + assert(llvm::TripleUtils::isArch64Bit(T) && + "Expected 64-bit architecture"); return Arch64Bit; }; diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -41,6 +41,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/TargetParser/TripleUtils.h" #include #include @@ -8151,7 +8152,8 @@ // Non-polynomial vector types: the usual suspects are allowed, as well as // float64_t on AArch64. - if ((Triple.isArch64Bit() || Triple.getArch() == llvm::Triple::aarch64_32) && + if ((llvm::TripleUtils::isArch64Bit(Triple) || + Triple.getArch() == llvm::Triple::aarch64_32) && BTy->getKind() == BuiltinType::Double) return true; diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -52,6 +52,7 @@ #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetMachine.h" #include "llvm/TargetParser/Host.h" +#include "llvm/TargetParser/TripleUtils.h" #include #include @@ -292,7 +293,7 @@ SmallVector CmdArgs; CmdArgs.push_back(*FatBinaryPath); - CmdArgs.push_back(Triple.isArch64Bit() ? "-64" : "-32"); + CmdArgs.push_back(llvm::TripleUtils::isArch64Bit(Triple) ? "-64" : "-32"); CmdArgs.push_back("--create"); CmdArgs.push_back(*TempFileOrErr); for (const auto &[File, Arch] : InputFiles) diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -30,6 +30,7 @@ #include "llvm/Support/RISCVAttributeParser.h" #include "llvm/Support/TarWriter.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; using namespace llvm::ELF; @@ -1556,8 +1557,8 @@ static ELFKind getBitcodeELFKind(const Triple &t) { if (t.isLittleEndian()) - return t.isArch64Bit() ? ELF64LEKind : ELF32LEKind; - return t.isArch64Bit() ? ELF64BEKind : ELF32BEKind; + return TripleUtils::isArch64Bit(t) ? ELF64LEKind : ELF32LEKind; + return TripleUtils::isArch64Bit(t) ? ELF64BEKind : ELF32BEKind; } static uint16_t getBitcodeMachineKind(StringRef path, const Triple &t) { diff --git a/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp --- a/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp +++ b/lldb/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp @@ -30,6 +30,7 @@ #include "llvm/TargetParser/Host.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" // Define these constants from FreeBSD mman.h for use when targeting remote // FreeBSD systems even when host has different values. @@ -116,7 +117,7 @@ if (is_host) { ArchSpec hostArch = HostInfo::GetArchitecture(HostInfo::eArchKindDefault); m_supported_architectures.push_back(hostArch); - if (hostArch.GetTriple().isArch64Bit()) { + if (llvm::TripleUtils::isArch64Bit(hostArch.GetTriple())) { m_supported_architectures.push_back( HostInfo::GetArchitecture(HostInfo::eArchKind32)); } diff --git a/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp b/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp --- a/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp +++ b/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp @@ -27,6 +27,7 @@ #include "lldb/Utility/State.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/StreamString.h" +#include "llvm/TargetParser/TripleUtils.h" // Define these constants from Linux mman.h for use when targeting remote linux // systems even when host has different values. @@ -114,7 +115,7 @@ if (is_host) { ArchSpec hostArch = HostInfo::GetArchitecture(HostInfo::eArchKindDefault); m_supported_architectures.push_back(hostArch); - if (hostArch.GetTriple().isArch64Bit()) { + if (llvm::TripleUtils::isArch64Bit(hostArch.GetTriple())) { m_supported_architectures.push_back( HostInfo::GetArchitecture(HostInfo::eArchKind32)); } @@ -393,7 +394,7 @@ } // the structure is padded on 64-bit arches to fix alignment - if (triple.isArch64Bit()) + if (llvm::TripleUtils::isArch64Bit(triple)) ast->AddFieldToRecordType(siginfo_type, "__pad0", int_type, lldb::eAccessPublic, 0); diff --git a/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.cpp b/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.cpp --- a/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.cpp +++ b/lldb/source/Plugins/Platform/NetBSD/PlatformNetBSD.cpp @@ -25,6 +25,7 @@ #include "lldb/Utility/State.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/StreamString.h" +#include "llvm/TargetParser/TripleUtils.h" // Define these constants from NetBSD mman.h for use when targeting remote // netbsd systems even when host has different values. @@ -105,7 +106,7 @@ if (is_host) { ArchSpec hostArch = HostInfo::GetArchitecture(HostInfo::eArchKindDefault); m_supported_architectures.push_back(hostArch); - if (hostArch.GetTriple().isArch64Bit()) { + if (llvm::TripleUtils::isArch64Bit(hostArch.GetTriple())) { m_supported_architectures.push_back( HostInfo::GetArchitecture(HostInfo::eArchKind32)); } @@ -265,7 +266,7 @@ lldb::eAccessPublic, 0); // the structure is padded on 64-bit arches to fix alignment - if (triple.isArch64Bit()) + if (llvm::TripleUtils::isArch64Bit(triple)) ast->AddFieldToRecordType(ksiginfo_type, "__pad0", int_type, lldb::eAccessPublic, 0); diff --git a/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp b/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp --- a/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp +++ b/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp @@ -33,6 +33,7 @@ #include "Plugins/Process/Utility/GDBRemoteSignals.h" #include "Plugins/Process/gdb-remote/ProcessGDBRemote.h" +#include "llvm/TargetParser/TripleUtils.h" #include using namespace lldb; @@ -257,7 +258,7 @@ ArchSpec remote_arch = m_gdb_client_up->GetSystemArchitecture(); if (remote_arch) { m_supported_architectures.push_back(remote_arch); - if (remote_arch.GetTriple().isArch64Bit()) + if (llvm::TripleUtils::isArch64Bit(remote_arch.GetTriple())) m_supported_architectures.push_back( ArchSpec(remote_arch.GetTriple().get32BitArchVariant())); } diff --git a/llvm/include/llvm/CodeGen/BasicTTIImpl.h b/llvm/include/llvm/CodeGen/BasicTTIImpl.h --- a/llvm/include/llvm/CodeGen/BasicTTIImpl.h +++ b/llvm/include/llvm/CodeGen/BasicTTIImpl.h @@ -48,6 +48,7 @@ #include "llvm/Support/MathExtras.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" +#include "llvm/TargetParser/TripleUtils.h" #include #include #include @@ -504,7 +505,7 @@ return false; Triple TargetTriple = TM.getTargetTriple(); - if (!TargetTriple.isArch64Bit()) + if (!TripleUtils::isArch64Bit(TargetTriple)) return false; // TODO: Triggers issues on aarch64 on darwin, so temporarily disable it diff --git a/llvm/include/llvm/Object/IRObjectFile.h b/llvm/include/llvm/Object/IRObjectFile.h --- a/llvm/include/llvm/Object/IRObjectFile.h +++ b/llvm/include/llvm/Object/IRObjectFile.h @@ -17,6 +17,7 @@ #include "llvm/Object/IRSymtab.h" #include "llvm/Object/ModuleSymbolTable.h" #include "llvm/Object/SymbolicFile.h" +#include "llvm/TargetParser/TripleUtils.h" namespace llvm { class Module; @@ -38,7 +39,7 @@ basic_symbol_iterator symbol_begin() const override; basic_symbol_iterator symbol_end() const override; bool is64Bit() const override { - return Triple(getTargetTriple()).isArch64Bit(); + return TripleUtils::isArch64Bit(Triple(getTargetTriple())); } StringRef getTargetTriple() const; diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h --- a/llvm/include/llvm/TargetParser/Triple.h +++ b/llvm/include/llvm/TargetParser/Triple.h @@ -448,17 +448,23 @@ /// 16-bit. The inner details of pointer width for particular architectures /// is not summed up in the triple, and so only a coarse grained predicate /// system is provided. - bool isArch64Bit() const; + [[deprecated("Use TripleUtils::isArch64Bit(const llvm::Triple& tripleImpl) " + "instead.")]] bool + isArch64Bit() const; /// Test whether the architecture is 32-bit /// /// Note that this tests for 32-bit pointer width, and nothing else. - bool isArch32Bit() const; + [[deprecated("Use TripleUtils::isArch32Bit(const llvm::Triple& tripleImpl) " + "instead.")]] bool + isArch32Bit() const; /// Test whether the architecture is 16-bit /// /// Note that this tests for 16-bit pointer width, and nothing else. - bool isArch16Bit() const; + [[deprecated("Use TripleUtils::isArch16Bit(const llvm::Triple& tripleImpl) " + "instead.")]] bool + isArch16Bit() const; /// Helper function for doing comparisons against version numbers included in /// the target triple. @@ -730,17 +736,7 @@ /// Tests whether the target is Android bool isAndroid() const { return getEnvironment() == Triple::Android; } - bool isAndroidVersionLT(unsigned Major) const { - assert(isAndroid() && "Not an Android triple!"); - - VersionTuple Version = getEnvironmentVersion(); - - // 64-bit targets did not exist before API level 21 (Lollipop). - if (isArch64Bit() && Version.getMajor() < 21) - return VersionTuple(21) < VersionTuple(Major); - - return Version < VersionTuple(Major); - } + bool isAndroidVersionLT(unsigned Major) const; /// Tests whether the environment is musl-libc bool isMusl() const { diff --git a/llvm/include/llvm/TargetParser/TripleUtils.h b/llvm/include/llvm/TargetParser/TripleUtils.h new file mode 100644 --- /dev/null +++ b/llvm/include/llvm/TargetParser/TripleUtils.h @@ -0,0 +1,32 @@ +//===-- llvm/TargetParser/TripleUtils.h - Triple Utils class--*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TARGETPARSER_TRIPLE_UTILS_H +#define LLVM_TARGETPARSER_TRIPLE_UTILS_H + +#include "llvm/TargetParser/Triple.h" +#include + +namespace llvm { + +class TripleUtils { +public: + /// Test whether the architecture is 16-bit + /// + /// Note that this tests for 16-bit pointer width, and nothing else. + + static bool isArch16Bit(const Triple &tripleImpl); + + static bool isArch32Bit(const Triple &tripleImpl); + + static bool isArch64Bit(const Triple &tripleImpl); +}; + +} // namespace llvm + +#endif \ No newline at end of file diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp --- a/llvm/lib/Analysis/TargetLibraryInfo.cpp +++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp @@ -15,6 +15,7 @@ #include "llvm/InitializePasses.h" #include "llvm/Support/CommandLine.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; static cl::opt ClVectorLibrary( @@ -184,7 +185,7 @@ // Let's assume by default that the size of int is 32 bits, unless the target // is a 16-bit architecture because then it most likely is 16 bits. If that // isn't true for a target those defaults should be overridden below. - TLI.setIntSize(T.isArch16Bit() ? 16 : 32); + TLI.setIntSize(llvm::TripleUtils::isArch16Bit(T) ? 16 : 32); // There is really no runtime library on AMDGPU, apart from // __kmpc_alloc/free_shared. diff --git a/llvm/lib/BinaryFormat/MachO.cpp b/llvm/lib/BinaryFormat/MachO.cpp --- a/llvm/lib/BinaryFormat/MachO.cpp +++ b/llvm/lib/BinaryFormat/MachO.cpp @@ -9,15 +9,16 @@ #include "llvm/BinaryFormat/MachO.h" #include "llvm/TargetParser/ARMTargetParser.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; static MachO::CPUSubTypeX86 getX86SubType(const Triple &T) { assert(T.isX86()); - if (T.isArch32Bit()) + if (TripleUtils::isArch32Bit(T)) return MachO::CPU_SUBTYPE_I386_ALL; - assert(T.isArch64Bit()); + assert(TripleUtils::isArch64Bit(T)); if (T.getArchName() == "x86_64h") return MachO::CPU_SUBTYPE_X86_64_H; return MachO::CPU_SUBTYPE_X86_64_ALL; @@ -56,7 +57,7 @@ static MachO::CPUSubTypeARM64 getARM64SubType(const Triple &T) { assert(T.isAArch64()); - if (T.isArch32Bit()) + if (TripleUtils::isArch32Bit(T)) return (MachO::CPUSubTypeARM64)MachO::CPU_SUBTYPE_ARM64_32_V8; if (T.isArm64e()) return MachO::CPU_SUBTYPE_ARM64E; @@ -77,14 +78,15 @@ Expected MachO::getCPUType(const Triple &T) { if (!T.isOSBinFormatMachO()) return unsupported("type", T); - if (T.isX86() && T.isArch32Bit()) + if (T.isX86() && TripleUtils::isArch32Bit(T)) return MachO::CPU_TYPE_X86; - if (T.isX86() && T.isArch64Bit()) + if (T.isX86() && TripleUtils::isArch64Bit(T)) return MachO::CPU_TYPE_X86_64; if (T.isARM() || T.isThumb()) return MachO::CPU_TYPE_ARM; if (T.isAArch64()) - return T.isArch32Bit() ? MachO::CPU_TYPE_ARM64_32 : MachO::CPU_TYPE_ARM64; + return TripleUtils::isArch32Bit(T) ? MachO::CPU_TYPE_ARM64_32 + : MachO::CPU_TYPE_ARM64; if (T.getArch() == Triple::ppc) return MachO::CPU_TYPE_POWERPC; if (T.getArch() == Triple::ppc64) diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -54,6 +54,7 @@ #include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetMachine.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include #include #include @@ -391,8 +392,9 @@ DwarfVersion = TT.isNVPTX() ? 2 : (DwarfVersion ? DwarfVersion : dwarf::DWARF_VERSION); - bool Dwarf64 = DwarfVersion >= 3 && // DWARF64 was introduced in DWARFv3. - TT.isArch64Bit(); // DWARF64 requires 64-bit relocations. + bool Dwarf64 = + DwarfVersion >= 3 && // DWARF64 was introduced in DWARFv3. + TripleUtils::isArch64Bit(TT); // DWARF64 requires 64-bit relocations. // Support DWARF64 // 1: For ELF when requested. @@ -404,7 +406,7 @@ TT.isOSBinFormatELF()) || TT.isOSBinFormatXCOFF(); - if (!Dwarf64 && TT.isArch64Bit() && TT.isOSBinFormatXCOFF()) + if (!Dwarf64 && TripleUtils::isArch64Bit(TT) && TT.isOSBinFormatXCOFF()) report_fatal_error("XCOFF requires DWARF64 for 64-bit mode!"); UseRangesSection = !NoDwarfRangesSection && !TT.isNVPTX(); diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -53,6 +53,7 @@ #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include "llvm/Transforms/Utils/SizeOpts.h" #include #include @@ -105,7 +106,7 @@ return false; // Macos < 10.9 has no sincos_stret. if (TT.isMacOSX()) - return !TT.isMacOSXVersionLT(10, 9) && TT.isArch64Bit(); + return !TT.isMacOSXVersionLT(10, 9) && TripleUtils::isArch64Bit(TT); // iOS < 7.0 has no sincos_stret. if (TT.isiOS()) return !TT.isOSVersionLT(7, 0); diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -65,6 +65,7 @@ #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetMachine.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include #include @@ -2535,10 +2536,10 @@ void TargetLoweringObjectFileXCOFF::Initialize(MCContext &Ctx, const TargetMachine &TgtM) { TargetLoweringObjectFile::Initialize(Ctx, TgtM); - TTypeEncoding = - dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_datarel | - (TgtM.getTargetTriple().isArch32Bit() ? dwarf::DW_EH_PE_sdata4 - : dwarf::DW_EH_PE_sdata8); + TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_datarel | + (llvm::TripleUtils::isArch32Bit(TgtM.getTargetTriple()) + ? dwarf::DW_EH_PE_sdata4 + : dwarf::DW_EH_PE_sdata8); PersonalityEncoding = 0; LSDAEncoding = 0; CallSiteEncoding = dwarf::DW_EH_PE_udata4; diff --git a/llvm/lib/CodeGen/WinEHPrepare.cpp b/llvm/lib/CodeGen/WinEHPrepare.cpp --- a/llvm/lib/CodeGen/WinEHPrepare.cpp +++ b/llvm/lib/CodeGen/WinEHPrepare.cpp @@ -31,6 +31,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/Cloning.h" #include "llvm/Transforms/Utils/Local.h" @@ -390,7 +391,7 @@ // stored in pre-order (outer first, inner next), not post-order // Add to map here. Fix the CatchHigh after children are processed const Module *Mod = BB->getParent()->getParent(); - bool IsPreOrder = Triple(Mod->getTargetTriple()).isArch64Bit(); + bool IsPreOrder = TripleUtils::isArch64Bit(Triple(Mod->getTargetTriple())); if (IsPreOrder) addTryBlockMapEntry(FuncInfo, TryLow, TryHigh, CatchLow, Handlers); unsigned TBMEIdx = FuncInfo.TryBlockMap.size() - 1; diff --git a/llvm/lib/DWARFLinker/DWARFStreamer.cpp b/llvm/lib/DWARFLinker/DWARFStreamer.cpp --- a/llvm/lib/DWARFLinker/DWARFStreamer.cpp +++ b/llvm/lib/DWARFLinker/DWARFStreamer.cpp @@ -25,6 +25,7 @@ #include "llvm/Support/LEB128.h" #include "llvm/Target/TargetOptions.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" namespace llvm { @@ -241,7 +242,7 @@ Asm.emitInt32(11 + Die.getSize() - 4); Asm.emitInt16(2); Asm.emitInt32(0); - Asm.emitInt8(MC->getTargetTriple().isArch64Bit() ? 8 : 4); + Asm.emitInt8(llvm::TripleUtils::isArch64Bit(MC->getTargetTriple()) ? 8 : 4); DebugInfoSectionSize += 11; emitDIE(Die); } diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -41,6 +41,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/Regex.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include using namespace llvm; @@ -5295,7 +5296,7 @@ // For 32-bit MSVC targets, raise the alignment of f80 values to 16 bytes. // Raising the alignment is safe because Clang did not produce f80 values in // the MSVC environment before this upgrade was added. - if (T.isWindowsMSVCEnvironment() && !T.isArch64Bit()) { + if (T.isWindowsMSVCEnvironment() && !TripleUtils::isArch64Bit(T)) { StringRef Ref = Res; auto I = Ref.find("-f80:32-"); if (I != StringRef::npos) diff --git a/llvm/lib/InterfaceStub/IFSHandler.cpp b/llvm/lib/InterfaceStub/IFSHandler.cpp --- a/llvm/lib/InterfaceStub/IFSHandler.cpp +++ b/llvm/lib/InterfaceStub/IFSHandler.cpp @@ -17,6 +17,7 @@ #include "llvm/Support/LineIterator.h" #include "llvm/Support/YAMLTraits.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include #include @@ -314,8 +315,9 @@ } RetTarget.Endianness = IFSTriple.isLittleEndian() ? IFSEndiannessType::Little : IFSEndiannessType::Big; - RetTarget.BitWidth = - IFSTriple.isArch64Bit() ? IFSBitWidthType::IFS64 : IFSBitWidthType::IFS32; + RetTarget.BitWidth = TripleUtils::isArch64Bit(IFSTriple) + ? IFSBitWidthType::IFS64 + : IFSBitWidthType::IFS32; return RetTarget; } diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp --- a/llvm/lib/LTO/LTOCodeGenerator.cpp +++ b/llvm/lib/LTO/LTOCodeGenerator.cpp @@ -57,6 +57,7 @@ #include "llvm/Target/TargetOptions.h" #include "llvm/TargetParser/Host.h" #include "llvm/TargetParser/SubtargetFeature.h" +#include "llvm/TargetParser/TripleUtils.h" #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/IPO/Internalize.h" #include "llvm/Transforms/IPO/WholeProgramDevirt.h" @@ -269,7 +270,7 @@ // Prepare inputs for the assember. const auto &Triple = TargetMach->getTargetTriple(); - const char *Arch = Triple.isArch64Bit() ? "-a64" : "-a32"; + const char *Arch = TripleUtils::isArch64Bit(Triple) ? "-a64" : "-a32"; std::string ObjectFileName(AssemblyFile); ObjectFileName[ObjectFileName.size() - 1] = 'o'; SmallVector Args = { diff --git a/llvm/lib/ProfileData/InstrProfCorrelator.cpp b/llvm/lib/ProfileData/InstrProfCorrelator.cpp --- a/llvm/lib/ProfileData/InstrProfCorrelator.cpp +++ b/llvm/lib/ProfileData/InstrProfCorrelator.cpp @@ -16,6 +16,7 @@ #include "llvm/DebugInfo/DWARF/DWARFUnit.h" #include "llvm/Object/MachO.h" #include "llvm/Support/Debug.h" +#include "llvm/TargetParser/TripleUtils.h" #include #define DEBUG_TYPE "correlator" @@ -85,9 +86,9 @@ if (auto Err = CtxOrErr.takeError()) return std::move(Err); auto T = Obj->makeTriple(); - if (T.isArch64Bit()) + if (TripleUtils::isArch64Bit(T)) return InstrProfCorrelatorImpl::get(std::move(*CtxOrErr), *Obj); - if (T.isArch32Bit()) + if (TripleUtils::isArch32Bit(T)) return InstrProfCorrelatorImpl::get(std::move(*CtxOrErr), *Obj); } return make_error( diff --git a/llvm/lib/Target/AArch64/AArch64Subtarget.h b/llvm/lib/Target/AArch64/AArch64Subtarget.h --- a/llvm/lib/Target/AArch64/AArch64Subtarget.h +++ b/llvm/lib/Target/AArch64/AArch64Subtarget.h @@ -25,6 +25,7 @@ #include "llvm/CodeGen/RegisterBankInfo.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" #include "llvm/IR/DataLayout.h" +#include "llvm/TargetParser/TripleUtils.h" #include #define GET_SUBTARGETINFO_HEADER @@ -285,7 +286,7 @@ bool isTargetMachO() const { return TargetTriple.isOSBinFormatMachO(); } bool isTargetILP32() const { - return TargetTriple.isArch32Bit() || + return llvm::TripleUtils::isArch32Bit(TargetTriple) || TargetTriple.getEnvironment() == Triple::GNUILP32; } diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp @@ -28,6 +28,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MathExtras.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; namespace { @@ -561,7 +562,7 @@ uint32_t CPUType = cantFail(MachO::getCPUType(TheTriple)); uint32_t CPUSubType = cantFail(MachO::getCPUSubType(TheTriple)); return createAArch64MachObjectWriter(CPUType, CPUSubType, - TheTriple.isArch32Bit()); + TripleUtils::isArch32Bit(TheTriple)); } /// Generate the compact unwind encoding from the CFI directives. diff --git a/llvm/lib/Target/LoongArch/LoongArchSubtarget.cpp b/llvm/lib/Target/LoongArch/LoongArchSubtarget.cpp --- a/llvm/lib/Target/LoongArch/LoongArchSubtarget.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchSubtarget.cpp @@ -13,6 +13,7 @@ #include "LoongArchSubtarget.h" #include "LoongArchFrameLowering.h" #include "MCTargetDesc/LoongArchBaseInfo.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; @@ -27,7 +28,7 @@ LoongArchSubtarget &LoongArchSubtarget::initializeSubtargetDependencies( const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS, StringRef ABIName) { - bool Is64Bit = TT.isArch64Bit(); + bool Is64Bit = TripleUtils::isArch64Bit(TT); if (CPU.empty() || CPU == "generic") CPU = Is64Bit ? "generic-la64" : "generic-la32"; diff --git a/llvm/lib/Target/LoongArch/LoongArchTargetMachine.cpp b/llvm/lib/Target/LoongArch/LoongArchTargetMachine.cpp --- a/llvm/lib/Target/LoongArch/LoongArchTargetMachine.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchTargetMachine.cpp @@ -22,6 +22,7 @@ #include "llvm/CodeGen/TargetPassConfig.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Support/CodeGen.h" +#include "llvm/TargetParser/TripleUtils.h" #include "llvm/Transforms/Scalar.h" #include @@ -44,9 +45,10 @@ cl::init(false)); static std::string computeDataLayout(const Triple &TT) { - if (TT.isArch64Bit()) + if (llvm::TripleUtils::isArch64Bit(TT)) return "e-m:e-p:64:64-i64:64-i128:128-n64-S128"; - assert(TT.isArch32Bit() && "only LA32 and LA64 are currently supported"); + assert(llvm::TripleUtils::isArch32Bit(TT) && + "only LA32 and LA64 are currently supported"); return "e-m:e-p:32:32-i64:64-n32-S128"; } @@ -66,7 +68,7 @@ case CodeModel::Medium: return *CM; case CodeModel::Large: - if (!TT.isArch64Bit()) + if (!TripleUtils::isArch64Bit(TT)) report_fatal_error("Large code model requires LA64"); return *CM; default: diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp --- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp +++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp @@ -19,6 +19,7 @@ #include "llvm/MC/MCValue.h" #include "llvm/Support/Endian.h" #include "llvm/Support/EndianStream.h" +#include "llvm/TargetParser/TripleUtils.h" #define DEBUG_TYPE "loongarch-asmbackend" @@ -202,5 +203,6 @@ const MCTargetOptions &Options) { const Triple &TT = STI.getTargetTriple(); uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TT.getOS()); - return new LoongArchAsmBackend(STI, OSABI, TT.isArch64Bit(), Options); + return new LoongArchAsmBackend(STI, OSABI, TripleUtils::isArch64Bit(TT), + Options); } diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.cpp --- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.cpp +++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.cpp @@ -16,6 +16,7 @@ #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" namespace llvm { @@ -23,7 +24,7 @@ ABI computeTargetABI(const Triple &TT, StringRef ABIName) { ABI ArgProvidedABI = getTargetABI(ABIName); - bool Is64Bit = TT.isArch64Bit(); + bool Is64Bit = TripleUtils::isArch64Bit(TT); ABI TripleABI; // Figure out the ABI explicitly requested via the triple's environment type. diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCAsmInfo.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCAsmInfo.cpp --- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCAsmInfo.cpp +++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCAsmInfo.cpp @@ -14,13 +14,15 @@ #include "llvm/BinaryFormat/Dwarf.h" #include "llvm/MC/MCStreamer.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; void LoongArchMCAsmInfo::anchor() {} LoongArchMCAsmInfo::LoongArchMCAsmInfo(const Triple &TT) { - CodePointerSize = CalleeSaveStackSlotSize = TT.isArch64Bit() ? 8 : 4; + CodePointerSize = CalleeSaveStackSlotSize = + TripleUtils::isArch64Bit(TT) ? 8 : 4; AlignmentIsInBytes = false; Data8bitsDirective = "\t.byte\t"; Data16bitsDirective = "\t.half\t"; diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.cpp --- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.cpp +++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.cpp @@ -27,6 +27,7 @@ #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Support/Compiler.h" +#include "llvm/TargetParser/TripleUtils.h" #define GET_INSTRINFO_MC_DESC #define ENABLE_INSTR_PREDICATE_VERIFIER @@ -55,7 +56,7 @@ static MCSubtargetInfo * createLoongArchMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) { if (CPU.empty() || CPU == "generic") - CPU = TT.isArch64Bit() ? "la464" : "generic-la32"; + CPU = TripleUtils::isArch64Bit(TT) ? "la464" : "generic-la32"; return createLoongArchMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS); } diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp @@ -21,6 +21,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/TargetParser/TripleUtils.h" #include #include #include @@ -665,8 +666,8 @@ std::unique_ptr llvm::createMipsELFObjectWriter(const Triple &TT, bool IsN32) { uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TT.getOS()); - bool IsN64 = TT.isArch64Bit() && !IsN32; - bool HasRelocationAddend = TT.isArch64Bit(); + bool IsN64 = TripleUtils::isArch64Bit(TT) && !IsN32; + bool HasRelocationAddend = TripleUtils::isArch64Bit(TT); return std::make_unique(OSABI, HasRelocationAddend, IsN64); } diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp --- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp +++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp @@ -23,6 +23,7 @@ #include "llvm/MC/MCValue.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; static uint64_t adjustFixupValue(unsigned Kind, uint64_t Value) { @@ -240,7 +241,7 @@ std::unique_ptr createObjectTargetWriter() const override { - return createPPCXCOFFObjectWriter(TT.isArch64Bit()); + return createPPCXCOFFObjectWriter(TripleUtils::isArch64Bit(TT)); } std::optional getFixupKind(StringRef Name) const override; diff --git a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp --- a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp +++ b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp @@ -43,6 +43,7 @@ #include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetOptions.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include "llvm/Transforms/Scalar.h" #include #include @@ -291,10 +292,10 @@ assert(TT.isOSBinFormatELF() && "All remaining PPC OSes are ELF based."); - if (TT.isArch32Bit()) + if (TripleUtils::isArch32Bit(TT)) return CodeModel::Small; - assert(TT.isArch64Bit() && "Unsupported PPC architecture."); + assert(TripleUtils::isArch64Bit(TT) && "Unsupported PPC architecture."); return CodeModel::Medium; } diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp @@ -25,6 +25,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/LEB128.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; @@ -721,5 +722,5 @@ const MCTargetOptions &Options) { const Triple &TT = STI.getTargetTriple(); uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TT.getOS()); - return new RISCVAsmBackend(STI, OSABI, TT.isArch64Bit(), Options); + return new RISCVAsmBackend(STI, OSABI, TripleUtils::isArch64Bit(TT), Options); } diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp @@ -20,6 +20,7 @@ #include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/TargetParser.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" namespace llvm { @@ -40,7 +41,7 @@ ABI computeTargetABI(const Triple &TT, const FeatureBitset &FeatureBits, StringRef ABIName) { auto TargetABI = getTargetABI(ABIName); - bool IsRV64 = TT.isArch64Bit(); + bool IsRV64 = TripleUtils::isArch64Bit(TT); bool IsRVE = FeatureBits[RISCV::FeatureRVE]; if (!ABIName.empty() && TargetABI == ABI_Unknown) { @@ -106,9 +107,9 @@ namespace RISCVFeatures { void validate(const Triple &TT, const FeatureBitset &FeatureBits) { - if (TT.isArch64Bit() && !FeatureBits[RISCV::Feature64Bit]) + if (TripleUtils::isArch64Bit(TT) && !FeatureBits[RISCV::Feature64Bit]) report_fatal_error("RV64 target requires an RV64 CPU"); - if (!TT.isArch64Bit() && !FeatureBits[RISCV::Feature32Bit]) + if (!TripleUtils::isArch64Bit(TT) && !FeatureBits[RISCV::Feature32Bit]) report_fatal_error("RV32 target requires an RV32 CPU"); if (FeatureBits[RISCV::Feature32Bit] && FeatureBits[RISCV::Feature64Bit]) diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCAsmInfo.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCAsmInfo.cpp --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCAsmInfo.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCAsmInfo.cpp @@ -15,12 +15,14 @@ #include "llvm/BinaryFormat/Dwarf.h" #include "llvm/MC/MCStreamer.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; void RISCVMCAsmInfo::anchor() {} RISCVMCAsmInfo::RISCVMCAsmInfo(const Triple &TT) { - CodePointerSize = CalleeSaveStackSlotSize = TT.isArch64Bit() ? 8 : 4; + CodePointerSize = CalleeSaveStackSlotSize = + TripleUtils::isArch64Bit(TT) ? 8 : 4; CommentString = "#"; AlignmentIsInBytes = false; SupportsDebugInformation = true; diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCTargetDesc.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCTargetDesc.cpp --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCTargetDesc.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCTargetDesc.cpp @@ -31,6 +31,7 @@ #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/TargetParser/TripleUtils.h" #define GET_INSTRINFO_MC_DESC #define ENABLE_INSTR_PREDICATE_VERIFIER @@ -79,7 +80,7 @@ static MCSubtargetInfo *createRISCVMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) { if (CPU.empty() || CPU == "generic") - CPU = TT.isArch64Bit() ? "generic-rv64" : "generic-rv32"; + CPU = TripleUtils::isArch64Bit(TT) ? "generic-rv64" : "generic-rv32"; return createRISCVMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS); } diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -181,7 +181,7 @@ int64_t Imm; if (!MCOp.evaluateAsConstantImm(Imm)) return false; - if (STI.getTargetTriple().isArch64Bit()) + if (llvm::TripleUtils::isArch64Bit(STI.getTargetTriple())) return isUInt<6>(Imm); return isUInt<5>(Imm); }]; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td @@ -32,7 +32,7 @@ int64_t Imm; if (!MCOp.evaluateAsConstantImm(Imm)) return false; - if (STI.getTargetTriple().isArch64Bit()) + if (llvm::TripleUtils::isArch64Bit(STI.getTargetTriple())) return isUInt<6>(Imm) && (Imm != 0); return isUInt<5>(Imm) && (Imm != 0); }]; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td @@ -61,7 +61,7 @@ int64_t Imm; if (!MCOp.evaluateAsConstantImm(Imm)) return false; - if (STI.getTargetTriple().isArch64Bit()) + if (llvm::TripleUtils::isArch64Bit(STI.getTargetTriple())) return isUInt<5>(Imm); return isUInt<4>(Imm); }]; diff --git a/llvm/lib/Target/RISCV/RISCVSubtarget.cpp b/llvm/lib/Target/RISCV/RISCVSubtarget.cpp --- a/llvm/lib/Target/RISCV/RISCVSubtarget.cpp +++ b/llvm/lib/Target/RISCV/RISCVSubtarget.cpp @@ -20,6 +20,7 @@ #include "RISCVTargetMachine.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; @@ -55,7 +56,7 @@ StringRef TuneCPU, StringRef FS, StringRef ABIName) { // Determine default and user-specified characteristics - bool Is64Bit = TT.isArch64Bit(); + bool Is64Bit = TripleUtils::isArch64Bit(TT); if (CPU.empty() || CPU == "generic") CPU = Is64Bit ? "generic-rv64" : "generic-rv32"; diff --git a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp --- a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp +++ b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp @@ -33,6 +33,7 @@ #include "llvm/MC/TargetRegistry.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Target/TargetOptions.h" +#include "llvm/TargetParser/TripleUtils.h" #include "llvm/Transforms/IPO.h" #include using namespace llvm; @@ -93,9 +94,10 @@ } static StringRef computeDataLayout(const Triple &TT) { - if (TT.isArch64Bit()) + if (TripleUtils::isArch64Bit(TT)) return "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"; - assert(TT.isArch32Bit() && "only RV32 and RV64 are currently supported"); + assert(TripleUtils::isArch32Bit(TT) && + "only RV32 and RV64 are currently supported"); return "e-m:e-p:32:32-i64:64-n32-S128"; } @@ -120,7 +122,7 @@ setMachineOutliner(true); setSupportsDefaultOutlining(true); - if (TT.isOSFuchsia() && !TT.isArch64Bit()) + if (TT.isOSFuchsia() && !TripleUtils::isArch64Bit(TT)) report_fatal_error("Fuchsia is only supported for 64-bit"); } diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -34,6 +34,7 @@ #include "llvm/MC/TargetRegistry.h" #include "llvm/Support/Endian.h" #include "llvm/Support/SourceMgr.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; @@ -247,7 +248,8 @@ WebAssemblyAsmParser(const MCSubtargetInfo &STI, MCAsmParser &Parser, const MCInstrInfo &MII, const MCTargetOptions &Options) : MCTargetAsmParser(Options, STI, MII), Parser(Parser), - Lexer(Parser.getLexer()), is64(STI.getTargetTriple().isArch64Bit()), + Lexer(Parser.getLexer()), + is64(TripleUtils::isArch64Bit(STI.getTargetTriple())), TC(Parser, MII, is64), SkipTypeCheck(Options.MCNoTypeCheck) { setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits())); // Don't type check if this is inline asm, since that is a naked sequence of diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyAsmBackend.cpp b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyAsmBackend.cpp --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyAsmBackend.cpp +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyAsmBackend.cpp @@ -24,6 +24,7 @@ #include "llvm/MC/MCWasmObjectWriter.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; @@ -125,5 +126,6 @@ } // end anonymous namespace MCAsmBackend *llvm::createWebAssemblyAsmBackend(const Triple &TT) { - return new WebAssemblyAsmBackend(TT.isArch64Bit(), TT.isOSEmscripten()); + return new WebAssemblyAsmBackend(TripleUtils::isArch64Bit(TT), + TT.isOSEmscripten()); } diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp @@ -15,6 +15,7 @@ #include "WebAssemblyMCAsmInfo.h" #include "WebAssemblyMCTargetDesc.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; @@ -24,7 +25,8 @@ WebAssemblyMCAsmInfo::WebAssemblyMCAsmInfo(const Triple &T, const MCTargetOptions &Options) { - CodePointerSize = CalleeSaveStackSlotSize = T.isArch64Bit() ? 8 : 4; + CodePointerSize = CalleeSaveStackSlotSize = + TripleUtils::isArch64Bit(T) ? 8 : 4; // TODO: What should MaxInstLength be? diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp --- a/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp @@ -25,6 +25,7 @@ #include "llvm/IR/Function.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetOptions.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; #define DEBUG_TYPE "wasm-reg-info" @@ -147,7 +148,7 @@ /* !hasFP */ {WebAssembly::SP32, WebAssembly::SP64}, /* hasFP */ {WebAssembly::FP32, WebAssembly::FP64}}; const WebAssemblyFrameLowering *TFI = getFrameLowering(MF); - return Regs[TFI->hasFP(MF)][TT.isArch64Bit()]; + return Regs[TFI->hasFP(MF)][TripleUtils::isArch64Bit(TT)]; } const TargetRegisterClass * diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h --- a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h @@ -20,6 +20,7 @@ #include "WebAssemblyInstrInfo.h" #include "WebAssemblySelectionDAGInfo.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" +#include "llvm/TargetParser/TripleUtils.h" #include #define GET_SUBTARGETINFO_ENUM @@ -89,7 +90,7 @@ bool useAA() const override; // Predicates used by WebAssemblyInstrInfo.td. - bool hasAddr64() const { return TargetTriple.isArch64Bit(); } + bool hasAddr64() const { return TripleUtils::isArch64Bit(TargetTriple); } bool hasSIMD128() const { return SIMDLevel >= SIMD128; } bool hasRelaxedSIMD() const { return SIMDLevel >= RelaxedSIMD; } bool hasAtomics() const { return HasAtomics; } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp --- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp @@ -30,6 +30,7 @@ #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Target/TargetOptions.h" +#include "llvm/TargetParser/TripleUtils.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Scalar/LowerAtomicPass.h" #include "llvm/Transforms/Utils.h" @@ -110,7 +111,7 @@ std::optional CM, CodeGenOpt::Level OL, bool JIT) : LLVMTargetMachine( T, - TT.isArch64Bit() + TripleUtils::isArch64Bit(TT) ? (TT.isOSEmscripten() ? "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-" "f128:64-n32:64-S128-ni:1:10:20" : "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-" diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp --- a/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp @@ -7,8 +7,8 @@ //===----------------------------------------------------------------------===// #include "MCTargetDesc/X86BaseInfo.h" -#include "MCTargetDesc/X86FixupKinds.h" #include "MCTargetDesc/X86EncodingOptimization.h" +#include "MCTargetDesc/X86FixupKinds.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/BinaryFormat/ELF.h" #include "llvm/BinaryFormat/MachO.h" @@ -34,6 +34,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; @@ -1311,7 +1312,7 @@ DarwinX86AsmBackend(const Target &T, const MCRegisterInfo &MRI, const MCSubtargetInfo &STI) : X86AsmBackend(T, STI), MRI(MRI), TT(STI.getTargetTriple()), - Is64Bit(TT.isArch64Bit()) { + Is64Bit(TripleUtils::isArch64Bit(TT)) { memset(SavedRegs, 0, sizeof(SavedRegs)); OffsetSize = Is64Bit ? 8 : 4; MoveInstrSize = Is64Bit ? 3 : 2; diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp @@ -30,6 +30,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/TargetParser/Host.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; @@ -48,7 +49,7 @@ std::string FS; // SSE2 should default to enabled in 64-bit mode, but can be turned off // explicitly. - if (TT.isArch64Bit()) + if (TripleUtils::isArch64Bit(TT)) FS = "+64bit-mode,-32bit-mode,-16bit-mode,+sse2"; else if (TT.getEnvironment() != Triple::CODE16) FS = "-64bit-mode,+32bit-mode,-16bit-mode"; diff --git a/llvm/lib/Target/X86/X86AsmPrinter.cpp b/llvm/lib/Target/X86/X86AsmPrinter.cpp --- a/llvm/lib/Target/X86/X86AsmPrinter.cpp +++ b/llvm/lib/Target/X86/X86AsmPrinter.cpp @@ -44,6 +44,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; @@ -766,7 +767,7 @@ if (FeatureFlagsAnd) { // Emit a .note.gnu.property section with the flags. - if (!TT.isArch32Bit() && !TT.isArch64Bit()) + if (!TripleUtils::isArch32Bit(TT) && !TripleUtils::isArch64Bit(TT)) llvm_unreachable("CFProtection used on invalid architecture!"); MCSection *Cur = OutStreamer->getCurrentSectionOnly(); MCSection *Nt = MMI->getContext().getELFSection( @@ -774,7 +775,7 @@ OutStreamer->switchSection(Nt); // Emitting note header. - const int WordSize = TT.isArch64Bit() && !TT.isX32() ? 8 : 4; + const int WordSize = TripleUtils::isArch64Bit(TT) && !TT.isX32() ? 8 : 4; emitAlignment(WordSize == 4 ? Align(4) : Align(8)); OutStreamer->emitIntValue(4, 4 /*size*/); // data size for "GNU\0" OutStreamer->emitIntValue(8 + WordSize, 4 /*size*/); // Elf_Prop size diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp --- a/llvm/lib/Target/X86/X86RegisterInfo.cpp +++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp @@ -35,6 +35,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; @@ -46,14 +47,14 @@ cl::desc("Enable use of a base pointer for complex stack frames")); X86RegisterInfo::X86RegisterInfo(const Triple &TT) - : X86GenRegisterInfo((TT.isArch64Bit() ? X86::RIP : X86::EIP), + : X86GenRegisterInfo((TripleUtils::isArch64Bit(TT) ? X86::RIP : X86::EIP), X86_MC::getDwarfRegFlavour(TT, false), X86_MC::getDwarfRegFlavour(TT, true), - (TT.isArch64Bit() ? X86::RIP : X86::EIP)) { + (TripleUtils::isArch64Bit(TT) ? X86::RIP : X86::EIP)) { X86_MC::initLLVMToSEHAndCVRegMapping(this); // Cache some information. - Is64Bit = TT.isArch64Bit(); + Is64Bit = TripleUtils::isArch64Bit(TT); IsWin64 = Is64Bit && TT.isOSWindows(); // Use a callee-saved register as the base pointer. These registers must diff --git a/llvm/lib/Target/X86/X86TargetMachine.cpp b/llvm/lib/Target/X86/X86TargetMachine.cpp --- a/llvm/lib/Target/X86/X86TargetMachine.cpp +++ b/llvm/lib/Target/X86/X86TargetMachine.cpp @@ -49,6 +49,7 @@ #include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetOptions.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include "llvm/Transforms/CFGuard.h" #include #include @@ -125,14 +126,14 @@ Ret += DataLayout::getManglingComponent(TT); // X86 and x32 have 32 bit pointers. - if (!TT.isArch64Bit() || TT.isX32() || TT.isOSNaCl()) + if (!TripleUtils::isArch64Bit(TT) || TT.isX32() || TT.isOSNaCl()) Ret += "-p:32:32"; // Address spaces for 32 bit signed, 32 bit unsigned, and 64 bit pointers. Ret += "-p270:32:32-p271:32:32-p272:64:64"; // Some ABIs align 64 bit integers and doubles to 64 bits, others to 32. - if (TT.isArch64Bit() || TT.isOSWindows() || TT.isOSNaCl()) + if (TripleUtils::isArch64Bit(TT) || TT.isOSWindows() || TT.isOSNaCl()) Ret += "-i64:64"; else if (TT.isOSIAMCU()) Ret += "-i64:32-f64:32"; @@ -142,7 +143,8 @@ // Some ABIs align long double to 128 bits, others to 32. if (TT.isOSNaCl() || TT.isOSIAMCU()) ; // No f80 - else if (TT.isArch64Bit() || TT.isOSDarwin() || TT.isWindowsMSVCEnvironment()) + else if (TripleUtils::isArch64Bit(TT) || TT.isOSDarwin() || + TT.isWindowsMSVCEnvironment()) Ret += "-f80:128"; else Ret += "-f80:32"; @@ -151,13 +153,13 @@ Ret += "-f128:32"; // The registers can hold 8, 16, 32 or, in x86-64, 64 bits. - if (TT.isArch64Bit()) + if (TripleUtils::isArch64Bit(TT)) Ret += "-n8:16:32:64"; else Ret += "-n8:16:32"; // The stack is aligned to 32 bits on some ABIs and 128 bits on others. - if ((!TT.isArch64Bit() && TT.isOSWindows()) || TT.isOSIAMCU()) + if ((!TripleUtils::isArch64Bit(TT) && TT.isOSWindows()) || TT.isOSIAMCU()) Ret += "-a:0:32-S32"; else Ret += "-S128"; diff --git a/llvm/lib/TargetParser/CMakeLists.txt b/llvm/lib/TargetParser/CMakeLists.txt --- a/llvm/lib/TargetParser/CMakeLists.txt +++ b/llvm/lib/TargetParser/CMakeLists.txt @@ -19,6 +19,7 @@ SubtargetFeature.cpp TargetParser.cpp Triple.cpp + TripleUtils.cpp X86TargetParser.cpp ADDITIONAL_HEADER_DIRS diff --git a/llvm/lib/TargetParser/Host.cpp b/llvm/lib/TargetParser/Host.cpp --- a/llvm/lib/TargetParser/Host.cpp +++ b/llvm/lib/TargetParser/Host.cpp @@ -19,6 +19,7 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include "llvm/TargetParser/X86TargetParser.h" #include @@ -1950,9 +1951,9 @@ PT = withHostArch(PT); #endif - if (sizeof(void *) == 8 && PT.isArch32Bit()) + if (sizeof(void *) == 8 && llvm::TripleUtils::isArch32Bit(PT)) PT = PT.get64BitArchVariant(); - if (sizeof(void *) == 4 && PT.isArch64Bit()) + if (sizeof(void *) == 4 && llvm::TripleUtils::isArch64Bit(PT)) PT = PT.get32BitArchVariant(); return PT.str(); diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp --- a/llvm/lib/TargetParser/Triple.cpp +++ b/llvm/lib/TargetParser/Triple.cpp @@ -16,6 +16,7 @@ #include "llvm/TargetParser/ARMTargetParser.h" #include "llvm/TargetParser/ARMTargetParserCommon.h" #include "llvm/TargetParser/Host.h" +#include "llvm/TargetParser/TripleUtils.h" #include #include using namespace llvm; @@ -328,6 +329,18 @@ } } +bool Triple::isAndroidVersionLT(unsigned Major) const { + assert(isAndroid() && "Not an Android triple!"); + + VersionTuple Version = getEnvironmentVersion(); + + // 64-bit targets did not exist before API level 21 (Lollipop). + if (TripleUtils::isArch64Bit(*this) && Version.getMajor() < 21) + return VersionTuple(21) < VersionTuple(Major); + + return Version < VersionTuple(Major); +} + Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) { Triple::ArchType BPFArch(parseBPFArch(Name)); return StringSwitch(Name) diff --git a/llvm/lib/TargetParser/TripleUtils.cpp b/llvm/lib/TargetParser/TripleUtils.cpp new file mode 100644 --- /dev/null +++ b/llvm/lib/TargetParser/TripleUtils.cpp @@ -0,0 +1,97 @@ +//===--- TripleUtils.cpp - Triple Utils class --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/TargetParser/TripleUtils.h" +#include "llvm/Support/ErrorHandling.h" +using namespace llvm; + +static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) { + switch (Arch) { + case llvm::Triple::UnknownArch: + return 0; + + case llvm::Triple::avr: + case llvm::Triple::msp430: + return 16; + + case llvm::Triple::aarch64_32: + case llvm::Triple::amdil: + case llvm::Triple::arc: + case llvm::Triple::arm: + case llvm::Triple::armeb: + case llvm::Triple::csky: + case llvm::Triple::dxil: + case llvm::Triple::hexagon: + case llvm::Triple::hsail: + case llvm::Triple::kalimba: + case llvm::Triple::lanai: + case llvm::Triple::le32: + case llvm::Triple::loongarch32: + case llvm::Triple::m68k: + case llvm::Triple::mips: + case llvm::Triple::mipsel: + case llvm::Triple::nvptx: + case llvm::Triple::ppc: + case llvm::Triple::ppcle: + case llvm::Triple::r600: + case llvm::Triple::renderscript32: + case llvm::Triple::riscv32: + case llvm::Triple::shave: + case llvm::Triple::sparc: + case llvm::Triple::sparcel: + case llvm::Triple::spir: + case llvm::Triple::spirv32: + case llvm::Triple::tce: + case llvm::Triple::tcele: + case llvm::Triple::thumb: + case llvm::Triple::thumbeb: + case llvm::Triple::wasm32: + case llvm::Triple::x86: + case llvm::Triple::xcore: + case llvm::Triple::xtensa: + return 32; + + case llvm::Triple::aarch64: + case llvm::Triple::aarch64_be: + case llvm::Triple::amdgcn: + case llvm::Triple::amdil64: + case llvm::Triple::bpfeb: + case llvm::Triple::bpfel: + case llvm::Triple::hsail64: + case llvm::Triple::le64: + case llvm::Triple::loongarch64: + case llvm::Triple::mips64: + case llvm::Triple::mips64el: + case llvm::Triple::nvptx64: + case llvm::Triple::ppc64: + case llvm::Triple::ppc64le: + case llvm::Triple::renderscript64: + case llvm::Triple::riscv64: + case llvm::Triple::sparcv9: + case llvm::Triple::spir64: + case llvm::Triple::spirv64: + case llvm::Triple::systemz: + case llvm::Triple::ve: + case llvm::Triple::wasm64: + case llvm::Triple::x86_64: + return 64; + } + llvm_unreachable("Invalid architecture value"); +} + +bool TripleUtils::isArch16Bit(const Triple &tripleImpl) { + return getArchPointerBitWidth(tripleImpl.getArch()) == 16; +} + +bool TripleUtils::isArch32Bit(const Triple &tripleImpl) { + return getArchPointerBitWidth(tripleImpl.getArch()) == 32; +} + +bool TripleUtils::isArch64Bit(const Triple &tripleImpl) { + return getArchPointerBitWidth(tripleImpl.getArch()) == 64; +} diff --git a/llvm/lib/XRay/InstrumentationMap.cpp b/llvm/lib/XRay/InstrumentationMap.cpp --- a/llvm/lib/XRay/InstrumentationMap.cpp +++ b/llvm/lib/XRay/InstrumentationMap.cpp @@ -24,6 +24,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/YAMLTraits.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include #include #include @@ -144,7 +145,7 @@ // Copy the instrumentation map data into the Sleds data structure. auto C = Contents.bytes_begin(); - bool Is32Bit = ObjFile.getBinary()->makeTriple().isArch32Bit(); + bool Is32Bit = TripleUtils::isArch32Bit(ObjFile.getBinary()->makeTriple()); size_t ELFSledEntrySize = Is32Bit ? 16 : 32; if ((C - Contents.bytes_end()) % ELFSledEntrySize != 0) diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp --- a/llvm/tools/lli/lli.cpp +++ b/llvm/tools/lli/lli.cpp @@ -64,6 +64,7 @@ #include "llvm/Support/WithColor.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" #include "llvm/Transforms/Instrumentation.h" #include #include @@ -388,7 +389,7 @@ // Create an empty function named "__main". Type *ReturnTy; - if (TargetTriple.isArch64Bit()) + if (TripleUtils::isArch64Bit(TargetTriple)) ReturnTy = Type::getInt64Ty(Context); else ReturnTy = Type::getInt32Ty(Context); diff --git a/llvm/tools/llvm-exegesis/lib/Mips/Target.cpp b/llvm/tools/llvm-exegesis/lib/Mips/Target.cpp --- a/llvm/tools/llvm-exegesis/lib/Mips/Target.cpp +++ b/llvm/tools/llvm-exegesis/lib/Mips/Target.cpp @@ -5,11 +5,12 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -#include "../Error.h" #include "../Target.h" +#include "../Error.h" #include "MCTargetDesc/MipsBaseInfo.h" #include "Mips.h" #include "MipsRegisterInfo.h" +#include "llvm/TargetParser/TripleUtils.h" #define GET_AVAILABLE_OPCODE_CHECKER #include "MipsGenInstrInfo.inc" @@ -135,7 +136,7 @@ } unsigned ExegesisMipsTarget::getScratchMemoryRegister(const Triple &TT) const { - return TT.isArch64Bit() ? Mips::A0_64 : Mips::A0; + return TripleUtils::isArch64Bit(TT) ? Mips::A0_64 : Mips::A0; } void ExegesisMipsTarget::fillMemoryOperands(InstructionTemplate &IT, diff --git a/llvm/tools/llvm-exegesis/lib/PowerPC/Target.cpp b/llvm/tools/llvm-exegesis/lib/PowerPC/Target.cpp --- a/llvm/tools/llvm-exegesis/lib/PowerPC/Target.cpp +++ b/llvm/tools/llvm-exegesis/lib/PowerPC/Target.cpp @@ -9,6 +9,7 @@ #include "../Target.h" #include "PPC.h" #include "PPCRegisterInfo.h" +#include "llvm/TargetParser/TripleUtils.h" #define GET_AVAILABLE_OPCODE_CHECKER #include "PPCGenInstrInfo.inc" @@ -71,7 +72,7 @@ ExegesisPowerPCTarget::getScratchMemoryRegister(const Triple &TT) const { // R13 is reserved as Thread Pointer, we won't use threading in benchmark, so // use it as scratch memory register - return TT.isArch64Bit() ? PPC::X13 : PPC::R13; + return TripleUtils::isArch64Bit(TT) ? PPC::X13 : PPC::R13; } void ExegesisPowerPCTarget::fillMemoryOperands(InstructionTemplate &IT, diff --git a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp --- a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp +++ b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp @@ -25,6 +25,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/TargetParser/Host.h" +#include "llvm/TargetParser/TripleUtils.h" #include #include @@ -846,7 +847,7 @@ } unsigned ExegesisX86Target::getScratchMemoryRegister(const Triple &TT) const { - if (!TT.isArch64Bit()) { + if (!TripleUtils::isArch64Bit(TT)) { // FIXME: This would require popping from the stack, so we would have to // add some additional setup code. return 0; @@ -855,7 +856,7 @@ } unsigned ExegesisX86Target::getLoopCounterRegister(const Triple &TT) const { - if (!TT.isArch64Bit()) { + if (!TripleUtils::isArch64Bit(TT)) { return 0; } return kLoopCounterReg; diff --git a/llvm/tools/llvm-ml/llvm-ml.cpp b/llvm/tools/llvm-ml/llvm-ml.cpp --- a/llvm/tools/llvm-ml/llvm-ml.cpp +++ b/llvm/tools/llvm-ml/llvm-ml.cpp @@ -43,6 +43,7 @@ #include "llvm/Support/ToolOutputFile.h" #include "llvm/Support/WithColor.h" #include "llvm/TargetParser/Host.h" +#include "llvm/TargetParser/TripleUtils.h" #include #include @@ -275,7 +276,7 @@ const std::string &TripleName = TheTriple.getTriple(); bool SafeSEH = InputArgs.hasArg(OPT_safeseh); - if (SafeSEH && !(TheTriple.isArch32Bit() && TheTriple.isX86())) { + if (SafeSEH && !(TripleUtils::isArch32Bit(TheTriple) && TheTriple.isX86())) { WithColor::warning() << "/safeseh applies only to 32-bit X86 platforms; ignoring.\n"; SafeSEH = false; diff --git a/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp b/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp --- a/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp +++ b/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp @@ -37,7 +37,7 @@ #include "llvm/Support/TargetSelect.h" #include "llvm/Support/Timer.h" #include "llvm/Support/raw_ostream.h" - +#include "llvm/TargetParser/TripleUtils.h" #include #include @@ -728,9 +728,9 @@ // If the -target-addr-end option wasn't explicitly passed, then set it to a // sensible default based on the target triple. if (TargetAddrEnd.getNumOccurrences() == 0) { - if (TargetTriple.isArch16Bit()) + if (llvm::TripleUtils::isArch16Bit(TargetTriple)) TargetAddrEnd = (1ULL << 16) - 1; - else if (TargetTriple.isArch32Bit()) + else if (llvm::TripleUtils::isArch32Bit(TargetTriple)) TargetAddrEnd = (1ULL << 32) - 1; // TargetAddrEnd already has a sensible default for 64-bit systems, so // there's nothing to do in the 64-bit case. diff --git a/llvm/unittests/DebugInfo/DWARF/DwarfUtils.cpp b/llvm/unittests/DebugInfo/DWARF/DwarfUtils.cpp --- a/llvm/unittests/DebugInfo/DWARF/DwarfUtils.cpp +++ b/llvm/unittests/DebugInfo/DWARF/DwarfUtils.cpp @@ -12,6 +12,7 @@ #include "llvm/Support/TargetSelect.h" #include "llvm/TargetParser/Host.h" #include "llvm/TargetParser/Triple.h" +#include "llvm/TargetParser/TripleUtils.h" using namespace llvm; @@ -40,9 +41,9 @@ // If a 32-bit/64-bit address size was specified, try to convert the triple // if it is for the wrong variant. - if (AddrSize == 8 && T.isArch32Bit()) + if (AddrSize == 8 && TripleUtils::isArch32Bit(T)) return T.get64BitArchVariant(); - if (AddrSize == 4 && T.isArch64Bit()) + if (AddrSize == 4 && TripleUtils::isArch64Bit(T)) return T.get32BitArchVariant(); return T; } diff --git a/llvm/unittests/TargetParser/CMakeLists.txt b/llvm/unittests/TargetParser/CMakeLists.txt --- a/llvm/unittests/TargetParser/CMakeLists.txt +++ b/llvm/unittests/TargetParser/CMakeLists.txt @@ -8,6 +8,7 @@ Host.cpp TargetParserTest.cpp TripleTest.cpp + TripleUtilsTest.cpp ) target_link_libraries(TargetParserTests PRIVATE LLVMTestingSupport) diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp --- a/llvm/unittests/TargetParser/TripleTest.cpp +++ b/llvm/unittests/TargetParser/TripleTest.cpp @@ -757,13 +757,11 @@ EXPECT_EQ(Triple::OpenEmbedded, T.getVendor()); EXPECT_EQ(Triple::Linux, T.getOS()); EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); - EXPECT_TRUE(T.isArch64Bit()); T = Triple("arm64_32-apple-ios"); EXPECT_EQ(Triple::aarch64_32, T.getArch()); EXPECT_EQ(Triple::IOS, T.getOS()); EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); - EXPECT_TRUE(T.isArch32Bit()); T = Triple("dxil-unknown-shadermodel-pixel"); EXPECT_EQ(Triple::dxil, T.getArch()); @@ -1094,174 +1092,32 @@ TEST(TripleTest, BitWidthPredicates) { Triple T; - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::arm); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::hexagon); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::mips); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::mips64); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); - - T.setArch(Triple::msp430); - EXPECT_TRUE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::ppc); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::ppc64); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); - - T.setArch(Triple::x86); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::x86_64); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); - - T.setArch(Triple::amdil); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::amdil64); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); - - T.setArch(Triple::hsail); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::hsail64); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); - - T.setArch(Triple::spir); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::spir64); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); T.setArch(Triple::spirv32); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); EXPECT_TRUE(T.isSPIRV()); T.setArch(Triple::spirv64); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); EXPECT_TRUE(T.isSPIRV()); - T.setArch(Triple::sparc); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::sparcel); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::sparcv9); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); - - T.setArch(Triple::wasm32); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::wasm64); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); - - T.setArch(Triple::avr); - EXPECT_TRUE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - - T.setArch(Triple::lanai); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); - T.setArch(Triple::riscv32); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); EXPECT_TRUE(T.isRISCV()); T.setArch(Triple::riscv64); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); EXPECT_TRUE(T.isRISCV()); T.setArch(Triple::csky); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); EXPECT_TRUE(T.isCSKY()); T.setArch(Triple::loongarch32); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); EXPECT_TRUE(T.isLoongArch()); EXPECT_TRUE(T.isLoongArch32()); T.setArch(Triple::loongarch64); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); EXPECT_TRUE(T.isLoongArch()); EXPECT_TRUE(T.isLoongArch64()); T.setArch(Triple::dxil); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); EXPECT_TRUE(T.isDXIL()); - - T.setArch(Triple::xtensa); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); } TEST(TripleTest, BitWidthArchVariants) { @@ -1622,9 +1478,6 @@ T = Triple("i386-apple-darwin9"); EXPECT_TRUE(T.isMacOSX()); EXPECT_FALSE(T.isiOS()); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); T.getMacOSXVersion(Version); EXPECT_EQ(VersionTuple(10, 5), Version); Version = T.getiOSVersion(); @@ -1633,9 +1486,6 @@ T = Triple("x86_64-apple-darwin9"); EXPECT_TRUE(T.isMacOSX()); EXPECT_FALSE(T.isiOS()); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); T.getMacOSXVersion(Version); EXPECT_EQ(VersionTuple(10, 5), Version); Version = T.getiOSVersion(); @@ -1644,9 +1494,6 @@ T = Triple("x86_64-apple-macosx"); EXPECT_TRUE(T.isMacOSX()); EXPECT_FALSE(T.isiOS()); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); T.getMacOSXVersion(Version); EXPECT_EQ(VersionTuple(10, 4), Version); Version = T.getiOSVersion(); @@ -1655,9 +1502,6 @@ T = Triple("x86_64-apple-macosx10.7"); EXPECT_TRUE(T.isMacOSX()); EXPECT_FALSE(T.isiOS()); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); T.getMacOSXVersion(Version); EXPECT_EQ(VersionTuple(10, 7), Version); Version = T.getiOSVersion(); @@ -1666,18 +1510,12 @@ T = Triple("x86_64-apple-macos11.0"); EXPECT_TRUE(T.isMacOSX()); EXPECT_FALSE(T.isiOS()); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); T.getMacOSXVersion(Version); EXPECT_EQ(VersionTuple(11, 0), Version); T = Triple("arm64-apple-macosx11.5.8"); EXPECT_TRUE(T.isMacOSX()); EXPECT_FALSE(T.isiOS()); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_FALSE(T.isArch32Bit()); - EXPECT_TRUE(T.isArch64Bit()); T.getMacOSXVersion(Version); EXPECT_EQ(VersionTuple(11, 5, 8), Version); @@ -1702,9 +1540,6 @@ T = Triple("armv7-apple-ios"); EXPECT_FALSE(T.isMacOSX()); EXPECT_TRUE(T.isiOS()); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); T.getMacOSXVersion(Version); EXPECT_EQ(VersionTuple(10, 4), Version); Version = T.getiOSVersion(); @@ -1713,9 +1548,6 @@ T = Triple("armv7-apple-ios7.0"); EXPECT_FALSE(T.isMacOSX()); EXPECT_TRUE(T.isiOS()); - EXPECT_FALSE(T.isArch16Bit()); - EXPECT_TRUE(T.isArch32Bit()); - EXPECT_FALSE(T.isArch64Bit()); T.getMacOSXVersion(Version); EXPECT_EQ(VersionTuple(10, 4), Version); Version = T.getiOSVersion(); diff --git a/llvm/unittests/TargetParser/TripleUtilsTest.cpp b/llvm/unittests/TargetParser/TripleUtilsTest.cpp new file mode 100644 --- /dev/null +++ b/llvm/unittests/TargetParser/TripleUtilsTest.cpp @@ -0,0 +1,218 @@ +//===----------- TripleUtils.cpp - TripleUtils unit tests +//---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/TargetParser/TripleUtils.h" +#include "gtest/gtest.h" + +using namespace llvm; + +namespace { + +TEST(TripleUtilsTest, CheckArchBitWidth) { + Triple T; + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::arm); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::hexagon); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::mips); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::mips64); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::msp430); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::ppc); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::ppc64); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::x86); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::x86_64); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::amdil); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::amdil64); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::hsail); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::hsail64); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::spir); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::spir64); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::spirv32); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::spirv64); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::sparc); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::sparcel); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::sparcv9); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::wasm32); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::wasm64); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::avr); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::lanai); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::riscv32); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::riscv64); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::csky); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::loongarch32); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::loongarch64); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::dxil); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T.setArch(Triple::xtensa); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); +} + +TEST(TripleUtilsTest, CheckArchBitWidthUsingOS) { + Triple T; + + T = Triple("i386-apple-darwin9"); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T = Triple("x86_64-apple-darwin9"); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T = Triple("x86_64-apple-macosx"); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T = Triple("x86_64-apple-macosx10.7"); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T = Triple("x86_64-apple-macos11.0"); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T = Triple("arm64-apple-macosx11.5.8"); + EXPECT_FALSE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_TRUE(llvm::TripleUtils::isArch64Bit(T)); + + T = Triple("armv7-apple-ios"); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T = Triple("armv7-apple-ios7.0"); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); + EXPECT_FALSE(llvm::TripleUtils::isArch64Bit(T)); + + T = Triple("arm64_32-apple-ios"); + EXPECT_TRUE(llvm::TripleUtils::isArch32Bit(T)); +} + +} // namespace \ No newline at end of file