[PATCH] D29775: [LLD] Add memory ORIGIN and LENGTH expression support
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 13 08:24:25 PST 2017
LGTM too
Robert Clarke via Phabricator via llvm-commits
<llvm-commits at lists.llvm.org> writes:
> raidiun updated this revision to Diff 87870.
> raidiun added a comment.
>
> Better MemoryRegion existence check
> Updates styling
> Removes superfluous braces
> Removes extra newline
>
>
> 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,33 @@
> +# 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
> +
> +# RUN: echo "SECTIONS { \
> +# RUN: no_exist_origin = ORIGIN(ram); \
> +# RUN: no_exist_length = LENGTH(ram); \
> +# RUN: }" > %t2.script
> +# RUN: not ld.lld -o %t2 --script %t2.script %t 2>&1 \
> +# RUN: | FileCheck -check-prefix=ERR %s
> +# ERR: {{.*}}.script:1: memory region not defined: ram
> +
> +
> +.global _start
> +_start:
> + nop
> Index: ELF/LinkerScript.cpp
> ===================================================================
> --- ELF/LinkerScript.cpp
> +++ ELF/LinkerScript.cpp
> @@ -1866,6 +1866,18 @@
> }
> if (Tok == "SIZEOF_HEADERS")
> return [=](uint64_t Dot) { return ScriptBase->getHeaderSize(); };
> + if (Tok == "ORIGIN") {
> + StringRef Name = readParenLiteral();
> + if (ScriptConfig->MemoryRegions.count(Name) == 0)
> + setError("memory region not defined: " + Name);
> + return [=](uint64_t Dot) { return ScriptConfig->MemoryRegions[Name].Origin; };
> + }
> + if (Tok == "LENGTH") {
> + StringRef Name = readParenLiteral();
> + if (ScriptConfig->MemoryRegions.count(Name) == 0)
> + setError("memory region not defined: " + Name);
> + return [=](uint64_t Dot) { return ScriptConfig->MemoryRegions[Name].Length; };
> + }
>
> // Tok is a literal number.
> uint64_t V;
>
>
> Index: test/ELF/linkerscript/symbol-memoryexpr.s
> ===================================================================
> --- test/ELF/linkerscript/symbol-memoryexpr.s
> +++ test/ELF/linkerscript/symbol-memoryexpr.s
> @@ -0,0 +1,33 @@
> +# 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
> +
> +# RUN: echo "SECTIONS { \
> +# RUN: no_exist_origin = ORIGIN(ram); \
> +# RUN: no_exist_length = LENGTH(ram); \
> +# RUN: }" > %t2.script
> +# RUN: not ld.lld -o %t2 --script %t2.script %t 2>&1 \
> +# RUN: | FileCheck -check-prefix=ERR %s
> +# ERR: {{.*}}.script:1: memory region not defined: ram
> +
> +
> +.global _start
> +_start:
> + nop
> Index: ELF/LinkerScript.cpp
> ===================================================================
> --- ELF/LinkerScript.cpp
> +++ ELF/LinkerScript.cpp
> @@ -1866,6 +1866,18 @@
> }
> if (Tok == "SIZEOF_HEADERS")
> return [=](uint64_t Dot) { return ScriptBase->getHeaderSize(); };
> + if (Tok == "ORIGIN") {
> + StringRef Name = readParenLiteral();
> + if (ScriptConfig->MemoryRegions.count(Name) == 0)
> + setError("memory region not defined: " + Name);
> + return [=](uint64_t Dot) { return ScriptConfig->MemoryRegions[Name].Origin; };
> + }
> + if (Tok == "LENGTH") {
> + StringRef Name = readParenLiteral();
> + if (ScriptConfig->MemoryRegions.count(Name) == 0)
> + setError("memory region not defined: " + Name);
> + return [=](uint64_t Dot) { return ScriptConfig->MemoryRegions[Name].Length; };
> + }
>
> // Tok is a literal number.
> uint64_t V;
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list