[lld] r202111 - [LinkerScript] OUTPUT_FORMAT: Parse Quoted Strings

Chandler Carruth chandlerc at google.com
Mon Feb 24 22:41:06 PST 2014


I feel like there is an easy way to tell whether the correct representation
is as optionally-quoted identifiers everywhere, or two different things:
can you take something that *clearly* requires an identifier, and add or
remove quotes without issue?


On Mon, Feb 24, 2014 at 10:33 PM, Shankar Easwaran
<shankare at codeaurora.org>wrote:

> Hi Rui,
>
> It makes checking for errors very easy, when you dont have a valid
> identifier, whether it appeared in a quoted string or not.
>
> I think identifiers and strings need to be separately considered for other
> cases which I am not sure of.
>
> Adding Bigcheese here.
>
> Thanks
>
> Shankar Easwaran
>
>
> On 2/25/2014 12:21 AM, Rui Ueyama wrote:
>
>> On Mon, Feb 24, 2014 at 10:10 PM, Shankar Easwaran
>> <shankare at codeaurora.org>wrote:
>>
>>  Hi Rui,
>>>
>>> No error in this case :-
>>>
>>> $cat x
>>> SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64");
>>> $ld -T x
>>> ld: no input files
>>>
>>
>>  Error in the below case, when the input is not a string :
>>>
>>>  That's not a counter example because "=" is an operator in Linker
>> Script.
>> The rule seems like this: identifier can appear without quotes if it does
>> not contain any character that has special meaning, such as "=" or "(". If
>> it contains such character, it must be quoted. Both are still identifier
>> whether quoted or non-quoted.
>>
>>
>>  $cat x
>>> SEARCH_DIR(=/usr/x86_64-linux-gnu/lib64);
>>> $ld -T x
>>> ld:x:1: syntax error
>>>
>>> We need identifiers need to be separately treated from quoted strings,
>>> for
>>> few other cases too.
>>>
>>> Thanks
>>>
>>> Shankar Easwaran
>>>
>>>
>>> On 2/25/2014 12:04 AM, Rui Ueyama wrote:
>>>
>>>  On Mon, Feb 24, 2014 at 9:46 PM, Shankar Easwaran
>>>> <shankare at codeaurora.org>wrote:
>>>>
>>>>   Hi Rui,
>>>>
>>>>> We want to distinguish between when a quotedString would appear and
>>>>> when
>>>>> an identifier would appear.
>>>>>
>>>>> For example: The SEARCH_DIR command doesnot allow identifiers, it only
>>>>> allows quoted strings.
>>>>>
>>>>>   Is it true? I added "SEARCH_DIR ( /foo/bar )" to libc.so as a test
>>>>> and
>>>>>
>>>> GNU
>>>> ld does not print any error.
>>>>
>>>>
>>>>   There is also a error case that needs to be handled in the following
>>>>
>>>>> patches, if a list is specified, only quoted strings are allowed.
>>>>>
>>>>> Thanks
>>>>>
>>>>> Shankar Easwaran
>>>>>
>>>>>
>>>>> On 2/24/2014 11:42 PM, Rui Ueyama wrote:
>>>>>
>>>>>   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
>>>>>>>
>>>>>>>
>>>>>>>   --
>>>>>>>
>>>>>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
>>>>> hosted
>>>>> by the Linux Foundation
>>>>>
>>>>>
>>>>>
>>>>>  --
>>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted
>>> by the Linux Foundation
>>>
>>>
>>>
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted
> by the Linux Foundation
>
> _______________________________________________
> 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/5edcf4ca/attachment.html>


More information about the llvm-commits mailing list