diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index a09a69f946ef78..bc59b6beafc785 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -373,6 +373,18 @@ void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args, D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain); } + // If GlobalISel is enabled, pass it through to LLVM. + if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel, + options::OPT_fno_global_isel)) { + if (A->getOption().matches(options::OPT_fglobal_isel)) { + CmdArgs.push_back("-mllvm"); + CmdArgs.push_back("-global-isel"); + // Disable abort and fall back to SDAG silently. + CmdArgs.push_back("-mllvm"); + CmdArgs.push_back("-global-isel-abort=0"); + } + } + Args.AddLastArg(CmdArgs, options::OPT_prebind); Args.AddLastArg(CmdArgs, options::OPT_noprebind); Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); diff --git a/clang/test/Driver/darwin-ld-lto.c b/clang/test/Driver/darwin-ld-lto.c index 05e6bccd00f089..252ca148c52003 100644 --- a/clang/test/Driver/darwin-ld-lto.c +++ b/clang/test/Driver/darwin-ld-lto.c @@ -30,3 +30,11 @@ // THIN_LTO_OBJECT_PATH: {{ld(.exe)?"}} // THIN_LTO_OBJECT_PATH-SAME: "-object_path_lto" // THIN_LTO_OBJECT_PATH-SAME: {{thinlto\-[a-zA-Z0-9_]+}} + + +// Check that we pass through -fglobal-isel flags to libLTO. +// RUN: %clang -target arm64-apple-darwin %s -flto -fglobal-isel -### 2>&1 | \ +// RUN: FileCheck --check-prefix=GISEL %s +// GISEL: {{ld(.exe)?"}} +// GISEL: "-mllvm" "-global-isel" +// GISEL: "-mllvm" "-global-isel-abort=0"