From 8977d087c693fd581db82bcff134d12da0f48bd3 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Sun, 26 Jul 2009 05:03:33 +0000 Subject: Factor commonality in triple match routines into helper template for registering classes, and migrate existing targets over. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77126 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetRegistry.h | 24 ++++++------- lib/Target/ARM/TargetInfo/ARMTargetInfo.cpp | 34 +++---------------- lib/Target/Alpha/TargetInfo/AlphaTargetInfo.cpp | 15 ++------- .../CBackend/TargetInfo/CBackendTargetInfo.cpp | 10 +----- .../CellSPU/TargetInfo/CellSPUTargetInfo.cpp | 16 ++------- lib/Target/MSP430/TargetInfo/MSP430TargetInfo.cpp | 14 ++------ lib/Target/Mips/TargetInfo/MipsTargetInfo.cpp | 39 ++-------------------- lib/Target/PIC16/TargetInfo/PIC16TargetInfo.cpp | 20 ++--------- .../PowerPC/TargetInfo/PowerPCTargetInfo.cpp | 32 +++--------------- lib/Target/Sparc/TargetInfo/SparcTargetInfo.cpp | 11 +----- .../SystemZ/TargetInfo/SystemZTargetInfo.cpp | 13 +------- lib/Target/X86/TargetInfo/X86TargetInfo.cpp | 34 +++---------------- lib/Target/XCore/TargetInfo/XCoreTargetInfo.cpp | 11 +----- tools/llvm-mc/llvm-mc.cpp | 6 ++-- 14 files changed, 46 insertions(+), 233 deletions(-) diff --git a/include/llvm/Target/TargetRegistry.h b/include/llvm/Target/TargetRegistry.h index a216186645..9c651f2ae1 100644 --- a/include/llvm/Target/TargetRegistry.h +++ b/include/llvm/Target/TargetRegistry.h @@ -19,6 +19,7 @@ #ifndef LLVM_TARGET_TARGETREGISTRY_H #define LLVM_TARGET_TARGETREGISTRY_H +#include "llvm/ADT/Triple.h" // FIXME: We shouldn't need this header, but we need it until there is a // different interface to get the TargetAsmInfo. #include "llvm/Target/TargetMachine.h" @@ -281,23 +282,22 @@ namespace llvm { /// /// Target TheFooTarget; // The global target instance. /// - /// namespace { - /// struct FooInfo { - /// static const bool HasJIT = ...; - /// - /// static unsigned getTripleMatchQuality(const std::string &) { ... } - /// }; - /// } - /// /// extern "C" void LLVMInitializeFooTargetInfo() { - /// RegisterTarget X(TheFooTarget, "foo", "Foo description"); + /// RegisterTarget X(TheFooTarget, "foo", "Foo description"); /// } - template + template struct RegisterTarget { RegisterTarget(Target &T, const char *Name, const char *Desc) { TargetRegistry::RegisterTarget(T, Name, Desc, - &TargetInfoImpl::getTripleMatchQuality, - TargetInfoImpl::HasJIT); + &getTripleMatchQuality, + HasJIT); + } + + static unsigned getTripleMatchQuality(const std::string &TT) { + if (Triple(TT.c_str()).getArch() == TargetArchType) + return 20; + return 0; } }; diff --git a/lib/Target/ARM/TargetInfo/ARMTargetInfo.cpp b/lib/Target/ARM/TargetInfo/ARMTargetInfo.cpp index a975a1c6e9..163a0a9875 100644 --- a/lib/Target/ARM/TargetInfo/ARMTargetInfo.cpp +++ b/lib/Target/ARM/TargetInfo/ARMTargetInfo.cpp @@ -12,36 +12,12 @@ #include "llvm/Target/TargetRegistry.h" using namespace llvm; -Target llvm::TheARMTarget; - -static unsigned ARM_TripleMatchQuality(const std::string &TT) { - // Match arm-foo-bar, as well as things like armv5blah-* - if (TT.size() >= 4 && - (TT.substr(0, 4) == "arm-" || TT.substr(0, 4) == "armv")) - return 20; - - return 0; -} - -Target llvm::TheThumbTarget; - -static unsigned Thumb_TripleMatchQuality(const std::string &TT) { - // Match thumb-foo-bar, as well as things like thumbv5blah-* - if (TT.size() >= 6 && - (TT.substr(0, 6) == "thumb-" || TT.substr(0, 6) == "thumbv")) - return 20; - - return 0; -} +Target llvm::TheARMTarget, llvm::TheThumbTarget; extern "C" void LLVMInitializeARMTargetInfo() { - TargetRegistry::RegisterTarget(TheARMTarget, "arm", - "ARM", - &ARM_TripleMatchQuality, - /*HasJIT=*/true); + RegisterTarget + X(TheARMTarget, "arm", "ARM"); - TargetRegistry::RegisterTarget(TheThumbTarget, "thumb", - "Thumb", - &Thumb_TripleMatchQuality, - /*HasJIT=*/true); + RegisterTarget + Y(TheThumbTarget, "thumb", "Thumb"); } diff --git a/lib/Target/Alpha/TargetInfo/AlphaTargetInfo.cpp b/lib/Target/Alpha/TargetInfo/AlphaTargetInfo.cpp index 1e4db94ef0..f7099b9ae9 100644 --- a/lib/Target/Alpha/TargetInfo/AlphaTargetInfo.cpp +++ b/lib/Target/Alpha/TargetInfo/AlphaTargetInfo.cpp @@ -14,18 +14,7 @@ using namespace llvm; llvm::Target llvm::TheAlphaTarget; -static unsigned Alpha_TripleMatchQuality(const std::string &TT) { - // We strongly match "alpha*". - if (TT.size() >= 5 && TT[0] == 'a' && TT[1] == 'l' && TT[2] == 'p' && - TT[3] == 'h' && TT[4] == 'a') - return 20; - - return 0; -} - extern "C" void LLVMInitializeAlphaTargetInfo() { - TargetRegistry::RegisterTarget(TheAlphaTarget, "alpha", - "Alpha [experimental]", - &Alpha_TripleMatchQuality, - /*HasJIT=*/true); + RegisterTarget + X(TheAlphaTarget, "alpha", "Alpha [experimental]"); } diff --git a/lib/Target/CBackend/TargetInfo/CBackendTargetInfo.cpp b/lib/Target/CBackend/TargetInfo/CBackendTargetInfo.cpp index c30c84d069..f7e8ff2548 100644 --- a/lib/Target/CBackend/TargetInfo/CBackendTargetInfo.cpp +++ b/lib/Target/CBackend/TargetInfo/CBackendTargetInfo.cpp @@ -14,14 +14,6 @@ using namespace llvm; Target llvm::TheCBackendTarget; -static unsigned CBackend_TripleMatchQuality(const std::string &TT) { - // This class always works, but must be requested explicitly on - // llc command line. - return 0; -} - extern "C" void LLVMInitializeCBackendTargetInfo() { - TargetRegistry::RegisterTarget(TheCBackendTarget, "c", - "C backend", - &CBackend_TripleMatchQuality); + RegisterTarget<> X(TheCBackendTarget, "c", "C backend"); } diff --git a/lib/Target/CellSPU/TargetInfo/CellSPUTargetInfo.cpp b/lib/Target/CellSPU/TargetInfo/CellSPUTargetInfo.cpp index ea3b8f9059..049ea236e9 100644 --- a/lib/Target/CellSPU/TargetInfo/CellSPUTargetInfo.cpp +++ b/lib/Target/CellSPU/TargetInfo/CellSPUTargetInfo.cpp @@ -14,19 +14,7 @@ using namespace llvm; Target llvm::TheCellSPUTarget; -static unsigned CellSPU_TripleMatchQuality(const std::string &TT) { - // We strongly match "spu-*" or "cellspu-*". - if ((TT.size() == 3 && std::string(TT.begin(), TT.begin()+3) == "spu") || - (TT.size() == 7 && std::string(TT.begin(), TT.begin()+7) == "cellspu") || - (TT.size() >= 4 && std::string(TT.begin(), TT.begin()+4) == "spu-") || - (TT.size() >= 8 && std::string(TT.begin(), TT.begin()+8) == "cellspu-")) - return 20; - - return 0; -} - extern "C" void LLVMInitializeCellSPUTargetInfo() { - TargetRegistry::RegisterTarget(TheCellSPUTarget, "cellspu", - "STI CBEA Cell SPU [experimental]", - &CellSPU_TripleMatchQuality); + RegisterTarget + X(TheCellSPUTarget, "cellspu", "STI CBEA Cell SPU [experimental]"); } diff --git a/lib/Target/MSP430/TargetInfo/MSP430TargetInfo.cpp b/lib/Target/MSP430/TargetInfo/MSP430TargetInfo.cpp index e2a71238d9..f9ca5c49c9 100644 --- a/lib/Target/MSP430/TargetInfo/MSP430TargetInfo.cpp +++ b/lib/Target/MSP430/TargetInfo/MSP430TargetInfo.cpp @@ -14,17 +14,7 @@ using namespace llvm; Target llvm::TheMSP430Target; -static unsigned MSP430_TripleMatchQuality(const std::string &TT) { - // We strongly match msp430 - if (TT.size() >= 6 && TT[0] == 'm' && TT[1] == 's' && TT[2] == 'p' && - TT[3] == '4' && TT[4] == '3' && TT[5] == '0') - return 20; - - return 0; -} - extern "C" void LLVMInitializeMSP430TargetInfo() { - TargetRegistry::RegisterTarget(TheMSP430Target, "msp430", - "MSP430 [experimental]", - &MSP430_TripleMatchQuality); + RegisterTarget + X(TheMSP430Target, "msp430", "MSP430 [experimental]"); } diff --git a/lib/Target/Mips/TargetInfo/MipsTargetInfo.cpp b/lib/Target/Mips/TargetInfo/MipsTargetInfo.cpp index 4f07545603..cc3d61e4e7 100644 --- a/lib/Target/Mips/TargetInfo/MipsTargetInfo.cpp +++ b/lib/Target/Mips/TargetInfo/MipsTargetInfo.cpp @@ -12,43 +12,10 @@ #include "llvm/Target/TargetRegistry.h" using namespace llvm; -Target llvm::TheMipsTarget; - -static unsigned Mips_TripleMatchQuality(const std::string &TT) { - // We strongly match "mips*-*". - if (TT.size() >= 5 && std::string(TT.begin(), TT.begin()+5) == "mips-") - return 20; - - if (TT.size() >= 13 && std::string(TT.begin(), - TT.begin()+13) == "mipsallegrex-") - return 20; - - return 0; -} - -Target llvm::TheMipselTarget; - -static unsigned Mipsel_TripleMatchQuality(const std::string &TT) { - // We strongly match "mips*el-*". - if (TT.size() >= 7 && std::string(TT.begin(), TT.begin()+7) == "mipsel-") - return 20; - - if (TT.size() >= 15 && std::string(TT.begin(), - TT.begin()+15) == "mipsallegrexel-") - return 20; - - if (TT.size() == 3 && std::string(TT.begin(), TT.begin()+3) == "psp") - return 20; - - return 0; -} +Target llvm::TheMipsTarget, llvm::TheMipselTarget; extern "C" void LLVMInitializeMipsTargetInfo() { - TargetRegistry::RegisterTarget(TheMipsTarget, "mips", - "Mips", - &Mips_TripleMatchQuality); + RegisterTarget X(TheMipsTarget, "mips", "Mips"); - TargetRegistry::RegisterTarget(TheMipselTarget, "mipsel", - "Mipsel", - &Mipsel_TripleMatchQuality); + RegisterTarget Y(TheMipselTarget, "mipsel", "Mipsel"); } diff --git a/lib/Target/PIC16/TargetInfo/PIC16TargetInfo.cpp b/lib/Target/PIC16/TargetInfo/PIC16TargetInfo.cpp index 87341b20e2..46cc81967e 100644 --- a/lib/Target/PIC16/TargetInfo/PIC16TargetInfo.cpp +++ b/lib/Target/PIC16/TargetInfo/PIC16TargetInfo.cpp @@ -12,24 +12,10 @@ #include "llvm/Target/TargetRegistry.h" using namespace llvm; -Target llvm::ThePIC16Target; - -static unsigned PIC16_TripleMatchQuality(const std::string &TT) { - return 0; -} - -Target llvm::TheCooperTarget; - -static unsigned Cooper_TripleMatchQuality(const std::string &TT) { - return 0; -} +Target llvm::ThePIC16Target, llvm::TheCooperTarget; extern "C" void LLVMInitializePIC16TargetInfo() { - TargetRegistry::RegisterTarget(ThePIC16Target, "pic16", - "PIC16 14-bit [experimental]", - &PIC16_TripleMatchQuality); + RegisterTarget<> X(ThePIC16Target, "pic16", "PIC16 14-bit [experimental]"); - TargetRegistry::RegisterTarget(TheCooperTarget, "cooper", - "PIC16 Cooper [experimental]", - &Cooper_TripleMatchQuality); + RegisterTarget<> Y(TheCooperTarget, "cooper", "PIC16 Cooper [experimental]"); } diff --git a/lib/Target/PowerPC/TargetInfo/PowerPCTargetInfo.cpp b/lib/Target/PowerPC/TargetInfo/PowerPCTargetInfo.cpp index 7fc73c139a..ad607d0ade 100644 --- a/lib/Target/PowerPC/TargetInfo/PowerPCTargetInfo.cpp +++ b/lib/Target/PowerPC/TargetInfo/PowerPCTargetInfo.cpp @@ -12,34 +12,12 @@ #include "llvm/Target/TargetRegistry.h" using namespace llvm; -Target llvm::ThePPC32Target; - -static unsigned PPC32_TripleMatchQuality(const std::string &TT) { - // We strongly match "powerpc-*". - if (TT.size() >= 8 && std::string(TT.begin(), TT.begin()+8) == "powerpc-") - return 20; - - return 0; -} - -Target llvm::ThePPC64Target; - -static unsigned PPC64_TripleMatchQuality(const std::string &TT) { - // We strongly match "powerpc64-*". - if (TT.size() >= 10 && std::string(TT.begin(), TT.begin()+10) == "powerpc64-") - return 20; - - return 0; -} +Target llvm::ThePPC32Target, llvm::ThePPC64Target; extern "C" void LLVMInitializePowerPCTargetInfo() { - TargetRegistry::RegisterTarget(ThePPC32Target, "ppc32", - "PowerPC 32", - &PPC32_TripleMatchQuality, - /*HasJIT=*/true); + RegisterTarget + X(ThePPC32Target, "ppc32", "PowerPC 32"); - TargetRegistry::RegisterTarget(ThePPC64Target, "ppc64", - "PowerPC 64", - &PPC64_TripleMatchQuality, - /*HasJIT=*/true); + RegisterTarget + Y(ThePPC64Target, "ppc64", "PowerPC 64"); } diff --git a/lib/Target/Sparc/TargetInfo/SparcTargetInfo.cpp b/lib/Target/Sparc/TargetInfo/SparcTargetInfo.cpp index 451a86419b..75200ab3eb 100644 --- a/lib/Target/Sparc/TargetInfo/SparcTargetInfo.cpp +++ b/lib/Target/Sparc/TargetInfo/SparcTargetInfo.cpp @@ -14,15 +14,6 @@ using namespace llvm; Target llvm::TheSparcTarget; -static unsigned Sparc_TripleMatchQuality(const std::string &TT) { - if (TT.size() >= 6 && std::string(TT.begin(), TT.begin()+6) == "sparc-") - return 20; - - return 0; -} - extern "C" void LLVMInitializeSparcTargetInfo() { - TargetRegistry::RegisterTarget(TheSparcTarget, "sparc", - "Sparc", - &Sparc_TripleMatchQuality); + RegisterTarget (TheSparcTarget, "sparc", "Sparc"); } diff --git a/lib/Target/SystemZ/TargetInfo/SystemZTargetInfo.cpp b/lib/Target/SystemZ/TargetInfo/SystemZTargetInfo.cpp index e063a911d0..8272b11882 100644 --- a/lib/Target/SystemZ/TargetInfo/SystemZTargetInfo.cpp +++ b/lib/Target/SystemZ/TargetInfo/SystemZTargetInfo.cpp @@ -14,17 +14,6 @@ using namespace llvm; Target llvm::TheSystemZTarget; -static unsigned SystemZ_TripleMatchQuality(const std::string &TT) { - // We strongly match s390x - if (TT.size() >= 5 && TT[0] == 's' && TT[1] == '3' && TT[2] == '9' && - TT[3] == '0' && TT[4] == 'x') - return 20; - - return 0; -} - extern "C" void LLVMInitializeSystemZTargetInfo() { - TargetRegistry::RegisterTarget(TheSystemZTarget, "systemz", - "SystemZ", - &SystemZ_TripleMatchQuality); + RegisterTarget X(TheSystemZTarget, "systemz", "SystemZ"); } diff --git a/lib/Target/X86/TargetInfo/X86TargetInfo.cpp b/lib/Target/X86/TargetInfo/X86TargetInfo.cpp index d371bced71..08d4d84f8a 100644 --- a/lib/Target/X86/TargetInfo/X86TargetInfo.cpp +++ b/lib/Target/X86/TargetInfo/X86TargetInfo.cpp @@ -12,36 +12,12 @@ #include "llvm/Target/TargetRegistry.h" using namespace llvm; -Target llvm::TheX86_32Target; - -static unsigned X86_32_TripleMatchQuality(const std::string &TT) { - // We strongly match "i[3-9]86-*". - if (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' && - TT[4] == '-' && TT[1] - '3' < 6) - return 20; - - return 0; -} - -Target llvm::TheX86_64Target; - -static unsigned X86_64_TripleMatchQuality(const std::string &TT) { - // We strongly match "x86_64-*". - if (TT.size() >= 7 && TT[0] == 'x' && TT[1] == '8' && TT[2] == '6' && - TT[3] == '_' && TT[4] == '6' && TT[5] == '4' && TT[6] == '-') - return 20; - - return 0; -} +Target llvm::TheX86_32Target, llvm::TheX86_64Target; extern "C" void LLVMInitializeX86TargetInfo() { - TargetRegistry::RegisterTarget(TheX86_32Target, "x86", - "32-bit X86: Pentium-Pro and above", - &X86_32_TripleMatchQuality, - /*HasJIT=*/true); + RegisterTarget + X(TheX86_32Target, "x86", "32-bit X86: Pentium-Pro and above"); - TargetRegistry::RegisterTarget(TheX86_64Target, "x86-64", - "64-bit X86: EM64T and AMD64", - &X86_64_TripleMatchQuality, - /*HasJIT=*/true); + RegisterTarget + Y(TheX86_64Target, "x86-64", "64-bit X86: EM64T and AMD64"); } diff --git a/lib/Target/XCore/TargetInfo/XCoreTargetInfo.cpp b/lib/Target/XCore/TargetInfo/XCoreTargetInfo.cpp index 17acb3266f..7aa8965c4a 100644 --- a/lib/Target/XCore/TargetInfo/XCoreTargetInfo.cpp +++ b/lib/Target/XCore/TargetInfo/XCoreTargetInfo.cpp @@ -14,15 +14,6 @@ using namespace llvm; Target llvm::TheXCoreTarget; -static unsigned XCore_TripleMatchQuality(const std::string &TT) { - if (TT.size() >= 6 && std::string(TT.begin(), TT.begin()+6) == "xcore-") - return 20; - - return 0; -} - extern "C" void LLVMInitializeXCoreTargetInfo() { - TargetRegistry::RegisterTarget(TheXCoreTarget, "xcore", - "XCore", - &XCore_TripleMatchQuality); + RegisterTarget X(TheXCoreTarget, "xcore", "XCore"); } diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp index 5212ab1936..dcbe47454a 100644 --- a/tools/llvm-mc/llvm-mc.cpp +++ b/tools/llvm-mc/llvm-mc.cpp @@ -39,7 +39,7 @@ IncludeDirs("I", cl::desc("Directory of include files"), cl::value_desc("directory"), cl::Prefix); static cl::opt -Triple("triple", cl::desc("Target triple to assemble for," +TripleName("triple", cl::desc("Target triple to assemble for," "see -version for available targets"), cl::init(LLVM_HOSTTRIPLE)); @@ -147,12 +147,12 @@ static int AssembleInput(const char *ProgName) { // Get the target specific parser. std::string Error; const Target *TheTarget = - TargetRegistry::lookupTarget(Triple, + TargetRegistry::lookupTarget(TripleName, /*FallbackToHost=*/true, /*RequireJIT=*/false, Error); if (TheTarget == 0) { - errs() << ProgName << ": error: unable to get target for '" << Triple + errs() << ProgName << ": error: unable to get target for '" << TripleName << "', see --version and --triple.\n"; return 1; } -- cgit v1.2.3