[PATCH] D29775: [LLD] Add memory ORIGIN and LENGTH expression support

Robert Clarke via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 9 10:57:14 PST 2017


raidiun created this revision.
raidiun added a project: lld.

Adds support for the ORIGIN and MEMORY functions in expression parsing.
ORIGIN produces an absolute address based on the memory section it references.
LENGTH produces the length of the referenced memory section.


https://reviews.llvm.org/D29775

Files:
  ELF/LinkerScript.cpp
  test/ELF/linkerscript/symbol-memoryexpr.s


Index: test/ELF/linkerscript/symbol-memoryexpr.s
===================================================================
--- test/ELF/linkerscript/symbol-memoryexpr.s
+++ test/ELF/linkerscript/symbol-memoryexpr.s
@@ -0,0 +1,24 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+
+# RUN: echo "MEMORY { \
+# RUN:   ram (rwx)  : ORIGIN = 0x8000, LENGTH = 256K \
+# RUN: } \
+# RUN: SECTIONS { \
+# RUN:         origin = ORIGIN(ram); \
+# RUN:         length = LENGTH(ram); \
+# RUN:         end    = ORIGIN(ram) + LENGTH(ram); \
+# RUN:       }" > %t.script
+# RUN: ld.lld -o %t1 --script %t.script %t
+# RUN: llvm-objdump -t %t1 | FileCheck %s
+
+# CHECK:      SYMBOL TABLE:
+# CHECK-NEXT: 0000000000000000 *UND* 00000000
+# CHECK-NEXT: 0000000000008000 .text 00000000 _start
+# CHECK-NEXT: 0000000000008000 *ABS* 00000000 origin
+# CHECK-NEXT: 0000000000040000 *ABS* 00000000 length
+# CHECK-NEXT: 0000000000048000 *ABS* 00000000 end
+
+.global _start
+_start:
+ nop
\ No newline at end of file
Index: ELF/LinkerScript.cpp
===================================================================
--- ELF/LinkerScript.cpp
+++ ELF/LinkerScript.cpp
@@ -1866,6 +1866,14 @@
   }
   if (Tok == "SIZEOF_HEADERS")
     return [=](uint64_t Dot) { return ScriptBase->getHeaderSize(); };
+  if (Tok == "ORIGIN") {
+    StringRef Name = readParenLiteral();
+    return { [=](uint64_t Dot) { return ScriptConfig->MemoryRegions[Name].Origin; } };
+    }
+  if (Tok == "LENGTH") {
+    StringRef Name = readParenLiteral();
+    return { [=](uint64_t Dot) { return ScriptConfig->MemoryRegions[Name].Length; } };
+    }
 
   // Tok is a literal number.
   uint64_t V;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29775.87840.patch
Type: text/x-patch
Size: 1680 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170209/5809814c/attachment.bin>


More information about the llvm-commits mailing list