mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Return ErrorOr from SymbolRef::getName.
This function can really fail since the string table offset can be out of bounds. Using ErrorOr makes sure the error is checked. Hopefully a lot of the boilerplate code in tools/* can go away once we have a diagnostic manager in Object. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241297 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -213,8 +213,10 @@ static std::error_code resolveSymbolName(const std::vector<RelocationRef> &Rels,
|
||||
SymbolRef Sym;
|
||||
if (std::error_code EC = resolveSymbol(Rels, Offset, Sym))
|
||||
return EC;
|
||||
if (std::error_code EC = Sym.getName(Name))
|
||||
ErrorOr<StringRef> NameOrErr = Sym.getName();
|
||||
if (std::error_code EC = NameOrErr.getError())
|
||||
return EC;
|
||||
Name = *NameOrErr;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
|
@@ -282,9 +282,10 @@ static void getSectionsAndSymbols(MachOObjectFile *MachOObj,
|
||||
SmallVectorImpl<uint64_t> &FoundFns,
|
||||
uint64_t &BaseSegmentAddress) {
|
||||
for (const SymbolRef &Symbol : MachOObj->symbols()) {
|
||||
StringRef SymName;
|
||||
Symbol.getName(SymName);
|
||||
if (!SymName.startswith("ltmp"))
|
||||
ErrorOr<StringRef> SymName = Symbol.getName();
|
||||
if (std::error_code EC = SymName.getError())
|
||||
report_fatal_error(EC.message());
|
||||
if (!SymName->startswith("ltmp"))
|
||||
Symbols.push_back(Symbol);
|
||||
}
|
||||
|
||||
@@ -361,9 +362,10 @@ static void PrintIndirectSymbolTable(MachOObjectFile *O, bool verbose,
|
||||
if (indirect_symbol < Symtab.nsyms) {
|
||||
symbol_iterator Sym = O->getSymbolByIndex(indirect_symbol);
|
||||
SymbolRef Symbol = *Sym;
|
||||
StringRef SymName;
|
||||
Symbol.getName(SymName);
|
||||
outs() << SymName;
|
||||
ErrorOr<StringRef> SymName = Symbol.getName();
|
||||
if (std::error_code EC = SymName.getError())
|
||||
report_fatal_error(EC.message());
|
||||
outs() << *SymName;
|
||||
} else {
|
||||
outs() << "?";
|
||||
}
|
||||
@@ -592,8 +594,10 @@ static void CreateSymbolAddressMap(MachOObjectFile *O,
|
||||
ST == SymbolRef::ST_Other) {
|
||||
uint64_t Address;
|
||||
Symbol.getAddress(Address);
|
||||
StringRef SymName;
|
||||
Symbol.getName(SymName);
|
||||
ErrorOr<StringRef> SymNameOrErr = Symbol.getName();
|
||||
if (std::error_code EC = SymNameOrErr.getError())
|
||||
report_fatal_error(EC.message());
|
||||
StringRef SymName = *SymNameOrErr;
|
||||
if (!SymName.startswith(".objc"))
|
||||
(*AddrMap)[Address] = SymName;
|
||||
}
|
||||
@@ -830,9 +834,10 @@ static void DumpLiteralPointerSection(MachOObjectFile *O,
|
||||
[&](const std::pair<uint64_t, SymbolRef> &P) { return P.first == i; });
|
||||
if (Reloc != Relocs.end()) {
|
||||
symbol_iterator RelocSym = Reloc->second;
|
||||
StringRef SymName;
|
||||
RelocSym->getName(SymName);
|
||||
outs() << "external relocation entry for symbol:" << SymName << "\n";
|
||||
ErrorOr<StringRef> SymName = RelocSym->getName();
|
||||
if (std::error_code EC = SymName.getError())
|
||||
report_fatal_error(EC.message());
|
||||
outs() << "external relocation entry for symbol:" << *SymName << "\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1793,9 +1798,10 @@ static int SymbolizerGetOpInfo(void *DisInfo, uint64_t Pc, uint64_t Offset,
|
||||
}
|
||||
}
|
||||
if (reloc_found && isExtern) {
|
||||
StringRef SymName;
|
||||
Symbol.getName(SymName);
|
||||
const char *name = SymName.data();
|
||||
ErrorOr<StringRef> SymName = Symbol.getName();
|
||||
if (std::error_code EC = SymName.getError())
|
||||
report_fatal_error(EC.message());
|
||||
const char *name = SymName->data();
|
||||
op_info->AddSymbol.Present = 1;
|
||||
op_info->AddSymbol.Name = name;
|
||||
// For i386 extern relocation entries the value in the instruction is
|
||||
@@ -1859,9 +1865,10 @@ static int SymbolizerGetOpInfo(void *DisInfo, uint64_t Pc, uint64_t Offset,
|
||||
// is the offset from the external symbol.
|
||||
if (info->O->getAnyRelocationPCRel(RE))
|
||||
op_info->Value -= Pc + Offset + Size;
|
||||
StringRef SymName;
|
||||
Symbol.getName(SymName);
|
||||
const char *name = SymName.data();
|
||||
ErrorOr<StringRef> SymName = Symbol.getName();
|
||||
if (std::error_code EC = SymName.getError())
|
||||
report_fatal_error(EC.message());
|
||||
const char *name = SymName->data();
|
||||
unsigned Type = info->O->getAnyRelocationType(RE);
|
||||
if (Type == MachO::X86_64_RELOC_SUBTRACTOR) {
|
||||
DataRefImpl RelNext = Rel;
|
||||
@@ -1875,9 +1882,10 @@ static int SymbolizerGetOpInfo(void *DisInfo, uint64_t Pc, uint64_t Offset,
|
||||
op_info->SubtractSymbol.Name = name;
|
||||
symbol_iterator RelocSymNext = info->O->getSymbolByIndex(SymbolNum);
|
||||
Symbol = *RelocSymNext;
|
||||
StringRef SymNameNext;
|
||||
Symbol.getName(SymNameNext);
|
||||
name = SymNameNext.data();
|
||||
ErrorOr<StringRef> SymNameNext = Symbol.getName();
|
||||
if (std::error_code EC = SymNameNext.getError())
|
||||
report_fatal_error(EC.message());
|
||||
name = SymNameNext->data();
|
||||
}
|
||||
}
|
||||
// TODO: add the VariantKinds to op_info->VariantKind for relocation types
|
||||
@@ -1944,9 +1952,10 @@ static int SymbolizerGetOpInfo(void *DisInfo, uint64_t Pc, uint64_t Offset,
|
||||
}
|
||||
|
||||
if (isExtern) {
|
||||
StringRef SymName;
|
||||
Symbol.getName(SymName);
|
||||
const char *name = SymName.data();
|
||||
ErrorOr<StringRef> SymName = Symbol.getName();
|
||||
if (std::error_code EC = SymName.getError())
|
||||
report_fatal_error(EC.message());
|
||||
const char *name = SymName->data();
|
||||
op_info->AddSymbol.Present = 1;
|
||||
op_info->AddSymbol.Name = name;
|
||||
switch (r_type) {
|
||||
@@ -2056,9 +2065,10 @@ static int SymbolizerGetOpInfo(void *DisInfo, uint64_t Pc, uint64_t Offset,
|
||||
// NOTE: Scattered relocations don't exist on arm64.
|
||||
if (!info->O->getPlainRelocationExternal(RE))
|
||||
return 0;
|
||||
StringRef SymName;
|
||||
Reloc->getSymbol()->getName(SymName);
|
||||
const char *name = SymName.data();
|
||||
ErrorOr<StringRef> SymName = Reloc->getSymbol()->getName();
|
||||
if (std::error_code EC = SymName.getError())
|
||||
report_fatal_error(EC.message());
|
||||
const char *name = SymName->data();
|
||||
op_info->AddSymbol.Present = 1;
|
||||
op_info->AddSymbol.Name = name;
|
||||
|
||||
@@ -2185,9 +2195,10 @@ static const char *GuessIndirectSymbol(uint64_t ReferenceValue,
|
||||
if (indirect_symbol < Symtab.nsyms) {
|
||||
symbol_iterator Sym = info->O->getSymbolByIndex(indirect_symbol);
|
||||
SymbolRef Symbol = *Sym;
|
||||
StringRef SymName;
|
||||
Symbol.getName(SymName);
|
||||
const char *name = SymName.data();
|
||||
ErrorOr<StringRef> SymName = Symbol.getName();
|
||||
if (std::error_code EC = SymName.getError())
|
||||
report_fatal_error(EC.message());
|
||||
const char *name = SymName->data();
|
||||
return name;
|
||||
}
|
||||
}
|
||||
@@ -2219,9 +2230,10 @@ static const char *GuessIndirectSymbol(uint64_t ReferenceValue,
|
||||
if (indirect_symbol < Symtab.nsyms) {
|
||||
symbol_iterator Sym = info->O->getSymbolByIndex(indirect_symbol);
|
||||
SymbolRef Symbol = *Sym;
|
||||
StringRef SymName;
|
||||
Symbol.getName(SymName);
|
||||
const char *name = SymName.data();
|
||||
ErrorOr<StringRef> SymName = Symbol.getName();
|
||||
if (std::error_code EC = SymName.getError())
|
||||
report_fatal_error(EC.message());
|
||||
const char *name = SymName->data();
|
||||
return name;
|
||||
}
|
||||
}
|
||||
@@ -2447,10 +2459,12 @@ static const char *get_symbol_64(uint32_t sect_offset, SectionRef S,
|
||||
Symbol.getAddress(n_value);
|
||||
if (n_value == UnknownAddress)
|
||||
n_value = 0;
|
||||
StringRef name;
|
||||
Symbol.getName(name);
|
||||
if (!name.empty()) {
|
||||
SymbolName = name.data();
|
||||
ErrorOr<StringRef> NameOrError = Symbol.getName();
|
||||
if (std::error_code EC = NameOrError.getError())
|
||||
report_fatal_error(EC.message());
|
||||
StringRef Name = *NameOrError;
|
||||
if (!Name.empty()) {
|
||||
SymbolName = Name.data();
|
||||
return SymbolName;
|
||||
}
|
||||
}
|
||||
@@ -6119,8 +6133,10 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF,
|
||||
ST == SymbolRef::ST_Other) {
|
||||
uint64_t Address;
|
||||
Symbol.getAddress(Address);
|
||||
StringRef SymName;
|
||||
Symbol.getName(SymName);
|
||||
ErrorOr<StringRef> SymNameOrErr = Symbol.getName();
|
||||
if (std::error_code EC = SymNameOrErr.getError())
|
||||
report_fatal_error(EC.message());
|
||||
StringRef SymName = *SymNameOrErr;
|
||||
AddrMap[Address] = SymName;
|
||||
if (!DisSymName.empty() && DisSymName == SymName)
|
||||
DisSymNameFound = true;
|
||||
@@ -6159,8 +6175,10 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF,
|
||||
|
||||
// Disassemble symbol by symbol.
|
||||
for (unsigned SymIdx = 0; SymIdx != Symbols.size(); SymIdx++) {
|
||||
StringRef SymName;
|
||||
Symbols[SymIdx].getName(SymName);
|
||||
ErrorOr<StringRef> SymNameOrErr = Symbols[SymIdx].getName();
|
||||
if (std::error_code EC = SymNameOrErr.getError())
|
||||
report_fatal_error(EC.message());
|
||||
StringRef SymName = *SymNameOrErr;
|
||||
|
||||
SymbolRef::Type ST = Symbols[SymIdx].getType();
|
||||
if (ST != SymbolRef::ST_Function)
|
||||
@@ -6423,7 +6441,10 @@ static void findUnwindRelocNameAddend(const MachOObjectFile *Obj,
|
||||
const RelocationRef &Reloc, uint64_t Addr,
|
||||
StringRef &Name, uint64_t &Addend) {
|
||||
if (Reloc.getSymbol() != Obj->symbol_end()) {
|
||||
Reloc.getSymbol()->getName(Name);
|
||||
ErrorOr<StringRef> NameOrErr = Reloc.getSymbol()->getName();
|
||||
if (std::error_code EC = NameOrErr.getError())
|
||||
report_fatal_error(EC.message());
|
||||
Name = *NameOrErr;
|
||||
Addend = Addr;
|
||||
return;
|
||||
}
|
||||
@@ -6449,7 +6470,10 @@ static void findUnwindRelocNameAddend(const MachOObjectFile *Obj,
|
||||
Sym->second.getSection(SymSection);
|
||||
if (RelocSection == *SymSection) {
|
||||
// There's a valid symbol in the same section before this reference.
|
||||
Sym->second.getName(Name);
|
||||
ErrorOr<StringRef> NameOrErr = Sym->second.getName();
|
||||
if (std::error_code EC = NameOrErr.getError())
|
||||
report_fatal_error(EC.message());
|
||||
Name = *NameOrErr;
|
||||
Addend = Addr - Sym->first;
|
||||
return;
|
||||
}
|
||||
|
@@ -433,9 +433,10 @@ static std::error_code getRelocationValueString(const COFFObjectFile *Obj,
|
||||
const RelocationRef &Rel,
|
||||
SmallVectorImpl<char> &Result) {
|
||||
symbol_iterator SymI = Rel.getSymbol();
|
||||
StringRef SymName;
|
||||
if (std::error_code EC = SymI->getName(SymName))
|
||||
ErrorOr<StringRef> SymNameOrErr = SymI->getName();
|
||||
if (std::error_code EC = SymNameOrErr.getError())
|
||||
return EC;
|
||||
StringRef SymName = *SymNameOrErr;
|
||||
Result.append(SymName.begin(), SymName.end());
|
||||
return std::error_code();
|
||||
}
|
||||
@@ -455,15 +456,15 @@ static void printRelocationTargetName(const MachOObjectFile *O,
|
||||
for (const SymbolRef &Symbol : O->symbols()) {
|
||||
std::error_code ec;
|
||||
uint64_t Addr;
|
||||
StringRef Name;
|
||||
ErrorOr<StringRef> Name = Symbol.getName();
|
||||
|
||||
if ((ec = Symbol.getAddress(Addr)))
|
||||
report_fatal_error(ec.message());
|
||||
if (Addr != Val)
|
||||
continue;
|
||||
if ((ec = Symbol.getName(Name)))
|
||||
report_fatal_error(ec.message());
|
||||
fmt << Name;
|
||||
if (std::error_code EC = Name.getError())
|
||||
report_fatal_error(EC.message());
|
||||
fmt << *Name;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -493,7 +494,9 @@ static void printRelocationTargetName(const MachOObjectFile *O,
|
||||
if (isExtern) {
|
||||
symbol_iterator SI = O->symbol_begin();
|
||||
advance(SI, Val);
|
||||
SI->getName(S);
|
||||
ErrorOr<StringRef> SOrErr = SI->getName();
|
||||
if (!error(SOrErr.getError()))
|
||||
S = *SOrErr;
|
||||
} else {
|
||||
section_iterator SI = O->section_begin();
|
||||
// Adjust for the fact that sections are 1-indexed.
|
||||
@@ -830,10 +833,10 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
|
||||
if (Address >= SectSize)
|
||||
continue;
|
||||
|
||||
StringRef Name;
|
||||
if (error(Symbol.getName(Name)))
|
||||
ErrorOr<StringRef> Name = Symbol.getName();
|
||||
if (error(Name.getError()))
|
||||
break;
|
||||
Symbols.push_back(std::make_pair(Address, Name));
|
||||
Symbols.push_back(std::make_pair(Address, *Name));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1121,8 +1124,11 @@ void llvm::PrintSymbolTable(const ObjectFile *o) {
|
||||
StringRef Name;
|
||||
if (Type == SymbolRef::ST_Debug && Section != o->section_end()) {
|
||||
Section->getName(Name);
|
||||
} else if (error(Symbol.getName(Name))) {
|
||||
continue;
|
||||
} else {
|
||||
ErrorOr<StringRef> NameOrErr = Symbol.getName();
|
||||
if (error(NameOrErr.getError()))
|
||||
continue;
|
||||
Name = *NameOrErr;
|
||||
}
|
||||
|
||||
bool Global = Flags & SymbolRef::SF_Global;
|
||||
|
Reference in New Issue
Block a user