summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-size/llvm-size.cpp
diff options
context:
space:
mode:
authorHemant Kulkarni <khemant@codeaurora.org>2016-03-28 16:48:10 +0000
committerHemant Kulkarni <khemant@codeaurora.org>2016-03-28 16:48:10 +0000
commit274457e5e80646e19eb9113e241c20999f1ed3dd (patch)
treedc3ad6093ee7136f46b4b176c1992dc4df08cd36 /llvm/tools/llvm-size/llvm-size.cpp
parent088a726f6f85782dec24f80deb7be556d4fe6698 (diff)
downloadbcm5719-llvm-274457e5e80646e19eb9113e241c20999f1ed3dd.tar.gz
bcm5719-llvm-274457e5e80646e19eb9113e241c20999f1ed3dd.zip
[llvm-size] Implement --common option
Differential Revision: http://reviews.llvm.org/D16820 llvm-svn: 264591
Diffstat (limited to 'llvm/tools/llvm-size/llvm-size.cpp')
-rw-r--r--llvm/tools/llvm-size/llvm-size.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/tools/llvm-size/llvm-size.cpp b/llvm/tools/llvm-size/llvm-size.cpp
index 098f1529800..f386a244885 100644
--- a/llvm/tools/llvm-size/llvm-size.cpp
+++ b/llvm/tools/llvm-size/llvm-size.cpp
@@ -57,6 +57,12 @@ cl::opt<bool>
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 @@ static bool considerForSize(ObjectFile *Obj, SectionRef Section) {
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 @@ static void printObjectSectionSizes(ObjectFile *Obj) {
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 @@ static void printObjectSectionSizes(ObjectFile *Obj) {
total_bss += size;
}
+ if (ELFCommons)
+ total_bss += getCommonSize(Obj);
+
total = total_text + total_data + total_bss;
if (!BerkeleyHeaderPrinted) {
OpenPOWER on IntegriCloud