Index: lld/include/lld/Common/Driver.h =================================================================== --- lld/include/lld/Common/Driver.h +++ lld/include/lld/Common/Driver.h @@ -25,7 +25,7 @@ // and re-entry would not be possible anymore. Use exitLld() in that case to // properly exit your application and avoid intermittent crashes on exit caused // by cleanup. -SafeReturn safeLldMain(int argc, const char **argv, llvm::raw_ostream &stdoutOS, +SafeReturn safeLldMain(int argc, char **argv, llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS); namespace coff { Index: lld/tools/lld/CMakeLists.txt =================================================================== --- lld/tools/lld/CMakeLists.txt +++ lld/tools/lld/CMakeLists.txt @@ -6,10 +6,18 @@ lld.cpp SUPPORT_PLUGINS + GENERATE_DRIVER ) export_executable_symbols_for_plugins(lld) -target_link_libraries(lld +function(lld_target_link_libraries target type) + target_link_libraries(${target} ${type} ${ARGN}) + if (TARGET obj.${target}) + target_link_libraries(obj.${target} ${ARGN}) + endif() +endfunction() + +lld_target_link_libraries(lld PRIVATE lldCommon lldCOFF Index: lld/tools/lld/lld.cpp =================================================================== --- lld/tools/lld/lld.cpp +++ lld/tools/lld/lld.cpp @@ -140,7 +140,7 @@ /// Universal linker main(). This linker emulates the gnu, darwin, or /// windows linker based on the argv[0] or -flavor option. -static int lldMain(int argc, const char **argv, llvm::raw_ostream &stdoutOS, +static int lldMain(int argc, char **argv, llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS, bool exitEarly = true) { std::vector args(argv, argv + argc); auto link = [&args]() { @@ -175,8 +175,7 @@ } // Similar to lldMain except that exceptions are caught. -SafeReturn lld::safeLldMain(int argc, const char **argv, - llvm::raw_ostream &stdoutOS, +SafeReturn lld::safeLldMain(int argc, char **argv, llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS) { int r = 0; { @@ -210,7 +209,7 @@ return v; } -int main(int argc, const char **argv) { +int lld_main(int argc, char **argv) { InitLLVM x(argc, argv); sys::Process::UseANSIEscapeCodes(true); Index: llvm/test/tools/llvm-driver/lit.local.cfg =================================================================== --- /dev/null +++ llvm/test/tools/llvm-driver/lit.local.cfg @@ -0,0 +1,4 @@ +from lit.llvm import llvm_config + +if llvm_config.use_lld(required=False): + config.available_features.add('lld') Index: llvm/test/tools/llvm-driver/passthrough-lld.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-driver/passthrough-lld.test @@ -0,0 +1,6 @@ +# REQUIRES: lld + +# RUN: %llvm ld.lld --help | FileCheck %s +# RUN: %llvm lld -flavor ld.lld --help | FileCheck %s + +# CHECK: supported targets: elf Index: llvm/tools/llvm-driver/llvm-driver.cpp =================================================================== --- llvm/tools/llvm-driver/llvm-driver.cpp +++ llvm/tools/llvm-driver/llvm-driver.cpp @@ -49,9 +49,15 @@ StringRef Stem = sys::path::stem(ToolName); auto Is = [=](StringRef Tool) { - auto I = Stem.rfind_insensitive(Tool); - return I != StringRef::npos && (I + Tool.size() == Stem.size() || - !llvm::isAlnum(Stem[I + Tool.size()])); + auto IsImpl = [=](StringRef Stem) { + auto I = Stem.rfind_insensitive(Tool); + return I != StringRef::npos && (I + Tool.size() == Stem.size() || + !llvm::isAlnum(Stem[I + Tool.size()])); + }; + for (StringRef S : {Stem, ToolName}) + if (IsImpl(S)) + return true; + return false; }; #define LLVM_DRIVER_TOOL(tool, entry) \ Index: utils/bazel/llvm-project-overlay/lld/BUILD.bazel =================================================================== --- utils/bazel/llvm-project-overlay/lld/BUILD.bazel +++ utils/bazel/llvm-project-overlay/lld/BUILD.bazel @@ -2,6 +2,7 @@ # See https://llvm.org/LICENSE.txt for license information. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +load("@bazel_skylib//rules:expand_template.bzl", "expand_template") load("//llvm:tblgen.bzl", "gentbl") package( @@ -240,12 +241,21 @@ ], ) +expand_template( + name = "lld_main", + out = "lld-driver.cpp", + substitutions = { + "@TOOL_NAME@": "lld", + }, + template = "//llvm:cmake/modules/llvm-driver-template.cpp.in", +) + cc_binary( name = "lld", srcs = glob([ "tools/lld/*.cpp", "tools/lld/*.h", - ]), + ]) + ["lld-driver.cpp"], deps = [ ":COFF", ":Common",