summaryrefslogtreecommitdiff
path: root/tools/llvm-size/llvm-size.cpp
diff options
context:
space:
mode:
authorHemant Kulkarni <khemant@codeaurora.org>2016-09-12 17:08:28 +0000
committerHemant Kulkarni <khemant@codeaurora.org>2016-09-12 17:08:28 +0000
commit7ee831747ce43cf82de2d4ffe8bcbf2af8ebe8f2 (patch)
treeb252925ad5d419fa279ec75e235ac84dc222d76e /tools/llvm-size/llvm-size.cpp
parent11981cd22ee9d0225c700cf61a7f41c41d843c29 (diff)
llvm-size: Add --totals option
Differential Revision: https://reviews.llvm.org/D24308 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281233 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-size/llvm-size.cpp')
-rw-r--r--tools/llvm-size/llvm-size.cpp41
1 files changed, 39 insertions, 2 deletions
diff --git a/tools/llvm-size/llvm-size.cpp b/tools/llvm-size/llvm-size.cpp
index 8da0ec677cb..3cf76cd8864 100644
--- a/tools/llvm-size/llvm-size.cpp
+++ b/tools/llvm-size/llvm-size.cpp
@@ -52,6 +52,10 @@ static cl::opt<OutputFormatTy> OutputFormatShort(
static bool BerkeleyHeaderPrinted = false;
static bool MoreThanOneFile = false;
+static uint64_t TotalObjectText = 0;
+static uint64_t TotalObjectData = 0;
+static uint64_t TotalObjectBss = 0;
+static uint64_t TotalObjectTotal = 0;
cl::opt<bool>
DarwinLongFormat("l", cl::desc("When format is darwin, use long format "
@@ -81,6 +85,14 @@ RadixShort(cl::desc("Print size in radix:"),
clEnumValEnd),
cl::init(decimal));
+static cl::opt<bool>
+ TotalSizes("totals",
+ cl::desc("Print totals of all objects - Berkeley format only"),
+ cl::init(false));
+
+static cl::alias TotalSizesShort("t", cl::desc("Short for --totals"),
+ cl::aliasopt(TotalSizes));
+
static cl::list<std::string>
InputFilenames(cl::Positional, cl::desc("<input files>"), cl::ZeroOrMore);
@@ -108,7 +120,7 @@ static bool error(Twine Message) {
// This version of error() prints the archive name and member name, for example:
// "libx.a(foo.o)" after the ToolName before the error message. It sets
-// HadError but returns allowing the code to move on to other archive members.
+// HadError but returns allowing the code to move on to other archive members.
static void error(llvm::Error E, StringRef FileName, const Archive::Child &C,
StringRef ArchitectureName = StringRef()) {
HadError = true;
@@ -136,7 +148,7 @@ static void error(llvm::Error E, StringRef FileName, const Archive::Child &C,
// This version of error() prints the file name and which architecture slice it // is from, for example: "foo.o (for architecture i386)" after the ToolName
// before the error message. It sets HadError but returns allowing the code to
-// move on to other architecture slices.
+// move on to other architecture slices.
static void error(llvm::Error E, StringRef FileName,
StringRef ArchitectureName = StringRef()) {
HadError = true;
@@ -462,6 +474,13 @@ static void printObjectSectionSizes(ObjectFile *Obj) {
total = total_text + total_data + total_bss;
+ if (TotalSizes) {
+ TotalObjectText += total_text;
+ TotalObjectData += total_data;
+ TotalObjectBss += total_bss;
+ TotalObjectTotal += total;
+ }
+
if (!BerkeleyHeaderPrinted) {
outs() << " text data bss "
<< (Radix == octal ? "oct" : "dec") << " hex filename\n";
@@ -821,6 +840,22 @@ static void printFileSectionSizes(StringRef file) {
outs() << "\n";
}
+static void printBerkelyTotals() {
+ std::string fmtbuf;
+ raw_string_ostream fmt(fmtbuf);
+ const char *radix_fmt = getRadixFmt();
+ fmt << "%#7" << radix_fmt << " "
+ << "%#7" << radix_fmt << " "
+ << "%#7" << radix_fmt << " ";
+ outs() << format(fmt.str().c_str(), TotalObjectText, TotalObjectData,
+ TotalObjectBss);
+ fmtbuf.clear();
+ fmt << "%7" << (Radix == octal ? PRIo64 : PRIu64) << " "
+ << "%7" PRIx64 " ";
+ outs() << format(fmt.str().c_str(), TotalObjectTotal, TotalObjectTotal)
+ << "(TOTALS)\n";
+}
+
int main(int argc, char **argv) {
// Print a stack trace if we signal out.
sys::PrintStackTraceOnErrorSignal(argv[0]);
@@ -853,6 +888,8 @@ int main(int argc, char **argv) {
MoreThanOneFile = InputFilenames.size() > 1;
std::for_each(InputFilenames.begin(), InputFilenames.end(),
printFileSectionSizes);
+ if (OutputFormat == berkeley && TotalSizes)
+ printBerkelyTotals();
if (HadError)
return 1;