}
LLVM_ATTRIBUTE_NORETURN void llvm::report_error(StringRef File,
+ Twine Message) {
+ errs() << ToolName << ": '" << File << "': " << Message << ".\n";
+ exit(1);
+}
+
+LLVM_ATTRIBUTE_NORETURN void llvm::report_error(StringRef File,
std::error_code EC) {
assert(EC);
errs() << ToolName << ": '" << File << "': " << EC.message() << ".\n";
std::string Error;
const Target *TheTarget = TargetRegistry::lookupTarget(ArchName, TheTriple,
Error);
- if (!TheTarget)
- report_fatal_error("can't find target: " + Error);
+ if (!TheTarget) {
+ if (Obj)
+ report_error(Obj->getFileName(), "can't find target: " + Error);
+ else
+ error("can't find target: " + Error);
+ }
// Update the triple name and return the found target.
TripleName = TheTriple.getTriple();
for (const SymbolRef &Symbol : O->symbols()) {
std::error_code ec;
Expected<uint64_t> Addr = Symbol.getAddress();
- if (!Addr) {
- std::string Buf;
- raw_string_ostream OS(Buf);
- logAllUnhandledErrors(Addr.takeError(), OS, "");
- OS.flush();
- report_fatal_error(Buf);
- }
+ if (!Addr)
+ report_error(O->getFileName(), Addr.takeError());
if (*Addr != Val)
continue;
Expected<StringRef> Name = Symbol.getName();
- if (!Name) {
- std::string Buf;
- raw_string_ostream OS(Buf);
- logAllUnhandledErrors(Name.takeError(), OS, "");
- OS.flush();
- report_fatal_error(Buf);
- }
+ if (!Name)
+ report_error(O->getFileName(), Name.takeError());
fmt << *Name;
return;
}
if (Addr != Val)
continue;
if ((ec = Section.getName(Name)))
- report_fatal_error(ec.message());
+ report_error(O->getFileName(), ec);
fmt << Name;
return;
}
symbol_iterator SI = O->symbol_begin();
advance(SI, Val);
Expected<StringRef> SOrErr = SI->getName();
- error(errorToErrorCode(SOrErr.takeError()));
+ if (!SOrErr)
+ report_error(O->getFileName(), SOrErr.takeError());
S = *SOrErr;
} else {
section_iterator SI = O->section_begin();
// NOTE: Scattered relocations don't exist on x86_64.
unsigned RType = Obj->getAnyRelocationType(RENext);
if (RType != MachO::X86_64_RELOC_UNSIGNED)
- report_fatal_error("Expected X86_64_RELOC_UNSIGNED after "
- "X86_64_RELOC_SUBTRACTOR.");
+ report_error(Obj->getFileName(), "Expected X86_64_RELOC_UNSIGNED after "
+ "X86_64_RELOC_SUBTRACTOR.");
// The X86_64_RELOC_UNSIGNED contains the minuend symbol;
// X86_64_RELOC_SUBTRACTOR contains the subtrahend.
unsigned RType = Obj->getAnyRelocationType(RENext);
if (RType != MachO::GENERIC_RELOC_PAIR)
- report_fatal_error("Expected GENERIC_RELOC_PAIR after "
- "GENERIC_RELOC_SECTDIFF.");
+ report_error(Obj->getFileName(), "Expected GENERIC_RELOC_PAIR after "
+ "GENERIC_RELOC_SECTDIFF.");
printRelocationTargetName(Obj, RE, fmt);
fmt << "-";
// GENERIC_RELOC_PAIR.
unsigned RType = Obj->getAnyRelocationType(RENext);
if (RType != MachO::GENERIC_RELOC_PAIR)
- report_fatal_error("Expected GENERIC_RELOC_PAIR after "
- "GENERIC_RELOC_LOCAL_SECTDIFF.");
+ report_error(Obj->getFileName(), "Expected GENERIC_RELOC_PAIR after "
+ "GENERIC_RELOC_LOCAL_SECTDIFF.");
printRelocationTargetName(Obj, RE, fmt);
fmt << "-";
// ARM_RELOC_PAIR.
unsigned RType = Obj->getAnyRelocationType(RENext);
if (RType != MachO::ARM_RELOC_PAIR)
- report_fatal_error("Expected ARM_RELOC_PAIR after "
- "ARM_RELOC_HALF");
+ report_error(Obj->getFileName(), "Expected ARM_RELOC_PAIR after "
+ "ARM_RELOC_HALF");
// NOTE: The half of the target virtual address is stashed in the
// address field of the secondary relocation, but we can't reverse
std::unique_ptr<const MCRegisterInfo> MRI(
TheTarget->createMCRegInfo(TripleName));
if (!MRI)
- report_fatal_error("error: no register info for target " + TripleName);
+ report_error(Obj->getFileName(), "no register info for target " +
+ TripleName);
// Set up disassembler.
std::unique_ptr<const MCAsmInfo> AsmInfo(
TheTarget->createMCAsmInfo(*MRI, TripleName));
if (!AsmInfo)
- report_fatal_error("error: no assembly info for target " + TripleName);
+ report_error(Obj->getFileName(), "no assembly info for target " +
+ TripleName);
std::unique_ptr<const MCSubtargetInfo> STI(
TheTarget->createMCSubtargetInfo(TripleName, MCPU, Features.getString()));
if (!STI)
- report_fatal_error("error: no subtarget info for target " + TripleName);
+ report_error(Obj->getFileName(), "no subtarget info for target " +
+ TripleName);
std::unique_ptr<const MCInstrInfo> MII(TheTarget->createMCInstrInfo());
if (!MII)
- report_fatal_error("error: no instruction info for target " + TripleName);
+ report_error(Obj->getFileName(), "no instruction info for target " +
+ TripleName);
MCObjectFileInfo MOFI;
MCContext Ctx(AsmInfo.get(), MRI.get(), &MOFI);
// FIXME: for now initialize MCObjectFileInfo with default values
std::unique_ptr<MCDisassembler> DisAsm(
TheTarget->createMCDisassembler(*STI, Ctx));
if (!DisAsm)
- report_fatal_error("error: no disassembler for target " + TripleName);
+ report_error(Obj->getFileName(), "no disassembler for target " +
+ TripleName);
std::unique_ptr<const MCInstrAnalysis> MIA(
TheTarget->createMCInstrAnalysis(MII.get()));
std::unique_ptr<MCInstPrinter> IP(TheTarget->createMCInstPrinter(
Triple(TripleName), AsmPrinterVariant, *AsmInfo, *MII, *MRI));
if (!IP)
- report_fatal_error("error: no instruction printer for target " +
- TripleName);
+ report_error(Obj->getFileName(), "no instruction printer for target " +
+ TripleName);
IP->setPrintImmHex(PrintImmHex);
PrettyPrinter &PIP = selectPrettyPrinter(Triple(TripleName));
std::map<SectionRef, SectionSymbolsTy> AllSymbols;
for (const SymbolRef &Symbol : Obj->symbols()) {
Expected<uint64_t> AddressOrErr = Symbol.getAddress();
- error(errorToErrorCode(AddressOrErr.takeError()));
+ if (!AddressOrErr)
+ report_error(Obj->getFileName(), AddressOrErr.takeError());
uint64_t Address = *AddressOrErr;
Expected<StringRef> Name = Symbol.getName();
- error(errorToErrorCode(Name.takeError()));
+ if (!Name)
+ report_error(Obj->getFileName(), Name.takeError());
if (Name->empty())
continue;
Expected<section_iterator> SectionOrErr = Symbol.getSection();
- error(errorToErrorCode(SectionOrErr.takeError()));
+ if (!SectionOrErr)
+ report_error(Obj->getFileName(), SectionOrErr.takeError());
section_iterator SecI = *SectionOrErr;
if (SecI == Obj->section_end())
continue;
for (const SymbolRef &Symbol : o->symbols()) {
Expected<uint64_t> AddressOrError = Symbol.getAddress();
if (!AddressOrError)
- report_error(ArchiveName, o->getFileName(), AddressOrError.takeError());
+ report_error(ArchiveName, o->getFileName(), AddressOrError.takeError(),
+ ArchitectureName);
uint64_t Address = *AddressOrError;
if ((Address < StartAddress) || (Address > StopAddress))
continue;
Expected<SymbolRef::Type> TypeOrError = Symbol.getType();
if (!TypeOrError)
- report_error(ArchiveName, o->getFileName(), TypeOrError.takeError());
+ report_error(ArchiveName, o->getFileName(), TypeOrError.takeError(),
+ ArchitectureName);
SymbolRef::Type Type = *TypeOrError;
uint32_t Flags = Symbol.getFlags();
Expected<section_iterator> SectionOrErr = Symbol.getSection();
- error(errorToErrorCode(SectionOrErr.takeError()));
+ if (!SectionOrErr)
+ report_error(ArchiveName, o->getFileName(), SectionOrErr.takeError(),
+ ArchitectureName);
section_iterator Section = *SectionOrErr;
StringRef Name;
if (Type == SymbolRef::ST_Debug && Section != o->section_end()) {
printMachOLoadCommands(o);
return;
}
- report_fatal_error("Invalid/Unsupported object file format");
+ report_error(o->getFileName(), "Invalid/Unsupported object file format");
}
static void DumpObject(const ObjectFile *o, const Archive *a = nullptr) {