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.

llvm-svn: 277014
This commit is contained in:
Rafael Espindola 2016-07-28 18:16:24 +00:00
parent 6a74284652
commit 54c145ce0e
3 changed files with 38 additions and 0 deletions

View File

@ -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();

View File

@ -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));
}

View File

@ -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