aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/tools/llvm-nm/llvm-nm.cpp
diff options
context:
space:
mode:
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.cpp96
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);