<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Apr 26, 2017 at 3:40 AM, George Rimar via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: grimar<br>
Date: Wed Apr 26 05:40:02 2017<br>
New Revision: 301391<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=301391&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=301391&view=rev</a><br>
Log:<br>
[ELF] - Implemented --defsym option.<br>
<br>
gnu ld description of option is:<br>
<br>
--defsym=symbol=expression<br>
Create a global symbol in the output file, containing the absolute address given<br>
by expression. You may use this option as many times as necessary to define multiple<br>
symbols in the command line. A limited form of arithmetic is supported for the<br>
expression in this context: you may give a hexadecimal constant or the name of an<br>
existing symbol, or use "+" and "-" to add or subtract hexadecimal constants or<br>
symbols. If you need more elaborate expressions, consider using the linker command<br>
language from a script. Note: there should be no white space between symbol,<br>
the equals sign ("="), and expression.<br>
<br>
In compare with D32082, this patch does not support math expressions and absolute<br>
symbols. It implemented via code similar to --wrap. That covers 1 of 3 possible<br>
--defsym cases.<br>
<br>
Differential revision: <a href="https://reviews.llvm.org/D32171" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D32171</a><br>
<br>
Added:<br>
    lld/trunk/test/ELF/defsym.s<br>
Modified:<br>
    lld/trunk/ELF/Driver.cpp<br>
    lld/trunk/ELF/Options.td<br>
    lld/trunk/ELF/SymbolTable.cpp<br>
    lld/trunk/ELF/SymbolTable.h<br>
<br>
Modified: lld/trunk/ELF/Driver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=301391&r1=301390&r2=301391&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/Driver.<wbr>cpp?rev=301391&r1=301390&r2=<wbr>301391&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Driver.cpp (original)<br>
+++ lld/trunk/ELF/Driver.cpp Wed Apr 26 05:40:02 2017<br>
@@ -880,6 +880,21 @@ static uint64_t getImageBase(opt::InputA<br>
   return V;<br>
 }<br>
<br>
+// Parses --defsym=alias option.<br>
+static std::vector<std::pair<<wbr>StringRef, StringRef>><br>
+getDefsym(opt::InputArgList &Args) {<br>
+  std::vector<std::pair<<wbr>StringRef, StringRef>> Ret;<br>
+  for (auto *Arg : Args.filtered(OPT_defsym)) {<br>
+    StringRef From;<br>
+    StringRef To;<br>
+    std::tie(From, To) = StringRef(Arg->getValue()).<wbr>split('=');<br>
+    if (!isValidCIdentifier(To))<br>
+      error("--defsym: symbol name expected, but got " + To);<br>
+    Ret.push_back({From, To});<br>
+  }<br>
+  return Ret;<br>
+}<br>
+<br>
 // Do actual linking. Note that when this function is called,<br>
 // all linker scripts have already been parsed.<br>
 template <class ELFT> void LinkerDriver::link(opt::<wbr>InputArgList &Args) {<br>
@@ -945,6 +960,10 @@ template <class ELFT> void LinkerDriver:<br>
   for (auto *Arg : Args.filtered(OPT_wrap))<br>
     Symtab.wrap(Arg->getValue());<br>
<br>
+  // Handle --defsym=sym=alias option.<br>
+  for (std::pair<StringRef, StringRef> &Def : getDefsym(Args))<br>
+    Symtab.alias(Def.first, Def.second);<br>
+<br>
   // Now that we have a complete list of input files.<br>
   // Beyond this point, no new files are added.<br>
   // Aggregate all input sections into one place.<br>
<br>
Modified: lld/trunk/ELF/Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.td?rev=301391&r1=301390&r2=301391&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/Options.<wbr>td?rev=301391&r1=301390&r2=<wbr>301391&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Options.td (original)<br>
+++ lld/trunk/ELF/Options.td Wed Apr 26 05:40:02 2017<br>
@@ -25,6 +25,8 @@ def build_id_eq: J<"build-id=">, HelpTex<br>
 def compress_debug_sections : J<"compress-debug-sections=">,<br>
   HelpText<"Compress DWARF debug sections">;<br>
<br>
+def defsym: J<"defsym=">, HelpText<"Define a symbol alias">;<br>
+<br></blockquote><div><br></div><div>This option is also accepted as `--defsym foo=0x1000`, not just `--defsym=foo=0x1000`.</div><div><br></div><div>-- Sean Silva</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
 def L: JoinedOrSeparate<["-"], "L">, MetaVarName<"<dir>">,<br>
   HelpText<"Add a directory to the library search path">;<br>
<br>
<br>
Modified: lld/trunk/ELF/SymbolTable.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=301391&r1=301390&r2=301391&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>SymbolTable.cpp?rev=301391&r1=<wbr>301390&r2=301391&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/SymbolTable.cpp (original)<br>
+++ lld/trunk/ELF/SymbolTable.cpp Wed Apr 26 05:40:02 2017<br>
@@ -168,6 +168,19 @@ template <class ELFT> void SymbolTable<E<br>
   memcpy(Sym->Body.buffer, Wrap->Body.buffer, sizeof(Wrap->Body));<br>
 }<br>
