mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
13e607925f
Emulated TLS is enabled by llc flag -emulated-tls, which is passed by clang driver. When llc is called explicitly or from other drivers like LTO, missing -emulated-tls flag would generate wrong TLS code for targets that supports only this mode. Now use useEmulatedTLS() instead of Options.EmulatedTLS to decide whether emulated TLS code should be generated. Unit tests are modified to run with and without the -emulated-tls flag. Differential Revision: https://reviews.llvm.org/D42999 llvm-svn: 326341
105 lines
3.5 KiB
C++
105 lines
3.5 KiB
C++
//===-- TargetSelect.cpp - Target Chooser Code ----------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This just asks the TargetRegistry for the appropriate target to use, and
|
|
// allows the user to specify a specific one on the commandline with -march=x,
|
|
// -mcpu=y, and -mattr=a,-b,+c. Clients should initialize targets prior to
|
|
// calling selectTarget().
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ADT/Triple.h"
|
|
#include "llvm/ExecutionEngine/ExecutionEngine.h"
|
|
#include "llvm/IR/Module.h"
|
|
#include "llvm/MC/SubtargetFeature.h"
|
|
#include "llvm/Support/Host.h"
|
|
#include "llvm/Support/TargetRegistry.h"
|
|
#include "llvm/Target/TargetMachine.h"
|
|
|
|
using namespace llvm;
|
|
|
|
TargetMachine *EngineBuilder::selectTarget() {
|
|
Triple TT;
|
|
|
|
// MCJIT can generate code for remote targets, but the old JIT and Interpreter
|
|
// must use the host architecture.
|
|
if (WhichEngine != EngineKind::Interpreter && M)
|
|
TT.setTriple(M->getTargetTriple());
|
|
|
|
return selectTarget(TT, MArch, MCPU, MAttrs);
|
|
}
|
|
|
|
/// selectTarget - Pick a target either via -march or by guessing the native
|
|
/// arch. Add any CPU features specified via -mcpu or -mattr.
|
|
TargetMachine *EngineBuilder::selectTarget(const Triple &TargetTriple,
|
|
StringRef MArch,
|
|
StringRef MCPU,
|
|
const SmallVectorImpl<std::string>& MAttrs) {
|
|
Triple TheTriple(TargetTriple);
|
|
if (TheTriple.getTriple().empty())
|
|
TheTriple.setTriple(sys::getProcessTriple());
|
|
|
|
// Adjust the triple to match what the user requested.
|
|
const Target *TheTarget = nullptr;
|
|
if (!MArch.empty()) {
|
|
auto I = find_if(TargetRegistry::targets(),
|
|
[&](const Target &T) { return MArch == T.getName(); });
|
|
|
|
if (I == TargetRegistry::targets().end()) {
|
|
if (ErrorStr)
|
|
*ErrorStr = "No available targets are compatible with this -march, "
|
|
"see -version for the available targets.\n";
|
|
return nullptr;
|
|
}
|
|
|
|
TheTarget = &*I;
|
|
|
|
// Adjust the triple to match (if known), otherwise stick with the
|
|
// requested/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) {
|
|
if (ErrorStr)
|
|
*ErrorStr = Error;
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
// Package up features to be passed to target/subtarget
|
|
std::string FeaturesStr;
|
|
if (!MAttrs.empty()) {
|
|
SubtargetFeatures Features;
|
|
for (unsigned i = 0; i != MAttrs.size(); ++i)
|
|
Features.AddFeature(MAttrs[i]);
|
|
FeaturesStr = Features.getString();
|
|
}
|
|
|
|
// FIXME: non-iOS ARM FastISel is broken with MCJIT.
|
|
if (TheTriple.getArch() == Triple::arm &&
|
|
!TheTriple.isiOS() &&
|
|
OptLevel == CodeGenOpt::None) {
|
|
OptLevel = CodeGenOpt::Less;
|
|
}
|
|
|
|
// Allocate a target...
|
|
TargetMachine *Target =
|
|
TheTarget->createTargetMachine(TheTriple.getTriple(), MCPU, FeaturesStr,
|
|
Options, RelocModel, CMModel, OptLevel,
|
|
/*JIT*/ true);
|
|
Target->Options.EmulatedTLS = EmulatedTLS;
|
|
Target->Options.ExplicitEmulatedTLS = true;
|
|
|
|
assert(Target && "Could not allocate target machine!");
|
|
return Target;
|
|
}
|