From 0702b34637ff0f883fa6de8e8f67a90b167c5407 Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Wed, 25 Jan 2017 21:33:38 +0000 Subject: [PATCH] =?utf8?q?Add=20a=20warning=20when=20the=20llvm-nm=20-prin?= =?utf8?q?t-size=20flag=20is=20used=20on=20a=20Mach-O=20file=20as=20Mach-O?= =?utf8?q?=20files=20don=E2=80=99t=20have=20size=20information=20about=20t?= =?utf8?q?he=20symbols=20in=20the=20object=20file=20format=20unlike=20ELF.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Also add the part of the fix to llvm-nm that was missed with r290001 so -arch armv7m works. rdar://25681018 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293099 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../ARM/Inputs/print-size.macho-armv7m | Bin 0 -> 356 bytes test/tools/llvm-nm/ARM/lit.local.cfg | 2 ++ test/tools/llvm-nm/ARM/macho-print-size.test | 3 +++ tools/llvm-nm/llvm-nm.cpp | 21 +++++++++++++++--- 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 test/tools/llvm-nm/ARM/Inputs/print-size.macho-armv7m create mode 100644 test/tools/llvm-nm/ARM/lit.local.cfg create mode 100644 test/tools/llvm-nm/ARM/macho-print-size.test diff --git a/test/tools/llvm-nm/ARM/Inputs/print-size.macho-armv7m b/test/tools/llvm-nm/ARM/Inputs/print-size.macho-armv7m new file mode 100644 index 0000000000000000000000000000000000000000..0014b68add7d3b19a1ed37a7134e30d2a7e438b3 GIT binary patch literal 356 zcmX^2>+L@t1_lOxAZ7$&W+2u8F@OL>9RM+~01lv-3s3=wW`|-XsJi(0lGKV4C&1 | FileCheck %s + +@ CHECK: llvm-nm: warning sizes with -print-size for Mach-O files are always zero. diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index aa89f89c31d..2bdda318ebf 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -129,6 +129,7 @@ cl::opt 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 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(&*ChildOrErr.get())) { + if (!MachOPrintSizeWarning && PrintSize && isa(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(&Bin)) { + if (!MachOPrintSizeWarning && PrintSize && isa(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); -- 2.40.0