Index: test/tools/llvm-readobj/stack-sizes.test =================================================================== --- test/tools/llvm-readobj/stack-sizes.test +++ test/tools/llvm-readobj/stack-sizes.test @@ -303,6 +303,9 @@ # RUN: llvm-readobj --stack-sizes %t07 2> %t07-llvm.err | FileCheck %s --check-prefix=BADSECTION-OUT-LLVM # RUN: FileCheck %s < %t07-llvm.err --check-prefix=BADSECTION-ERR -DFILE=%t07 +# RUN: llvm-readelf --stack-sizes --demangle %t07 2>&1 | FileCheck %s --check-prefix=BADSECTION-DEMANGLE-ERR -DFILE=%t07 +# RUN: llvm-readobj --stack-sizes --demangle %t07 2>&1 | FileCheck %s --check-prefix=BADSECTION-DEMANGLE-ERR -DFILE=%t07 + # BADSECTION-OUT-GNU: Size Function # BADSECTION-OUT-GNU: 8 ? @@ -313,7 +316,8 @@ # BADSECTION-OUT-LLVM-NEXT: } # BADSECTION-OUT-LLVM-NEXT: ] -# BADSECTION-ERR: warning: '[[FILE]]': cannot identify the section for relocation symbol foo +# BADSECTION-ERR: warning: '[[FILE]]': cannot identify the section for relocation symbol _Z3foof +# BADSECTION-DEMANGLE-ERR: warning: '[[FILE]]': cannot identify the section for relocation symbol foo(float) --- !ELF FileHeader: @@ -334,10 +338,10 @@ Info: .stack_sizes Relocations: - Offset: 0 - Symbol: foo + Symbol: _Z3foof Type: R_X86_64_64 Symbols: - - Name: foo + - Name: _Z3foof ## An invalid section index. Index: 10 Type: STT_FUNC Index: tools/llvm-readobj/ELFDumper.cpp =================================================================== --- tools/llvm-readobj/ELFDumper.cpp +++ tools/llvm-readobj/ELFDumper.cpp @@ -4688,6 +4688,26 @@ OS << "printELFLinkerOptions not implemented!\n"; } +// Used for printing section names in places where possible errors can be +// ignored. +static StringRef getSectionName(const SectionRef &Sec) { + Expected NameOrErr = Sec.getName(); + if (NameOrErr) + return *NameOrErr; + consumeError(NameOrErr.takeError()); + return ""; +} + +// Used for printing symbol names in places where possible errors can be +// ignored. +static std::string getSymbolName(const ELFSymbolRef &Sym) { + Expected NameOrErr = Sym.getName(); + if (NameOrErr) + return maybeDemangle(*NameOrErr); + consumeError(NameOrErr.takeError()); + return ""; +} + template void DumpStyle::printFunctionStackSize( const ELFObjectFile *Obj, uint64_t SymValue, SectionRef FunctionSec, @@ -4712,18 +4732,12 @@ std::string FuncName = "?"; // A valid SymbolRef has a non-null object file pointer. - if (FuncSym.BasicSymbolRef::getObject()) { - // Extract the symbol name. - Expected FuncNameOrErr = FuncSym.getName(); - if (FuncNameOrErr) - FuncName = maybeDemangle(*FuncNameOrErr); - else - consumeError(FuncNameOrErr.takeError()); - } else { + if (FuncSym.BasicSymbolRef::getObject()) + FuncName = getSymbolName(FuncSym); + else reportWarning( createError("could not identify function symbol for stack size entry"), Obj->getFileName()); - } // Extract the size. The expectation is that Offset is pointing to the right // place, i.e. past the function address. @@ -4765,22 +4779,16 @@ // Ensure that the relocation symbol is in the function section, i.e. the // section where the functions whose stack sizes we are reporting are // located. - StringRef SymName = "?"; - Expected NameOrErr = RelocSym->getName(); - if (NameOrErr) - SymName = *NameOrErr; - else - consumeError(NameOrErr.takeError()); - auto SectionOrErr = RelocSym->getSection(); if (!SectionOrErr) { reportWarning( createError("cannot identify the section for relocation symbol " + - SymName), + getSymbolName(*RelocSym)), FileStr); consumeError(SectionOrErr.takeError()); } else if (*SectionOrErr != FunctionSec) { - reportWarning(createError("relocation symbol " + SymName + + reportWarning(createError("relocation symbol " + + getSymbolName(*RelocSym) + " is not in the expected section"), FileStr); // Pretend that the symbol is in the correct section and report its @@ -4810,16 +4818,6 @@ Data, &Offset); } -// Used for printing section names in places where possible errors can be -// ignored. -static StringRef getSectionName(const SectionRef &Sec) { - Expected NameOrErr = Sec.getName(); - if (NameOrErr) - return *NameOrErr; - consumeError(NameOrErr.takeError()); - return ""; -} - template void DumpStyle::printNonRelocatableStackSizes( const ELFObjectFile *Obj, std::function PrintHeader) {