Index: include/clang/Driver/ToolChain.h =================================================================== --- include/clang/Driver/ToolChain.h +++ include/clang/Driver/ToolChain.h @@ -226,7 +226,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 @@ -64,7 +64,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 @@ -83,7 +83,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 @@ -207,7 +207,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; @@ -314,7 +315,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; } @@ -633,7 +635,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, @@ -651,7 +656,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; @@ -896,7 +902,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 { @@ -919,7 +928,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; } @@ -944,7 +954,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 { @@ -964,7 +977,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; } @@ -1007,7 +1021,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; @@ -1054,7 +1069,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; @@ -1147,7 +1165,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 @@ -2631,8 +2631,14 @@ 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(); + llvm::Triple ABITriple = + getTriple().getABIVariant(Args.getLastArgValue(options::OPT_mabi_EQ)); + if (ABITriple.getArch() != llvm::Triple::UnknownArch) + Triple = ABITriple; + + switch (Triple.getArch()) { case llvm::Triple::x86: case llvm::Triple::x86_64: case llvm::Triple::aarch64: @@ -4866,7 +4872,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 @@ -4236,7 +4236,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))