Skip to content

Commit 931cb65

Browse files
committed
Thread Expected<...> up from libObject’s getSymbolAddress() for symbols to allow
a good error message to be produced. This is nearly the last libObject interface that used ErrorOr and the last one that appears in llvm/include/llvm/Object/MachO.h . For Mach-O objects this is just a clean up because it’s version of getSymbolAddress() can’t return an error. I will leave it to the experts on COFF and ELF to actually add meaning full error messages in their tests if they wish. And also leave it to these experts to change the last two ErrorOr interfaces in llvm/include/llvm/Object/ObjectFile.h for createCOFFObjectFile() and createELFObjectFile() if they wish. Since there are no test cases for COFF and ELF error cases with respect to getSymbolAddress() in the test suite this is no functional change (NFC). llvm-svn: 273701
1 parent 267164d commit 931cb65

File tree

18 files changed

+92
-55
lines changed

18 files changed

+92
-55
lines changed

llvm/include/llvm/Object/COFF.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ class COFFObjectFile : public ObjectFile {
722722
protected:
723723
void moveSymbolNext(DataRefImpl &Symb) const override;
724724
Expected<StringRef> getSymbolName(DataRefImpl Symb) const override;
725-
ErrorOr<uint64_t> getSymbolAddress(DataRefImpl Symb) const override;
725+
Expected<uint64_t> getSymbolAddress(DataRefImpl Symb) const override;
726726
uint64_t getSymbolValueImpl(DataRefImpl Symb) const override;
727727
uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override;
728728
uint32_t getSymbolFlags(DataRefImpl Symb) const override;

llvm/include/llvm/Object/ELFObjectFile.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ template <class ELFT> class ELFObjectFile : public ELFObjectFileBase {
207207

208208
void moveSymbolNext(DataRefImpl &Symb) const override;
209209
Expected<StringRef> getSymbolName(DataRefImpl Symb) const override;
210-
ErrorOr<uint64_t> getSymbolAddress(DataRefImpl Symb) const override;
210+
Expected<uint64_t> getSymbolAddress(DataRefImpl Symb) const override;
211211
uint64_t getSymbolValueImpl(DataRefImpl Symb) const override;
212212
uint32_t getSymbolAlignment(DataRefImpl Symb) const override;
213213
uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override;
@@ -397,7 +397,7 @@ uint64_t ELFObjectFile<ELFT>::getSymbolValueImpl(DataRefImpl Symb) const {
397397
}
398398

399399
template <class ELFT>
400-
ErrorOr<uint64_t>
400+
Expected<uint64_t>
401401
ELFObjectFile<ELFT>::getSymbolAddress(DataRefImpl Symb) const {
402402
uint64_t Result = getSymbolValue(Symb);
403403
const Elf_Sym *ESym = getSymbol(Symb);
@@ -415,7 +415,7 @@ ELFObjectFile<ELFT>::getSymbolAddress(DataRefImpl Symb) const {
415415
ErrorOr<const Elf_Shdr *> SectionOrErr =
416416
EF.getSection(ESym, SymTab, ShndxTable);
417417
if (std::error_code EC = SectionOrErr.getError())
418-
return EC;
418+
return errorCodeToError(EC);
419419
const Elf_Shdr *Section = *SectionOrErr;
420420
if (Section)
421421
Result += Section->sh_addr;

llvm/include/llvm/Object/MachO.h

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

208-
ErrorOr<uint64_t> getSymbolAddress(DataRefImpl Symb) const override;
208+
Expected<uint64_t> getSymbolAddress(DataRefImpl Symb) const override;
209209
uint32_t getSymbolAlignment(DataRefImpl Symb) const override;
210210
uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override;
211211
Expected<SymbolRef::Type> getSymbolType(DataRefImpl Symb) const override;

llvm/include/llvm/Object/ObjectFile.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ class SymbolRef : public BasicSymbolRef {
135135
Expected<StringRef> getName() const;
136136
/// Returns the symbol virtual address (i.e. address at which it will be
137137
/// mapped).
138-
ErrorOr<uint64_t> getAddress() const;
138+
Expected<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,7 +198,7 @@ class ObjectFile : public SymbolicFile {
198198
virtual Expected<StringRef> getSymbolName(DataRefImpl Symb) const = 0;
199199
std::error_code printSymbolName(raw_ostream &OS,
200200
DataRefImpl Symb) const override;
201-
virtual ErrorOr<uint64_t> getSymbolAddress(DataRefImpl Symb) const = 0;
201+
virtual Expected<uint64_t> getSymbolAddress(DataRefImpl Symb) const = 0;
202202
virtual uint64_t getSymbolValueImpl(DataRefImpl Symb) const = 0;
203203
virtual uint32_t getSymbolAlignment(DataRefImpl Symb) const;
204204
virtual uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const = 0;
@@ -312,7 +312,7 @@ inline Expected<StringRef> SymbolRef::getName() const {
312312
return getObject()->getSymbolName(getRawDataRefImpl());
313313
}
314314

315-
inline ErrorOr<uint64_t> SymbolRef::getAddress() const {
315+
inline Expected<uint64_t> SymbolRef::getAddress() const {
316316
return getObject()->getSymbolAddress(getRawDataRefImpl());
317317
}
318318

llvm/lib/DebugInfo/DWARF/DWARFContext.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -793,10 +793,14 @@ DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj,
793793
// First calculate the address of the symbol or section as it appears
794794
// in the objct file
795795
if (Sym != Obj.symbol_end()) {
796-
ErrorOr<uint64_t> SymAddrOrErr = Sym->getAddress();
797-
if (std::error_code EC = SymAddrOrErr.getError()) {
796+
Expected<uint64_t> SymAddrOrErr = Sym->getAddress();
797+
if (!SymAddrOrErr) {
798+
std::string Buf;
799+
raw_string_ostream OS(Buf);
800+
logAllUnhandledErrors(SymAddrOrErr.takeError(), OS, "");
801+
OS.flush();
798802
errs() << "error: failed to compute symbol address: "
799-
<< EC.message() << '\n';
803+
<< Buf << '\n';
800804
continue;
801805
}
802806
SymAddr = *SymAddrOrErr;

llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ std::error_code SymbolizableObjectFile::addSymbol(const SymbolRef &Symbol,
125125
SymbolRef::Type SymbolType = *SymbolTypeOrErr;
126126
if (SymbolType != SymbolRef::ST_Function && SymbolType != SymbolRef::ST_Data)
127127
return std::error_code();
128-
ErrorOr<uint64_t> SymbolAddressOrErr = Symbol.getAddress();
129-
if (auto EC = SymbolAddressOrErr.getError())
130-
return EC;
128+
Expected<uint64_t> SymbolAddressOrErr = Symbol.getAddress();
129+
if (!SymbolAddressOrErr)
130+
return errorToErrorCode(SymbolAddressOrErr.takeError());
131131
uint64_t SymbolAddress = *SymbolAddressOrErr;
132132
if (OpdExtractor) {
133133
// For big-endian PowerPC64 ELF, symbols in the .opd section refer to

llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,9 @@ void RuntimeDyldImpl::mapSectionAddress(const void *LocalAddress,
163163

164164
static Error getOffset(const SymbolRef &Sym, SectionRef Sec,
165165
uint64_t &Result) {
166-
ErrorOr<uint64_t> AddressOrErr = Sym.getAddress();
167-
if (std::error_code EC = AddressOrErr.getError())
168-
return errorCodeToError(EC);
166+
Expected<uint64_t> AddressOrErr = Sym.getAddress();
167+
if (!AddressOrErr)
168+
return AddressOrErr.takeError();
169169
Result = *AddressOrErr - Sec.getAddress();
170170
return Error::success();
171171
}
@@ -236,7 +236,7 @@ RuntimeDyldImpl::loadObjectImpl(const object::ObjectFile &Obj) {
236236
if (auto AddrOrErr = I->getAddress())
237237
Addr = *AddrOrErr;
238238
else
239-
return errorCodeToError(AddrOrErr.getError());
239+
return AddrOrErr.takeError();
240240

241241
unsigned SectionID = AbsoluteSymbolSection;
242242

llvm/lib/Object/COFFObjectFile.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ uint64_t COFFObjectFile::getSymbolValueImpl(DataRefImpl Ref) const {
157157
return getCOFFSymbol(Ref).getValue();
158158
}
159159

160-
ErrorOr<uint64_t> COFFObjectFile::getSymbolAddress(DataRefImpl Ref) const {
160+
Expected<uint64_t> COFFObjectFile::getSymbolAddress(DataRefImpl Ref) const {
161161
uint64_t Result = getSymbolValue(Ref);
162162
COFFSymbolRef Symb = getCOFFSymbol(Ref);
163163
int32_t SectionNumber = Symb.getSectionNumber();
@@ -168,7 +168,7 @@ ErrorOr<uint64_t> COFFObjectFile::getSymbolAddress(DataRefImpl Ref) const {
168168

169169
const coff_section *Section = nullptr;
170170
if (std::error_code EC = getSection(SectionNumber, Section))
171-
return EC;
171+
return errorCodeToError(EC);
172172
Result += Section->VirtualAddress;
173173

174174
// The section VirtualAddress does not include ImageBase, and we want to

llvm/lib/Object/MachOObjectFile.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ uint64_t MachOObjectFile::getSymbolValueImpl(DataRefImpl Sym) const {
473473
return getNValue(Sym);
474474
}
475475

476-
ErrorOr<uint64_t> MachOObjectFile::getSymbolAddress(DataRefImpl Sym) const {
476+
Expected<uint64_t> MachOObjectFile::getSymbolAddress(DataRefImpl Sym) const {
477477
return getSymbolValue(Sym);
478478
}
479479

llvm/lib/Object/Object.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,14 @@ const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) {
195195
}
196196

197197
uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) {
198-
ErrorOr<uint64_t> Ret = (*unwrap(SI))->getAddress();
199-
if (std::error_code EC = Ret.getError())
200-
report_fatal_error(EC.message());
198+
Expected<uint64_t> Ret = (*unwrap(SI))->getAddress();
199+
if (!Ret) {
200+
std::string Buf;
201+
raw_string_ostream OS(Buf);
202+
logAllUnhandledErrors(Ret.takeError(), OS, "");
203+
OS.flush();
204+
report_fatal_error(Buf);
205+
}
201206
return *Ret;
202207
}
203208

0 commit comments

Comments
 (0)