diff options
author | Evan Cheng <evan.cheng@apple.com> | 2011-07-26 19:02:16 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2011-07-26 19:02:16 +0000 |
commit | d6dcf39ca824f6df42de92328d08ad5d4b3d6bd2 (patch) | |
tree | 22f2250ff21a6be48185dd40dda31574f8c70ff5 | |
parent | 5acaeb512114ebf5eaf47645f7a3a8e37948fc6c (diff) | |
download | external_llvm-d6dcf39ca824f6df42de92328d08ad5d4b3d6bd2.zip external_llvm-d6dcf39ca824f6df42de92328d08ad5d4b3d6bd2.tar.gz external_llvm-d6dcf39ca824f6df42de92328d08ad5d4b3d6bd2.tar.bz2 |
Fix llvm-mc target detection code to match llc.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136115 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | tools/llvm-mc/llvm-mc.cpp | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp index 30942b4..f13229d 100644 --- a/tools/llvm-mc/llvm-mc.cpp +++ b/tools/llvm-mc/llvm-mc.cpp @@ -170,21 +170,42 @@ static const Target *GetTarget(const char *ProgName) { // Figure out the target triple. if (TripleName.empty()) TripleName = sys::getHostTriple(); + Triple TheTriple(Triple::normalize(TripleName)); + + const Target *TheTarget = 0; if (!ArchName.empty()) { - llvm::Triple TT(TripleName); - TT.setArchName(ArchName); - TripleName = TT.str(); - } + for (TargetRegistry::iterator it = TargetRegistry::begin(), + ie = TargetRegistry::end(); it != ie; ++it) { + if (ArchName == it->getName()) { + TheTarget = &*it; + break; + } + } - // Get the target specific parser. - std::string Error; - const Target *TheTarget = TargetRegistry::lookupTarget(TripleName, Error); - if (TheTarget) - return TheTarget; + if (!TheTarget) { + errs() << ProgName << ": error: invalid target '" << ArchName << "'.\n"; + return 0; + } - errs() << ProgName << ": error: unable to get target for '" << TripleName - << "', see --version and --triple.\n"; - return 0; + // Adjust the triple to match (if known), otherwise stick with the + // module/host triple. + Triple::ArchType Type = Triple::getArchTypeForLLVMName(ArchName); + if (Type != Triple::UnknownArch) + TheTriple.setArch(Type); + } else { + // Get the target specific parser. + std::string Error; + TheTarget = TargetRegistry::lookupTarget(TheTriple.getTriple(), Error); + if (TheTarget == 0) { + errs() << ProgName << ": error: unable to get target for '" + << TheTriple.getTriple() + << "', see --version and --triple.\n"; + return 0; + } + } + + TripleName = TheTriple.getTriple(); + return TheTarget; } static tool_output_file *GetOutputStream() { |