[PATCH] D74687: [LLD][ELF] - Linker script: do not fail parsing when "/DISCARD/" follows the fill expression.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 26 03:06:07 PST 2020


grimar added a comment.

In D74687#1880879 <https://reviews.llvm.org/D74687#1880879>, @MaskRay wrote:

> I prefer an alternative: limit `=` to accept `readPrimary` instead of `readFill`:
>
>   if (peek() == "=" || peek().startswith("=")) {
>     inExpr = true;
>     consume("=");
>     cmd->filler = readFill();
>     inExpr = false;
>   }
>   
>
>


Honestly I just do not feel comfortable to do this change.
If I currectly understood, you're suggesting something like:

  if (peek() == "=" || peek().startswith("=")) {
    inExpr = true;
    consume("=");
    uint64_t value = readPrimary()().val;
    std::array<uint8_t, 4> buf;
    write32be(buf.data(), (uint32_t)value);
  
    cmd->filler = buf;
    inExpr = false;
  }

With it we stop supporting syntax like `SECTIONS { .mysec : { *(.mysec*) } =0x11223300+0x44 }`.
It is a deviation from the specification which says that "fillexp is an expression" and mentions a unary +.

> As you can see, GNU ld's `=` syntax is weird...

Yes, but it the current state LLD seems to have a reasonable behavior.
I am not sure we should intentionally ignore specification and remove this feature just because of a specific issue
with "/DISCARD/".


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74687/new/

https://reviews.llvm.org/D74687





More information about the llvm-commits mailing list