[PATCH] D16820: Implement common symbol size calculation in llvm-size
khemant@codeaurora.org via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 28 09:53:35 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL264591: [llvm-size] Implement --common option (authored by khemant).
Changed prior to commit:
http://reviews.llvm.org/D16820?vs=50065&id=51800#toc
Repository:
rL LLVM
http://reviews.llvm.org/D16820
Files:
llvm/trunk/test/tools/llvm-size/X86/test-common.s
llvm/trunk/tools/llvm-size/llvm-size.cpp
Index: llvm/trunk/test/tools/llvm-size/X86/test-common.s
===================================================================
--- llvm/trunk/test/tools/llvm-size/X86/test-common.s
+++ llvm/trunk/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.\\/:]+}}
Index: llvm/trunk/tools/llvm-size/llvm-size.cpp
===================================================================
--- llvm/trunk/tools/llvm-size/llvm-size.cpp
+++ llvm/trunk/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) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16820.51800.patch
Type: text/x-patch
Size: 3368 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160328/5adeab88/attachment.bin>
More information about the llvm-commits
mailing list