1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

Fix PR4845: r77946 completely broke x86_64 Darwin (or any situation where the

desired triplet is a sub-target, e.g. thumbv7 vs. arm host). Reverting the
patch isn't quite right either since the previous behavior does not allow the
triplet to be overridden with -march.

llvm-svn: 80742
This commit is contained in:
Evan Cheng 2009-09-02 00:19:03 +00:00
parent 2a64f7b891
commit 24b0f4a60e

View File

@ -43,19 +43,41 @@ MAttrs("mattr",
/// selectTarget - Pick a target either via -march or by guessing the native
/// arch. Add any CPU features specified via -mcpu or -mattr.
TargetMachine *JIT::selectTarget(ModuleProvider *MP, std::string *ErrorStr) {
Triple TheTriple(sys::getHostTriple());
Module &Mod = *MP->getModule();
Triple TheTriple(Mod.getTargetTriple());
if (TheTriple.getTriple().empty())
TheTriple.setTriple(sys::getHostTriple());
// Adjust the triple to match what the user requested.
if (!MArch.empty())
TheTriple.setArch(Triple::getArchTypeForLLVMName(MArch));
const Target *TheTarget = 0;
if (!MArch.empty()) {
for (TargetRegistry::iterator it = TargetRegistry::begin(),
ie = TargetRegistry::end(); it != ie; ++it) {
if (MArch == it->getName()) {
TheTarget = &*it;
break;
}
}
std::string Error;
const Target *TheTarget =
TargetRegistry::lookupTarget(TheTriple.getTriple(), Error);
if (TheTarget == 0) {
if (ErrorStr)
*ErrorStr = Error;
return 0;
if (!TheTarget) {
errs() << "JIT: error: invalid target '" << MArch << "'.\n";
return 0;
}
// Adjust the triple to match (if known), otherwise stick with the
// module/host triple.
Triple::ArchType Type = Triple::getArchTypeForLLVMName(MArch);
if (Type != Triple::UnknownArch)
TheTriple.setArch(Type);
} else {
std::string Error;
TheTarget = TargetRegistry::lookupTarget(TheTriple.getTriple(), Error);
if (TheTarget == 0) {
if (ErrorStr)
*ErrorStr = Error;
return 0;
}
}
if (!TheTarget->hasJIT()) {