Alexandre Ganea 6f2e92c10c Re-land [LLD] Allow usage of LLD as a library
This reverts commit aa495214b39d475bab24b468de7a7c676ce9e366.

As discussed in https://github.com/llvm/llvm-project/issues/53475 this patch
allows for using LLD-as-a-lib. It also lets clients link only the drivers that
they want (see unit tests).

This also adds the unit test infra as in the other LLVM projects. Among the
test coverage, I've added the original issue from @krzysz00, see:
https://github.com/ROCmSoftwarePlatform/D108850-lld-bug-reproduction

Important note: this doesn't allow (yet) linking in parallel. This will come a
bit later hopefully, in subsequent patches, for COFF at least.

Differential revision: https://reviews.llvm.org/D119049
2023-06-19 07:35:11 -04:00

38 lines
1.5 KiB
C++

//===- SomeDrivers.cpp ------------------------------------------*- C++ -*-===//
//
// This file is licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// In this test we showcase the fact that only one LLD driver can be invoked -
// the ELF driver that was linked in the test binary. Calling other drivers
// would return a failure. When using LLD as a library, any driver can be
// linked into your application.
//===----------------------------------------------------------------------===//
#include "lld/Common/Driver.h"
#include "gmock/gmock.h"
LLD_HAS_DRIVER(elf)
static bool lldInvoke(const char *lldExe) {
std::vector<const char *> args{lldExe, "--version"};
lld::Result s = lld::lldMain(args, llvm::outs(), llvm::errs(),
{{lld::Gnu, &lld::elf::link}});
return !s.retCode && s.canRunAgain;
}
TEST(AsLib, SomeDrivers) {
// When this flag is on, we actually need the MinGW driver library, not the
// ELF one. Here our test only covers the case where the ELF driver is linked
// into the unit test binary.
#ifndef LLD_DEFAULT_LD_LLD_IS_MINGW
EXPECT_TRUE(lldInvoke("ld.lld")); // ELF
#endif
// These drivers are not linked in this unit test.
EXPECT_FALSE(lldInvoke("ld64.lld")); // Mach-O
EXPECT_FALSE(lldInvoke("lld-link")); // COFF
EXPECT_FALSE(lldInvoke("wasm-ld")); // Wasm
}