@@ -302,7 +302,7 @@ template <typename ELFT> class ELFDumper : public ObjDumper {
302
302
void getSectionNameIndex (const Elf_Sym *Symbol, const Elf_Sym *FirstSym,
303
303
StringRef &SectionName,
304
304
unsigned &SectionIndex) const ;
305
- std::string getStaticSymbolName (uint32_t Index) const ;
305
+ Expected< std::string> getStaticSymbolName (uint32_t Index) const ;
306
306
std::string getDynamicString (uint64_t Value) const ;
307
307
StringRef getSymbolVersionByIndex (StringRef StrTab,
308
308
uint32_t VersionSymbolIndex,
@@ -754,17 +754,22 @@ static std::string maybeDemangle(StringRef Name) {
754
754
}
755
755
756
756
template <typename ELFT>
757
- std::string ELFDumper<ELFT>::getStaticSymbolName(uint32_t Index) const {
757
+ Expected<std::string>
758
+ ELFDumper<ELFT>::getStaticSymbolName(uint32_t Index) const {
758
759
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);
768
773
}
769
774
770
775
template <typename ELFT>
@@ -4047,7 +4052,7 @@ void GNUStyle<ELFT>::printCGProfile(const ELFFile<ELFT> *Obj) {
4047
4052
4048
4053
template <class ELFT >
4049
4054
void GNUStyle<ELFT>::printAddrsig(const ELFFile<ELFT> *Obj) {
4050
- OS << " GNUStyle::printAddrsig not implemented\n " ;
4055
+ reportError ( createError ( " --addrsig: not implemented" ), this -> FileName ) ;
4051
4056
}
4052
4057
4053
4058
static StringRef getGenericNoteTypeName (const uint32_t NT) {
@@ -5723,14 +5728,35 @@ void LLVMStyle<ELFT>::printCGProfile(const ELFFile<ELFT> *Obj) {
5723
5728
this ->dumper ()->getDotCGProfileSec ()));
5724
5729
for (const Elf_CGProfile &CGPE : CGProfile) {
5725
5730
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 );
5730
5741
W.printNumber (" Weight" , CGPE.cgp_weight );
5731
5742
}
5732
5743
}
5733
5744
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
+
5734
5760
template <class ELFT >
5735
5761
void LLVMStyle<ELFT>::printAddrsig(const ELFFile<ELFT> *Obj) {
5736
5762
ListScope L (W, " Addrsig" );
@@ -5739,18 +5765,20 @@ void LLVMStyle<ELFT>::printAddrsig(const ELFFile<ELFT> *Obj) {
5739
5765
ArrayRef<uint8_t > Contents = unwrapOrError (
5740
5766
this ->FileName ,
5741
5767
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
+ }
5750
5773
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);
5754
5782
}
5755
5783
}
5756
5784
0 commit comments