[lld] r276619 - [ELF] - Linkerscript: implemented output section [address] attribute.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 25 01:29:47 PDT 2016
Author: grimar
Date: Mon Jul 25 03:29:46 2016
New Revision: 276619
URL: http://llvm.org/viewvc/llvm-project?rev=276619&view=rev
Log:
[ELF] - Linkerscript: implemented output section [address] attribute.
Output section description in SECTIONS looks like that:
section [address] [(type)] :
...
{
...
}
Patch implements support of address atribute.
Differential revision: https://reviews.llvm.org/D22689
Added:
lld/trunk/test/ELF/linkerscript-outsections-addr.s
Modified:
lld/trunk/ELF/LinkerScript.cpp
lld/trunk/ELF/LinkerScript.h
lld/trunk/test/ELF/linkerscript/linkerscript-diagnostic.s
Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=276619&r1=276618&r2=276619&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Mon Jul 25 03:29:46 2016
@@ -194,6 +194,9 @@ void LinkerScript<ELFT>::assignAddresses
if (Sec->getName() != Cmd->Name)
continue;
+ if (Cmd->AddrExpr)
+ Dot = Cmd->AddrExpr(Dot);
+
if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) {
uintX_t TVA = Dot + ThreadBssOffset;
TVA = alignTo(TVA, Sec->getAlignment());
@@ -648,6 +651,12 @@ static int precedence(StringRef Op) {
void ScriptParser::readOutputSectionDescription(StringRef OutSec) {
OutputSectionCommand *Cmd = new OutputSectionCommand(OutSec);
Opt.Commands.emplace_back(Cmd);
+
+ // Read an address expression.
+ // https://sourceware.org/binutils/docs/ld/Output-Section-Address.html#Output-Section-Address
+ if (peek() != ":")
+ Cmd->AddrExpr = readExpr();
+
expect(":");
// Parse constraints.
Modified: lld/trunk/ELF/LinkerScript.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.h?rev=276619&r1=276618&r2=276619&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.h (original)
+++ lld/trunk/ELF/LinkerScript.h Mon Jul 25 03:29:46 2016
@@ -72,6 +72,7 @@ struct OutputSectionCommand : BaseComman
: BaseCommand(OutputSectionKind), Name(Name) {}
static bool classof(const BaseCommand *C);
StringRef Name;
+ Expr AddrExpr;
std::vector<std::unique_ptr<BaseCommand>> Commands;
std::vector<StringRef> Phdrs;
std::vector<uint8_t> Filler;
Added: lld/trunk/test/ELF/linkerscript-outsections-addr.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript-outsections-addr.s?rev=276619&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript-outsections-addr.s (added)
+++ lld/trunk/test/ELF/linkerscript-outsections-addr.s Mon Jul 25 03:29:46 2016
@@ -0,0 +1,122 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+# RUN: echo "SECTIONS { \
+# RUN: .aaa 0x2000 : \
+# RUN: { \
+# RUN: *(.aaa) \
+# RUN: } \
+# RUN: .bbb 0x1 ? 0x3000 : 0x4000 : \
+# RUN: { \
+# RUN: *(.bbb) \
+# RUN: } \
+# RUN: .ccc ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) : \
+# RUN: { \
+# RUN: *(.ccc) \
+# RUN: } \
+# RUN: .ddd 0x5001 : \
+# RUN: { \
+# RUN: *(.ddd) \
+# RUN: } \
+# RUN: }" > %t.script
+# RUN: ld.lld %t --script %t.script -o %tout
+# RUN: llvm-readobj -s %tout | FileCheck %s
+
+## Check:
+## 1) Simple constant as address.
+## 2) That something that contains ":" character, like ternary
+## operator works as expression.
+## 3) That complex expressions work.
+## 4) That section alignment still applied to explicitly specified address.
+
+#CHECK:Sections [
+#CHECK: Section {
+#CHECK: Index: 0
+#CHECK: Name:
+#CHECK: Type: SHT_NULL
+#CHECK: Flags [
+#CHECK: ]
+#CHECK: Address: 0x0
+#CHECK: Offset: 0x0
+#CHECK: Size: 0
+#CHECK: Link: 0
+#CHECK: Info: 0
+#CHECK: AddressAlignment: 0
+#CHECK: EntrySize: 0
+#CHECK: }
+#CHECK: Section {
+#CHECK: Index: 1
+#CHECK: Name: .aaa
+#CHECK: Type: SHT_PROGBITS
+#CHECK: Flags [
+#CHECK: SHF_ALLOC
+#CHECK: ]
+#CHECK: Address: 0x2000
+#CHECK: Offset: 0x1000
+#CHECK: Size: 8
+#CHECK: Link: 0
+#CHECK: Info: 0
+#CHECK: AddressAlignment: 1
+#CHECK: EntrySize: 0
+#CHECK: }
+#CHECK: Section {
+#CHECK: Index: 2
+#CHECK: Name: .bbb
+#CHECK: Type: SHT_PROGBITS
+#CHECK: Flags [
+#CHECK: SHF_ALLOC
+#CHECK: ]
+#CHECK: Address: 0x3000
+#CHECK: Offset: 0x2000
+#CHECK: Size: 8
+#CHECK: Link: 0
+#CHECK: Info: 0
+#CHECK: AddressAlignment: 1
+#CHECK: EntrySize: 0
+#CHECK: }
+#CHECK: Section {
+#CHECK: Index: 3
+#CHECK: Name: .ccc
+#CHECK: Type: SHT_PROGBITS
+#CHECK: Flags [
+#CHECK: SHF_ALLOC
+#CHECK: ]
+#CHECK: Address: 0x4008
+#CHECK: Offset: 0x2008
+#CHECK: Size: 8
+#CHECK: Link: 0
+#CHECK: Info: 0
+#CHECK: AddressAlignment: 1
+#CHECK: EntrySize: 0
+#CHECK: }
+#CHECK: Section {
+#CHECK: Index: 4
+#CHECK: Name: .ddd
+#CHECK: Type: SHT_PROGBITS
+#CHECK: Flags [
+#CHECK: SHF_ALLOC
+#CHECK: ]
+#CHECK: Address: 0x5010
+#CHECK: Offset: 0x2010
+#CHECK: Size: 8
+#CHECK: Link: 0
+#CHECK: Info: 0
+#CHECK: AddressAlignment: 16
+#CHECK: EntrySize: 0
+#CHECK: }
+
+.globl _start
+_start:
+nop
+
+.section .aaa, "a"
+.quad 0
+
+.section .bbb, "a"
+.quad 0
+
+.section .ccc, "a"
+.quad 0
+
+.section .ddd, "a"
+.align 16
+.quad 0
Modified: lld/trunk/test/ELF/linkerscript/linkerscript-diagnostic.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/linkerscript-diagnostic.s?rev=276619&r1=276618&r2=276619&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/linkerscript-diagnostic.s (original)
+++ lld/trunk/test/ELF/linkerscript/linkerscript-diagnostic.s Mon Jul 25 03:29:46 2016
@@ -61,6 +61,6 @@
# RUN: echo "boom .temp : { *(.temp) } }" >> %t.script
# RUN: not ld.lld -shared %t -o %t1 --script %t.script > %t.log 2>&1
# RUN: FileCheck -check-prefix=ERR7 %s < %t.log
-# ERR7: line 4: : expected, but got .temp
+# ERR7: line 4: malformed number: .temp
# ERR7-NEXT: boom .temp : { *(.temp) } }
# RUN: grep '^ ^' %t.log
More information about the llvm-commits
mailing list