@@ -302,7 +302,7 @@ template <typename ELFT> class ELFDumper : public ObjDumper {
302302 void getSectionNameIndex (const Elf_Sym *Symbol, const Elf_Sym *FirstSym,
303303 StringRef &SectionName,
304304 unsigned &SectionIndex) const ;
305- std::string getStaticSymbolName (uint32_t Index) const ;
305+ Expected< std::string> getStaticSymbolName (uint32_t Index) const ;
306306 std::string getDynamicString (uint64_t Value) const ;
307307 StringRef getSymbolVersionByIndex (StringRef StrTab,
308308 uint32_t VersionSymbolIndex,
@@ -754,17 +754,22 @@ static std::string maybeDemangle(StringRef Name) {
754754}
755755
756756template <typename ELFT>
757- std::string ELFDumper<ELFT>::getStaticSymbolName(uint32_t Index) const {
757+ Expected<std::string>
758+ ELFDumper<ELFT>::getStaticSymbolName(uint32_t Index) const {
758759 const ELFFile<ELFT> *Obj = ObjF->getELFFile ();
759- StringRef StrTable = unwrapOrError (
760- ObjF->getFileName (), Obj->getStringTableForSymtab (*DotSymtabSec));
761- Elf_Sym_Range Syms =
762- unwrapOrError (ObjF->getFileName (), Obj->symbols (DotSymtabSec));
763- if (Index >= Syms.size ())
764- reportError (createError (" Invalid symbol index" ), ObjF->getFileName ());
765- const Elf_Sym *Sym = &Syms[Index];
766- return maybeDemangle (
767- unwrapOrError (ObjF->getFileName (), Sym->getName (StrTable)));
760+ Expected<const typename ELFT::Sym *> SymOrErr =
761+ Obj->getSymbol (DotSymtabSec, Index);
762+ if (!SymOrErr)
763+ return SymOrErr.takeError ();
764+
765+ Expected<StringRef> StrTabOrErr = Obj->getStringTableForSymtab (*DotSymtabSec);
766+ if (!StrTabOrErr)
767+ return StrTabOrErr.takeError ();
768+
769+ Expected<StringRef> NameOrErr = (*SymOrErr)->getName (*StrTabOrErr);
770+ if (!NameOrErr)
771+ return NameOrErr.takeError ();
772+ return maybeDemangle (*NameOrErr);
768773}
769774
770775template <typename ELFT>
@@ -4047,7 +4052,7 @@ void GNUStyle<ELFT>::printCGProfile(const ELFFile<ELFT> *Obj) {
40474052
40484053template <class ELFT >
40494054void GNUStyle<ELFT>::printAddrsig(const ELFFile<ELFT> *Obj) {
4050- OS << " GNUStyle::printAddrsig not implemented\n " ;
4055+ reportError ( createError ( " --addrsig: not implemented" ), this -> FileName ) ;
40514056}
40524057
40534058static StringRef getGenericNoteTypeName (const uint32_t NT) {
@@ -5723,14 +5728,35 @@ void LLVMStyle<ELFT>::printCGProfile(const ELFFile<ELFT> *Obj) {
57235728 this ->dumper ()->getDotCGProfileSec ()));
57245729 for (const Elf_CGProfile &CGPE : CGProfile) {
57255730 DictScope D (W, " CGProfileEntry" );
5726- W.printNumber (" From" , this ->dumper ()->getStaticSymbolName (CGPE.cgp_from ),
5727- CGPE.cgp_from );
5728- W.printNumber (" To" , this ->dumper ()->getStaticSymbolName (CGPE.cgp_to ),
5729- CGPE.cgp_to );
5731+ W.printNumber (
5732+ " From" ,
5733+ unwrapOrError (this ->FileName ,
5734+ this ->dumper ()->getStaticSymbolName (CGPE.cgp_from )),
5735+ CGPE.cgp_from );
5736+ W.printNumber (
5737+ " To" ,
5738+ unwrapOrError (this ->FileName ,
5739+ this ->dumper ()->getStaticSymbolName (CGPE.cgp_to )),
5740+ CGPE.cgp_to );
57305741 W.printNumber (" Weight" , CGPE.cgp_weight );
57315742 }
57325743}
57335744
5745+ static Expected<std::vector<uint64_t >> toULEB128Array (ArrayRef<uint8_t > Data) {
5746+ std::vector<uint64_t > Ret;
5747+ const uint8_t *Cur = Data.begin ();
5748+ const uint8_t *End = Data.end ();
5749+ while (Cur != End) {
5750+ unsigned Size;
5751+ const char *Err;
5752+ Ret.push_back (decodeULEB128 (Cur, &Size, End, &Err));
5753+ if (Err)
5754+ return createError (Err);
5755+ Cur += Size;
5756+ }
5757+ return Ret;
5758+ }
5759+
57345760template <class ELFT >
57355761void LLVMStyle<ELFT>::printAddrsig(const ELFFile<ELFT> *Obj) {
57365762 ListScope L (W, " Addrsig" );
@@ -5739,18 +5765,20 @@ void LLVMStyle<ELFT>::printAddrsig(const ELFFile<ELFT> *Obj) {
57395765 ArrayRef<uint8_t > Contents = unwrapOrError (
57405766 this ->FileName ,
57415767 Obj->getSectionContents (this ->dumper ()->getDotAddrsigSec ()));
5742- const uint8_t *Cur = Contents.begin ();
5743- const uint8_t *End = Contents.end ();
5744- while (Cur != End) {
5745- unsigned Size;
5746- const char *Err;
5747- uint64_t SymIndex = decodeULEB128 (Cur, &Size, End, &Err);
5748- if (Err)
5749- reportError (createError (Err), this ->FileName );
5768+ Expected<std::vector<uint64_t >> V = toULEB128Array (Contents);
5769+ if (!V) {
5770+ reportWarning (V.takeError (), this ->FileName );
5771+ return ;
5772+ }
57505773
5751- W.printNumber (" Sym" , this ->dumper ()->getStaticSymbolName (SymIndex),
5752- SymIndex);
5753- Cur += Size;
5774+ for (uint64_t Sym : *V) {
5775+ Expected<std::string> NameOrErr = this ->dumper ()->getStaticSymbolName (Sym);
5776+ if (NameOrErr) {
5777+ W.printNumber (" Sym" , *NameOrErr, Sym);
5778+ continue ;
5779+ }
5780+ reportWarning (NameOrErr.takeError (), this ->FileName );
5781+ W.printNumber (" Sym" , " <?>" , Sym);
57545782 }
57555783}
57565784
0 commit comments