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,7 +3844,7 @@ 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()) return Arch32Bit; 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 @@ -458,7 +458,9 @@ /// 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. 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,28 @@ +//===-- 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 llvm::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/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/TripleUtils.cpp b/llvm/lib/TargetParser/TripleUtils.cpp new file mode 100644 --- /dev/null +++ b/llvm/lib/TargetParser/TripleUtils.cpp @@ -0,0 +1,89 @@ +//===--- 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 llvm::Triple &tripleImpl) { + return getArchPointerBitWidth(tripleImpl.getArch()) == 16; +} 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,7 +728,7 @@ // 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()) TargetAddrEnd = (1ULL << 32) - 1; 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 @@ -1094,172 +1094,140 @@ 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()); } @@ -1622,7 +1590,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); @@ -1633,7 +1600,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); @@ -1644,7 +1610,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); @@ -1655,7 +1620,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); @@ -1666,7 +1630,6 @@ 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); @@ -1675,7 +1638,6 @@ 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); @@ -1702,7 +1664,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); @@ -1713,7 +1674,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); 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,116 @@ +//===----------- 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::isArch16Bit(T)); + + T.setArch(Triple::arm); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::hexagon); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::mips); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::mips64); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::msp430); + EXPECT_TRUE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::ppc); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::ppc64); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::x86); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::x86_64); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::amdil); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::amdil64); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::hsail); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::hsail64); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::spir); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::spir64); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::spirv32); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::spirv64); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::sparc); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::sparcel); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + ; + + T.setArch(Triple::sparcv9); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::wasm32); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::wasm64); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::avr); + EXPECT_TRUE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::lanai); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::riscv32); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::riscv64); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::csky); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::loongarch32); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::loongarch64); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::dxil); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); + + T.setArch(Triple::xtensa); + EXPECT_FALSE(llvm::TripleUtils::isArch16Bit(T)); +} + +} // namespace \ No newline at end of file