diff options
-rw-r--r-- | lld/lib/Driver/WinLinkModuleDef.cpp | 89 | ||||
-rw-r--r-- | lld/test/pecoff/Inputs/exports.def | 4 |
2 files changed, 51 insertions, 42 deletions
diff --git a/lld/lib/Driver/WinLinkModuleDef.cpp b/lld/lib/Driver/WinLinkModuleDef.cpp index 71a838d7346..0d7191df30e 100644 --- a/lld/lib/Driver/WinLinkModuleDef.cpp +++ b/lld/lib/Driver/WinLinkModuleDef.cpp @@ -19,48 +19,55 @@ namespace lld { namespace moduledef { Token Lexer::lex() { - _buffer = _buffer.trim(); - if (_buffer.empty() || _buffer[0] == '\0') - return Token(Kind::eof, _buffer); - - switch (_buffer[0]) { - case '=': - _buffer = _buffer.drop_front(); - return Token(Kind::equal, "="); - case ',': - _buffer = _buffer.drop_front(); - return Token(Kind::comma, ","); - case '"': { - size_t end = _buffer.find('"', 1); - Token ret; - if (end == _buffer.npos) { - ret = Token(Kind::identifier, _buffer.substr(1, end)); - _buffer = ""; - } else { - ret = Token(Kind::identifier, _buffer.substr(1, end - 1)); - _buffer = _buffer.drop_front(end); + for (;;) { + _buffer = _buffer.trim(); + if (_buffer.empty() || _buffer[0] == '\0') + return Token(Kind::eof, _buffer); + + switch (_buffer[0]) { + case ';': { + size_t end = _buffer.find('\n'); + _buffer = (end == _buffer.npos) ? "" : _buffer.drop_front(end); + continue; + } + case '=': + _buffer = _buffer.drop_front(); + return Token(Kind::equal, "="); + case ',': + _buffer = _buffer.drop_front(); + return Token(Kind::comma, ","); + case '"': { + size_t end = _buffer.find('"', 1); + Token ret; + if (end == _buffer.npos) { + ret = Token(Kind::identifier, _buffer.substr(1, end)); + _buffer = ""; + } else { + ret = Token(Kind::identifier, _buffer.substr(1, end - 1)); + _buffer = _buffer.drop_front(end); + } + return ret; + } + default: { + size_t end = _buffer.find_first_not_of( + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789_.*~+!@#$%^&*()/"); + StringRef word = _buffer.substr(0, end); + Kind kind = llvm::StringSwitch<Kind>(word) + .Case("BASE", Kind::kw_base) + .Case("DATA", Kind::kw_data) + .Case("EXPORTS", Kind::kw_exports) + .Case("HEAPSIZE", Kind::kw_heapsize) + .Case("LIBRARY", Kind::kw_library) + .Case("NAME", Kind::kw_name) + .Case("NONAME", Kind::kw_noname) + .Case("STACKSIZE", Kind::kw_stacksize) + .Case("VERSION", Kind::kw_version) + .Default(Kind::identifier); + _buffer = (end == _buffer.npos) ? "" : _buffer.drop_front(end); + return Token(kind, word); + } } - return ret; - } - default: { - size_t end = _buffer.find_first_not_of( - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - "0123456789_.*~+!@#$%^&*()/"); - StringRef word = _buffer.substr(0, end); - Kind kind = llvm::StringSwitch<Kind>(word) - .Case("BASE", Kind::kw_base) - .Case("DATA", Kind::kw_data) - .Case("EXPORTS", Kind::kw_exports) - .Case("HEAPSIZE", Kind::kw_heapsize) - .Case("LIBRARY", Kind::kw_library) - .Case("NAME", Kind::kw_name) - .Case("NONAME", Kind::kw_noname) - .Case("STACKSIZE", Kind::kw_stacksize) - .Case("VERSION", Kind::kw_version) - .Default(Kind::identifier); - _buffer = (end == _buffer.npos) ? "" : _buffer.drop_front(end); - return Token(kind, word); - } } } diff --git a/lld/test/pecoff/Inputs/exports.def b/lld/test/pecoff/Inputs/exports.def index 6cc7cb5f2ee..54031a6f258 100644 --- a/lld/test/pecoff/Inputs/exports.def +++ b/lld/test/pecoff/Inputs/exports.def @@ -1,3 +1,5 @@ +; This is a comment line + EXPORTS - exportfn1 @5 + exportfn1 @5 ; foo exportfn2 |