summaryrefslogtreecommitdiffstats
path: root/lld/lib/Driver/WinLinkModuleDef.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/Driver/WinLinkModuleDef.cpp')
-rw-r--r--lld/lib/Driver/WinLinkModuleDef.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/lld/lib/Driver/WinLinkModuleDef.cpp b/lld/lib/Driver/WinLinkModuleDef.cpp
index dd71b8508a1..bc18609b821 100644
--- a/lld/lib/Driver/WinLinkModuleDef.cpp
+++ b/lld/lib/Driver/WinLinkModuleDef.cpp
@@ -54,6 +54,7 @@ Token Lexer::lex() {
.Case("HEAPSIZE", Kind::kw_heapsize)
.Case("NAME", Kind::kw_name)
.Case("NONAME", Kind::kw_noname)
+ .Case("VERSION", Kind::kw_version)
.Default(Kind::identifier);
_buffer = (end == _buffer.npos) ? "" : _buffer.drop_front(end);
return Token(kind, word);
@@ -129,6 +130,13 @@ llvm::Optional<Directive *> Parser::parse() {
return llvm::None;
return new (_alloc) Name(outputPath, baseaddr);
}
+ // VERSION
+ if (_tok._kind == Kind::kw_version) {
+ int major, minor;
+ if (!parseVersion(major, minor))
+ return llvm::None;
+ return new (_alloc) Version(major, minor);
+ }
error(_tok, Twine("Unknown directive: ") + _tok._range);
return llvm::None;
}
@@ -199,5 +207,22 @@ bool Parser::parseName(std::string &outputPath, uint64_t &baseaddr) {
return true;
}
+// VERSION major[.minor]
+bool Parser::parseVersion(int &major, int &minor) {
+ consumeToken();
+ if (_tok._kind != Kind::identifier)
+ return false;
+ StringRef v1, v2;
+ llvm::tie(v1, v2) = _tok._range.split('.');
+ if (v1.getAsInteger(10, major))
+ return false;
+ if (v2.empty()) {
+ minor = 0;
+ } else if (v2.getAsInteger(10, minor)) {
+ return false;
+ }
+ return true;
+}
+
} // moddef
} // namespace lld
OpenPOWER on IntegriCloud