diff options
Diffstat (limited to 'tools/llvm-nm/llvm-nm.cpp')
-rw-r--r-- | tools/llvm-nm/llvm-nm.cpp | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index aa89f89c31d5..a07fcef35ebe 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -29,6 +29,7 @@ #include "llvm/Object/MachO.h" #include "llvm/Object/MachOUniversal.h" #include "llvm/Object/ObjectFile.h" +#include "llvm/Object/Wasm.h" #include "llvm/Support/COFF.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" @@ -129,6 +130,7 @@ cl::opt<bool> PrintSize("print-size", cl::desc("Show symbol size instead of address")); cl::alias PrintSizeS("S", cl::desc("Alias for --print-size"), cl::aliasopt(PrintSize), cl::Grouping); +bool MachOPrintSizeWarning = false; cl::opt<bool> SizeSort("size-sort", cl::desc("Sort symbols by size")); @@ -269,6 +271,8 @@ static char isSymbolList64Bit(SymbolicFile &Obj) { return Triple(IRObj->getTargetTriple()).isArch64Bit(); if (isa<COFFObjectFile>(Obj)) return false; + if (isa<WasmObjectFile>(Obj)) + return false; if (MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(&Obj)) return MachO->is64Bit(); return cast<ELFObjectFileBase>(Obj).getBytesInAddress() == 8; @@ -882,6 +886,13 @@ static char getSymbolNMTypeChar(MachOObjectFile &Obj, basic_symbol_iterator I) { return '?'; } +static char getSymbolNMTypeChar(WasmObjectFile &Obj, basic_symbol_iterator I) { + uint32_t Flags = I->getFlags(); + if (Flags & SymbolRef::SF_Executable) + return 't'; + return 'd'; +} + static char getSymbolNMTypeChar(IRObjectFile &Obj, basic_symbol_iterator I) { uint32_t Flags = I->getFlags(); // FIXME: should we print 'b'? At the IR level we cannot be sure if this @@ -923,6 +934,8 @@ static char getNMTypeChar(SymbolicFile &Obj, basic_symbol_iterator I) { Ret = getSymbolNMTypeChar(*COFF, I); else if (MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(&Obj)) Ret = getSymbolNMTypeChar(*MachO, I); + else if (WasmObjectFile *Wasm = dyn_cast<WasmObjectFile>(&Obj)) + Ret = getSymbolNMTypeChar(*Wasm, I); else Ret = getSymbolNMTypeChar(cast<ELFObjectFileBase>(Obj), I); @@ -1057,15 +1070,19 @@ static bool checkMachOAndArchFlags(SymbolicFile *O, std::string &Filename) { MachO::mach_header H; MachO::mach_header_64 H_64; Triple T; + const char *McpuDefault, *ArchFlag; if (MachO->is64Bit()) { H_64 = MachO->MachOObjectFile::getHeader64(); - T = MachOObjectFile::getArchTriple(H_64.cputype, H_64.cpusubtype); + T = MachOObjectFile::getArchTriple(H_64.cputype, H_64.cpusubtype, + &McpuDefault, &ArchFlag); } else { H = MachO->MachOObjectFile::getHeader(); - T = MachOObjectFile::getArchTriple(H.cputype, H.cpusubtype); + T = MachOObjectFile::getArchTriple(H.cputype, H.cpusubtype, + &McpuDefault, &ArchFlag); } + const std::string ArchFlagName(ArchFlag); if (none_of(ArchFlags, [&](const std::string &Name) { - return Name == T.getArchName(); + return Name == ArchFlagName; })) { error("No architecture specified", Filename); return false; @@ -1120,6 +1137,11 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { continue; } if (SymbolicFile *O = dyn_cast<SymbolicFile>(&*ChildOrErr.get())) { + if (!MachOPrintSizeWarning && PrintSize && isa<MachOObjectFile>(O)) { + errs() << ToolName << ": warning sizes with -print-size for Mach-O " + "files are always zero.\n"; + MachOPrintSizeWarning = true; + } if (!checkMachOAndArchFlags(O, Filename)) return; if (!PrintFileName) { @@ -1357,6 +1379,11 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { return; } if (SymbolicFile *O = dyn_cast<SymbolicFile>(&Bin)) { + if (!MachOPrintSizeWarning && PrintSize && isa<MachOObjectFile>(O)) { + errs() << ToolName << ": warning sizes with -print-size for Mach-O files " + "are always zero.\n"; + MachOPrintSizeWarning = true; + } if (!checkMachOAndArchFlags(O, Filename)) return; dumpSymbolNamesFromObject(*O, true); |