summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2017-03-17 13:45:36 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2017-03-17 13:45:36 +0000
commitf2115f04c8a152af8b3dbf069cd5cba5854841a5 (patch)
tree6957e7122c97b5684f46bf1e247327ff87e6a797
parent8fe7aea52779ce328a2f07e7c8194048b736ca21 (diff)
downloadbcm5719-llvm-f2115f04c8a152af8b3dbf069cd5cba5854841a5.tar.gz
bcm5719-llvm-f2115f04c8a152af8b3dbf069cd5cba5854841a5.zip
Support non abs values in the rhs of +.
llvm-svn: 298088
-rw-r--r--lld/ELF/LinkerScript.cpp2
-rw-r--r--lld/test/ELF/linkerscript/expr-sections.s35
2 files changed, 37 insertions, 0 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index b05d55492b9..7ca9b298347 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -60,6 +60,8 @@ uint64_t ExprValue::getValue() const {
}
static ExprValue add(ExprValue A, ExprValue B) {
+ if (A.isAbsolute())
+ std::swap(A, B);
return {A.Sec, A.ForceAbsolute, A.Val + B.getValue()};
}
static ExprValue sub(ExprValue A, ExprValue B) {
diff --git a/lld/test/ELF/linkerscript/expr-sections.s b/lld/test/ELF/linkerscript/expr-sections.s
new file mode 100644
index 00000000000..74b9393db85
--- /dev/null
+++ b/lld/test/ELF/linkerscript/expr-sections.s
@@ -0,0 +1,35 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: echo "SECTIONS { foo = ADDR(.text) + 1; bar = 1 + ADDR(.text); };" > %t.script
+# RUN: ld.lld -o %t.so --script %t.script %t.o -shared
+# RUN: llvm-readobj -t -s %t.so | FileCheck %s
+
+# CHECK: Section {
+# CHECK: Index:
+# CHECK: Name: .text
+# CHECK-NEXT: Type:
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: SHF_ALLOC
+# CHECK-NEXT: SHF_EXECINSTR
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address: 0x0
+
+# CHECK: Symbol {
+# CHECK: Name: foo
+# CHECK-NEXT: Value: 0x1
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: None
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .text
+# CHECK-NEXT: }
+
+# CHECK: Symbol {
+# CHECK: Name: bar
+# CHECK-NEXT: Value: 0x1
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: None
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .text
+# CHECK-NEXT: }
OpenPOWER on IntegriCloud