[lld] r277014 - Add support for SEGMENT_START.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 28 11:16:24 PDT 2016


Author: rafael
Date: Thu Jul 28 13:16:24 2016
New Revision: 277014

URL: http://llvm.org/viewvc/llvm-project?rev=277014&view=rev
Log:
Add support for SEGMENT_START.

This is a bit of an odd feature. It is normally used in

. = SEGMENT_START(seg, val);

In bfd it evaluates to val or to the value of the corresponding
-T<seg>-segment. Note that the -T<seg>-segment in bfd doesn't actually
change the segment address, just the value this evaluates too,
including in the default linker script.

In gold the -T<seg>-segment options do change the segment address and
seeing this expressions in linker scripts disables the options.

For new this just always evaluates the expression to val.

Added:
    lld/trunk/test/ELF/linkerscript/Inputs/segment-start.script
    lld/trunk/test/ELF/linkerscript/segment-start.s
Modified:
    lld/trunk/ELF/LinkerScript.cpp

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=277014&r1=277013&r2=277014&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Thu Jul 28 13:16:24 2016
@@ -872,6 +872,15 @@ Expr ScriptParser::readPrimary() {
     expect(")");
     return [=](uint64_t Dot) { return getConstant(Tok); };
   }
+  if (Tok == "SEGMENT_START") {
+    expect("(");
+    next();
+    expect(",");
+    uint64_t Val;
+    next().getAsInteger(0, Val);
+    expect(")");
+    return [=](uint64_t Dot) { return Val; };
+  }
   if (Tok == "DATA_SEGMENT_ALIGN") {
     expect("(");
     Expr E = readExpr();

Added: lld/trunk/test/ELF/linkerscript/Inputs/segment-start.script
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/Inputs/segment-start.script?rev=277014&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/Inputs/segment-start.script (added)
+++ lld/trunk/test/ELF/linkerscript/Inputs/segment-start.script Thu Jul 28 13:16:24 2016
@@ -0,0 +1,7 @@
+SECTIONS
+{
+  PROVIDE (foobar1 = SEGMENT_START("text-segment", 0x8001));
+  PROVIDE (foobar2 = SEGMENT_START("data-segment", 0x8002));
+  PROVIDE (foobar3 = SEGMENT_START("bss-segment", 0x8003));
+  PROVIDE (foobar4 = SEGMENT_START("abc-segment", 0x8004));
+}

Added: lld/trunk/test/ELF/linkerscript/segment-start.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/segment-start.s?rev=277014&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/segment-start.s (added)
+++ lld/trunk/test/ELF/linkerscript/segment-start.s Thu Jul 28 13:16:24 2016
@@ -0,0 +1,22 @@
+// REQUIRES: x86
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+// RUN: ld.lld %t.o %S/Inputs/segment-start.script -shared -o %t.so
+// RUN: llvm-readobj --dyn-symbols %t.so | FileCheck %s
+
+// CHECK:      Name: foobar1
+// CHECK-NEXT: Value: 0x8001
+
+// CHECK:      Name: foobar2
+// CHECK-NEXT: Value: 0x8002
+
+// CHECK:      Name: foobar3
+// CHECK-NEXT: Value: 0x8003
+
+// CHECK:      Name: foobar
+// CHECK-NEXT: Value: 0x8004
+
+.data
+.quad foobar1
+.quad foobar2
+.quad foobar3
+.quad foobar4




More information about the llvm-commits mailing list