1//===- lld/Common/Driver.h - Linker Driver Emulator -----------------------===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef LLD_COMMON_DRIVER_H 10#define LLD_COMMON_DRIVER_H 11 12#include "llvm/ADT/ArrayRef.h" 13#include "llvm/Support/raw_ostream.h" 14 15namespace lld { 16enum Flavor { 17 Invalid, 18 Gnu, // -flavor gnu 19 MinGW, // -flavor gnu MinGW 20 WinLink, // -flavor link 21 Darwin, // -flavor darwin 22 Wasm, // -flavor wasm 23}; 24 25using Driver = bool (*)(llvm::ArrayRef<const char *>, llvm::raw_ostream &, 26 llvm::raw_ostream &, bool, bool); 27 28struct DriverDef { 29 Flavor f; 30 Driver d; 31}; 32 33struct Result { 34 int retCode; 35 bool canRunAgain; 36}; 37 38// Generic entry point when using LLD as a library, safe for re-entry, supports 39// crash recovery. Returns a general completion code and a boolean telling 40// whether it can be called again. In some cases, a crash could corrupt memory 41// and re-entry would not be possible anymore. Use exitLld() in that case to 42// properly exit your application and avoid intermittent crashes on exit caused 43// by cleanup. 44Result lldMain(llvm::ArrayRef<const char *> args, llvm::raw_ostream &stdoutOS, 45 llvm::raw_ostream &stderrOS, llvm::ArrayRef<DriverDef> drivers); 46} // namespace lld 47 48// With this macro, library users must specify which drivers they use, provide 49// that information to lldMain() in the `drivers` param, and link the 50// corresponding driver library in their executable. 51#define LLD_HAS_DRIVER(name) \ 52 namespace lld { \ 53 namespace name { \ 54 bool link(llvm::ArrayRef<const char *> args, llvm::raw_ostream &stdoutOS, \ 55 llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput); \ 56 } \ 57 } 58 59// An array which declares that all LLD drivers are linked in your executable. 60// Must be used along with LLD_HAS_DRIVERS. See examples in LLD unittests. 61#define LLD_ALL_DRIVERS \ 62 { \ 63 {lld::WinLink, &lld::coff::link}, {lld::Gnu, &lld::elf::link}, \ 64 {lld::MinGW, &lld::mingw::link}, {lld::Darwin, &lld::macho::link}, { \ 65 lld::Wasm, &lld::wasm::link \ 66 } \ 67 } 68 69#endif 70