summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/test/tools/llvm-nm/ARM/Inputs/print-size.macho-armv7mbin0 -> 356 bytes
-rw-r--r--llvm/test/tools/llvm-nm/ARM/lit.local.cfg2
-rw-r--r--llvm/test/tools/llvm-nm/ARM/macho-print-size.test3
-rw-r--r--llvm/tools/llvm-nm/llvm-nm.cpp21
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
new file mode 100644
index 00000000000..0014b68add7
--- /dev/null
+++ b/llvm/test/tools/llvm-nm/ARM/Inputs/print-size.macho-armv7m
Binary files differ
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);
OpenPOWER on IntegriCloud