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 15 namespace lld { 16 enum 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 25 using Driver = bool (*)(llvm::ArrayRef<const char *>, llvm::raw_ostream &, 26 llvm::raw_ostream &, bool, bool); 27 28 struct DriverDef { 29 Flavor f; 30 Driver d; 31 }; 32 33 struct 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. 44 Result 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