[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