diff options
Diffstat (limited to 'lld/COFF/Driver.h')
| -rw-r--r-- | lld/COFF/Driver.h | 22 | 
1 files changed, 18 insertions, 4 deletions
diff --git a/lld/COFF/Driver.h b/lld/COFF/Driver.h index cc2f25a6f95e..3fee9b1fe50e 100644 --- a/lld/COFF/Driver.h +++ b/lld/COFF/Driver.h @@ -41,6 +41,21 @@ public:    COFFOptTable();  }; +// Constructing the option table is expensive. Use a global table to avoid doing +// it more than once. +extern COFFOptTable optTable; + +// The result of parsing the .drective section. The /export: and /include: +// options are handled separately because they reference symbols, and the number +// of symbols can be quite large. The LLVM Option library will perform at least +// one memory allocation per argument, and that is prohibitively slow for +// parsing directives. +struct ParsedDirectives { +  std::vector<StringRef> exports; +  std::vector<StringRef> includes; +  llvm::opt::InputArgList args; +}; +  class ArgParser {  public:    // Parses command line options. @@ -52,16 +67,13 @@ public:    // Tokenizes a given string and then parses as command line options in    // .drectve section. /EXPORT options are returned in second element    // to be processed in fastpath. -  std::pair<llvm::opt::InputArgList, std::vector<StringRef>> -  parseDirectives(StringRef s); +  ParsedDirectives parseDirectives(StringRef s);  private:    // Concatenate LINK environment variable.    void addLINK(SmallVector<const char *, 256> &argv);    std::vector<const char *> tokenize(StringRef s); - -  COFFOptTable table;  };  class LinkerDriver { @@ -75,6 +87,8 @@ public:    void enqueueArchiveMember(const Archive::Child &c, const Archive::Symbol &sym,                              StringRef parentName); +  void enqueuePDB(StringRef Path) { enqueuePath(Path, false, false); } +    MemoryBufferRef takeBuffer(std::unique_ptr<MemoryBuffer> mb);    void enqueuePath(StringRef path, bool wholeArchive, bool lazy);  | 
