summaryrefslogtreecommitdiff
path: root/lld/COFF/Driver.h
diff options
context:
space:
mode:
Diffstat (limited to 'lld/COFF/Driver.h')
-rw-r--r--lld/COFF/Driver.h22
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);