[lld] r202111 - [LinkerScript] OUTPUT_FORMAT: Parse Quoted Strings
Rui Ueyama
ruiu at google.com
Mon Feb 24 21:42:02 PST 2014
In this patch, "foo" will be parsed as a token of type quotedString and foo
(bare string) is of type identifier, but I think we don't need to
distinguish one from other. Whether a token was quoted or not is not
important for the core linker script interpreter. Can you remove
quotedString and just use type identifier?
On Mon, Feb 24, 2014 at 9:17 PM, Shankar Easwaran
<shankare at codeaurora.org>wrote:
> Author: shankare
> Date: Mon Feb 24 23:17:24 2014
> New Revision: 202111
>
> URL: http://llvm.org/viewvc/llvm-project?rev=202111&view=rev
> Log:
> [LinkerScript] OUTPUT_FORMAT: Parse Quoted Strings
>
> Added:
> lld/trunk/test/LinkerScript/
> lld/trunk/test/LinkerScript/linker-script-outputformat.test
> lld/trunk/test/LinkerScript/linker-script.test
> - copied, changed from r202101, lld/trunk/test/linker-script.test
> Removed:
> lld/trunk/test/linker-script.test
> Modified:
> lld/trunk/include/lld/ReaderWriter/LinkerScript.h
> lld/trunk/lib/ReaderWriter/LinkerScript.cpp
>
> Modified: lld/trunk/include/lld/ReaderWriter/LinkerScript.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/LinkerScript.h?rev=202111&r1=202110&r2=202111&view=diff
>
> ==============================================================================
> --- lld/trunk/include/lld/ReaderWriter/LinkerScript.h (original)
> +++ lld/trunk/include/lld/ReaderWriter/LinkerScript.h Mon Feb 24 23:17:24
> 2014
> @@ -16,6 +16,7 @@
> #define LLD_READER_WRITER_LINKER_SCRIPT_H
>
> #include "lld/Core/LLVM.h"
> +#include "lld/Core/range.h"
>
> #include "llvm/ADT/OwningPtr.h"
> #include "llvm/ADT/StringSwitch.h"
> @@ -25,6 +26,8 @@
> #include "llvm/Support/SourceMgr.h"
> #include "llvm/Support/system_error.h"
>
> +#include <vector>
> +
> namespace lld {
> namespace script {
> class Token {
> @@ -33,6 +36,8 @@ public:
> unknown,
> eof,
> identifier,
> + comma,
> + quotedString,
> l_paren,
> r_paren,
> kw_entry,
> @@ -93,21 +98,30 @@ private:
>
> class OutputFormat : public Command {
> public:
> - explicit OutputFormat(StringRef format)
> - : Command(Kind::OutputFormat), _format(format) {}
> + explicit OutputFormat(StringRef format) : Command(Kind::OutputFormat) {
> + _formats.push_back(format);
> + }
>
> static bool classof(const Command *c) {
> return c->getKind() == Kind::OutputFormat;
> }
>
> virtual void dump(raw_ostream &os) const {
> - os << "OUTPUT_FORMAT(" << getFormat() << ")\n";
> + os << "OUTPUT_FORMAT(";
> + for (auto fb = _formats.begin(), fe = _formats.end(); fb != fe; ++fb)
> {
> + if (fb != _formats.begin())
> + os << ",";
> + os << *fb;
> + }
> + os << ")\n";
> }
>
> - StringRef getFormat() const { return _format; }
> + virtual void addOutputFormat(StringRef format) {
> _formats.push_back(format); }
> +
> + range<StringRef *> getFormats() { return _formats; }
>
> private:
> - StringRef _format;
> + std::vector<StringRef> _formats;
> };
>
> class OutputArch : public Command {
> @@ -227,6 +241,8 @@ private:
> return true;
> }
>
> + bool isNextToken(Token::Kind kind) { return (_tok._kind == kind); }
> +
> OutputFormat *parseOutputFormat();
> OutputArch *parseOutputArch();
> Group *parseGroup();
>
> Modified: lld/trunk/lib/ReaderWriter/LinkerScript.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/LinkerScript.cpp?rev=202111&r1=202110&r2=202111&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/LinkerScript.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/LinkerScript.cpp Mon Feb 24 23:17:24 2014
> @@ -29,6 +29,8 @@ void Token::dump(raw_ostream &os) const
> CASE(kw_group)
> CASE(kw_output_format)
> CASE(kw_output_arch)
> + CASE(quotedString)
> + CASE(comma)
> CASE(l_paren)
> CASE(r_paren)
> CASE(unknown)
> @@ -67,7 +69,12 @@ bool Lexer::canContinueName(char c) cons
> case '0': case '1': case '2': case '3': case '4': case '5': case '6':
> case '7': case '8': case '9':
> case '_': case '.': case '$': case '/': case '\\': case '~': case '=':
> - case '+': case ',': case '[': case ']': case '*': case '?': case '-':
> + case '+':
> + case '[':
> + case ']':
> + case '*':
> + case '?':
> + case '-':
> case ':':
> return true;
> default:
> @@ -94,7 +101,23 @@ void Lexer::lex(Token &tok) {
> tok = Token(_buffer.substr(0, 1), Token::r_paren);
> _buffer = _buffer.drop_front();
> return;
> + case ',':
> + tok = Token(_buffer.substr(0, 1), Token::comma);
> + _buffer = _buffer.drop_front();
> + return;
> default:
> + // Quoted strings ?
> + if ((_buffer[0] == '\"') || (_buffer[0] == '\'')) {
> + char c = _buffer[0];
> + _buffer = _buffer.drop_front();
> + auto quotedStringEnd = _buffer.find(c);
> + if (quotedStringEnd == StringRef::npos || quotedStringEnd == 0)
> + break;
> + StringRef word = _buffer.substr(0, quotedStringEnd);
> + tok = Token(word, Token::quotedString);
> + _buffer = _buffer.drop_front(quotedStringEnd + 1);
> + return;
> + }
> /// keyword or identifer.
> if (!canStartName(_buffer[0]))
> break;
> @@ -215,14 +238,27 @@ OutputFormat *Parser::parseOutputFormat(
> if (!expectAndConsume(Token::l_paren, "expected ("))
> return nullptr;
>
> - if (_tok._kind != Token::identifier) {
> - error(_tok, "Expected identifier in OUTPUT_FORMAT.");
> + if (_tok._kind != Token::quotedString && _tok._kind !=
> Token::identifier) {
> + error(_tok, "Expected identifier/string in OUTPUT_FORMAT.");
> return nullptr;
> }
>
> auto ret = new (_alloc) OutputFormat(_tok._range);
> consumeToken();
>
> + do {
> + if (isNextToken(Token::comma))
> + consumeToken();
> + else
> + break;
> + if (_tok._kind != Token::quotedString && _tok._kind !=
> Token::identifier) {
> + error(_tok, "Expected identifier/string in OUTPUT_FORMAT.");
> + return nullptr;
> + }
> + ret->addOutputFormat(_tok._range);
> + consumeToken();
> + } while (isNextToken(Token::comma));
> +
> if (!expectAndConsume(Token::r_paren, "expected )"))
> return nullptr;
>
>
> Added: lld/trunk/test/LinkerScript/linker-script-outputformat.test
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/LinkerScript/linker-script-outputformat.test?rev=202111&view=auto
>
> ==============================================================================
> --- lld/trunk/test/LinkerScript/linker-script-outputformat.test (added)
> +++ lld/trunk/test/LinkerScript/linker-script-outputformat.test Mon Feb 24
> 23:17:24 2014
> @@ -0,0 +1,12 @@
> +/* RUN: linker-script-test %s | FileCheck %s
> +*/
> +
> +OUTPUT_FORMAT(elf64-x86-64)
> +
> +/*
> +CHECK: kw_output_format: OUTPUT_FORMAT
> +CHECK: l_paren: (
> +CHECK: identifier: elf64-x86-64
> +CHECK: r_paren: )
> +CHECK: OUTPUT_FORMAT(elf64-x86-64)
> +*/
>
> Copied: lld/trunk/test/LinkerScript/linker-script.test (from r202101,
> lld/trunk/test/linker-script.test)
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/LinkerScript/linker-script.test?p2=lld/trunk/test/LinkerScript/linker-script.test&p1=lld/trunk/test/linker-script.test&r1=202101&r2=202111&rev=202111&view=diff
>
> ==============================================================================
> --- lld/trunk/test/linker-script.test (original)
> +++ lld/trunk/test/LinkerScript/linker-script.test Mon Feb 24 23:17:24 2014
> @@ -2,7 +2,7 @@
> */
>
> OUTPUT_ARCH(i386:x86_64)
> -OUTPUT_FORMAT(elf64-x86-64)
> +OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
> GROUP ( /lib/x86_64-linux-gnu/libc.so.6
> /usr/lib/x86_64-linux-gnu/libc_nonshared.a AS_NEEDED (
> /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ) )
> ENTRY(init)
>
> @@ -13,7 +13,11 @@ CHECK: identifier: i386:x86_64
> CHECK: r_paren: )
> CHECK: kw_output_format: OUTPUT_FORMAT
> CHECK: l_paren: (
> -CHECK: identifier: elf64-x86-64
> +CHECK: quotedString: elf64-x86-64
> +CHECK: comma: ,
> +CHECK: quotedString: elf64-x86-64
> +CHECK: comma: ,
> +CHECK: quotedString: elf64-x86-64
> CHECK: r_paren: )
> CHECK: kw_group: GROUP
> CHECK: l_paren: (
> @@ -29,7 +33,7 @@ CHECK: l_paren: (
> CHECK: identifier: init
> CHECK: r_paren: )
> CHECK: eof:
> -CHECK: OUTPUT_FORMAT(elf64-x86-64)
> +CHECK: OUTPUT_FORMAT(elf64-x86-64,elf64-x86-64,elf64-x86-64)
> CHECK: GROUP(/lib/x86_64-linux-gnu/libc.so.6
> /usr/lib/x86_64-linux-gnu/libc_nonshared.a
> AS_NEEDED(/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2))
> CHECK: ENTRY(init)
> */
>
> Removed: lld/trunk/test/linker-script.test
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/linker-script.test?rev=202110&view=auto
>
> ==============================================================================
> --- lld/trunk/test/linker-script.test (original)
> +++ lld/trunk/test/linker-script.test (removed)
> @@ -1,35 +0,0 @@
> -/* RUN: linker-script-test %s | FileCheck %s
> -*/
> -
> -OUTPUT_ARCH(i386:x86_64)
> -OUTPUT_FORMAT(elf64-x86-64)
> -GROUP ( /lib/x86_64-linux-gnu/libc.so.6
> /usr/lib/x86_64-linux-gnu/libc_nonshared.a AS_NEEDED (
> /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ) )
> -ENTRY(init)
> -
> -/*
> -CHECK: kw_output_arch: OUTPUT_ARCH
> -CHECK: l_paren: (
> -CHECK: identifier: i386:x86_64
> -CHECK: r_paren: )
> -CHECK: kw_output_format: OUTPUT_FORMAT
> -CHECK: l_paren: (
> -CHECK: identifier: elf64-x86-64
> -CHECK: r_paren: )
> -CHECK: kw_group: GROUP
> -CHECK: l_paren: (
> -CHECK: identifier: /lib/x86_64-linux-gnu/libc.so.6
> -CHECK: identifier: /usr/lib/x86_64-linux-gnu/libc_nonshared.a
> -CHECK: kw_as_needed: AS_NEEDED
> -CHECK: l_paren: (
> -CHECK: identifier: /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
> -CHECK: r_paren: )
> -CHECK: r_paren: )
> -CHECK: kw_entry: ENTRY
> -CHECK: l_paren: (
> -CHECK: identifier: init
> -CHECK: r_paren: )
> -CHECK: eof:
> -CHECK: OUTPUT_FORMAT(elf64-x86-64)
> -CHECK: GROUP(/lib/x86_64-linux-gnu/libc.so.6
> /usr/lib/x86_64-linux-gnu/libc_nonshared.a
> AS_NEEDED(/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2))
> -CHECK: ENTRY(init)
> -*/
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140224/ab8020bf/attachment.html>
More information about the llvm-commits
mailing list