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 33 private: 34 std::vector<MemoryBufferRef> getArchiveMembers(MemoryBufferRef MB); 35 void readConfigs(llvm::opt::InputArgList &Args); 36 void createFiles(llvm::opt::InputArgList &Args); 37 void inferMachineType(); 38 template <class ELFT> void link(llvm::opt::InputArgList &Args); 39 40 // True if we are in --whole-archive and --no-whole-archive. 41 bool InWholeArchive = false; 42 43 // True if we are in --start-lib and --end-lib. 44 bool InLib = false; 45 46 // True if we are in -format=binary and -format=elf. 47 bool InBinary = false; 48 49 std::vector<InputFile *> Files; 50 }; 51 52 // Parses command line options. 53 class ELFOptTable : public llvm::opt::OptTable { 54 public: 55 ELFOptTable(); 56 llvm::opt::InputArgList parse(ArrayRef<const char *> Argv); 57 }; 58 59 // Create enum with OPT_xxx values for each option in Options.td 60 enum { 61 OPT_INVALID = 0, 62 #define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11) OPT_##ID, 63 #include "Options.inc" 64 #undef OPTION 65 }; 66 67 void printHelp(const char *Argv0); 68 std::vector<uint8_t> parseHexstring(StringRef S); 69 70 std::string createResponseFile(const llvm::opt::InputArgList &Args); 71 72 llvm::Optional<std::string> findFromSearchPaths(StringRef Path); 73 llvm::Optional<std::string> searchLibrary(StringRef Path); 74 75 } // namespace elf 76 } // namespace lld 77 78 #endif 79