diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2015-08-30 07:51:04 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2015-08-30 07:51:04 +0000 |
commit | 3309ef6f02854949f9d64d69f82504c362fe3fd1 (patch) | |
tree | 7513d23f4fab9ad1a95aaa1d3bb23d0a5c83e3d9 /llvm/lib/Support/TargetParser.cpp | |
parent | 2d55698ed7509c3b0bccf898e120a713b4ebcd34 (diff) | |
download | bcm5719-llvm-3309ef6f02854949f9d64d69f82504c362fe3fd1.tar.gz bcm5719-llvm-3309ef6f02854949f9d64d69f82504c362fe3fd1.zip |
Teach the target parsing framework to directly compute the length of all
of its strings when expanding the string literals from the macros, and
push all of the APIs to be StringRef instead of C-string APIs.
This (remarkably) removes a very non-trivial number of strlen calls. It
even deletes code and complexity from one of the primary users -- Clang.
llvm-svn: 246374
Diffstat (limited to 'llvm/lib/Support/TargetParser.cpp')
-rw-r--r-- | llvm/lib/Support/TargetParser.cpp | 109 |
1 files changed, 68 insertions, 41 deletions
diff --git a/llvm/lib/Support/TargetParser.cpp b/llvm/lib/Support/TargetParser.cpp index 53b713cb16b..3280035dca9 100644 --- a/llvm/lib/Support/TargetParser.cpp +++ b/llvm/lib/Support/TargetParser.cpp @@ -28,14 +28,17 @@ namespace { // FIXME: TableGen this. // The entries must appear in the order listed in ARM::FPUKind for correct indexing struct { - const char * Name; + const char *NameCStr; + size_t NameLength; ARM::FPUKind ID; ARM::FPUVersion FPUVersion; ARM::NeonSupportLevel NeonSupport; ARM::FPURestriction Restriction; + + StringRef getName() const { return StringRef(NameCStr, NameLength); } } FPUNames[] = { #define ARM_FPU(NAME, KIND, VERSION, NEON_SUPPORT, RESTRICTION) \ - { NAME, KIND, VERSION, NEON_SUPPORT, RESTRICTION }, + { NAME, sizeof(NAME) - 1, KIND, VERSION, NEON_SUPPORT, RESTRICTION }, #include "llvm/Support/ARMTargetParser.def" }; @@ -48,48 +51,72 @@ struct { // Check to see if the expectation should be changed. // FIXME: TableGen this. struct { - const char *Name; + const char *NameCStr; + size_t NameLength; ARM::ArchKind ID; - const char *CPUAttr; // CPU class in build attributes. - const char *SubArch; // Sub-Arch name. + const char *CPUAttrCStr; + size_t CPUAttrLength; + const char *SubArchCStr; + size_t SubArchLength; ARMBuildAttrs::CPUArch ArchAttr; // Arch ID in build attributes. + + StringRef getName() const { return StringRef(NameCStr, NameLength); } + + // CPU class in build attributes. + StringRef getCPUAttr() const { return StringRef(CPUAttrCStr, CPUAttrLength); } + + // Sub-Arch name. + StringRef getSubArch() const { return StringRef(SubArchCStr, SubArchLength); } } ARCHNames[] = { -#define ARM_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR) \ - { NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR }, +#define ARM_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR) \ + {NAME, sizeof(NAME) - 1, ID, CPU_ATTR, sizeof(CPU_ATTR) - 1, SUB_ARCH, \ + sizeof(SUB_ARCH) - 1, ARCH_ATTR}, #include "llvm/Support/ARMTargetParser.def" }; + // List of Arch Extension names. // FIXME: TableGen this. struct { - const char *Name; + const char *NameCStr; + size_t NameLength; unsigned ID; + + StringRef getName() const { return StringRef(NameCStr, NameLength); } } ARCHExtNames[] = { -#define ARM_ARCH_EXT_NAME(NAME, ID) { NAME, ID }, +#define ARM_ARCH_EXT_NAME(NAME, ID) { NAME, sizeof(NAME) - 1, ID }, #include "llvm/Support/ARMTargetParser.def" }; + // List of HWDiv names (use getHWDivSynonym) and which architectural // features they correspond to (use getHWDivFeatures). // FIXME: TableGen this. struct { - const char *Name; + const char *NameCStr; + size_t NameLength; unsigned ID; + + StringRef getName() const { return StringRef(NameCStr, NameLength); } } HWDivNames[] = { -#define ARM_HW_DIV_NAME(NAME, ID) { NAME, ID }, +#define ARM_HW_DIV_NAME(NAME, ID) { NAME, sizeof(NAME) - 1, ID }, #include "llvm/Support/ARMTargetParser.def" }; + // List of CPU names and their arches. // The same CPU can have multiple arches and can be default on multiple arches. // When finding the Arch for a CPU, first-found prevails. Sort them accordingly. // When this becomes table-generated, we'd probably need two tables. // FIXME: TableGen this. struct { - const char *Name; + const char *NameCStr; + size_t NameLength; ARM::ArchKind ArchID; ARM::FPUKind DefaultFPU; bool Default; // is $Name the default CPU for $ArchID ? + + StringRef getName() const { return StringRef(NameCStr, NameLength); } } CPUNames[] = { #define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT) \ - { NAME, ID, DEFAULT_FPU, IS_DEFAULT }, + { NAME, sizeof(NAME) - 1, ID, DEFAULT_FPU, IS_DEFAULT }, #include "llvm/Support/ARMTargetParser.def" }; @@ -99,10 +126,10 @@ struct { // Information by ID // ======================================================= // -const char *llvm::ARM::getFPUName(unsigned FPUKind) { +StringRef llvm::ARM::getFPUName(unsigned FPUKind) { if (FPUKind >= ARM::FK_LAST) - return nullptr; - return FPUNames[FPUKind].Name; + return StringRef(); + return FPUNames[FPUKind].getName(); } unsigned llvm::ARM::getFPUVersion(unsigned FPUKind) { @@ -125,7 +152,7 @@ unsigned llvm::ARM::getFPURestriction(unsigned FPUKind) { unsigned llvm::ARM::getDefaultFPU(StringRef CPU) { for (const auto C : CPUNames) { - if (CPU == C.Name) + if (CPU == C.getName()) return C.DefaultFPU; } return ARM::FK_INVALID; @@ -231,22 +258,22 @@ bool llvm::ARM::getFPUFeatures(unsigned FPUKind, return true; } -const char *llvm::ARM::getArchName(unsigned ArchKind) { +StringRef llvm::ARM::getArchName(unsigned ArchKind) { if (ArchKind >= ARM::AK_LAST) - return nullptr; - return ARCHNames[ArchKind].Name; + return StringRef(); + return ARCHNames[ArchKind].getName(); } -const char *llvm::ARM::getCPUAttr(unsigned ArchKind) { +StringRef llvm::ARM::getCPUAttr(unsigned ArchKind) { if (ArchKind >= ARM::AK_LAST) - return nullptr; - return ARCHNames[ArchKind].CPUAttr; + return StringRef(); + return ARCHNames[ArchKind].getCPUAttr(); } -const char *llvm::ARM::getSubArch(unsigned ArchKind) { +StringRef llvm::ARM::getSubArch(unsigned ArchKind) { if (ArchKind >= ARM::AK_LAST) - return nullptr; - return ARCHNames[ArchKind].SubArch; + return StringRef(); + return ARCHNames[ArchKind].getSubArch(); } unsigned llvm::ARM::getArchAttr(unsigned ArchKind) { @@ -255,33 +282,33 @@ unsigned llvm::ARM::getArchAttr(unsigned ArchKind) { return ARCHNames[ArchKind].ArchAttr; } -const char *llvm::ARM::getArchExtName(unsigned ArchExtKind) { +StringRef llvm::ARM::getArchExtName(unsigned ArchExtKind) { for (const auto AE : ARCHExtNames) { if (ArchExtKind == AE.ID) - return AE.Name; + return AE.getName(); } - return nullptr; + return StringRef(); } -const char *llvm::ARM::getHWDivName(unsigned HWDivKind) { +StringRef llvm::ARM::getHWDivName(unsigned HWDivKind) { for (const auto D : HWDivNames) { if (HWDivKind == D.ID) - return D.Name; + return D.getName(); } - return nullptr; + return StringRef(); } -const char *llvm::ARM::getDefaultCPU(StringRef Arch) { +StringRef llvm::ARM::getDefaultCPU(StringRef Arch) { unsigned AK = parseArch(Arch); if (AK == ARM::AK_INVALID) - return nullptr; + return StringRef(); // Look for multiple AKs to find the default for pair AK+Name. for (const auto CPU : CPUNames) { if (CPU.ArchID == AK && CPU.Default) - return CPU.Name; + return CPU.getName(); } - return nullptr; + return StringRef(); } // ======================================================= // @@ -380,7 +407,7 @@ StringRef llvm::ARM::getCanonicalArchName(StringRef Arch) { unsigned llvm::ARM::parseHWDiv(StringRef HWDiv) { StringRef Syn = getHWDivSynonym(HWDiv); for (const auto D : HWDivNames) { - if (Syn == D.Name) + if (Syn == D.getName()) return D.ID; } return ARM::AEK_INVALID; @@ -389,7 +416,7 @@ unsigned llvm::ARM::parseHWDiv(StringRef HWDiv) { unsigned llvm::ARM::parseFPU(StringRef FPU) { StringRef Syn = getFPUSynonym(FPU); for (const auto F : FPUNames) { - if (Syn == F.Name) + if (Syn == F.getName()) return F.ID; } return ARM::FK_INVALID; @@ -400,7 +427,7 @@ unsigned llvm::ARM::parseArch(StringRef Arch) { Arch = getCanonicalArchName(Arch); StringRef Syn = getArchSynonym(Arch); for (const auto A : ARCHNames) { - if (StringRef(A.Name).endswith(Syn)) + if (A.getName().endswith(Syn)) return A.ID; } return ARM::AK_INVALID; @@ -408,7 +435,7 @@ unsigned llvm::ARM::parseArch(StringRef Arch) { unsigned llvm::ARM::parseArchExt(StringRef ArchExt) { for (const auto A : ARCHExtNames) { - if (ArchExt == A.Name) + if (ArchExt == A.getName()) return A.ID; } return ARM::AEK_INVALID; @@ -416,7 +443,7 @@ unsigned llvm::ARM::parseArchExt(StringRef ArchExt) { unsigned llvm::ARM::parseCPUArch(StringRef CPU) { for (const auto C : CPUNames) { - if (CPU == C.Name) + if (CPU == C.getName()) return C.ArchID; } return ARM::AK_INVALID; |