From 8b250344e9bbf2d61c329cef7d5ee90b7a9cd44f Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 20 Sep 2017 17:43:44 +0000 Subject: [PATCH] Add a special case for trivial alignment. Normally to find the offset of a value in a section, we have to compute the value since the alignment is defined on the final address. If the alignment is trivial, we can skip the value computation. This allows us to know the offset even in cases where we cannot yet know the value. llvm-svn: 313777 --- lld/ELF/LinkerScript.cpp | 5 +++++ lld/test/ELF/linkerscript/early-assign-symbol.s | 14 ++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index b7170675c190..af8398290e67 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -71,6 +71,11 @@ uint64_t ExprValue::getSecAddr() const { } uint64_t ExprValue::getSectionOffset() const { + // If the alignment is trivial, we don't have to compute the full + // value to know the offset. This allows this function to succeed in + // cases where the output section is not yet known. + if (Alignment == 1) + return Val; return getValue() - getSecAddr(); } diff --git a/lld/test/ELF/linkerscript/early-assign-symbol.s b/lld/test/ELF/linkerscript/early-assign-symbol.s index e2e9175070ff..413724e113d5 100644 --- a/lld/test/ELF/linkerscript/early-assign-symbol.s +++ b/lld/test/ELF/linkerscript/early-assign-symbol.s @@ -1,9 +1,6 @@ # REQUIRES: x86 # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o -# RUN: echo "SECTIONS { aaa = 1 + ABSOLUTE(foo - 1); .text : { *(.text*) } }" > %t1.script -# RUN: not ld.lld -o %t --script %t1.script %t.o 2>&1 | FileCheck %s - # RUN: echo "SECTIONS { aaa = ABSOLUTE(foo - 1) + 1; .text : { *(.text*) } }" > %t2.script # RUN: not ld.lld -o %t --script %t2.script %t.o 2>&1 | FileCheck %s @@ -12,9 +9,18 @@ # CHECK: error: {{.*}}.script:1: unable to evaluate expression: input section .text has no output section assigned -# Simple case that we can handle. +# Simple cases that we can handle. + +# RUN: echo "SECTIONS { aaa = 1 + ABSOLUTE(foo - 1); .text : { *(.text*) } }" > %t.script +# RUN: ld.lld -o %t --script %t.script %t.o +# RUN: llvm-objdump -t %t | FileCheck --check-prefix=VAL %s + # RUN: echo "SECTIONS { aaa = ABSOLUTE(foo); .text : { *(.text*) } }" > %t4.script # RUN: ld.lld -o %t --script %t4.script %t.o +# RUN: llvm-objdump -t %t | FileCheck --check-prefix=VAL %s + +# VAL: 0000000000000000 .text 00000000 foo +# VAL: 0000000000000000 *ABS* 00000000 aaa .section .text .globl foo