<br><br>On Monday, June 22, 2015, Rafael Espindola <<a href="mailto:rafael.espindola@gmail.com">rafael.espindola@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Mon Jun 22 21:08:48 2015<br>
New Revision: 240366<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D240366-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=-9qtAOOxpzpCYPdAczaw8E4x_SDv8K8AalIAg06V_6E&s=ma-4nsgDgROb21M49cNl0TmTvTvgaA4I8FE8dQLMhYM&e=" target="_blank">http://llvm.org/viewvc/llvm-project?rev=240366&view=rev</a><br>
Log:<br>
Extract an utility for computing symbol sizes on MachO and COFF.<br>
<br>
I will add a second user in the next commit.<br>
<br>
Added:<br>
    llvm/trunk/include/llvm/Object/SymbolSize.h<br>
    llvm/trunk/lib/Object/SymbolSize.cpp<br>
Modified:<br>
    llvm/trunk/lib/Object/CMakeLists.txt<br>
    llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp<br>
<br>
Added: llvm/trunk/include/llvm/Object/SymbolSize.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_Object_SymbolSize.h-3Frev-3D240366-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=-9qtAOOxpzpCYPdAczaw8E4x_SDv8K8AalIAg06V_6E&s=eNg5in4MVBkCuspP-9rFKuvzD_FH5X0u1IBElAs1mwA&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/SymbolSize.h?rev=240366&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Object/SymbolSize.h (added)<br>
+++ llvm/trunk/include/llvm/Object/SymbolSize.h Mon Jun 22 21:08:48 2015<br>
@@ -0,0 +1,26 @@<br>
+//===- SymbolSize.h ---------------------------------------------*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// Declares the writeArchive function for writing an archive file.</blockquote><div>But does it really declare writeArchive? ;-)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#ifndef LLVM_OBJECT_SYMBOLSIZE_H<br>
+#define LLVM_OBJECT_SYMBOLSIZE_H<br>
+<br>
+#include "llvm/Object/ObjectFile.h"<br>
+<br>
+namespace llvm {<br>
+namespace object {<br>
+ErrorOr<std::vector<std::pair<SymbolRef, uint64_t>>><br>
+computeSymbolSizes(const ObjectFile &O);<br>
+}<br>
+} // namespace llvm<br>
+<br>
+#endif<br>
<br>
Modified: llvm/trunk/lib/Object/CMakeLists.txt<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Object_CMakeLists.txt-3Frev-3D240366-26r1-3D240365-26r2-3D240366-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=-9qtAOOxpzpCYPdAczaw8E4x_SDv8K8AalIAg06V_6E&s=B9wrMMFYfjwOjDxL17OjBpR_OdPKf_mtNof-iYbrAmU&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/CMakeLists.txt?rev=240366&r1=240365&r2=240366&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Object/CMakeLists.txt (original)<br>
+++ llvm/trunk/lib/Object/CMakeLists.txt Mon Jun 22 21:08:48 2015<br>
@@ -16,6 +16,7 @@ add_llvm_library(LLVMObject<br>
   ObjectFile.cpp<br>
   RecordStreamer.cpp<br>
   SymbolicFile.cpp<br>
+  SymbolSize.cpp<br>
<br>
   ADDITIONAL_HEADER_DIRS<br>
   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Object<br>
<br>
Added: llvm/trunk/lib/Object/SymbolSize.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Object_SymbolSize.cpp-3Frev-3D240366-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=-9qtAOOxpzpCYPdAczaw8E4x_SDv8K8AalIAg06V_6E&s=ccsXcfLzXrz41aW7twwzTeGcORtry6MS4qIkbY9YHtI&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/SymbolSize.cpp?rev=240366&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Object/SymbolSize.cpp (added)<br>
+++ llvm/trunk/lib/Object/SymbolSize.cpp Mon Jun 22 21:08:48 2015<br>
@@ -0,0 +1,88 @@<br>
+//===- SymbolSize.cpp -----------------------------------------------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "llvm/Object/SymbolSize.h"<br>
+#include "llvm/ADT/STLExtras.h"<br>
+#include "llvm/Object/ELFObjectFile.h"<br>
+<br>
+using namespace llvm;<br>
+using namespace object;<br>
+<br>
+namespace {<br>
+struct SymEntry {<br>
+  symbol_iterator I;<br>
+  uint64_t Address;<br>
+  unsigned Number;<br>
+  SectionRef Section;<br>
+};<br>
+}<br>
+<br>
+static int compareAddress(const SymEntry *A, const SymEntry *B) {<br>
+  if (A->Section == B->Section)<br>
+    return A->Address - B->Address;<br>
+  if (A->Section < B->Section)<br>
+    return -1;<br>
+  return 1;<br>
+}<br>
+<br>
+static int compareNumber(const SymEntry *A, const SymEntry *B) {<br>
+  return A->Number - B->Number;<br>
+}<br>
+<br>
+ErrorOr<std::vector<std::pair<SymbolRef, uint64_t>>><br>
+llvm::object::computeSymbolSizes(const ObjectFile &O) {<br>
+  std::vector<std::pair<SymbolRef, uint64_t>> Ret;<br>
+<br>
+  if (isa<ELFObjectFileBase>(&O)) {<br>
+    for (SymbolRef Sym : O.symbols()) {<br>
+      Ret.push_back({Sym, Sym.getSize()});<br>
+    }<br>
+    return Ret;<br>
+  }<br>
+<br>
+  // Collect sorted symbol addresses. Include dummy addresses for the end<br>
+  // of each section.<br>
+  std::vector<SymEntry> Addresses;<br>
+  unsigned SymNum = 0;<br>
+  for (symbol_iterator I = O.symbol_begin(), E = O.symbol_end(); I != E; ++I) {</blockquote><div>Why don't you use .symbols()?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    SymbolRef Sym = *I;<br>
+    uint64_t Address;<br>
+    if (std::error_code EC = Sym.getAddress(Address))<br>
+      return EC;<br>
+    section_iterator SecI = O.section_end();<br>
+    if (std::error_code EC = Sym.getSection(SecI))<br>
+      return EC;<br>
+    Addresses.push_back({I, Address, SymNum, *SecI});<br>
+    ++SymNum;<br>
+  }<br>
+  for (const SectionRef Sec : O.sections()) {<br>
+    uint64_t Address = Sec.getAddress();<br>
+    uint64_t Size = Sec.getSize();<br>
+    Addresses.push_back({O.symbol_end(), Address + Size, 0, Sec});<br>
+  }<br>
+  array_pod_sort(Addresses.begin(), Addresses.end(), compareAddress);<br>
+<br>
+  // Compute the size as the gap to the next symbol<br>
+  for (unsigned I = 0, N = Addresses.size() - 1; I < N; ++I) {<br>
+    auto &P = Addresses[I];<br>
+    if (P.I == O.symbol_end())<br>
+      continue;<br>
+    uint64_t Size = Addresses[I + 1].Address - P.Address;<br>
+    P.Address = Size;<br>
+  }<br>
+<br>
+  // Put back in the original order and copy the result<br>
+  array_pod_sort(Addresses.begin(), Addresses.end(), compareNumber);<br>
+  for (SymEntry &P : Addresses) {<br>
+    if (P.I == O.symbol_end())<br>
+      continue;<br>
+    Ret.push_back({*P.I, P.Address});<br>
+  }<br>
+  return Ret;<br>
+}<br>
<br>
Modified: llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_tools_llvm-2Drtdyld_llvm-2Drtdyld.cpp-3Frev-3D240366-26r1-3D240365-26r2-3D240366-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=-9qtAOOxpzpCYPdAczaw8E4x_SDv8K8AalIAg06V_6E&s=_J031eZx4aI-kWRLQO3_gNwwrUEGPZUuLq1k1lIcR-M&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp?rev=240366&r1=240365&r2=240366&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp (original)<br>
+++ llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp Mon Jun 22 21:08:48 2015<br>
@@ -25,6 +25,7 @@<br>
 #include "llvm/MC/MCRegisterInfo.h"<br>
 #include "llvm/MC/MCSubtargetInfo.h"<br>
 #include "llvm/Object/MachO.h"<br>
+#include "llvm/Object/SymbolSize.h"<br>
 #include "llvm/Support/CommandLine.h"<br>
 #include "llvm/Support/DynamicLibrary.h"<br>
 #include "llvm/Support/ManagedStatic.h"<br>
@@ -252,38 +253,14 @@ static int printLineInfoForInput(bool Lo<br>
     std::unique_ptr<DIContext> Context(<br>
       new DWARFContextInMemory(*SymbolObj,LoadedObjInfo.get()));<br>
<br>
-    // FIXME: This is generally useful. Figure out a place in lib/Object to<br>
-    // put utility functions.<br>
-    std::map<object::SectionRef, std::vector<uint64_t>> FuncAddresses;<br>
-    if (!isa<ELFObjectFileBase>(SymbolObj)) {<br>
-      for (object::SymbolRef Sym : SymbolObj->symbols()) {<br>
-        object::SymbolRef::Type SymType;<br>
-        if (Sym.getType(SymType))<br>
-          continue;<br>
-        if (SymType != object::SymbolRef::ST_Function)<br>
-          continue;<br>
-        uint64_t Addr;<br>
-        if (Sym.getAddress(Addr))<br>
-          continue;<br>
-        object::section_iterator Sec = SymbolObj->section_end();<br>
-        if (Sym.getSection(Sec))<br>
-          continue;<br>
-        std::vector<uint64_t> &Addrs = FuncAddresses[*Sec];<br>
-        if (Addrs.empty()) {<br>
-          uint64_t SecAddr = Sec->getAddress();<br>
-          uint64_t SecSize = Sec->getSize();<br>
-          Addrs.push_back(SecAddr + SecSize);<br>
-        }<br>
-        Addrs.push_back(Addr);<br>
-      }<br>
-      for (auto &Pair : FuncAddresses) {<br>
-        std::vector<uint64_t> &Addrs = Pair.second;<br>
-        array_pod_sort(Addrs.begin(), Addrs.end());<br>
-      }<br>
-    }<br>
+    ErrorOr<std::vector<std::pair<SymbolRef, uint64_t>>> SymAddrOrErr =<br>
+        object::computeSymbolSizes(*SymbolObj);<br>
+    if (std::error_code EC = SymAddrOrErr.getError())<br>
+      return Error(EC.message());<br>
<br>
     // Use symbol info to iterate functions in the object.<br>
-    for (object::SymbolRef Sym : SymbolObj->symbols()) {<br>
+    for (const auto &P : *SymAddrOrErr) {<br>
+      object::SymbolRef Sym = P.first;<br>
       object::SymbolRef::Type SymType;<br>
       if (Sym.getType(SymType))<br>
         continue;<br>
@@ -295,20 +272,7 @@ static int printLineInfoForInput(bool Lo<br>
         if (Sym.getAddress(Addr))<br>
           continue;<br>
<br>
-        uint64_t Size;<br>
-        if (isa<ELFObjectFileBase>(SymbolObj)) {<br>
-          Size = Sym.getSize();<br>
-        } else {<br>
-          object::section_iterator Sec = SymbolObj->section_end();<br>
-          if (Sym.getSection(Sec))<br>
-            continue;<br>
-          const std::vector<uint64_t> &Addrs = FuncAddresses[*Sec];<br>
-          auto AddrI = std::find(Addrs.begin(), Addrs.end(), Addr);<br>
-          assert(AddrI != Addrs.end() && (AddrI + 1) != Addrs.end());<br>
-          assert(*AddrI == Addr);<br>
-          Size = *(AddrI + 1) - Addr;<br>
-        }<br>
-<br>
+        uint64_t Size = P.second;<br>
         // If we're not using the debug object, compute the address of the<br>
         // symbol in memory (rather than that in the unrelocated object file)<br>
         // and use that to query the DWARFContext.<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;llvm-commits@cs.uiuc.edu&#39;)">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote><br><br>-- <br>  F<br><br>