[lld] r285608 - Move IsAbsolute from SymbolAssignment to Expr.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 31 10:55:44 PDT 2016


Isn't this almost the same as the Eugene's patch?

On Mon, Oct 31, 2016 at 10:43 AM, Rafael Espindola via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: rafael
> Date: Mon Oct 31 12:43:38 2016
> New Revision: 285608
>
> URL: http://llvm.org/viewvc/llvm-project?rev=285608&view=rev
> Log:
> Move IsAbsolute from SymbolAssignment to Expr.
>
> And as a token of the new feature, make ALIGNOF always absolute.
>
> This is a step in making it possible to have non absolute symbols out
> of output sections.
>
> Added:
>     lld/trunk/test/ELF/linkerscript/absolute-expr.s
> Modified:
>     lld/trunk/ELF/LinkerScript.cpp
>     lld/trunk/ELF/LinkerScript.h
>
> Modified: lld/trunk/ELF/LinkerScript.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> LinkerScript.cpp?rev=285608&r1=285607&r2=285608&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/LinkerScript.cpp (original)
> +++ lld/trunk/ELF/LinkerScript.cpp Mon Oct 31 12:43:38 2016
> @@ -64,7 +64,7 @@ template <class ELFT> static void addSyn
>  }
>
>  template <class ELFT> static void addSymbol(SymbolAssignment *Cmd) {
> -  if (Cmd->IsAbsolute)
> +  if (Cmd->Expression.IsAbsolute)
>      addRegular<ELFT>(Cmd);
>    else
>      addSynthetic<ELFT>(Cmd);
> @@ -1424,7 +1424,7 @@ SymbolAssignment *ScriptParser::readProv
>      Cmd = readProvideHidden(true, true);
>    }
>    if (Cmd && MakeAbsolute)
> -    Cmd->IsAbsolute = true;
> +    Cmd->Expression.IsAbsolute = true;
>    return Cmd;
>  }
>
> @@ -1436,20 +1436,19 @@ static uint64_t getSymbolValue(StringRef
>
>  SymbolAssignment *ScriptParser::readAssignment(StringRef Name) {
>    StringRef Op = next();
> -  bool IsAbsolute = false;
>    Expr E;
>    assert(Op == "=" || Op == "+=");
>    if (consume("ABSOLUTE")) {
>      // The RHS may be something like "ABSOLUTE(.) & 0xff".
>      // Call readExpr1 to read the whole expression.
>      E = readExpr1(readParenExpr(), 0);
> -    IsAbsolute = true;
> +    E.IsAbsolute = true;
>    } else {
>      E = readExpr();
>    }
>    if (Op == "+=")
>      E = [=](uint64_t Dot) { return getSymbolValue(Name, Dot) + E(Dot); };
> -  return new SymbolAssignment(Name, E, IsAbsolute);
> +  return new SymbolAssignment(Name, E);
>  }
>
>  // This is an operator-precedence parser to parse a linker
> @@ -1671,8 +1670,9 @@ Expr ScriptParser::readPrimary() {
>    }
>    if (Tok == "ALIGNOF") {
>      StringRef Name = readParenLiteral();
> -    return
> -        [=](uint64_t Dot) { return ScriptBase->getOutputSectionAlign(Name);
> };
> +    return {
> +        [=](uint64_t Dot) { return ScriptBase->getOutputSectionAlign(Name);
> },
> +        true};
>    }
>    if (Tok == "SIZEOF_HEADERS")
>      return [=](uint64_t Dot) { return ScriptBase->getHeaderSize(); };
>
> Modified: lld/trunk/ELF/LinkerScript.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> LinkerScript.h?rev=285608&r1=285607&r2=285608&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/LinkerScript.h (original)
> +++ lld/trunk/ELF/LinkerScript.h Mon Oct 31 12:43:38 2016
> @@ -37,7 +37,17 @@ class InputSectionData;
>  // ScriptParser::readExpr reads an expression and returns an Expr.
>  // Later, we evaluate the expression by calling the function
>  // with the value of special context variable ".".
> -typedef std::function<uint64_t(uint64_t)> Expr;
> +struct Expr {
> +  std::function<uint64_t(uint64_t)> Val;
> +  bool IsAbsolute;
> +  uint64_t operator()(uint64_t Dot) const { return Val(Dot); }
> +  operator bool() const { return (bool)Val; }
> +
> +  template <typename T>
> +  Expr(T Val, bool IsAbsolute) : Val(Val), IsAbsolute(IsAbsolute) {}
> +  template <typename T> Expr(T V) : Expr(V, false) {}
> +  Expr() : Expr(nullptr) {}
> +};
>

I really liked the fact that an expression is compiled to a lambda in our
linker script processor. Isn't there any other way to do this?

 // Parses a linker script. Calling this function updates
>  // Config and ScriptConfig.
> @@ -64,9 +74,8 @@ struct BaseCommand {
>
>  // This represents ". = <expr>" or "<symbol> = <expr>".
>  struct SymbolAssignment : BaseCommand {
> -  SymbolAssignment(StringRef Name, Expr E, bool IsAbsolute)
> -      : BaseCommand(AssignmentKind), Name(Name), Expression(E),
> -        IsAbsolute(IsAbsolute) {}
> +  SymbolAssignment(StringRef Name, Expr E)
> +      : BaseCommand(AssignmentKind), Name(Name), Expression(E) {}
>    static bool classof(const BaseCommand *C);
>
>    // The LHS of an expression. Name is either a symbol name or ".".
> @@ -79,7 +88,6 @@ struct SymbolAssignment : BaseCommand {
>    // Command attributes for PROVIDE, HIDDEN and PROVIDE_HIDDEN.
>    bool Provide = false;
>    bool Hidden = false;
> -  bool IsAbsolute;
>  };
>
>  // Linker scripts allow additional constraints to be put on ouput
> sections.
>
> Added: lld/trunk/test/ELF/linkerscript/absolute-expr.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/
> linkerscript/absolute-expr.s?rev=285608&view=auto
> ============================================================
> ==================
> --- lld/trunk/test/ELF/linkerscript/absolute-expr.s (added)
> +++ lld/trunk/test/ELF/linkerscript/absolute-expr.s Mon Oct 31 12:43:38
> 2016
> @@ -0,0 +1,17 @@
> +# REQUIRES: x86
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
> +# RUN: echo "SECTIONS { \
> +# RUN:                  .text : { bar = ALIGNOF(.text); *(.text) } \
> +# RUN:                };" > %t.script
> +# RUN: ld.lld -o %t.so --script %t.script %t.o -shared
> +# RUN: llvm-readobj -t %t.so | FileCheck %s
> +
> +# CHECK:      Symbol {
> +# CHECK:        Name: bar
> +# CHECK-NEXT:   Value: 0x4
> +# CHECK-NEXT:   Size: 0
> +# CHECK-NEXT:   Binding: Global
> +# CHECK-NEXT:   Type: None
> +# CHECK-NEXT:   Other: 0
> +# CHECK-NEXT:   Section: Absolute
> +# CHECK-NEXT: }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161031/842d0391/attachment.html>


More information about the llvm-commits mailing list