aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-size/llvm-size.cpp
diff options
context:
space:
mode:
authorvgxbj <higuoxing@gmail.com>2020-04-10 20:24:21 +0800
committervgxbj <higuoxing@gmail.com>2020-04-18 21:27:57 +0800
commitac00376a13e9b637a8bc6b9e2ae6fd668e01b0f9 (patch)
tree6962508217cdaf939712e44cfbaff1a091cfd32f /llvm/tools/llvm-size/llvm-size.cpp
parent9cd68bfa0e49f755a0cc90b27025fa2e48083050 (diff)
downloadllvm-ac00376a13e9b637a8bc6b9e2ae6fd668e01b0f9.zip
llvm-ac00376a13e9b637a8bc6b9e2ae6fd668e01b0f9.tar.gz
llvm-ac00376a13e9b637a8bc6b9e2ae6fd668e01b0f9.tar.bz2
[Object] Change uint32_t getSymbolFlags() to Expected<uint32_t> getSymbolFlags().
This change enables getSymbolFlags() to return errors which benefit error reporting in clients. Differential Revision: https://reviews.llvm.org/D77860
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;