Index: lld/trunk/ELF/LinkerScript.h =================================================================== --- lld/trunk/ELF/LinkerScript.h +++ lld/trunk/ELF/LinkerScript.h @@ -168,12 +168,12 @@ // Represents BYTE(), SHORT(), LONG(), or QUAD(). struct BytesDataCommand : BaseCommand { - BytesDataCommand(uint64_t Data, unsigned Size) - : BaseCommand(BytesDataKind), Data(Data), Size(Size) {} + BytesDataCommand(Expr E, unsigned Size) + : BaseCommand(BytesDataKind), Expression(E), Size(Size) {} static bool classof(const BaseCommand *C); - uint64_t Data; + Expr Expression; unsigned Offset; unsigned Size; }; Index: lld/trunk/ELF/LinkerScript.cpp =================================================================== --- lld/trunk/ELF/LinkerScript.cpp +++ lld/trunk/ELF/LinkerScript.cpp @@ -852,7 +852,7 @@ auto *Cmd = dyn_cast(Opt.Commands[I].get()); for (const std::unique_ptr &Base : Cmd->Commands) if (auto *Data = dyn_cast(Base.get())) - writeInt(Buf + Data->Offset, Data->Data, Data->Size); + writeInt(Buf + Data->Offset, Data->Expression(0), Data->Size); } template bool LinkerScript::hasLMA(StringRef Name) { @@ -1688,13 +1688,7 @@ if (Size == -1) return nullptr; - expect("("); - uint64_t Val = 0; - StringRef S = next(); - if (!readInteger(S, Val)) - setError("unexpected value: " + S); - expect(")"); - return new BytesDataCommand(Val, Size); + return new BytesDataCommand(readParenExpr(), Size); } StringRef ScriptParser::readParenLiteral() { Index: lld/trunk/test/ELF/linkerscript/data-commands.s =================================================================== --- lld/trunk/test/ELF/linkerscript/data-commands.s +++ lld/trunk/test/ELF/linkerscript/data-commands.s @@ -12,14 +12,28 @@ # RUN: *(.foo.4) \ # RUN: QUAD(0x1122334455667788) \ # RUN: } \ +# RUN: .bar : { \ +# RUN: *(.bar.1) \ +# RUN: BYTE(a + 1) \ +# RUN: *(.bar.2) \ +# RUN: SHORT(b) \ +# RUN: *(.bar.3) \ +# RUN: LONG(c + 2) \ +# RUN: *(.bar.4) \ +# RUN: QUAD(d) \ +# RUN: } \ # RUN: }" > %t.script -# RUN: ld.lld -o %t --script %t.script %t.o +# RUN: ld.lld -o %t %t.o --script %t.script # RUN: llvm-objdump -s %t | FileCheck %s # CHECK: Contents of section .foo: # CHECK-NEXT: ff11ff22 11ff4433 2211ff88 77665544 # CHECK-NEXT: 332211 +# CHECK: Contents of section .bar: +# CHECK-NEXT: ff12ff22 11ff4633 2211ff88 77665544 +# CHECK-NEXT: 332211 + # RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux %s -o %tmips64be # RUN: ld.lld --script %t.script %tmips64be -o %t2 # RUN: llvm-objdump -s %t2 | FileCheck %s --check-prefix=BE @@ -27,6 +41,25 @@ # BE-NEXT: ff11ff11 22ff1122 3344ff11 22334455 # BE-NEXT: 667788 +# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux %s -o %tmips64be +# RUN: ld.lld --script %t.script %tmips64be -o %t2 +# RUN: llvm-objdump -s %t2 | FileCheck %s --check-prefix=BE +# BE: Contents of section .bar: +# BE-NEXT: ff12ff11 22ff1122 3346ff11 22334455 +# BE-NEXT: 667788 + +.global a +a = 0x11 + +.global b +b = 0x1122 + +.global c +c = 0x11223344 + +.global d +d = 0x1122334455667788 + .section .foo.1, "a" .byte 0xFF @@ -38,3 +71,15 @@ .section .foo.4, "a" .byte 0xFF + +.section .bar.1, "a" + .byte 0xFF + +.section .bar.2, "a" + .byte 0xFF + +.section .bar.3, "a" + .byte 0xFF + +.section .bar.4, "a" + .byte 0xFF