diff options
| -rw-r--r-- | llvm/test/tools/llvm-nm/ARM/Inputs/print-size.macho-armv7m | bin | 0 -> 356 bytes | |||
| -rw-r--r-- | llvm/test/tools/llvm-nm/ARM/lit.local.cfg | 2 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-nm/ARM/macho-print-size.test | 3 | ||||
| -rw-r--r-- | llvm/tools/llvm-nm/llvm-nm.cpp | 21 | 
4 files changed, 23 insertions, 3 deletions
diff --git a/llvm/test/tools/llvm-nm/ARM/Inputs/print-size.macho-armv7m b/llvm/test/tools/llvm-nm/ARM/Inputs/print-size.macho-armv7m Binary files differnew file mode 100644 index 00000000000..0014b68add7 --- /dev/null +++ b/llvm/test/tools/llvm-nm/ARM/Inputs/print-size.macho-armv7m diff --git a/llvm/test/tools/llvm-nm/ARM/lit.local.cfg b/llvm/test/tools/llvm-nm/ARM/lit.local.cfg new file mode 100644 index 00000000000..236e1d34416 --- /dev/null +++ b/llvm/test/tools/llvm-nm/ARM/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'ARM' in config.root.targets: +    config.unsupported = True diff --git a/llvm/test/tools/llvm-nm/ARM/macho-print-size.test b/llvm/test/tools/llvm-nm/ARM/macho-print-size.test new file mode 100644 index 00000000000..f32a7aabbcb --- /dev/null +++ b/llvm/test/tools/llvm-nm/ARM/macho-print-size.test @@ -0,0 +1,3 @@ +@ RUN: llvm-nm -print-size -arch armv7m %p/Inputs/print-size.macho-armv7m 2>&1 | FileCheck %s + +@ CHECK: llvm-nm: warning sizes with -print-size for Mach-O files are always zero. diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index aa89f89c31d..2bdda318ebf 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -129,6 +129,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")); @@ -1057,15 +1058,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 +1125,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 +1367,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);  | 

