[PATCH] D16820: Implement common symbol size calculation in llvm-size

khemant@codeaurora.org via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 8 13:22:56 PST 2016


khemant updated this revision to Diff 50065.
khemant added a comment.

Addressed comments


Repository:
  rL LLVM

http://reviews.llvm.org/D16820

Files:
  test/tools/llvm-size/X86/test-common.s
  tools/llvm-size/llvm-size.cpp

Index: tools/llvm-size/llvm-size.cpp
===================================================================
--- tools/llvm-size/llvm-size.cpp
+++ tools/llvm-size/llvm-size.cpp
@@ -57,6 +57,12 @@
 DarwinLongFormat("l", cl::desc("When format is darwin, use long format "
                                "to include addresses and offsets."));
 
+cl::opt<bool>
+    ELFCommons("common",
+               cl::desc("Print common symbols in the ELF file.  When using "
+                        "Berkely format, this is added to bss."),
+               cl::init(false));
+
 static cl::list<std::string>
 ArchFlags("arch", cl::desc("architecture(s) from a Mach-O file to dump"),
           cl::ZeroOrMore);
@@ -127,6 +133,15 @@
   return true;
 }
 
+/// Total size of all ELF common symbols
+static uint64_t getCommonSize(ObjectFile *Obj) {
+  uint64_t TotalCommons = 0;
+  for (auto &Sym : Obj->symbols())
+    if (Obj->getSymbolFlags(Sym.getRawDataRefImpl()) & SymbolRef::SF_Common)
+      TotalCommons += Obj->getCommonSymbolSize(Sym.getRawDataRefImpl());
+  return TotalCommons;
+}
+
 /// Print the size of each Mach-O segment and section in @p MachO.
 ///
 /// This is when used when @c OutputFormat is darwin and produces the same
@@ -352,6 +367,13 @@
       outs() << format(fmt.str().c_str(), namestr.c_str(), size, addr);
     }
 
+    if (ELFCommons) {
+      uint64_t CommonSize = getCommonSize(Obj);
+      total += CommonSize;
+      outs() << format(fmt.str().c_str(), std::string("*COM*").c_str(),
+                       CommonSize, static_cast<uint64_t>(0));
+    }
+
     // Print total.
     fmtbuf.clear();
     fmt << "%-" << max_name_len << "s "
@@ -379,6 +401,9 @@
         total_bss += size;
     }
 
+    if (ELFCommons)
+      total_bss += getCommonSize(Obj);
+
     total = total_text + total_data + total_bss;
 
     if (!BerkeleyHeaderPrinted) {
Index: test/tools/llvm-size/X86/test-common.s
===================================================================
--- /dev/null
+++ test/tools/llvm-size/X86/test-common.s
@@ -0,0 +1,29 @@
+// #Check that with common switch commons are added to bss or 
+// #Shown as *COM* otherwise their size is discounted
+// RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux
+// RUN: llvm-size -A -common %t.o | FileCheck --check-prefix="SYSV" %s
+// RUN: llvm-size -B -common %t.o| FileCheck --check-prefix="BSD" %s
+// RUN: llvm-size -A %t.o | FileCheck --check-prefix="SYSVNOCOMM" %s
+// RUN: llvm-size -B %t.o| FileCheck --check-prefix="BSDNOCOMM" %s
+	.type	x, at object             
+	.comm	x,4,4
+	.type	y, at object            
+	.comm	y,4,4
+	.type	z, at object           
+	.comm	z,4,4
+// SYSV:      {{[ -\(\)_A-Za-z0-9.\\/:]+}}  :
+// SYSV-NEXT: section   size   addr
+// SYSV-NEXT: .text          0      0
+// SYSV-NEXT: *COM*     12      0
+// SYSV-NEXT: Total     12
+
+// SYSVNOCOMM:      {{[ -\(\)_A-Za-z0-9.\\/:]+}}  :
+// SYSVNOCOMM-NEXT: section   size   addr
+// SYSVNOCOMM-NEXT: .text          0      0
+// SYSVNOCOMM-NEXT: Total      0
+
+// BSD:      text    data     bss     dec     hex filename
+// BSD-NEXT:    0       0      12       12       c  {{[ -\(\)_A-Za-z0-9.\\/:]+}}
+
+// BSDNOCOMM:      text    data     bss     dec     hex filename
+// BSDNOCOMM-NEXT:    0       0       0       0       0  {{[ -\(\)_A-Za-z0-9.\\/:]+}}


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16820.50065.patch
Type: text/x-patch
Size: 3309 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160308/aa911296/attachment.bin>


More information about the llvm-commits mailing list