diff --git a/llvm/include/llvm/Object/COFF.h b/llvm/include/llvm/Object/COFF.h --- a/llvm/include/llvm/Object/COFF.h +++ b/llvm/include/llvm/Object/COFF.h @@ -969,6 +969,8 @@ section_iterator section_begin() const override; section_iterator section_end() const override; + bool is64Bit() const override { return false; } + const coff_section *getCOFFSection(const SectionRef &Section) const; COFFSymbolRef getCOFFSymbol(const DataRefImpl &Ref) const; COFFSymbolRef getCOFFSymbol(const SymbolRef &Symbol) const; diff --git a/llvm/include/llvm/Object/COFFImportFile.h b/llvm/include/llvm/Object/COFFImportFile.h --- a/llvm/include/llvm/Object/COFFImportFile.h +++ b/llvm/include/llvm/Object/COFFImportFile.h @@ -56,6 +56,8 @@ return BasicSymbolRef(Symb, this); } + bool is64Bit() const override { return false; } + const coff_import_header *getCOFFImportHeader() const { return reinterpret_cast( Data.getBufferStart()); diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h --- a/llvm/include/llvm/Object/ELFObjectFile.h +++ b/llvm/include/llvm/Object/ELFObjectFile.h @@ -432,6 +432,8 @@ basic_symbol_iterator symbol_begin() const override; basic_symbol_iterator symbol_end() const override; + bool is64Bit() const override { return getBytesInAddress() == 8; } + elf_symbol_iterator dynamic_symbol_begin() const; elf_symbol_iterator dynamic_symbol_end() const; diff --git a/llvm/include/llvm/Object/IRObjectFile.h b/llvm/include/llvm/Object/IRObjectFile.h --- a/llvm/include/llvm/Object/IRObjectFile.h +++ b/llvm/include/llvm/Object/IRObjectFile.h @@ -37,7 +37,9 @@ Expected getSymbolFlags(DataRefImpl Symb) const override; basic_symbol_iterator symbol_begin() const override; basic_symbol_iterator symbol_end() const override; - + bool is64Bit() const override { + return Triple(getTargetTriple()).isArch64Bit(); + } StringRef getTargetTriple() const; static bool classof(const Binary *v) { diff --git a/llvm/include/llvm/Object/MachO.h b/llvm/include/llvm/Object/MachO.h --- a/llvm/include/llvm/Object/MachO.h +++ b/llvm/include/llvm/Object/MachO.h @@ -503,6 +503,8 @@ basic_symbol_iterator symbol_begin() const override; basic_symbol_iterator symbol_end() const override; + bool is64Bit() const override; + // MachO specific. symbol_iterator getSymbolByIndex(unsigned Index) const; uint64_t getSymbolIndex(DataRefImpl Symb) const; @@ -735,7 +737,7 @@ ArrayRef getUuid() const; StringRef getStringTableData() const; - bool is64Bit() const; + void ReadULEB128s(uint64_t Index, SmallVectorImpl &Out) const; static StringRef guessLibraryShortName(StringRef Name, bool &isFramework, diff --git a/llvm/include/llvm/Object/SymbolicFile.h b/llvm/include/llvm/Object/SymbolicFile.h --- a/llvm/include/llvm/Object/SymbolicFile.h +++ b/llvm/include/llvm/Object/SymbolicFile.h @@ -158,6 +158,8 @@ virtual basic_symbol_iterator symbol_end() const = 0; + virtual bool is64Bit() const = 0; + // convenience wrappers. using basic_symbol_iterator_range = iterator_range; basic_symbol_iterator_range symbols() const { diff --git a/llvm/include/llvm/Object/TapiFile.h b/llvm/include/llvm/Object/TapiFile.h --- a/llvm/include/llvm/Object/TapiFile.h +++ b/llvm/include/llvm/Object/TapiFile.h @@ -50,7 +50,7 @@ static bool classof(const Binary *v) { return v->isTapiFile(); } - bool is64Bit() { return MachO::is64Bit(Arch); } + bool is64Bit() const override { return MachO::is64Bit(Arch); } private: struct Symbol { diff --git a/llvm/include/llvm/Object/Wasm.h b/llvm/include/llvm/Object/Wasm.h --- a/llvm/include/llvm/Object/Wasm.h +++ b/llvm/include/llvm/Object/Wasm.h @@ -164,6 +164,8 @@ basic_symbol_iterator symbol_end() const override; Expected getSymbolName(DataRefImpl Symb) const override; + bool is64Bit() const override { return false; } + Expected getSymbolAddress(DataRefImpl Symb) const override; uint64_t getWasmSymbolValue(const WasmSymbol &Sym) const; uint64_t getSymbolValueImpl(DataRefImpl Symb) const override; diff --git a/llvm/include/llvm/Object/XCOFFObjectFile.h b/llvm/include/llvm/Object/XCOFFObjectFile.h --- a/llvm/include/llvm/Object/XCOFFObjectFile.h +++ b/llvm/include/llvm/Object/XCOFFObjectFile.h @@ -576,7 +576,7 @@ Expected getSymbolFlags(DataRefImpl Symb) const override; basic_symbol_iterator symbol_begin() const override; basic_symbol_iterator symbol_end() const override; - + bool is64Bit() const override; Expected getSymbolName(DataRefImpl Symb) const override; Expected getSymbolAddress(DataRefImpl Symb) const override; uint64_t getSymbolValueImpl(DataRefImpl Symb) const override; @@ -625,7 +625,7 @@ bool isRelocatableObject() const override; // Below here is the non-inherited interface. - bool is64Bit() const; + Expected getRawData(const char *Start, uint64_t Size, StringRef Name) const; diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp --- a/llvm/tools/llvm-ar/llvm-ar.cpp +++ b/llvm/tools/llvm-ar/llvm-ar.cpp @@ -18,15 +18,7 @@ #include "llvm/IR/LLVMContext.h" #include "llvm/Object/Archive.h" #include "llvm/Object/ArchiveWriter.h" -#include "llvm/Object/COFFImportFile.h" -#include "llvm/Object/ELFObjectFile.h" -#include "llvm/Object/IRObjectFile.h" -#include "llvm/Object/MachO.h" -#include "llvm/Object/ObjectFile.h" #include "llvm/Object/SymbolicFile.h" -#include "llvm/Object/TapiFile.h" -#include "llvm/Object/Wasm.h" -#include "llvm/Object/XCOFFObjectFile.h" #include "llvm/Support/Chrono.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ConvertUTF.h" @@ -646,31 +638,12 @@ llvm_unreachable("Missing entry in covered switch."); } -static bool is64BitSymbolicFile(SymbolicFile &Obj) { - if (auto *IRObj = dyn_cast(&Obj)) - return Triple(IRObj->getTargetTriple()).isArch64Bit(); - if (isa(Obj) || isa(Obj)) - return false; - if (XCOFFObjectFile *XCOFFObj = dyn_cast(&Obj)) - return XCOFFObj->is64Bit(); - if (isa(Obj)) - return false; - if (TapiFile *Tapi = dyn_cast(&Obj)) - return Tapi->is64Bit(); - if (MachOObjectFile *MachO = dyn_cast(&Obj)) - return MachO->is64Bit(); - if (ELFObjectFileBase *ElfO = dyn_cast(&Obj)) - return ElfO->getBytesInAddress() == 8; - - fail("unsupported file format"); -} - static bool isValidInBitMode(Binary &Bin) { if (BitMode == BitModeTy::Bit32_64 || BitMode == BitModeTy::Any) return true; if (SymbolicFile *SymFile = dyn_cast(&Bin)) { - bool Is64Bit = is64BitSymbolicFile(*SymFile); + bool Is64Bit = SymFile->is64Bit(); if ((Is64Bit && (BitMode == BitModeTy::Bit32)) || (!Is64Bit && (BitMode == BitModeTy::Bit64))) return false; diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -293,22 +293,6 @@ } } // anonymous namespace -static char isSymbolList64Bit(SymbolicFile &Obj) { - if (auto *IRObj = dyn_cast(&Obj)) - return Triple(IRObj->getTargetTriple()).isArch64Bit(); - if (isa(Obj) || isa(Obj)) - return false; - if (XCOFFObjectFile *XCOFFObj = dyn_cast(&Obj)) - return XCOFFObj->is64Bit(); - if (isa(Obj)) - return false; - if (TapiFile *Tapi = dyn_cast(&Obj)) - return Tapi->is64Bit(); - if (MachOObjectFile *MachO = dyn_cast(&Obj)) - return MachO->is64Bit(); - return cast(Obj).getBytesInAddress() == 8; -} - static StringRef CurrentFilename; static char getSymbolNMTypeChar(IRObjectFile &Obj, basic_symbol_iterator I); @@ -722,7 +706,7 @@ outs() << '\n' << CurrentFilename << ":\n"; } else if (OutputFormat == sysv) { outs() << "\n\nSymbols from " << CurrentFilename << ":\n\n"; - if (isSymbolList64Bit(Obj)) + if (Obj.is64Bit()) outs() << "Name Value Class Type" << " Size Line Section\n"; else @@ -732,7 +716,7 @@ } const char *printBlanks, *printDashes, *printFormat; - if (isSymbolList64Bit(Obj)) { + if (Obj.is64Bit()) { printBlanks = " "; printDashes = "----------------"; switch (AddressRadix) { @@ -1671,8 +1655,8 @@ !isa(Obj)) return true; - return isSymbolList64Bit(Obj) ? BitMode != BitModeTy::Bit32 - : BitMode != BitModeTy::Bit64; + return Obj.is64Bit() ? BitMode != BitModeTy::Bit32 + : BitMode != BitModeTy::Bit64; } static void getXCOFFExports(XCOFFObjectFile *XCOFFObj,