forked from OSchip/llvm-project
[llvm-size] Implement --common option
Differential Revision: http://reviews.llvm.org/D16820 llvm-svn: 264591
This commit is contained in:
parent
088a726f6f
commit
274457e5e8
|
@ -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,@object
|
||||
.comm x,4,4
|
||||
.type y,@object
|
||||
.comm y,4,4
|
||||
.type z,@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.\\/:]+}}
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue