diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 8ec4cf853fed28..882ae40086cea0 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -380,6 +380,10 @@ class ToolChain { /// Check if the toolchain should use the integrated assembler. virtual bool useIntegratedAs() const; + /// Check if the toolchain should use AsmParser to parse inlineAsm when + /// integrated assembler is not default. + virtual bool parseInlineAsmUsingAsmParser() const { return false; } + /// IsMathErrnoDefault - Does this tool chain use -fmath-errno by default. virtual bool IsMathErrnoDefault() const { return true; } diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp index ca3fc5af768950..3000b8416adfd0 100644 --- a/clang/lib/Driver/ToolChains/AIX.cpp +++ b/clang/lib/Driver/ToolChains/AIX.cpp @@ -176,6 +176,8 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA, /// AIX - AIX tool chain which can call as(1) and ld(1) directly. AIX::AIX(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : ToolChain(D, Triple, Args) { + ParseInlineAsmUsingAsmParser = Args.hasFlag( + options::OPT_fintegrated_as, options::OPT_fno_integrated_as, true); getLibraryPaths().push_back(getDriver().SysRoot + "/usr/lib"); } diff --git a/clang/lib/Driver/ToolChains/AIX.h b/clang/lib/Driver/ToolChains/AIX.h index 1534af950c88f2..d1ec6d10fb3a09 100644 --- a/clang/lib/Driver/ToolChains/AIX.h +++ b/clang/lib/Driver/ToolChains/AIX.h @@ -59,6 +59,9 @@ class LLVM_LIBRARY_VISIBILITY AIX : public ToolChain { AIX(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args); + bool parseInlineAsmUsingAsmParser() const override { + return ParseInlineAsmUsingAsmParser; + } bool isPICDefault() const override { return true; } bool isPIEDefault() const override { return false; } bool isPICDefaultForced() const override { return true; } @@ -87,6 +90,7 @@ class LLVM_LIBRARY_VISIBILITY AIX : public ToolChain { private: llvm::StringRef GetHeaderSysroot(const llvm::opt::ArgList &DriverArgs) const; + bool ParseInlineAsmUsingAsmParser; }; } // end namespace toolchains diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 9c0922c8497cfd..85204ceaa49a2b 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5038,7 +5038,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, << A->getValue() << A->getOption().getName(); } - if (!TC.useIntegratedAs()) + // If toolchain choose to use MCAsmParser for inline asm don't pass the + // option to disable integrated-as explictly. + if (!TC.useIntegratedAs() && !TC.parseInlineAsmUsingAsmParser()) CmdArgs.push_back("-no-integrated-as"); if (Args.hasArg(options::OPT_fdebug_pass_structure)) { diff --git a/clang/test/Driver/aix-as.c b/clang/test/Driver/aix-as.c index aa8c6103590374..def2adc97daaa3 100644 --- a/clang/test/Driver/aix-as.c +++ b/clang/test/Driver/aix-as.c @@ -63,3 +63,18 @@ // CHECK-AS32-MultiInput: "{{.*}}as{{(.exe)?}}" // CHECK-AS32-MultiInput: "-a32" // CHECK-AS32-MultiInput: "-many" + +// Check not passing no-integrated-as flag by default. +// RUN: %clang -no-canonical-prefixes %s -### -c -o %t.o 2>&1 \ +// RUN: -target powerpc64-ibm-aix7.1.0.0 \ +// RUN: | FileCheck --check-prefix=CHECK-IAS --implicit-check-not=-no-integrated-as %s +// CHECK-IAS: InstalledDir +// CHECK-IAS: "-a64" + +// Check passing no-integrated-as flag if specified by user. +// RUN: %clang -no-canonical-prefixes %s -### -c -o %t.o 2>&1 \ +// RUN: -target powerpc64-ibm-aix7.1.0.0 -fno-integrated-as \ +// RUN: | FileCheck --check-prefix=CHECK-NOIAS %s +// CHECK-NOIAS: InstalledDir +// CHECK-NOIAS: -no-integrated-as +// CHECK-NOIAS: "-a64"