Skip to content

Commit ed067c4

Browse files
committed
Return ErrorOr from getSymbolAddress.
It can fail trying to get the section on ELF and COFF. This makes sure the error is handled. llvm-svn: 241366
1 parent e2df87f commit ed067c4

File tree

18 files changed

+80
-61
lines changed

18 files changed

+80
-61
lines changed

llvm/include/llvm/Object/COFF.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -648,8 +648,7 @@ class COFFObjectFile : public ObjectFile {
648648
protected:
649649
void moveSymbolNext(DataRefImpl &Symb) const override;
650650
ErrorOr<StringRef> getSymbolName(DataRefImpl Symb) const override;
651-
std::error_code getSymbolAddress(DataRefImpl Symb,
652-
uint64_t &Res) const override;
651+
ErrorOr<uint64_t> getSymbolAddress(DataRefImpl Symb) const override;
653652
uint64_t getSymbolValue(DataRefImpl Symb) const override;
654653
uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override;
655654
uint32_t getSymbolFlags(DataRefImpl Symb) const override;

llvm/include/llvm/Object/ELFObjectFile.h

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,7 @@ template <class ELFT> class ELFObjectFile : public ELFObjectFileBase {
196196

197197
void moveSymbolNext(DataRefImpl &Symb) const override;
198198
ErrorOr<StringRef> getSymbolName(DataRefImpl Symb) const override;
199-
std::error_code getSymbolAddress(DataRefImpl Symb,
200-
uint64_t &Res) const override;
199+
ErrorOr<uint64_t> getSymbolAddress(DataRefImpl Symb) const override;
201200
uint64_t getSymbolValue(DataRefImpl Symb) const override;
202201
uint32_t getSymbolAlignment(DataRefImpl Symb) const override;
203202
uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override;
@@ -400,15 +399,15 @@ uint64_t ELFObjectFile<ELFT>::getSymbolValue(DataRefImpl Symb) const {
400399
}
401400

402401
template <class ELFT>
403-
std::error_code ELFObjectFile<ELFT>::getSymbolAddress(DataRefImpl Symb,
404-
uint64_t &Result) const {
405-
Result = getSymbolValue(Symb);
402+
ErrorOr<uint64_t>
403+
ELFObjectFile<ELFT>::getSymbolAddress(DataRefImpl Symb) const {
404+
uint64_t Result = getSymbolValue(Symb);
406405
const Elf_Sym *ESym = getSymbol(Symb);
407406
switch (ESym->st_shndx) {
408407
case ELF::SHN_COMMON:
409408
case ELF::SHN_UNDEF:
410409
case ELF::SHN_ABS:
411-
return std::error_code();
410+
return Result;
412411
}
413412

414413
const Elf_Ehdr *Header = EF.getHeader();
@@ -422,7 +421,7 @@ std::error_code ELFObjectFile<ELFT>::getSymbolAddress(DataRefImpl Symb,
422421
Result += Section->sh_addr;
423422
}
424423

425-
return std::error_code();
424+
return Result;
426425
}
427426

428427
template <class ELFT>

llvm/include/llvm/Object/MachO.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,7 @@ class MachOObjectFile : public ObjectFile {
205205
std::error_code getIndirectName(DataRefImpl Symb, StringRef &Res) const;
206206
unsigned getSectionType(SectionRef Sec) const;
207207

208-
std::error_code getSymbolAddress(DataRefImpl Symb,
209-
uint64_t &Res) const override;
208+
ErrorOr<uint64_t> getSymbolAddress(DataRefImpl Symb) const override;
210209
uint64_t getSymbolValue(DataRefImpl Symb) const override;
211210
uint32_t getSymbolAlignment(DataRefImpl Symb) const override;
212211
uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override;

llvm/include/llvm/Object/ObjectFile.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ class SymbolRef : public BasicSymbolRef {
135135
ErrorOr<StringRef> getName() const;
136136
/// Returns the symbol virtual address (i.e. address at which it will be
137137
/// mapped).
138-
std::error_code getAddress(uint64_t &Result) const;
138+
ErrorOr<uint64_t> getAddress() const;
139139

140140
/// Return the value of the symbol depending on the object this can be an
141141
/// offset or a virtual address.
@@ -198,8 +198,7 @@ class ObjectFile : public SymbolicFile {
198198
virtual ErrorOr<StringRef> getSymbolName(DataRefImpl Symb) const = 0;
199199
std::error_code printSymbolName(raw_ostream &OS,
200200
DataRefImpl Symb) const override;
201-
virtual std::error_code getSymbolAddress(DataRefImpl Symb,
202-
uint64_t &Res) const = 0;
201+
virtual ErrorOr<uint64_t> getSymbolAddress(DataRefImpl Symb) const = 0;
203202
virtual uint64_t getSymbolValue(DataRefImpl Symb) const = 0;
204203
virtual uint32_t getSymbolAlignment(DataRefImpl Symb) const;
205204
virtual uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const = 0;
@@ -308,8 +307,8 @@ inline ErrorOr<StringRef> SymbolRef::getName() const {
308307
return getObject()->getSymbolName(getRawDataRefImpl());
309308
}
310309

311-
inline std::error_code SymbolRef::getAddress(uint64_t &Result) const {
312-
return getObject()->getSymbolAddress(getRawDataRefImpl(), Result);
310+
inline ErrorOr<uint64_t> SymbolRef::getAddress() const {
311+
return getObject()->getSymbolAddress(getRawDataRefImpl());
313312
}
314313

315314
inline uint64_t SymbolRef::getValue() const {

llvm/lib/DebugInfo/DWARF/DWARFContext.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,13 @@ DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj,
677677
// First calculate the address of the symbol or section as it appears
678678
// in the objct file
679679
if (Sym != Obj.symbol_end()) {
680-
Sym->getAddress(SymAddr);
680+
ErrorOr<uint64_t> SymAddrOrErr = Sym->getAddress();
681+
if (std::error_code EC = SymAddrOrErr.getError()) {
682+
errs() << "error: failed to compute symbol address: "
683+
<< EC.message() << '\n';
684+
continue;
685+
}
686+
SymAddr = *SymAddrOrErr;
681687
// Also remember what section this symbol is in for later
682688
Sym->getSection(RSec);
683689
} else if (auto *MObj = dyn_cast<MachOObjectFile>(&Obj)) {

llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,10 @@ void RuntimeDyldImpl::mapSectionAddress(const void *LocalAddress,
114114
}
115115

116116
static std::error_code getOffset(const SymbolRef &Sym, uint64_t &Result) {
117-
uint64_t Address;
118-
if (std::error_code EC = Sym.getAddress(Address))
117+
ErrorOr<uint64_t> AddressOrErr = Sym.getAddress();
118+
if (std::error_code EC = AddressOrErr.getError())
119119
return EC;
120+
uint64_t Address = *AddressOrErr;
120121

121122
if (Address == UnknownAddress) {
122123
Result = UnknownAddress;

llvm/lib/Object/COFFObjectFile.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,21 +163,20 @@ uint64_t COFFObjectFile::getSymbolValue(DataRefImpl Ref) const {
163163
return Sym.getValue();
164164
}
165165

166-
std::error_code COFFObjectFile::getSymbolAddress(DataRefImpl Ref,
167-
uint64_t &Result) const {
168-
Result = getSymbolValue(Ref);
166+
ErrorOr<uint64_t> COFFObjectFile::getSymbolAddress(DataRefImpl Ref) const {
167+
uint64_t Result = getSymbolValue(Ref);
169168
COFFSymbolRef Symb = getCOFFSymbol(Ref);
170169
int32_t SectionNumber = Symb.getSectionNumber();
171170

172171
if (Symb.isAnyUndefined() || Symb.isCommon() ||
173172
COFF::isReservedSectionNumber(SectionNumber))
174-
return std::error_code();
173+
return Result;
175174

176175
const coff_section *Section = nullptr;
177176
if (std::error_code EC = getSection(SectionNumber, Section))
178177
return EC;
179178
Result += Section->VirtualAddress;
180-
return std::error_code();
179+
return Result;
181180
}
182181

183182
SymbolRef::Type COFFObjectFile::getSymbolType(DataRefImpl Ref) const {

llvm/lib/Object/MachOObjectFile.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -376,10 +376,8 @@ uint64_t MachOObjectFile::getSymbolValue(DataRefImpl Sym) const {
376376
return NValue;
377377
}
378378

379-
std::error_code MachOObjectFile::getSymbolAddress(DataRefImpl Sym,
380-
uint64_t &Res) const {
381-
Res = getSymbolValue(Sym);
382-
return std::error_code();
379+
ErrorOr<uint64_t> MachOObjectFile::getSymbolAddress(DataRefImpl Sym) const {
380+
return getSymbolValue(Sym);
383381
}
384382

385383
uint32_t MachOObjectFile::getSymbolAlignment(DataRefImpl DRI) const {

llvm/lib/Object/Object.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,10 @@ const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) {
180180
}
181181

182182
uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) {
183-
uint64_t ret;
184-
if (std::error_code ec = (*unwrap(SI))->getAddress(ret))
185-
report_fatal_error(ec.message());
186-
return ret;
183+
ErrorOr<uint64_t> Ret = (*unwrap(SI))->getAddress();
184+
if (std::error_code EC = Ret.getError())
185+
report_fatal_error(EC.message());
186+
return *Ret;
187187
}
188188

189189
uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI) {

llvm/lib/Target/X86/MCTargetDesc/X86ELFRelocationInfo.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,16 @@ class X86_64ELFRelocationInfo : public MCRelocationInfo {
3434
report_fatal_error(EC.message());
3535
StringRef SymName = *SymNameOrErr;
3636

37-
uint64_t SymAddr; SymI->getAddress(SymAddr);
37+
ErrorOr<uint64_t> SymAddr = SymI->getAddress();
38+
if (std::error_code EC = SymAddr.getError())
39+
report_fatal_error(EC.message());
3840
uint64_t SymSize = SymI->getSize();
3941
int64_t Addend = *ELFRelocationRef(Rel).getAddend();
4042

4143
MCSymbol *Sym = Ctx.getOrCreateSymbol(SymName);
4244
// FIXME: check that the value is actually the same.
4345
if (!Sym->isVariable())
44-
Sym->setVariableValue(MCConstantExpr::create(SymAddr, Ctx));
46+
Sym->setVariableValue(MCConstantExpr::create(*SymAddr, Ctx));
4547

4648
const MCExpr *Expr = nullptr;
4749
// If hasAddend is true, then we need to add Addend (r_addend) to Expr.

llvm/tools/llvm-cxxdump/llvm-cxxdump.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,10 @@ static void dumpCXXData(const ObjectFile *Obj) {
207207
StringRef SecContents;
208208
if (error(Sec.getContents(SecContents)))
209209
return;
210-
uint64_t SymAddress;
211-
if (error(Sym.getAddress(SymAddress)))
210+
ErrorOr<uint64_t> SymAddressOrErr = Sym.getAddress();
211+
if (error(SymAddressOrErr.getError()))
212212
return;
213+
uint64_t SymAddress = *SymAddressOrErr;
213214
uint64_t SecAddress = Sec.getAddress();
214215
uint64_t SecSize = Sec.getSize();
215216
uint64_t SymOffset = SymAddress - SecAddress;

llvm/tools/llvm-nm/llvm-nm.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -901,8 +901,10 @@ static void dumpSymbolNamesFromObject(SymbolicFile &Obj, bool printName,
901901
S.Size = ELFSymbolRef(Sym).getSize();
902902
}
903903
if (PrintAddress && isa<ObjectFile>(Obj)) {
904-
if (error(SymbolRef(Sym).getAddress(S.Address)))
904+
ErrorOr<uint64_t> AddressOrErr = SymbolRef(Sym).getAddress();
905+
if (error(AddressOrErr.getError()))
905906
break;
907+
S.Address = *AddressOrErr;
906908
}
907909
S.TypeChar = getNMTypeChar(Obj, Sym);
908910
if (error(Sym.printName(OS)))

llvm/tools/llvm-objdump/COFFDump.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,10 @@ static std::error_code
161161
resolveSectionAndAddress(const COFFObjectFile *Obj, const SymbolRef &Sym,
162162
const coff_section *&ResolvedSection,
163163
uint64_t &ResolvedAddr) {
164-
if (std::error_code EC = Sym.getAddress(ResolvedAddr))
164+
ErrorOr<uint64_t> ResolvedAddrOrErr = Sym.getAddress();
165+
if (std::error_code EC = ResolvedAddrOrErr.getError())
165166
return EC;
167+
ResolvedAddr = *ResolvedAddrOrErr;
166168
section_iterator iter(Obj->section_begin());
167169
if (std::error_code EC = Sym.getSection(iter))
168170
return EC;

llvm/tools/llvm-objdump/llvm-objdump.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -455,13 +455,12 @@ static void printRelocationTargetName(const MachOObjectFile *O,
455455

456456
for (const SymbolRef &Symbol : O->symbols()) {
457457
std::error_code ec;
458-
uint64_t Addr;
459-
ErrorOr<StringRef> Name = Symbol.getName();
460-
461-
if ((ec = Symbol.getAddress(Addr)))
458+
ErrorOr<uint64_t> Addr = Symbol.getAddress();
459+
if ((ec = Addr.getError()))
462460
report_fatal_error(ec.message());
463-
if (Addr != Val)
461+
if (*Addr != Val)
464462
continue;
463+
ErrorOr<StringRef> Name = Symbol.getName();
465464
if (std::error_code EC = Name.getError())
466465
report_fatal_error(EC.message());
467466
fmt << *Name;
@@ -824,9 +823,10 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
824823
std::vector<std::pair<uint64_t, StringRef>> Symbols;
825824
for (const SymbolRef &Symbol : Obj->symbols()) {
826825
if (Section.containsSymbol(Symbol)) {
827-
uint64_t Address;
828-
if (error(Symbol.getAddress(Address)))
826+
ErrorOr<uint64_t> AddressOrErr = Symbol.getAddress();
827+
if (error(AddressOrErr.getError()))
829828
break;
829+
uint64_t Address = *AddressOrErr;
830830
if (Address == UnknownAddress)
831831
continue;
832832
Address -= SectionAddr;
@@ -1113,12 +1113,13 @@ void llvm::PrintSymbolTable(const ObjectFile *o) {
11131113
return;
11141114
}
11151115
for (const SymbolRef &Symbol : o->symbols()) {
1116-
uint64_t Address;
1116+
ErrorOr<uint64_t> AddressOrError = Symbol.getAddress();
1117+
if (error(AddressOrError.getError()))
1118+
continue;
1119+
uint64_t Address = *AddressOrError;
11171120
SymbolRef::Type Type = Symbol.getType();
11181121
uint32_t Flags = Symbol.getFlags();
11191122
section_iterator Section = o->section_end();
1120-
if (error(Symbol.getAddress(Address)))
1121-
continue;
11221123
if (error(Symbol.getSection(Section)))
11231124
continue;
11241125
StringRef Name;

llvm/tools/llvm-readobj/ARMWinEHPrinter.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -201,10 +201,10 @@ ErrorOr<object::SymbolRef> Decoder::getSymbol(const COFFObjectFile &COFF,
201201
if (FunctionOnly && Symbol.getType() != SymbolRef::ST_Function)
202202
continue;
203203

204-
uint64_t Address;
205-
if (std::error_code EC = Symbol.getAddress(Address))
204+
ErrorOr<uint64_t> Address = Symbol.getAddress();
205+
if (std::error_code EC = Address.getError())
206206
return EC;
207-
if (Address == VA)
207+
if (*Address == VA)
208208
return Symbol;
209209
}
210210
return readobj_error::unknown_symbol;
@@ -605,7 +605,10 @@ bool Decoder::dumpUnpackedEntry(const COFFObjectFile &COFF,
605605
if (std::error_code EC = FunctionNameOrErr.getError())
606606
report_fatal_error(EC.message());
607607
FunctionName = *FunctionNameOrErr;
608-
Function->getAddress(FunctionAddress);
608+
ErrorOr<uint64_t> FunctionAddressOrErr = Function->getAddress();
609+
if (std::error_code EC = FunctionAddressOrErr.getError())
610+
report_fatal_error(EC.message());
611+
FunctionAddress = *FunctionAddressOrErr;
609612
} else {
610613
const pe32_header *PEHeader;
611614
if (COFF.getPE32Header(PEHeader))
@@ -620,8 +623,10 @@ bool Decoder::dumpUnpackedEntry(const COFFObjectFile &COFF,
620623
if (std::error_code EC = Name.getError())
621624
report_fatal_error(EC.message());
622625

623-
uint64_t Address;
624-
XDataRecord->getAddress(Address);
626+
ErrorOr<uint64_t> AddressOrErr = XDataRecord->getAddress();
627+
if (std::error_code EC = AddressOrErr.getError())
628+
report_fatal_error(EC.message());
629+
uint64_t Address = *AddressOrErr;
625630

626631
SW.printString("ExceptionRecord", formatSymbol(*Name, Address));
627632

@@ -666,7 +671,8 @@ bool Decoder::dumpPackedEntry(const object::COFFObjectFile &COFF,
666671
if (std::error_code EC = FunctionNameOrErr.getError())
667672
report_fatal_error(EC.message());
668673
FunctionName = *FunctionNameOrErr;
669-
Function->getAddress(FunctionAddress);
674+
ErrorOr<uint64_t> FunctionAddressOrErr = Function->getAddress();
675+
FunctionAddress = *FunctionAddressOrErr;
670676
} else {
671677
const pe32_header *PEHeader;
672678
if (COFF.getPE32Header(PEHeader))

llvm/tools/llvm-readobj/Win64EHDumper.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,10 @@ static std::error_code resolveRelocation(const Dumper::Context &Ctx,
144144
Ctx.ResolveSymbol(Section, Offset, Symbol, Ctx.UserData))
145145
return EC;
146146

147-
if (std::error_code EC = Symbol.getAddress(ResolvedAddress))
147+
ErrorOr<uint64_t> ResolvedAddressOrErr = Symbol.getAddress();
148+
if (std::error_code EC = ResolvedAddressOrErr.getError())
148149
return EC;
150+
ResolvedAddress = *ResolvedAddressOrErr;
149151

150152
section_iterator SI = Ctx.COFF.section_begin();
151153
if (std::error_code EC = Symbol.getSection(SI))

llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,10 @@ static int printLineInfoForInput(bool LoadObjects, bool UseDebugObj) {
269269
ErrorOr<StringRef> Name = Sym.getName();
270270
if (!Name)
271271
continue;
272-
uint64_t Addr;
273-
if (Sym.getAddress(Addr))
272+
ErrorOr<uint64_t> AddrOrErr = Sym.getAddress();
273+
if (!AddrOrErr)
274274
continue;
275+
uint64_t Addr = *AddrOrErr;
275276

276277
uint64_t Size = P.second;
277278
// If we're not using the debug object, compute the address of the

llvm/tools/llvm-symbolizer/LLVMSymbolize.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,11 @@ void ModuleInfo::addSymbol(const SymbolRef &Symbol, uint64_t SymbolSize,
8484
SymbolRef::Type SymbolType = Symbol.getType();
8585
if (SymbolType != SymbolRef::ST_Function && SymbolType != SymbolRef::ST_Data)
8686
return;
87-
uint64_t SymbolAddress;
88-
if (error(Symbol.getAddress(SymbolAddress)) ||
89-
SymbolAddress == UnknownAddress)
87+
ErrorOr<uint64_t> SymbolAddressOrErr = Symbol.getAddress();
88+
if (error(SymbolAddressOrErr.getError()))
89+
return;
90+
uint64_t SymbolAddress = *SymbolAddressOrErr;
91+
if (SymbolAddress == UnknownAddress)
9092
return;
9193
if (OpdExtractor) {
9294
// For big-endian PowerPC64 ELF, symbols in the .opd section refer to

0 commit comments

Comments
 (0)