aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-size/llvm-size.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-size/llvm-size.cpp')
-rw-r--r--llvm/tools/llvm-size/llvm-size.cpp34
1 files changed, 25 insertions, 9 deletions
diff --git a/llvm/tools/llvm-size/llvm-size.cpp b/llvm/tools/llvm-size/llvm-size.cpp
index 46ece5a..87fe469 100644
--- a/llvm/tools/llvm-size/llvm-size.cpp
+++ b/llvm/tools/llvm-size/llvm-size.cpp
@@ -196,11 +196,17 @@ static bool considerForSize(ObjectFile *Obj, SectionRef Section) {
}
/// Total size of all ELF common symbols
-static uint64_t getCommonSize(ObjectFile *Obj) {
+static Expected<uint64_t> getCommonSize(ObjectFile *Obj) {
uint64_t TotalCommons = 0;
- for (auto &Sym : Obj->symbols())
- if (Obj->getSymbolFlags(Sym.getRawDataRefImpl()) & SymbolRef::SF_Common)
+ for (auto &Sym : Obj->symbols()) {
+ Expected<uint32_t> SymFlagsOrErr =
+ Obj->getSymbolFlags(Sym.getRawDataRefImpl());
+ if (!SymFlagsOrErr)
+ // TODO: Test this error.
+ return SymFlagsOrErr.takeError();
+ if (*SymFlagsOrErr & SymbolRef::SF_Common)
TotalCommons += Obj->getCommonSymbolSize(Sym.getRawDataRefImpl());
+ }
return TotalCommons;
}
@@ -435,10 +441,14 @@ static void printObjectSectionSizes(ObjectFile *Obj) {
}
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));
+ if (Expected<uint64_t> CommonSizeOrErr = getCommonSize(Obj)) {
+ total += *CommonSizeOrErr;
+ outs() << format(fmt.str().c_str(), std::string("*COM*").c_str(),
+ *CommonSizeOrErr, static_cast<uint64_t>(0));
+ } else {
+ error(CommonSizeOrErr.takeError(), Obj->getFileName());
+ return;
+ }
}
// Print total.
@@ -469,8 +479,14 @@ static void printObjectSectionSizes(ObjectFile *Obj) {
total_bss += size;
}
- if (ELFCommons)
- total_bss += getCommonSize(Obj);
+ if (ELFCommons) {
+ if (Expected<uint64_t> CommonSizeOrErr = getCommonSize(Obj))
+ total_bss += *CommonSizeOrErr;
+ else {
+ error(CommonSizeOrErr.takeError(), Obj->getFileName());
+ return;
+ }
+ }
total = total_text + total_data + total_bss;