diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -693,6 +693,11 @@ Args.MakeArgString(Twine(PluginOptPrefix) + "-debugger-tune=gdb")); } + bool UseIntegratedAs = ToolChain.useIntegratedAs(); + if (IsOSAIX && !UseIntegratedAs) + CmdArgs.push_back( + Args.MakeArgString(Twine(PluginOptPrefix) + "-no-integrated-as=1")); + if (IsOSAIX) { // On AIX, clang assumes strict-dwarf is true if any debug option is // specified, unless it is told explicitly not to assume so. diff --git a/clang/test/Driver/lto-aix.c b/clang/test/Driver/lto-aix.c --- a/clang/test/Driver/lto-aix.c +++ b/clang/test/Driver/lto-aix.c @@ -73,3 +73,14 @@ // RUN: -fcs-profile-generate 2>&1 | FileCheck -check-prefix=CSPGO %s // // CSPGO: "-bplugin_opt:-cs-profile-generate" "-bplugin_opt:-cs-profile-path=default_%m.profraw" +// +// Test integrated assembler options +// RUN: %clang --target=powerpc-ibm-aix -### %s -flto -fno-integrated-as \ +// RUN: -fintegrated-as 2>&1 | FileCheck --check-prefix=INTAS %s +// RUN: %clang --target=powerpc-ibm-aix -### %s -flto -fintegrated-as \ +// RUN: -fno-integrated-as 2>&1 | FileCheck --check-prefix=NOINTAS %s +// RUN: %clang --target=powerpc-ibm-aix -### %s -flto 2>&1 \ +// RUN: | FileCheck --check-prefix=INTAS %s +// +// NOINTAS: "-bplugin_opt:-no-integrated-as=1" +// INTAS-NOT: "-bplugin_opt:-no-integrated-as=0" diff --git a/llvm/include/llvm/CodeGen/CommandFlags.h b/llvm/include/llvm/CodeGen/CommandFlags.h --- a/llvm/include/llvm/CodeGen/CommandFlags.h +++ b/llvm/include/llvm/CodeGen/CommandFlags.h @@ -94,6 +94,8 @@ bool getUseCtors(); +bool getDisableIntegratedAS(); + bool getRelaxELFRelocations(); bool getDataSections(); diff --git a/llvm/lib/CodeGen/CommandFlags.cpp b/llvm/lib/CodeGen/CommandFlags.cpp --- a/llvm/lib/CodeGen/CommandFlags.cpp +++ b/llvm/lib/CodeGen/CommandFlags.cpp @@ -81,6 +81,7 @@ CGOPT(bool, StackRealign) CGOPT(std::string, TrapFuncName) CGOPT(bool, UseCtors) +CGOPT(bool, DisableIntegratedAS) CGOPT(bool, RelaxELFRelocations) CGOPT_EXP(bool, DataSections) CGOPT_EXP(bool, FunctionSections) @@ -487,6 +488,11 @@ cl::init(false)); CGBINDOPT(XCOFFReadOnlyPointers); + static cl::opt DisableIntegratedAS( + "no-integrated-as", cl::desc("Disable integrated assembler"), + cl::init(false)); + CGBINDOPT(DisableIntegratedAS); + #undef CGBINDOPT mc::RegisterMCTargetOptionsFlags(); @@ -540,6 +546,7 @@ Options.GuaranteedTailCallOpt = getEnableGuaranteedTailCallOpt(); Options.StackSymbolOrdering = getStackSymbolOrdering(); Options.UseInitArray = !getUseCtors(); + Options.DisableIntegratedAS = getDisableIntegratedAS(); Options.RelaxELFRelocations = getRelaxELFRelocations(); Options.DataSections = getExplicitDataSections().value_or(TheTriple.hasDefaultDataSections()); diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp --- a/llvm/lib/LTO/LTOCodeGenerator.cpp +++ b/llvm/lib/LTO/LTOCodeGenerator.cpp @@ -244,7 +244,7 @@ bool LTOCodeGenerator::useAIXSystemAssembler() { const auto &Triple = TargetMach->getTargetTriple(); - return Triple.isOSAIX(); + return Triple.isOSAIX() && Config.Options.DisableIntegratedAS; } bool LTOCodeGenerator::runAIXSystemAssembler(SmallString<128> &AssemblyFile) { diff --git a/llvm/test/tools/llvm-lto/aix-sys-as.ll b/llvm/test/tools/llvm-lto/aix-sys-as.ll new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-lto/aix-sys-as.ll @@ -0,0 +1,12 @@ +; REQUIRES: system-aix +; RUN: llvm-as < %s > %t1 +; RUN: llvm-lto -no-integrated-as=1 %t1 | FileCheck %s + +target triple = "powerpc-ibm-aix" + +define i32 @main() { +entry: + ret i32 42 +} +; CHECK: Wrote native object file + diff --git a/llvm/test/tools/llvm-lto/aix.ll b/llvm/test/tools/llvm-lto/aix.ll --- a/llvm/test/tools/llvm-lto/aix.ll +++ b/llvm/test/tools/llvm-lto/aix.ll @@ -1,4 +1,4 @@ -; REQUIRES: system-aix +; REQUIRES: powerpc-registered-target ; RUN: llvm-as < %s > %t1 ; RUN: llvm-lto %t1 | FileCheck %s diff --git a/llvm/tools/llc/llc.cpp b/llvm/tools/llc/llc.cpp --- a/llvm/tools/llc/llc.cpp +++ b/llvm/tools/llc/llc.cpp @@ -106,10 +106,6 @@ "'none' means that all ELF features can be used, " "regardless of binutils support")); -static cl::opt -NoIntegratedAssembler("no-integrated-as", cl::Hidden, - cl::desc("Disable integrated assembler")); - static cl::opt PreserveComments("preserve-as-comments", cl::Hidden, cl::desc("Preserve Comments in outputted assembly"), @@ -517,7 +513,6 @@ Options.BinutilsVersion = TargetMachine::parseBinutilsVersion(BinutilsVersion); - Options.DisableIntegratedAS = NoIntegratedAssembler; Options.MCOptions.ShowMCEncoding = ShowMCEncoding; Options.MCOptions.AsmVerbose = AsmVerbose; Options.MCOptions.PreserveAsmComments = PreserveComments;