<div dir="ltr">LGTM</div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, May 24, 2015 at 11:57 AM, Davide Italiano <span dir="ltr"><<a href="mailto:dccitaliano@gmail.com" target="_blank">dccitaliano@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi ruiu, atanasyan, Bigcheese,<br>
<br>
Note: Needs to wait until D9958 lands for a testcase/commit.<br>
<br>
REPOSITORY<br>
  rL LLVM<br>
<br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D9963&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=N3K54Hv_yxOHrNnx_8NvFrZaK5m-ZQ3G9G70vtzAEEw&s=0GNzQtj15mLglksw73HcJimgd7Aqo1NnIcpM3631NUg&e=" target="_blank">http://reviews.llvm.org/D9963</a><br>
<br>
Files:<br>
  include/lld/ReaderWriter/ELFLinkingContext.h<br>
  lib/Driver/GnuLdDriver.cpp<br>
  lib/ReaderWriter/ELF/OutputELFWriter.cpp<br>
<br>
Index: include/lld/ReaderWriter/ELFLinkingContext.h<br>
===================================================================<br>
--- include/lld/ReaderWriter/ELFLinkingContext.h<br>
+++ include/lld/ReaderWriter/ELFLinkingContext.h<br>
@@ -97,6 +97,12 @@<br>
     OMAGIC,<br>
   };<br>
<br>
+  /// \brief ELF DT_FLAGS.<br>
+  enum DTFlag : uint32_t {<br>
+    DT_NOW = 1 << 1,<br>
+    DT_ORIGIN = 1 << 2,<br>
+  };<br>
+<br>
   llvm::Triple getTriple() const { return _triple; }<br>
<br>
   uint64_t getPageSize() const { return _maxPageSize; }<br>
@@ -329,6 +335,10 @@<br>
   // --wrap option.<br>
   void addWrapForSymbol(StringRef sym) { _wrapCalls.insert(sym); }<br>
<br>
+  // \brief Set DT_FLAGS flag.<br>
+  void setDTFlag(DTFlag f) { _dtFlags |= f; };<br>
+  bool getDTFlag(DTFlag f) { return (_dtFlags & f); };<br>
+<br>
   const llvm::StringSet<> &wrapCalls() const { return _wrapCalls; }<br>
<br>
   void setUndefinesResolver(std::unique_ptr<File> resolver);<br>
@@ -383,6 +393,7 @@<br>
   bool _armTarget1Rel = false;<br>
   bool _mipsPcRelEhRel = false;<br>
   uint64_t _maxPageSize = 0x1000;<br>
+  uint32_t _dtFlags = 0;<br>
<br>
   OutputMagic _outputMagic = OutputMagic::DEFAULT;<br>
   StringRefVector _inputSearchPaths;<br>
Index: lib/Driver/GnuLdDriver.cpp<br>
===================================================================<br>
--- lib/Driver/GnuLdDriver.cpp<br>
+++ lib/Driver/GnuLdDriver.cpp<br>
@@ -584,9 +584,13 @@<br>
<br>
   for (auto *arg : parsedArgs->filtered(OPT_z)) {<br>
     StringRef opt = arg->getValue();<br>
-    if (opt == "muldefs") {<br>
+    if (opt == "muldefs")<br>
       ctx->setAllowDuplicates(true);<br>
-    } else if (opt.startswith("max-page-size")) {<br>
+    else if (opt == "now")<br>
+      ctx->setDTFlag(ELFLinkingContext::DTFlag::DT_NOW);<br>
+    else if (opt == "origin")<br>
+      ctx->setDTFlag(ELFLinkingContext::DTFlag::DT_ORIGIN);<br>
+    else if (opt.startswith("max-page-size")) {<br>
       // Parse -z max-page-size option.<br>
       // The default page size is considered the minimum page size the user<br>
       // can set, check the user input if its atleast the minimum page size<br>
Index: lib/ReaderWriter/ELF/OutputELFWriter.cpp<br>
===================================================================<br>
--- lib/ReaderWriter/ELF/OutputELFWriter.cpp<br>
+++ lib/ReaderWriter/ELF/OutputELFWriter.cpp<br>
@@ -140,6 +140,21 @@<br>
   if (!soname.empty() && _ctx.getOutputELFType() == llvm::ELF::ET_DYN)<br>
     _dynamicTable->addEntry(DT_SONAME, _dynamicStringTable->addString(soname));<br>
<br>
+  // Add DT_FLAGS/DT_FLAGS_1 entries if necessary.<br>
+  uint32_t dtflags = 0, dt1flags = 0;<br>
+  if (_ctx.getDTFlag(ELFLinkingContext::DTFlag::DT_NOW)) {<br>
+    dtflags |= DF_BIND_NOW;<br>
+    dt1flags |= DF_1_NOW;<br>
+  }<br>
+  if (_ctx.getDTFlag(ELFLinkingContext::DTFlag::DT_ORIGIN)) {<br>
+    dtflags |= DF_ORIGIN;<br>
+    dt1flags |= DF_1_ORIGIN;<br>
+  }<br>
+  if (dtflags != 0)<br>
+    _dynamicTable->addEntry(DT_FLAGS, dtflags);<br>
+  if (dt1flags != 0)<br>
+    _dynamicTable->addEntry(DT_FLAGS_1, dt1flags);<br>
+<br>
   // The dynamic symbol table need to be sorted earlier because the hash<br>
   // table needs to be built using the dynamic symbol table. It would be<br>
   // late to sort the symbols due to that in finalize. In the dynamic symbol<br>
<br>
EMAIL PREFERENCES<br>
  <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_settings_panel_emailpreferences_&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=N3K54Hv_yxOHrNnx_8NvFrZaK5m-ZQ3G9G70vtzAEEw&s=hl0JkzopJT9LkvAQC66lThMqOtluGIaoLuhlLH6_7CQ&e=" target="_blank">http://reviews.llvm.org/settings/panel/emailpreferences/</a><br>
</blockquote></div><br></div>