diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -730,4 +730,8 @@ def err_drv_expand_response_file : Error< "failed to expand response file: %0">; + +def warn_drv_unsupported_lto_option_for_target : Warning< + "ignoring '%0' option as it is not currently supported for target '%1' during LTO">, + InGroup; } 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,17 @@ Args.MakeArgString(Twine(PluginOptPrefix) + "-debugger-tune=gdb")); } + bool UseIntegratedAs = ToolChain.useIntegratedAs(); + if (IsOSAIX) { + if (!UseIntegratedAs) + CmdArgs.push_back( + Args.MakeArgString(Twine(PluginOptPrefix) + "-no-integrated-as=1")); + } else if (!UseIntegratedAs) { + if (Arg *A = Args.getLastArgNoClaim(options::OPT_fno_integrated_as)) + D.Diag(diag::warn_drv_unsupported_lto_option_for_target) + << A->getSpelling() << ToolChain.getTriple().getTriple(); + } + 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/clang/test/Driver/lto.c b/clang/test/Driver/lto.c --- a/clang/test/Driver/lto.c +++ b/clang/test/Driver/lto.c @@ -105,3 +105,10 @@ // FLTO-THIN: -flto=thin // FLTO-THIN-NOT: "-flto" // FLTO-THIN-NOT: -flto=full +// + +// Check that using -fno-integrated-as produces a warning on Linux +// RUN: %clang --target=x86_64-unknown-linux -### %s -fno-integrated-as \ +// RUN: -flto 2>&1 | FileCheck --check-prefix=NO-INTEGRATED-AS %s +// +// NO-INTEGRATED-AS: clang: warning: ignoring '-fno-integrated-as' option as it is not currently supported for target 'x86_64-unknown-linux' during LTO [-Woption-ignored] 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;