[driver] Default to arm mode when using the integrated assembler.

rdar://10125227

llvm-svn: 140179
This commit is contained in:
Chad Rosier 2011-09-20 20:44:06 +00:00
parent 2b37261fd6
commit d3a0f954a3
5 changed files with 25 additions and 13 deletions

View File

@ -171,14 +171,16 @@ public:
/// ComputeLLVMTriple - Return the LLVM target triple to use, after taking
/// command line arguments into account.
virtual std::string ComputeLLVMTriple(const ArgList &Args) const;
virtual std::string ComputeLLVMTriple(const ArgList &Args,
types::ID InputType = types::TY_INVALID) const;
/// ComputeEffectiveClangTriple - Return the Clang triple to use for this
/// target, which may take into account the command line arguments. For
/// example, on Darwin the -mmacosx-version-min= command line argument (which
/// sets the deployment target) determines the version in the triple passed to
/// Clang.
virtual std::string ComputeEffectiveClangTriple(const ArgList &Args) const;
virtual std::string ComputeEffectiveClangTriple(const ArgList &Args,
types::ID InputType = types::TY_INVALID) const;
/// configureObjCRuntime - Configure the known properties of the
/// Objective-C runtime for this platform.

View File

@ -169,7 +169,8 @@ static const char *getLLVMArchSuffixForARM(StringRef CPU) {
return "";
}
std::string ToolChain::ComputeLLVMTriple(const ArgList &Args) const {
std::string ToolChain::ComputeLLVMTriple(const ArgList &Args,
types::ID InputType) const {
switch (getTriple().getArch()) {
default:
return getTripleString();
@ -187,7 +188,10 @@ std::string ToolChain::ComputeLLVMTriple(const ArgList &Args) const {
bool ThumbDefault =
(Suffix == "v7" && getTriple().getOS() == llvm::Triple::Darwin);
std::string ArchName = "arm";
if (Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault))
// Assembly files should start in ARM mode.
if (InputType != types::TY_PP_Asm &&
Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault))
ArchName = "thumb";
Triple.setArchName(ArchName + Suffix.str());
@ -196,7 +200,8 @@ std::string ToolChain::ComputeLLVMTriple(const ArgList &Args) const {
}
}
std::string ToolChain::ComputeEffectiveClangTriple(const ArgList &Args) const {
std::string ToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
types::ID InputType) const {
// Diagnose use of Darwin OS deployment target arguments on non-Darwin.
if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ,
options::OPT_miphoneos_version_min_EQ,
@ -204,7 +209,7 @@ std::string ToolChain::ComputeEffectiveClangTriple(const ArgList &Args) const {
getDriver().Diag(diag::err_drv_clang_unsupported)
<< A->getAsString(Args);
return ComputeLLVMTriple(Args);
return ComputeLLVMTriple(Args, InputType);
}
ToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{

View File

@ -189,8 +189,9 @@ Darwin::~Darwin() {
delete it->second;
}
std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args) const {
llvm::Triple Triple(ComputeLLVMTriple(Args));
std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
types::ID InputType) const {
llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
// If the target isn't initialized (e.g., an unknown Darwin platform, return
// the default triple).
@ -958,8 +959,9 @@ bool Darwin::SupportsObjCGC() const {
}
std::string
Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args) const {
return ComputeLLVMTriple(Args);
Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args,
types::ID InputType) const {
return ComputeLLVMTriple(Args, InputType);
}
/// Generic_GCC - A tool chain using the 'gcc' command to perform

View File

@ -89,7 +89,8 @@ public:
Darwin(const HostInfo &Host, const llvm::Triple& Triple);
~Darwin();
std::string ComputeEffectiveClangTriple(const ArgList &Args) const;
std::string ComputeEffectiveClangTriple(const ArgList &Args,
types::ID InputType) const;
/// @name Darwin Specific Toolchain API
/// {
@ -292,7 +293,8 @@ public:
Darwin_Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
: Generic_GCC(Host, Triple) {}
std::string ComputeEffectiveClangTriple(const ArgList &Args) const;
std::string ComputeEffectiveClangTriple(const ArgList &Args,
types::ID InputType) const;
virtual const char *GetDefaultRelocationModel() const { return "pic"; }
};

View File

@ -2230,7 +2230,8 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
// Add the "effective" target triple.
CmdArgs.push_back("-triple");
std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
std::string TripleStr =
getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
CmdArgs.push_back(Args.MakeArgString(TripleStr));
// Set the output mode, we currently only expect to be used as a real