<html><head></head><body>Lgtm<br><br><div class="gmail_quote">On September 23, 2016 8:10:21 AM EDT, George Rimar <grimar@accesssoftek.com> wrote:<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<pre class="k9mail">grimar created this revision.<br />grimar added reviewers: ruiu, rafael.<br />grimar added subscribers: llvm-commits, grimar, davide, evgeny777.<br /><br />DEFINED(symbol)<br />Return 1 if symbol is in the linker global symbol table and is defined before<br />the statement using DEFINED in the script, otherwise return 0.<br /><br />Can be used to define default values for symbols. Found it in the wild here:<br /><a href="https://searchcode.com/file/103745382/board/bf561-ezkit/u-boot.lds.S">https://searchcode.com/file/103745382/board/bf561-ezkit/u-boot.lds.S</a><br /><br />Patch implements it.<br /><br /><a href="https://reviews.llvm.org/D24858">https://reviews.llvm.org/D24858</a><br /><br />Files:<br />  ELF/LinkerScript.cpp<br />  ELF/LinkerScript.h<br />  test/ELF/linkerscript/define.s<br /><br />Index: test/ELF/linkerscript/define.s<br /><hr /><br />--- test/ELF/linkerscript/define.s<br />+++ test/ELF/linkerscript/define.s<br />@@ -0,0 +1,25 @@<br />+#
REQUIRES: x86<br />+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t<br />+<br />+# RUN: echo "SECTIONS                                \<br />+# RUN: {                                             \<br />+# RUN:  . = DEFINED(defined) ? 0x11000 : .;          \<br />+# RUN:  .foo : { *(.foo*) }                          \<br />+# RUN:  . = DEFINED(notdefined) ? 0x12000 : 0x13000; \<br />+# RUN:  .bar : { *(.bar*) }                          \<br />+# RUN: }" > %t.script<br />+# RUN: ld.lld -o %t1 --script %t.script %t<br />+# RUN: llvm-objdump -section-headers %t1 | FileCheck %s<br />+<br />+# CHECK: 1 .foo  00000008 0000000000011000 DATA<br />+# CHECK: 2 .bar  00000008 0000000000013000 DATA<br />+# CHECK: 3 .text 00000000 0000000000013008 TEXT DATA<br />+<br />+.global defined<br />+defined = 0<br />+<br />+.section .foo,"a"<br />+.quad 1<br />+<br />+.section .bar,"a"<br />+.quad 1<br />Index: ELF/LinkerScript.h<br /><hr /><br />--- ELF/LinkerScript.h<br />+++
ELF/LinkerScript.h<br />@@ -157,6 +157,7 @@<br />   virtual uint64_t getOutputSectionAlign(StringRef Name) = 0;<br />   virtual uint64_t getHeaderSize() = 0;<br />   virtual uint64_t getSymbolValue(StringRef S) = 0;<br />+  virtual bool isDefined(StringRef S) = 0;<br /> };<br /> <br /> // ScriptConfiguration holds linker script parse results.<br />@@ -203,6 +204,7 @@<br />   uint64_t getOutputSectionAlign(StringRef Name) override;<br />   uint64_t getHeaderSize() override;<br />   uint64_t getSymbolValue(StringRef S) override;<br />+  bool isDefined(StringRef S) override;<br /> <br />   std::vector<OutputSectionBase<ELFT> *> *OutputSections;<br /> <br />Index: ELF/LinkerScript.cpp<br /><hr /><br />--- ELF/LinkerScript.cpp<br />+++ ELF/LinkerScript.cpp<br />@@ -756,6 +756,10 @@<br />   return 0;<br /> }<br /> <br />+template <class ELFT> bool LinkerScript<ELFT>::isDefined(StringRef S) {<br />+  return Symtab<ELFT>::X->find(S) != nullptr;<br />+}<br
/>+<br /> // Returns indices of ELF headers containing specific section, identified<br /> // by Name. Each index is a zero based number of ELF header listed within<br /> // PHDRS {} script block.<br />@@ -1484,6 +1488,14 @@<br />     expect(")");<br />     return [=](uint64_t Dot) { return getConstant(Tok); };<br />   }<br />+  if (Tok == "DEFINED") {<br />+    expect("(");<br />+    StringRef Tok = next();<br />+    expect(")");<br />+    return [=](uint64_t Dot) {<br />+      return ScriptBase->isDefined(Tok) ? 1 : 0;<br />+    };<br />+  }<br />   if (Tok == "SEGMENT_START") {<br />     expect("(");<br />     next();<br /><br /><br /></pre></blockquote></div><br>
-- <br>
Sent from my Android device with K-9 Mail. Please excuse my brevity.</body></html>