diff options
Diffstat (limited to 'contrib/llvm-project/llvm/tools/llvm-nm/llvm-nm.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/tools/llvm-nm/llvm-nm.cpp | 96 |
1 files changed, 49 insertions, 47 deletions
diff --git a/contrib/llvm-project/llvm/tools/llvm-nm/llvm-nm.cpp b/contrib/llvm-project/llvm/tools/llvm-nm/llvm-nm.cpp index 55319d0e4c72..1f6a5d1ab806 100644 --- a/contrib/llvm-project/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/contrib/llvm-project/llvm/tools/llvm-nm/llvm-nm.cpp @@ -16,7 +16,6 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/StringSwitch.h" -#include "llvm/ADT/Triple.h" #include "llvm/BinaryFormat/COFF.h" #include "llvm/BinaryFormat/XCOFF.h" #include "llvm/Demangle/Demangle.h" @@ -40,14 +39,16 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Format.h" -#include "llvm/Support/Host.h" #include "llvm/Support/InitLLVM.h" +#include "llvm/Support/LLVMDriver.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Program.h" #include "llvm/Support/Signals.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Support/WithColor.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/TargetParser/Host.h" +#include "llvm/TargetParser/Triple.h" #include <vector> using namespace llvm; @@ -293,22 +294,6 @@ bool operator==(const NMSymbol &A, const NMSymbol &B) { } } // anonymous namespace -static char isSymbolList64Bit(SymbolicFile &Obj) { - if (auto *IRObj = dyn_cast<IRObjectFile>(&Obj)) - return Triple(IRObj->getTargetTriple()).isArch64Bit(); - if (isa<COFFObjectFile>(Obj) || isa<COFFImportFile>(Obj)) - return false; - if (XCOFFObjectFile *XCOFFObj = dyn_cast<XCOFFObjectFile>(&Obj)) - return XCOFFObj->is64Bit(); - if (isa<WasmObjectFile>(Obj)) - return false; - if (TapiFile *Tapi = dyn_cast<TapiFile>(&Obj)) - return Tapi->is64Bit(); - if (MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(&Obj)) - return MachO->is64Bit(); - return cast<ELFObjectFileBase>(Obj).getBytesInAddress() == 8; -} - static StringRef CurrentFilename; static char getSymbolNMTypeChar(IRObjectFile &Obj, basic_symbol_iterator I); @@ -654,7 +639,7 @@ static void darwinPrintStab(MachOObjectFile *MachO, const NMSymbol &S) { static std::optional<std::string> demangle(StringRef Name) { std::string Demangled; - if (nonMicrosoftDemangle(Name.str().c_str(), Demangled)) + if (nonMicrosoftDemangle(Name, Demangled)) return Demangled; return std::nullopt; } @@ -722,7 +707,7 @@ static void printSymbolList(SymbolicFile &Obj, 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 +717,7 @@ static void printSymbolList(SymbolicFile &Obj, } const char *printBlanks, *printDashes, *printFormat; - if (isSymbolList64Bit(Obj)) { + if (Obj.is64Bit()) { printBlanks = " "; printDashes = "----------------"; switch (AddressRadix) { @@ -1044,7 +1029,15 @@ static char getSymbolNMTypeChar(MachOObjectFile &Obj, basic_symbol_iterator I) { } static char getSymbolNMTypeChar(TapiFile &Obj, basic_symbol_iterator I) { - return 's'; + auto Type = cantFail(Obj.getSymbolType(I->getRawDataRefImpl())); + switch (Type) { + case SymbolRef::ST_Data: + return 'd'; + case SymbolRef::ST_Function: + return 't'; + default: + return 's'; + } } static char getSymbolNMTypeChar(WasmObjectFile &Obj, basic_symbol_iterator I) { @@ -1671,8 +1664,8 @@ static bool shouldDump(SymbolicFile &Obj) { !isa<IRObjectFile>(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, @@ -1961,26 +1954,39 @@ static bool checkMachOAndArchFlags(SymbolicFile *O, StringRef Filename) { return true; } +static void printArchiveMap(iterator_range<Archive::symbol_iterator> &map, + StringRef Filename) { + for (auto I : map) { + Expected<Archive::Child> C = I.getMember(); + if (!C) { + error(C.takeError(), Filename); + break; + } + Expected<StringRef> FileNameOrErr = C->getName(); + if (!FileNameOrErr) { + error(FileNameOrErr.takeError(), Filename); + break; + } + StringRef SymName = I.getName(); + outs() << SymName << " in " << FileNameOrErr.get() << "\n"; + } + + outs() << "\n"; +} + static void dumpArchiveMap(Archive *A, StringRef Filename) { - Archive::symbol_iterator I = A->symbol_begin(); - Archive::symbol_iterator E = A->symbol_end(); - if (I != E) { + auto Map = A->symbols(); + if (!Map.empty()) { outs() << "Archive map\n"; - for (; I != E; ++I) { - Expected<Archive::Child> C = I->getMember(); - if (!C) { - error(C.takeError(), Filename); - break; - } - Expected<StringRef> FileNameOrErr = C->getName(); - if (!FileNameOrErr) { - error(FileNameOrErr.takeError(), Filename); - break; - } - StringRef SymName = I->getName(); - outs() << SymName << " in " << FileNameOrErr.get() << "\n"; - } - outs() << "\n"; + printArchiveMap(Map, Filename); + } + + auto ECMap = A->ec_symbols(); + if (!ECMap) { + warn(ECMap.takeError(), Filename); + } else if (!ECMap->empty()) { + outs() << "Archive EC map\n"; + printArchiveMap(*ECMap, Filename); } } @@ -2261,11 +2267,7 @@ static std::vector<NMSymbol> dumpSymbolNamesFromFile(StringRef Filename) { if (error(BufferOrErr.getError(), Filename)) return SymbolList; - // Always enable opaque pointers, to handle archives with mixed typed and - // opaque pointer bitcode files gracefully. As we're only reading symbols, - // the used pointer types don't matter. LLVMContext Context; - Context.setOpaquePointers(true); LLVMContext *ContextPtr = NoLLVMBitcode ? nullptr : &Context; Expected<std::unique_ptr<Binary>> BinaryOrErr = createBinary(BufferOrErr.get()->getMemBufferRef(), ContextPtr); @@ -2302,7 +2304,7 @@ exportSymbolNamesFromFiles(const std::vector<std::string> &InputFilenames) { printExportSymbolList(SymbolList); } -int llvm_nm_main(int argc, char **argv) { +int llvm_nm_main(int argc, char **argv, const llvm::ToolContext &) { InitLLVM X(argc, argv); BumpPtrAllocator A; StringSaver Saver(A); |