1 //===- Driver.h -------------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Linker 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLD_ELF_DRIVER_H 11 #define LLD_ELF_DRIVER_H 12 13 #include "SymbolTable.h" 14 #include "lld/Core/LLVM.h" 15 #include "lld/Core/Reproduce.h" 16 #include "llvm/ADT/Optional.h" 17 #include "llvm/ADT/StringRef.h" 18 #include "llvm/ADT/StringSet.h" 19 #include "llvm/Option/ArgList.h" 20 #include "llvm/Support/raw_ostream.h" 21 22 namespace lld { 23 namespace elf { 24 25 extern class LinkerDriver *Driver; 26 27 class LinkerDriver { 28 public: 29 void main(ArrayRef<const char *> Args, bool CanExitEarly); 30 void addFile(StringRef Path); 31 void addLibrary(StringRef Name); 32 std::unique_ptr<CpioFile> Cpio; // for reproduce 33 34 private: 35 std::vector<MemoryBufferRef> getArchiveMembers(MemoryBufferRef MB); 36 llvm::Optional<MemoryBufferRef> readFile(StringRef Path); 37 void readConfigs(llvm::opt::InputArgList &Args); 38 void createFiles(llvm::opt::InputArgList &Args); 39 void inferMachineType(); 40 template <class ELFT> void link(llvm::opt::InputArgList &Args); 41 42 // True if we are in --whole-archive and --no-whole-archive. 43 bool InWholeArchive = false; 44 45 // True if we are in --start-lib and --end-lib. 46 bool InLib = false; 47 48 // True if we are in -format=binary and -format=elf. 49 bool InBinary = false; 50 51 std::vector<InputFile *> Files; 52 std::vector<std::unique_ptr<MemoryBuffer>> OwningMBs; 53 }; 54 55 // Parses command line options. 56 class ELFOptTable : public llvm::opt::OptTable { 57 public: 58 ELFOptTable(); 59 llvm::opt::InputArgList parse(ArrayRef<const char *> Argv); 60 }; 61 62 // Create enum with OPT_xxx values for each option in Options.td 63 enum { 64 OPT_INVALID = 0, 65 #define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11) OPT_##ID, 66 #include "Options.inc" 67 #undef OPTION 68 }; 69 70 void printHelp(const char *Argv0); 71 std::vector<uint8_t> parseHexstring(StringRef S); 72 73 std::string createResponseFile(const llvm::opt::InputArgList &Args); 74 75 llvm::Optional<std::string> findFromSearchPaths(StringRef Path); 76 llvm::Optional<std::string> searchLibrary(StringRef Path); 77 78 } // namespace elf 79 } // namespace lld 80 81 #endif 82