diff options
Diffstat (limited to 'tools/llvm-cxxdump/llvm-cxxdump.cpp')
-rw-r--r-- | tools/llvm-cxxdump/llvm-cxxdump.cpp | 104 |
1 files changed, 36 insertions, 68 deletions
diff --git a/tools/llvm-cxxdump/llvm-cxxdump.cpp b/tools/llvm-cxxdump/llvm-cxxdump.cpp index 4e06be9e78b9..3dda69266a2d 100644 --- a/tools/llvm-cxxdump/llvm-cxxdump.cpp +++ b/tools/llvm-cxxdump/llvm-cxxdump.cpp @@ -40,18 +40,14 @@ cl::list<std::string> InputFilenames(cl::Positional, cl::ZeroOrMore); } // namespace opts -static int ReturnValue = EXIT_SUCCESS; - namespace llvm { -static bool error(std::error_code EC) { +static void error(std::error_code EC) { if (!EC) - return false; - - ReturnValue = EXIT_FAILURE; + return; outs() << "\nError reading file: " << EC.message() << ".\n"; outs().flush(); - return true; + exit(1); } } // namespace llvm @@ -59,38 +55,24 @@ static bool error(std::error_code EC) { static void reportError(StringRef Input, StringRef Message) { if (Input == "-") Input = "<stdin>"; - errs() << Input << ": " << Message << "\n"; errs().flush(); - ReturnValue = EXIT_FAILURE; + exit(1); } static void reportError(StringRef Input, std::error_code EC) { reportError(Input, EC.message()); } -static SmallVectorImpl<SectionRef> &getRelocSections(const ObjectFile *Obj, - const SectionRef &Sec) { - static bool MappingDone = false; - static std::map<SectionRef, SmallVector<SectionRef, 1>> SectionRelocMap; - if (!MappingDone) { - for (const SectionRef &Section : Obj->sections()) { - section_iterator Sec2 = Section.getRelocatedSection(); - if (Sec2 != Obj->section_end()) - SectionRelocMap[*Sec2].push_back(Section); - } - MappingDone = true; - } - return SectionRelocMap[Sec]; -} +static std::map<SectionRef, SmallVector<SectionRef, 1>> SectionRelocMap; -static bool collectRelocatedSymbols(const ObjectFile *Obj, +static void collectRelocatedSymbols(const ObjectFile *Obj, const SectionRef &Sec, uint64_t SecAddress, uint64_t SymAddress, uint64_t SymSize, StringRef *I, StringRef *E) { uint64_t SymOffset = SymAddress - SecAddress; uint64_t SymEnd = SymOffset + SymSize; - for (const SectionRef &SR : getRelocSections(Obj, Sec)) { + for (const SectionRef &SR : SectionRelocMap[Sec]) { for (const object::RelocationRef &Reloc : SR.relocations()) { if (I == E) break; @@ -98,8 +80,7 @@ static bool collectRelocatedSymbols(const ObjectFile *Obj, if (RelocSymI == Obj->symbol_end()) continue; ErrorOr<StringRef> RelocSymName = RelocSymI->getName(); - if (error(RelocSymName.getError())) - return true; + error(RelocSymName.getError()); uint64_t Offset = Reloc.getOffset(); if (Offset >= SymOffset && Offset < SymEnd) { *I = *RelocSymName; @@ -107,29 +88,26 @@ static bool collectRelocatedSymbols(const ObjectFile *Obj, } } } - return false; } -static bool collectRelocationOffsets( +static void collectRelocationOffsets( const ObjectFile *Obj, const SectionRef &Sec, uint64_t SecAddress, uint64_t SymAddress, uint64_t SymSize, StringRef SymName, std::map<std::pair<StringRef, uint64_t>, StringRef> &Collection) { uint64_t SymOffset = SymAddress - SecAddress; uint64_t SymEnd = SymOffset + SymSize; - for (const SectionRef &SR : getRelocSections(Obj, Sec)) { + for (const SectionRef &SR : SectionRelocMap[Sec]) { for (const object::RelocationRef &Reloc : SR.relocations()) { const object::symbol_iterator RelocSymI = Reloc.getSymbol(); if (RelocSymI == Obj->symbol_end()) continue; ErrorOr<StringRef> RelocSymName = RelocSymI->getName(); - if (error(RelocSymName.getError())) - return true; + error(RelocSymName.getError()); uint64_t Offset = Reloc.getOffset(); if (Offset >= SymOffset && Offset < SymEnd) Collection[std::make_pair(SymName, Offset - SymOffset)] = *RelocSymName; } } - return false; } static void dumpCXXData(const ObjectFile *Obj) { @@ -182,6 +160,13 @@ static void dumpCXXData(const ObjectFile *Obj) { std::map<std::pair<StringRef, uint64_t>, StringRef> VTTEntries; std::map<StringRef, StringRef> TINames; + SectionRelocMap.clear(); + for (const SectionRef &Section : Obj->sections()) { + section_iterator Sec2 = Section.getRelocatedSection(); + if (Sec2 != Obj->section_end()) + SectionRelocMap[*Sec2].push_back(Section); + } + uint8_t BytesInAddress = Obj->getBytesInAddress(); std::vector<std::pair<SymbolRef, uint64_t>> SymAddr = @@ -191,12 +176,11 @@ static void dumpCXXData(const ObjectFile *Obj) { object::SymbolRef Sym = P.first; uint64_t SymSize = P.second; ErrorOr<StringRef> SymNameOrErr = Sym.getName(); - if (error(SymNameOrErr.getError())) - return; + error(SymNameOrErr.getError()); StringRef SymName = *SymNameOrErr; - object::section_iterator SecI(Obj->section_begin()); - if (error(Sym.getSection(SecI))) - return; + ErrorOr<object::section_iterator> SecIOrErr = Sym.getSection(); + error(SecIOrErr.getError()); + object::section_iterator SecI = *SecIOrErr; // Skip external symbols. if (SecI == Obj->section_end()) continue; @@ -205,11 +189,9 @@ static void dumpCXXData(const ObjectFile *Obj) { if (Sec.isBSS() || Sec.isVirtual()) continue; StringRef SecContents; - if (error(Sec.getContents(SecContents))) - return; + error(Sec.getContents(SecContents)); ErrorOr<uint64_t> SymAddressOrErr = Sym.getAddress(); - if (error(SymAddressOrErr.getError())) - return; + error(SymAddressOrErr.getError()); uint64_t SymAddress = *SymAddressOrErr; uint64_t SecAddress = Sec.getAddress(); uint64_t SecSize = Sec.getSize(); @@ -236,23 +218,19 @@ static void dumpCXXData(const ObjectFile *Obj) { // Complete object locators in the MS-ABI start with '??_R4' else if (SymName.startswith("??_R4")) { CompleteObjectLocator COL; - COL.Data = ArrayRef<little32_t>( + COL.Data = makeArrayRef( reinterpret_cast<const little32_t *>(SymContents.data()), 3); StringRef *I = std::begin(COL.Symbols), *E = std::end(COL.Symbols); - if (collectRelocatedSymbols(Obj, Sec, SecAddress, SymAddress, SymSize, I, - E)) - return; + collectRelocatedSymbols(Obj, Sec, SecAddress, SymAddress, SymSize, I, E); COLs[SymName] = COL; } // Class hierarchy descriptors in the MS-ABI start with '??_R3' else if (SymName.startswith("??_R3")) { ClassHierarchyDescriptor CHD; - CHD.Data = ArrayRef<little32_t>( + CHD.Data = makeArrayRef( reinterpret_cast<const little32_t *>(SymContents.data()), 3); StringRef *I = std::begin(CHD.Symbols), *E = std::end(CHD.Symbols); - if (collectRelocatedSymbols(Obj, Sec, SecAddress, SymAddress, SymSize, I, - E)) - return; + collectRelocatedSymbols(Obj, Sec, SecAddress, SymAddress, SymSize, I, E); CHDs[SymName] = CHD; } // Class hierarchy descriptors in the MS-ABI start with '??_R2' @@ -265,12 +243,10 @@ static void dumpCXXData(const ObjectFile *Obj) { // Base class descriptors in the MS-ABI start with '??_R1' else if (SymName.startswith("??_R1")) { BaseClassDescriptor BCD; - BCD.Data = ArrayRef<little32_t>( + BCD.Data = makeArrayRef( reinterpret_cast<const little32_t *>(SymContents.data()) + 1, 5); StringRef *I = std::begin(BCD.Symbols), *E = std::end(BCD.Symbols); - if (collectRelocatedSymbols(Obj, Sec, SecAddress, SymAddress, SymSize, I, - E)) - return; + collectRelocatedSymbols(Obj, Sec, SecAddress, SymAddress, SymSize, I, E); BCDs[SymName] = BCD; } // Type descriptors in the MS-ABI start with '??_R0' @@ -283,9 +259,7 @@ static void dumpCXXData(const ObjectFile *Obj) { TD.AlwaysZero = *reinterpret_cast<const little32_t *>(DataPtr); TD.MangledName = SymContents.drop_front(BytesInAddress * 2); StringRef *I = std::begin(TD.Symbols), *E = std::end(TD.Symbols); - if (collectRelocatedSymbols(Obj, Sec, SecAddress, SymAddress, SymSize, I, - E)) - return; + collectRelocatedSymbols(Obj, Sec, SecAddress, SymAddress, SymSize, I, E); TDs[SymName] = TD; } // Throw descriptors in the MS-ABI start with '_TI' @@ -316,9 +290,7 @@ static void dumpCXXData(const ObjectFile *Obj) { CT.VirtualBaseAdjustmentOffset = DataPtr[4]; CT.Size = DataPtr[5]; StringRef *I = std::begin(CT.Symbols), *E = std::end(CT.Symbols); - if (collectRelocatedSymbols(Obj, Sec, SecAddress, SymAddress, SymSize, I, - E)) - return; + collectRelocatedSymbols(Obj, Sec, SecAddress, SymAddress, SymSize, I, E); CTs[SymName] = CT; } // Construction vtables in the Itanium ABI start with '_ZTT' or '__ZTT'. @@ -510,7 +482,9 @@ static void dumpCXXData(const ObjectFile *Obj) { } static void dumpArchive(const Archive *Arc) { - for (const Archive::Child &ArcC : Arc->children()) { + for (auto &ErrorOrChild : Arc->children()) { + error(ErrorOrChild.getError()); + const Archive::Child &ArcC = *ErrorOrChild; ErrorOr<std::unique_ptr<Binary>> ChildOrErr = ArcC.getAsBinary(); if (std::error_code EC = ChildOrErr.getError()) { // Ignore non-object files. @@ -527,12 +501,6 @@ static void dumpArchive(const Archive *Arc) { } static void dumpInput(StringRef File) { - // If file isn't stdin, check that it exists. - if (File != "-" && !sys::fs::exists(File)) { - reportError(File, cxxdump_error::file_not_found); - return; - } - // Attempt to open the binary. ErrorOr<OwningBinary<Binary>> BinaryOrErr = createBinary(File); if (std::error_code EC = BinaryOrErr.getError()) { @@ -569,5 +537,5 @@ int main(int argc, const char *argv[]) { std::for_each(opts::InputFilenames.begin(), opts::InputFilenames.end(), dumpInput); - return ReturnValue; + return EXIT_SUCCESS; } |