diff options
author | Bradley Smith <bradley.smith@arm.com> | 2015-11-16 11:15:22 +0000 |
---|---|---|
committer | Bradley Smith <bradley.smith@arm.com> | 2015-11-16 11:15:22 +0000 |
commit | 4adcb73933cd20268f85717950fe806f8df7ccc6 (patch) | |
tree | 46b51f4cb6c46de76e6015cc4fba2832ae20452b /llvm/lib/Support/TargetParser.cpp | |
parent | 311cc7d13331fe227bc6c7ceece71f8816379742 (diff) | |
download | bcm5719-llvm-4adcb73933cd20268f85717950fe806f8df7ccc6.tar.gz bcm5719-llvm-4adcb73933cd20268f85717950fe806f8df7ccc6.zip |
[ARM] Allow TargetParser to accurately target architectures
Instead of defaulting to an empty string, we want to default to
the CPU 'generic' in the case of no valid default CPU being found,
(as long as the architecture is actually valid).
In order to do this we add a default FPU for each architecture, as
well as falling back to architecture defaults for extensions and FPU
in the case of a generic CPU is specified.
llvm-svn: 253198
Diffstat (limited to 'llvm/lib/Support/TargetParser.cpp')
-rw-r--r-- | llvm/lib/Support/TargetParser.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/llvm/lib/Support/TargetParser.cpp b/llvm/lib/Support/TargetParser.cpp index 7a2d177a562..4dbc44690ae 100644 --- a/llvm/lib/Support/TargetParser.cpp +++ b/llvm/lib/Support/TargetParser.cpp @@ -59,6 +59,7 @@ struct { const char *SubArchCStr; size_t SubArchLength; ARMBuildAttrs::CPUArch ArchAttr; // Arch ID in build attributes. + unsigned DefaultFPU; unsigned ArchBaseExtensions; StringRef getName() const { return StringRef(NameCStr, NameLength); } @@ -69,9 +70,9 @@ struct { // Sub-Arch name. StringRef getSubArch() const { return StringRef(SubArchCStr, SubArchLength); } } ARCHNames[] = { -#define ARM_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_BASE_EXT) \ +#define ARM_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, ARCH_BASE_EXT) \ {NAME, sizeof(NAME) - 1, ID, CPU_ATTR, sizeof(CPU_ATTR) - 1, SUB_ARCH, \ - sizeof(SUB_ARCH) - 1, ARCH_ATTR, ARCH_BASE_EXT}, + sizeof(SUB_ARCH) - 1, ARCH_ATTR, ARCH_FPU, ARCH_BASE_EXT}, #include "llvm/Support/ARMTargetParser.def" }; @@ -151,7 +152,10 @@ unsigned llvm::ARM::getFPURestriction(unsigned FPUKind) { return FPUNames[FPUKind].Restriction; } -unsigned llvm::ARM::getDefaultFPU(StringRef CPU) { +unsigned llvm::ARM::getDefaultFPU(StringRef CPU, unsigned ArchKind) { + if (CPU == "generic") + return ARCHNames[ArchKind].DefaultFPU; + return StringSwitch<unsigned>(CPU) #define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \ .Case(NAME, DEFAULT_FPU) @@ -319,7 +323,10 @@ StringRef llvm::ARM::getHWDivName(unsigned HWDivKind) { return StringRef(); } -unsigned llvm::ARM::getDefaultExtensions(StringRef CPU) { +unsigned llvm::ARM::getDefaultExtensions(StringRef CPU, unsigned ArchKind) { + if (CPU == "generic") + return ARCHNames[ArchKind].ArchBaseExtensions; + for (const auto C : CPUNames) { if (CPU == C.getName()) return (ARCHNames[C.ArchID].ArchBaseExtensions | C.DefaultExtensions); @@ -337,7 +344,9 @@ StringRef llvm::ARM::getDefaultCPU(StringRef Arch) { if (CPU.ArchID == AK && CPU.Default) return CPU.getName(); } - return StringRef(); + + // If we can't find a default then target the architecture instead + return "generic"; } // ======================================================= // |