Index: include/clang/Driver/ToolChain.h =================================================================== --- include/clang/Driver/ToolChain.h +++ include/clang/Driver/ToolChain.h @@ -240,7 +240,10 @@ /// IsIntegratedAssemblerDefault - Does this tool chain enable -integrated-as /// by default. - virtual bool IsIntegratedAssemblerDefault() const { return false; } + virtual bool + IsIntegratedAssemblerDefault(const llvm::opt::ArgList &Args) const { + return false; + } /// \brief Check if the toolchain should use the integrated assembler. virtual bool useIntegratedAs() const; Index: lib/Driver/MSVCToolChain.cpp =================================================================== --- lib/Driver/MSVCToolChain.cpp +++ lib/Driver/MSVCToolChain.cpp @@ -65,7 +65,7 @@ return nullptr; } -bool MSVCToolChain::IsIntegratedAssemblerDefault() const { +bool MSVCToolChain::IsIntegratedAssemblerDefault(const ArgList &Args) const { return true; } Index: lib/Driver/MinGWToolChain.cpp =================================================================== --- lib/Driver/MinGWToolChain.cpp +++ lib/Driver/MinGWToolChain.cpp @@ -96,7 +96,9 @@ getFilePaths().push_back(Base + Arch + "/sys-root/mingw/lib"); } -bool MinGW::IsIntegratedAssemblerDefault() const { return true; } +bool MinGW::IsIntegratedAssemblerDefault(const ArgList &Args) const { + return true; +} Tool *MinGW::getTool(Action::ActionClass AC) const { switch (AC) { Index: lib/Driver/ToolChain.cpp =================================================================== --- lib/Driver/ToolChain.cpp +++ lib/Driver/ToolChain.cpp @@ -84,7 +84,7 @@ bool ToolChain::useIntegratedAs() const { return Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as, - IsIntegratedAssemblerDefault()); + IsIntegratedAssemblerDefault(Args)); } const SanitizerArgs& ToolChain::getSanitizerArgs() const { Index: lib/Driver/ToolChains.h =================================================================== --- lib/Driver/ToolChains.h +++ lib/Driver/ToolChains.h @@ -221,7 +221,8 @@ bool isPICDefault() const override; bool isPIEDefault() const override; bool isPICDefaultForced() const override; - bool IsIntegratedAssemblerDefault() const override; + bool + IsIntegratedAssemblerDefault(const llvm::opt::ArgList &Args) const override; protected: Tool *getTool(Action::ActionClass AC) const override; @@ -325,7 +326,8 @@ // expected to use /usr/include/Block.h. return true; } - bool IsIntegratedAssemblerDefault() const override { + bool + IsIntegratedAssemblerDefault(const llvm::opt::ArgList &Args) const override { // Default integrated assembler to on for Apple's MachO targets. return true; } @@ -645,7 +647,10 @@ Solaris(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args); - bool IsIntegratedAssemblerDefault() const override { return true; } + bool + IsIntegratedAssemblerDefault(const llvm::opt::ArgList &Args) const override { + return true; + } void AddClangCXXStdlibIncludeArgs( const llvm::opt::ArgList &DriverArgs, @@ -663,7 +668,8 @@ MinGW(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args); - bool IsIntegratedAssemblerDefault() const override; + bool + IsIntegratedAssemblerDefault(const llvm::opt::ArgList &Args) const override; bool IsUnwindTablesDefault() const override; bool isPICDefault() const override; bool isPIEDefault() const override; @@ -920,7 +926,10 @@ LanaiToolChain(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args) : Generic_ELF(D, Triple, Args) {} - bool IsIntegratedAssemblerDefault() const override { return true; } + bool + IsIntegratedAssemblerDefault(const llvm::opt::ArgList &Args) const override { + return true; + } }; class LLVM_LIBRARY_VISIBILITY HexagonToolChain : public Linux { @@ -943,7 +952,8 @@ CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; StringRef GetGCCLibAndIncVersion() const { return GCCLibAndIncVersion.Text; } - bool IsIntegratedAssemblerDefault() const override { + bool + IsIntegratedAssemblerDefault(const llvm::opt::ArgList &Args) const override { return true; } @@ -968,7 +978,10 @@ AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args); unsigned GetDefaultDwarfVersion() const override { return 2; } - bool IsIntegratedAssemblerDefault() const override { return true; } + bool + IsIntegratedAssemblerDefault(const llvm::opt::ArgList &Args) const override { + return true; + } }; class LLVM_LIBRARY_VISIBILITY NaClToolChain : public Generic_ELF { @@ -988,7 +1001,8 @@ void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override; - bool IsIntegratedAssemblerDefault() const override { + bool + IsIntegratedAssemblerDefault(const llvm::opt::ArgList &Args) const override { return getTriple().getArch() == llvm::Triple::mipsel; } @@ -1031,7 +1045,8 @@ TranslateArgs(const llvm::opt::DerivedArgList &Args, const char *BoundArch) const override; - bool IsIntegratedAssemblerDefault() const override; + bool + IsIntegratedAssemblerDefault(const llvm::opt::ArgList &Args) const override; bool IsUnwindTablesDefault() const override; bool isPICDefault() const override; bool isPIEDefault() const override; @@ -1078,7 +1093,10 @@ CrossWindowsToolChain(const Driver &D, const llvm::Triple &T, const llvm::opt::ArgList &Args); - bool IsIntegratedAssemblerDefault() const override { return true; } + bool + IsIntegratedAssemblerDefault(const llvm::opt::ArgList &Args) const override { + return true; + } bool IsUnwindTablesDefault() const override; bool isPICDefault() const override; bool isPIEDefault() const override; @@ -1171,7 +1189,8 @@ bool isPICDefault() const override; bool isPIEDefault() const override; bool isPICDefaultForced() const override; - bool IsIntegratedAssemblerDefault() const override; + bool + IsIntegratedAssemblerDefault(const llvm::opt::ArgList &Args) const override; bool hasBlocksRuntime() const override; bool SupportsObjCGC() const override; bool SupportsProfiling() const override; Index: lib/Driver/ToolChains.cpp =================================================================== --- lib/Driver/ToolChains.cpp +++ lib/Driver/ToolChains.cpp @@ -2747,8 +2747,10 @@ return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows(); } -bool Generic_GCC::IsIntegratedAssemblerDefault() const { - switch (getTriple().getArch()) { +bool Generic_GCC::IsIntegratedAssemblerDefault(const ArgList &Args) const { + llvm::Triple Triple = getTriple(); + + switch (Triple.getArch()) { case llvm::Triple::x86: case llvm::Triple::x86_64: case llvm::Triple::aarch64: @@ -2763,9 +2765,28 @@ case llvm::Triple::ppc64: case llvm::Triple::ppc64le: case llvm::Triple::systemz: + return true; case llvm::Triple::mips: - case llvm::Triple::mipsel: + case llvm::Triple::mipsel: { + // Convert a GNU style Mips ABI name to the name + // accepted by LLVM Mips backend. + llvm::StringRef ABIName = Args.getLastArgValue(options::OPT_mabi_EQ); + ABIName = llvm::StringSwitch(ABIName) + .Case("32", "o32") + .Case("64", "n64") + .Default(ABIName); + llvm::Triple ABITriple; + std::tie(ABITriple, ABIName) = getTriple().getABIVariant(ABIName); + if (ABITriple.getArch() != llvm::Triple::UnknownArch) + Triple = ABITriple; + if (Triple.getEnvironment() == llvm::Triple::ABIN32 || + Triple.getEnvironment() == llvm::Triple::ABI64 || + Triple.getEnvironment() == llvm::Triple::GNUABIN32 || + Triple.getEnvironment() == llvm::Triple::GNUABI64 || + Triple.getEnvironment() == llvm::Triple::AndroidABI64) + return false; return true; + } default: return false; } @@ -5054,7 +5075,9 @@ bool WebAssembly::isPICDefaultForced() const { return false; } -bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; } +bool WebAssembly::IsIntegratedAssemblerDefault(const ArgList &Args) const { + return true; +} // TODO: Support Objective C stuff. bool WebAssembly::SupportsObjCGC() const { return false; } Index: lib/Driver/Tools.cpp =================================================================== --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -4384,7 +4384,7 @@ // Decide whether to use verbose asm. Verbose assembly is the default on // toolchains which have the integrated assembler on by default. bool IsIntegratedAssemblerDefault = - getToolChain().IsIntegratedAssemblerDefault(); + getToolChain().IsIntegratedAssemblerDefault(Args); if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm, IsIntegratedAssemblerDefault) || Args.hasArg(options::OPT_dA)) Index: test/Driver/mips-integrated-as.s =================================================================== --- test/Driver/mips-integrated-as.s +++ test/Driver/mips-integrated-as.s @@ -1,3 +1,5 @@ +// RUN: %clang -target mips-linux-gnu -### -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=ABI-O32 %s // RUN: %clang -target mips-linux-gnu -### -fintegrated-as -c %s 2>&1 | \ // RUN: FileCheck -check-prefix=ABI-O32 %s // RUN: %clang -target mips-linux-gnu -### -fintegrated-as -c %s -mabi=32 2>&1 | \ @@ -293,3 +295,13 @@ // IMG-SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+single-float" // IMG-SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+fpxx" // IMG-SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+nooddspreg" + +// RUN: %clang -target mips-linux-gnu -### -c %s -mips64 -mabi=n32 2>&1 | \ +// RUN: FileCheck -check-prefix=GAS %s +// RUN: %clang -target mips64-linux-gnu -### -c %s -mabi=n32 2>&1 | \ +// RUN: FileCheck -check-prefix=GAS %s +// RUN: %clang -target mips-linux-gnu -### -c %s -mips64 -mabi=64 2>&1 | \ +// RUN: FileCheck -check-prefix=GAS %s +// RUN: %clang -target mips64-linux-gnu -### -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=GAS %s +// GAS-NOT: -cc1as