Index: lld/trunk/ELF/LinkerScript.h =================================================================== --- lld/trunk/ELF/LinkerScript.h +++ lld/trunk/ELF/LinkerScript.h @@ -73,6 +73,7 @@ static bool classof(const BaseCommand *C); StringRef Name; Expr AddrExpr; + Expr AlignExpr; std::vector> Commands; std::vector Phdrs; std::vector Filler; Index: lld/trunk/ELF/LinkerScript.cpp =================================================================== --- lld/trunk/ELF/LinkerScript.cpp +++ lld/trunk/ELF/LinkerScript.cpp @@ -226,6 +226,9 @@ if (Cmd->AddrExpr) Dot = Cmd->AddrExpr(Dot); + if (Cmd->AlignExpr) + Sec->updateAlignment(Cmd->AlignExpr(Dot)); + if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) { uintX_t TVA = Dot + ThreadBssOffset; TVA = alignTo(TVA, Sec->getAlignment()); @@ -433,6 +436,7 @@ std::vector readOutputSectionPhdrs(); unsigned readPhdrType(); void readProvide(bool Hidden); + void readAlign(OutputSectionCommand *Cmd); Expr readExpr(); Expr readExpr1(Expr Lhs, int MinPrec); @@ -671,6 +675,12 @@ expect(")"); } +void ScriptParser::readAlign(OutputSectionCommand *Cmd) { + expect("("); + Cmd->AlignExpr = readExpr(); + expect(")"); +} + void ScriptParser::readOutputSectionDescription(StringRef OutSec) { OutputSectionCommand *Cmd = new OutputSectionCommand(OutSec); Opt.Commands.emplace_back(Cmd); @@ -682,6 +692,9 @@ expect(":"); + if (skip("ALIGN")) + readAlign(Cmd); + // Parse constraints. if (skip("ONLY_IF_RO")) Cmd->Constraint = ConstraintKind::ReadOnly; Index: lld/trunk/test/ELF/linkerscript/linkerscript-align.s =================================================================== --- lld/trunk/test/ELF/linkerscript/linkerscript-align.s +++ lld/trunk/test/ELF/linkerscript/linkerscript-align.s @@ -1,6 +1,7 @@ # REQUIRES: x86 # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t +## Check that ALIGN command workable using location counter # RUN: echo "SECTIONS { \ # RUN: . = 0x10000; \ # RUN: .aaa : \ @@ -27,6 +28,25 @@ # CHECK-NEXT: 2 .bbb 00000008 0000000000011000 DATA # CHECK-NEXT: 3 .ccc 00000008 0000000000014000 DATA +## Check output sections ALIGN modificator +# RUN: echo "SECTIONS { \ +# RUN: . = 0x10000; \ +# RUN: .aaa : \ +# RUN: { \ +# RUN: *(.aaa) \ +# RUN: } \ +# RUN: .bbb : ALIGN(4096) \ +# RUN: { \ +# RUN: *(.bbb) \ +# RUN: } \ +# RUN: .ccc : ALIGN(4096 * 4) \ +# RUN: { \ +# RUN: *(.ccc) \ +# RUN: } \ +# RUN: }" > %t2.script +# RUN: ld.lld -o %t2 --script %t2.script %t +# RUN: llvm-objdump -section-headers %t1 | FileCheck %s + .global _start _start: nop