diff options
author | Kevin Enderby <enderby@apple.com> | 2012-05-08 23:38:45 +0000 |
---|---|---|
committer | Kevin Enderby <enderby@apple.com> | 2012-05-08 23:38:45 +0000 |
commit | fe3d005ca52cbf7680474e8ecfab97b163e3d874 (patch) | |
tree | 1ab143c86c358f00e831539136a516c1fa6ba3c2 /llvm/lib/Support/TargetRegistry.cpp | |
parent | 40306e7e308e1e01b31acee46437326565ba80d0 (diff) | |
download | bcm5719-llvm-fe3d005ca52cbf7680474e8ecfab97b163e3d874.tar.gz bcm5719-llvm-fe3d005ca52cbf7680474e8ecfab97b163e3d874.zip |
Fix it so llvm-objdump -arch does accept x86 and x86-64 as valid arch names.
PR12731. Patch by Meador Inge!
llvm-svn: 156444
Diffstat (limited to 'llvm/lib/Support/TargetRegistry.cpp')
-rw-r--r-- | llvm/lib/Support/TargetRegistry.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/llvm/lib/Support/TargetRegistry.cpp b/llvm/lib/Support/TargetRegistry.cpp index 53c8d84e7d4..9c81327615c 100644 --- a/llvm/lib/Support/TargetRegistry.cpp +++ b/llvm/lib/Support/TargetRegistry.cpp @@ -23,6 +23,47 @@ TargetRegistry::iterator TargetRegistry::begin() { return iterator(FirstTarget); } +const Target *TargetRegistry::lookupTarget(const std::string &ArchName, + Triple &TheTriple, + std::string &Error) { + // Allocate target machine. First, check whether the user has explicitly + // specified an architecture to compile for. If so we have to look it up by + // name, because it might be a backend that has no mapping to a target triple. + const Target *TheTarget = 0; + if (!ArchName.empty()) { + for (TargetRegistry::iterator it = TargetRegistry::begin(), + ie = TargetRegistry::end(); it != ie; ++it) { + if (ArchName == it->getName()) { + TheTarget = &*it; + break; + } + } + + if (!TheTarget) { + Error = "error: invalid target '" + ArchName + "'.\n"; + return 0; + } + + // Adjust the triple to match (if known), otherwise stick with the + // given triple. + Triple::ArchType Type = Triple::getArchTypeForLLVMName(ArchName); + if (Type != Triple::UnknownArch) + TheTriple.setArch(Type); + } else { + // Get the target specific parser. + std::string TempError; + TheTarget = TargetRegistry::lookupTarget(TheTriple.getTriple(), TempError); + if (TheTarget == 0) { + Error = ": error: unable to get target for '" + + TheTriple.getTriple() + + "', see --version and --triple.\n"; + return 0; + } + } + + return TheTarget; +} + const Target *TargetRegistry::lookupTarget(const std::string &TT, std::string &Error) { // Provide special warning when no targets are initialized. |