<br>
+// Creates alias for symbol. Used to implement --defsym=ALIAS=SYM.<br>
+template <class ELFT><br>
+void SymbolTable<ELFT>::alias(<wbr>StringRef Alias, StringRef Name) {<br>
+  SymbolBody *B = find(Name);<br>
+  if (!B) {<br>
+    error("-defsym: undefined symbol: " + Name);<br>
+    return;<br>
+  }<br>
+  Symbol *Sym = B->symbol();<br>
+  Symbol *AliasSym = addUndefined(Alias);<br>
+  memcpy(AliasSym->Body.buffer, Sym->Body.buffer, sizeof(AliasSym->Body));<br>
+}<br>
+<br>
 static uint8_t getMinVisibility(uint8_t VA, uint8_t VB) {<br>
   if (VA == STV_DEFAULT)<br>
     return VB;<br>
<br>
Modified: lld/trunk/ELF/SymbolTable.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=301391&r1=301390&r2=301391&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>SymbolTable.h?rev=301391&r1=<wbr>301390&r2=301391&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/SymbolTable.h (original)<br>
+++ lld/trunk/ELF/SymbolTable.h Wed Apr 26 05:40:02 2017<br>
@@ -86,6 +86,7 @@ public:<br>
<br>
   void trace(StringRef Name);<br>
   void wrap(StringRef Name);<br>
+  void alias(StringRef Alias, StringRef Name);<br>
<br>
 private:<br>
   std::vector<SymbolBody *> findByVersion(SymbolVersion Ver);<br>
<br>
Added: lld/trunk/test/ELF/defsym.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/defsym.s?rev=301391&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>defsym.s?rev=301391&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/defsym.s (added)<br>
+++ lld/trunk/test/ELF/defsym.s Wed Apr 26 05:40:02 2017<br>
@@ -0,0 +1,44 @@<br>
+# REQUIRES: x86<br>
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o<br>
+# RUN: ld.lld -o %t %t.o --defsym=foo2=foo1<br>
+# RUN: llvm-readobj -t -s %t | FileCheck %s<br>
+# RUN: llvm-objdump -d -print-imm-hex %t | FileCheck %s --check-prefix=USE<br>
+<br>
+## In compare with GNU linkers, symbol defined with --defsym does<br>
+## not get aliased name in symbol table:<br>
+# CHECK:      Symbol {<br>
+# CHECK:        Name: foo1<br>
+# CHECK-NEXT:   Value: 0x123<br>
+# CHECK-NEXT:   Size:<br>
+# CHECK-NEXT:   Binding: Global<br>
+# CHECK-NEXT:   Type:<br>
+# CHECK-NEXT:   Other:<br>
+# CHECK-NEXT:   Section: Absolute<br>
+# CHECK-NEXT: }<br>
+# CHECK-NEXT: Symbol {<br>
+# CHECK-NEXT:   Name: foo1<br>
+# CHECK-NEXT:   Value: 0x123<br>
+# CHECK-NEXT:   Size:<br>
+# CHECK-NEXT:   Binding: Global<br>
+# CHECK-NEXT:   Type:<br>
+# CHECK-NEXT:   Other:<br>
+# CHECK-NEXT:   Section: Absolute<br>
+# CHECK-NEXT: }<br>
+<br>
+## Check we can use foo2 and it that it is an alias for foo1.<br>
+# USE:       Disassembly of section .text:<br>
+# USE-NEXT:  _start:<br>
+# USE-NEXT:    movl $0x123, %edx<br>
+<br>
+# RUN: not ld.lld -o %t %t.o --defsym=foo2=1 2>&1 | FileCheck %s -check-prefix=ERR1<br>
+# ERR1: error: --defsym: symbol name expected, but got 1<br>
+<br>
+# RUN: not ld.lld -o %t %t.o --defsym=foo2=und 2>&1 | FileCheck %s -check-prefix=ERR2<br>
+# ERR2: error: -defsym: undefined symbol: und<br>
+<br>
+.globl foo1<br>
+ foo1 = 0x123<br>
+<br>
+.global _start<br>
+_start:<br>
+  movl $foo2, %edx<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>