Add support for inline asm symbols to IRObjectFile.
[oota-llvm.git] / tools / llvm-nm / llvm-nm.cpp
1 //===-- llvm-nm.cpp - Symbol table dumping utility for llvm ---------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This program is a utility that works like traditional Unix "nm", that is, it
11 // prints out the names of symbols in a bitcode or object file, along with some
12 // information about each symbol.
13 //
14 // This "nm" supports many of the features of GNU "nm", including its different
15 // output formats.
16 //
17 //===----------------------------------------------------------------------===//
18
19 #include "llvm/IR/Function.h"
20 #include "llvm/IR/GlobalAlias.h"
21 #include "llvm/IR/GlobalVariable.h"
22 #include "llvm/IR/LLVMContext.h"
23 #include "llvm/Object/Archive.h"
24 #include "llvm/Object/COFF.h"
25 #include "llvm/Object/ELFObjectFile.h"
26 #include "llvm/Object/IRObjectFile.h"
27 #include "llvm/Object/MachO.h"
28 #include "llvm/Object/MachOUniversal.h"
29 #include "llvm/Object/ObjectFile.h"
30 #include "llvm/Support/COFF.h"
31 #include "llvm/Support/CommandLine.h"
32 #include "llvm/Support/FileSystem.h"
33 #include "llvm/Support/Format.h"
34 #include "llvm/Support/ManagedStatic.h"
35 #include "llvm/Support/MemoryBuffer.h"
36 #include "llvm/Support/PrettyStackTrace.h"
37 #include "llvm/Support/Program.h"
38 #include "llvm/Support/Signals.h"
39 #include "llvm/Support/raw_ostream.h"
40 #include "llvm/Support/TargetSelect.h"
41 #include <algorithm>
42 #include <cctype>
43 #include <cerrno>
44 #include <cstring>
45 #include <system_error>
46 #include <vector>
47 using namespace llvm;
48 using namespace object;
49
50 namespace {
51 enum OutputFormatTy { bsd, sysv, posix, darwin };
52 cl::opt<OutputFormatTy> OutputFormat(
53     "format", cl::desc("Specify output format"),
54     cl::values(clEnumVal(bsd, "BSD format"), clEnumVal(sysv, "System V format"),
55                clEnumVal(posix, "POSIX.2 format"),
56                clEnumVal(darwin, "Darwin -m format"), clEnumValEnd),
57     cl::init(bsd));
58 cl::alias OutputFormat2("f", cl::desc("Alias for --format"),
59                         cl::aliasopt(OutputFormat));
60
61 cl::list<std::string> InputFilenames(cl::Positional, cl::desc("<input files>"),
62                                      cl::ZeroOrMore);
63
64 cl::opt<bool> UndefinedOnly("undefined-only",
65                             cl::desc("Show only undefined symbols"));
66 cl::alias UndefinedOnly2("u", cl::desc("Alias for --undefined-only"),
67                          cl::aliasopt(UndefinedOnly));
68
69 cl::opt<bool> DynamicSyms("dynamic",
70                           cl::desc("Display the dynamic symbols instead "
71                                    "of normal symbols."));
72 cl::alias DynamicSyms2("D", cl::desc("Alias for --dynamic"),
73                        cl::aliasopt(DynamicSyms));
74
75 cl::opt<bool> DefinedOnly("defined-only",
76                           cl::desc("Show only defined symbols"));
77 cl::alias DefinedOnly2("U", cl::desc("Alias for --defined-only"),
78                        cl::aliasopt(DefinedOnly));
79
80 cl::opt<bool> ExternalOnly("extern-only",
81                            cl::desc("Show only external symbols"));
82 cl::alias ExternalOnly2("g", cl::desc("Alias for --extern-only"),
83                         cl::aliasopt(ExternalOnly));
84
85 cl::opt<bool> BSDFormat("B", cl::desc("Alias for --format=bsd"));
86 cl::opt<bool> POSIXFormat("P", cl::desc("Alias for --format=posix"));
87 cl::opt<bool> DarwinFormat("m", cl::desc("Alias for --format=darwin"));
88
89 static cl::list<std::string>
90 ArchFlags("arch", cl::desc("architecture(s) from a Mach-O file to dump"),
91           cl::ZeroOrMore);
92 bool ArchAll = false;
93
94 cl::opt<bool> PrintFileName(
95     "print-file-name",
96     cl::desc("Precede each symbol with the object file it came from"));
97
98 cl::alias PrintFileNameA("A", cl::desc("Alias for --print-file-name"),
99                          cl::aliasopt(PrintFileName));
100 cl::alias PrintFileNameo("o", cl::desc("Alias for --print-file-name"),
101                          cl::aliasopt(PrintFileName));
102
103 cl::opt<bool> DebugSyms("debug-syms",
104                         cl::desc("Show all symbols, even debugger only"));
105 cl::alias DebugSymsa("a", cl::desc("Alias for --debug-syms"),
106                      cl::aliasopt(DebugSyms));
107
108 cl::opt<bool> NumericSort("numeric-sort", cl::desc("Sort symbols by address"));
109 cl::alias NumericSortn("n", cl::desc("Alias for --numeric-sort"),
110                        cl::aliasopt(NumericSort));
111 cl::alias NumericSortv("v", cl::desc("Alias for --numeric-sort"),
112                        cl::aliasopt(NumericSort));
113
114 cl::opt<bool> NoSort("no-sort", cl::desc("Show symbols in order encountered"));
115 cl::alias NoSortp("p", cl::desc("Alias for --no-sort"), cl::aliasopt(NoSort));
116
117 cl::opt<bool> ReverseSort("reverse-sort", cl::desc("Sort in reverse order"));
118 cl::alias ReverseSortr("r", cl::desc("Alias for --reverse-sort"),
119                        cl::aliasopt(ReverseSort));
120
121 cl::opt<bool> PrintSize("print-size",
122                         cl::desc("Show symbol size instead of address"));
123 cl::alias PrintSizeS("S", cl::desc("Alias for --print-size"),
124                      cl::aliasopt(PrintSize));
125
126 cl::opt<bool> SizeSort("size-sort", cl::desc("Sort symbols by size"));
127
128 cl::opt<bool> WithoutAliases("without-aliases", cl::Hidden,
129                              cl::desc("Exclude aliases from output"));
130
131 cl::opt<bool> ArchiveMap("print-armap", cl::desc("Print the archive map"));
132 cl::alias ArchiveMaps("s", cl::desc("Alias for --print-armap"),
133                       cl::aliasopt(ArchiveMap));
134 bool PrintAddress = true;
135
136 bool MultipleFiles = false;
137
138 bool HadError = false;
139
140 std::string ToolName;
141 }
142
143 static void error(Twine Message, Twine Path = Twine()) {
144   HadError = true;
145   errs() << ToolName << ": " << Path << ": " << Message << ".\n";
146 }
147
148 static bool error(std::error_code EC, Twine Path = Twine()) {
149   if (EC) {
150     error(EC.message(), Path);
151     return true;
152   }
153   return false;
154 }
155
156 namespace {
157 struct NMSymbol {
158   uint64_t Address;
159   uint64_t Size;
160   char TypeChar;
161   StringRef Name;
162   DataRefImpl Symb;
163 };
164 }
165
166 static bool compareSymbolAddress(const NMSymbol &A, const NMSymbol &B) {
167   if (!ReverseSort) {
168     if (A.Address < B.Address)
169       return true;
170     else if (A.Address == B.Address && A.Name < B.Name)
171       return true;
172     else if (A.Address == B.Address && A.Name == B.Name && A.Size < B.Size)
173       return true;
174     else
175       return false;
176   } else {
177     if (A.Address > B.Address)
178       return true;
179     else if (A.Address == B.Address && A.Name > B.Name)
180       return true;
181     else if (A.Address == B.Address && A.Name == B.Name && A.Size > B.Size)
182       return true;
183     else
184       return false;
185   }
186 }
187
188 static bool compareSymbolSize(const NMSymbol &A, const NMSymbol &B) {
189   if (!ReverseSort) {
190     if (A.Size < B.Size)
191       return true;
192     else if (A.Size == B.Size && A.Name < B.Name)
193       return true;
194     else if (A.Size == B.Size && A.Name == B.Name && A.Address < B.Address)
195       return true;
196     else
197       return false;
198   } else {
199     if (A.Size > B.Size)
200       return true;
201     else if (A.Size == B.Size && A.Name > B.Name)
202       return true;
203     else if (A.Size == B.Size && A.Name == B.Name && A.Address > B.Address)
204       return true;
205     else
206       return false;
207   }
208 }
209
210 static bool compareSymbolName(const NMSymbol &A, const NMSymbol &B) {
211   if (!ReverseSort) {
212     if (A.Name < B.Name)
213       return true;
214     else if (A.Name == B.Name && A.Size < B.Size)
215       return true;
216     else if (A.Name == B.Name && A.Size == B.Size && A.Address < B.Address)
217       return true;
218     else
219       return false;
220   } else {
221     if (A.Name > B.Name)
222       return true;
223     else if (A.Name == B.Name && A.Size > B.Size)
224       return true;
225     else if (A.Name == B.Name && A.Size == B.Size && A.Address > B.Address)
226       return true;
227     else
228       return false;
229   }
230 }
231
232 static char isSymbolList64Bit(SymbolicFile *Obj) {
233   if (isa<IRObjectFile>(Obj))
234     return false;
235   else if (isa<COFFObjectFile>(Obj))
236     return false;
237   else if (MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(Obj))
238     return MachO->is64Bit();
239   else if (isa<ELF32LEObjectFile>(Obj))
240     return false;
241   else if (isa<ELF64LEObjectFile>(Obj))
242     return true;
243   else if (isa<ELF32BEObjectFile>(Obj))
244     return false;
245   else if (isa<ELF64BEObjectFile>(Obj))
246     return true;
247   else
248     return false;
249 }
250
251 static StringRef CurrentFilename;
252 typedef std::vector<NMSymbol> SymbolListT;
253 static SymbolListT SymbolList;
254
255 // darwinPrintSymbol() is used to print a symbol from a Mach-O file when the
256 // the OutputFormat is darwin.  It produces the same output as darwin's nm(1) -m
257 // output.
258 static void darwinPrintSymbol(MachOObjectFile *MachO, SymbolListT::iterator I,
259                               char *SymbolAddrStr, const char *printBlanks) {
260   MachO::mach_header H;
261   MachO::mach_header_64 H_64;
262   uint32_t Filetype, Flags;
263   MachO::nlist_64 STE_64;
264   MachO::nlist STE;
265   uint8_t NType;
266   uint16_t NDesc;
267   uint64_t NValue;
268   if (MachO->is64Bit()) {
269     H_64 = MachO->MachOObjectFile::getHeader64();
270     Filetype = H_64.filetype;
271     Flags = H_64.flags;
272     STE_64 = MachO->getSymbol64TableEntry(I->Symb);
273     NType = STE_64.n_type;
274     NDesc = STE_64.n_desc;
275     NValue = STE_64.n_value;
276   } else {
277     H = MachO->MachOObjectFile::getHeader();
278     Filetype = H.filetype;
279     Flags = H.flags;
280     STE = MachO->getSymbolTableEntry(I->Symb);
281     NType = STE.n_type;
282     NDesc = STE.n_desc;
283     NValue = STE.n_value;
284   }
285
286   if (PrintAddress) {
287     if ((NType & MachO::N_TYPE) == MachO::N_INDR)
288       strcpy(SymbolAddrStr, printBlanks);
289     outs() << SymbolAddrStr << ' ';
290   }
291
292   switch (NType & MachO::N_TYPE) {
293   case MachO::N_UNDF:
294     if (NValue != 0) {
295       outs() << "(common) ";
296       if (MachO::GET_COMM_ALIGN(NDesc) != 0)
297         outs() << "(alignment 2^" << (int)MachO::GET_COMM_ALIGN(NDesc) << ") ";
298     } else {
299       if ((NType & MachO::N_TYPE) == MachO::N_PBUD)
300         outs() << "(prebound ";
301       else
302         outs() << "(";
303       if ((NDesc & MachO::REFERENCE_TYPE) ==
304           MachO::REFERENCE_FLAG_UNDEFINED_LAZY)
305         outs() << "undefined [lazy bound]) ";
306       else if ((NDesc & MachO::REFERENCE_TYPE) ==
307                MachO::REFERENCE_FLAG_UNDEFINED_LAZY)
308         outs() << "undefined [private lazy bound]) ";
309       else if ((NDesc & MachO::REFERENCE_TYPE) ==
310                MachO::REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY)
311         outs() << "undefined [private]) ";
312       else
313         outs() << "undefined) ";
314     }
315     break;
316   case MachO::N_ABS:
317     outs() << "(absolute) ";
318     break;
319   case MachO::N_INDR:
320     outs() << "(indirect) ";
321     break;
322   case MachO::N_SECT: {
323     section_iterator Sec = MachO->section_end();
324     MachO->getSymbolSection(I->Symb, Sec);
325     DataRefImpl Ref = Sec->getRawDataRefImpl();
326     StringRef SectionName;
327     MachO->getSectionName(Ref, SectionName);
328     StringRef SegmentName = MachO->getSectionFinalSegmentName(Ref);
329     outs() << "(" << SegmentName << "," << SectionName << ") ";
330     break;
331   }
332   default:
333     outs() << "(?) ";
334     break;
335   }
336
337   if (NType & MachO::N_EXT) {
338     if (NDesc & MachO::REFERENCED_DYNAMICALLY)
339       outs() << "[referenced dynamically] ";
340     if (NType & MachO::N_PEXT) {
341       if ((NDesc & MachO::N_WEAK_DEF) == MachO::N_WEAK_DEF)
342         outs() << "weak private external ";
343       else
344         outs() << "private external ";
345     } else {
346       if ((NDesc & MachO::N_WEAK_REF) == MachO::N_WEAK_REF ||
347           (NDesc & MachO::N_WEAK_DEF) == MachO::N_WEAK_DEF) {
348         if ((NDesc & (MachO::N_WEAK_REF | MachO::N_WEAK_DEF)) ==
349             (MachO::N_WEAK_REF | MachO::N_WEAK_DEF))
350           outs() << "weak external automatically hidden ";
351         else
352           outs() << "weak external ";
353       } else
354         outs() << "external ";
355     }
356   } else {
357     if (NType & MachO::N_PEXT)
358       outs() << "non-external (was a private external) ";
359     else
360       outs() << "non-external ";
361   }
362
363   if (Filetype == MachO::MH_OBJECT &&
364       (NDesc & MachO::N_NO_DEAD_STRIP) == MachO::N_NO_DEAD_STRIP)
365     outs() << "[no dead strip] ";
366
367   if (Filetype == MachO::MH_OBJECT &&
368       ((NType & MachO::N_TYPE) != MachO::N_UNDF) &&
369       (NDesc & MachO::N_SYMBOL_RESOLVER) == MachO::N_SYMBOL_RESOLVER)
370     outs() << "[symbol resolver] ";
371
372   if (Filetype == MachO::MH_OBJECT &&
373       ((NType & MachO::N_TYPE) != MachO::N_UNDF) &&
374       (NDesc & MachO::N_ALT_ENTRY) == MachO::N_ALT_ENTRY)
375     outs() << "[alt entry] ";
376
377   if ((NDesc & MachO::N_ARM_THUMB_DEF) == MachO::N_ARM_THUMB_DEF)
378     outs() << "[Thumb] ";
379
380   if ((NType & MachO::N_TYPE) == MachO::N_INDR) {
381     outs() << I->Name << " (for ";
382     StringRef IndirectName;
383     if (MachO->getIndirectName(I->Symb, IndirectName))
384       outs() << "?)";
385     else
386       outs() << IndirectName << ")";
387   } else
388     outs() << I->Name;
389
390   if ((Flags & MachO::MH_TWOLEVEL) == MachO::MH_TWOLEVEL &&
391       (((NType & MachO::N_TYPE) == MachO::N_UNDF && NValue == 0) ||
392        (NType & MachO::N_TYPE) == MachO::N_PBUD)) {
393     uint32_t LibraryOrdinal = MachO::GET_LIBRARY_ORDINAL(NDesc);
394     if (LibraryOrdinal != 0) {
395       if (LibraryOrdinal == MachO::EXECUTABLE_ORDINAL)
396         outs() << " (from executable)";
397       else if (LibraryOrdinal == MachO::DYNAMIC_LOOKUP_ORDINAL)
398         outs() << " (dynamically looked up)";
399       else {
400         StringRef LibraryName;
401         if (MachO->getLibraryShortNameByIndex(LibraryOrdinal - 1, LibraryName))
402           outs() << " (from bad library ordinal " << LibraryOrdinal << ")";
403         else
404           outs() << " (from " << LibraryName << ")";
405       }
406     }
407   }
408
409   outs() << "\n";
410 }
411
412 static void sortAndPrintSymbolList(SymbolicFile *Obj, bool printName) {
413   if (!NoSort) {
414     if (NumericSort)
415       std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolAddress);
416     else if (SizeSort)
417       std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolSize);
418     else
419       std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolName);
420   }
421
422   if (OutputFormat == posix && MultipleFiles && printName) {
423     outs() << '\n' << CurrentFilename << ":\n";
424   } else if (OutputFormat == bsd && MultipleFiles && printName) {
425     outs() << "\n" << CurrentFilename << ":\n";
426   } else if (OutputFormat == sysv) {
427     outs() << "\n\nSymbols from " << CurrentFilename << ":\n\n"
428            << "Name                  Value   Class        Type"
429            << "         Size   Line  Section\n";
430   }
431
432   const char *printBlanks, *printFormat;
433   if (isSymbolList64Bit(Obj)) {
434     printBlanks = "                ";
435     printFormat = "%016" PRIx64;
436   } else {
437     printBlanks = "        ";
438     printFormat = "%08" PRIx64;
439   }
440
441   for (SymbolListT::iterator I = SymbolList.begin(), E = SymbolList.end();
442        I != E; ++I) {
443     if ((I->TypeChar != 'U') && UndefinedOnly)
444       continue;
445     if ((I->TypeChar == 'U') && DefinedOnly)
446       continue;
447     if (SizeSort && !PrintAddress && I->Size == UnknownAddressOrSize)
448       continue;
449
450     char SymbolAddrStr[18] = "";
451     char SymbolSizeStr[18] = "";
452
453     if (OutputFormat == sysv || I->Address == UnknownAddressOrSize)
454       strcpy(SymbolAddrStr, printBlanks);
455     if (OutputFormat == sysv)
456       strcpy(SymbolSizeStr, printBlanks);
457
458     if (I->Address != UnknownAddressOrSize)
459       format(printFormat, I->Address)
460           .print(SymbolAddrStr, sizeof(SymbolAddrStr));
461     if (I->Size != UnknownAddressOrSize)
462       format(printFormat, I->Size).print(SymbolSizeStr, sizeof(SymbolSizeStr));
463
464     // If OutputFormat is darwin and we have a MachOObjectFile print as darwin's
465     // nm(1) -m output, else if OutputFormat is darwin and not a Mach-O object
466     // fall back to OutputFormat bsd (see below).
467     MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(Obj);
468     if (OutputFormat == darwin && MachO) {
469       darwinPrintSymbol(MachO, I, SymbolAddrStr, printBlanks);
470     } else if (OutputFormat == posix) {
471       outs() << I->Name << " " << I->TypeChar << " " << SymbolAddrStr
472              << SymbolSizeStr << "\n";
473     } else if (OutputFormat == bsd || (OutputFormat == darwin && !MachO)) {
474       if (PrintAddress)
475         outs() << SymbolAddrStr << ' ';
476       if (PrintSize) {
477         outs() << SymbolSizeStr;
478         if (I->Size != UnknownAddressOrSize)
479           outs() << ' ';
480       }
481       outs() << I->TypeChar << " " << I->Name << "\n";
482     } else if (OutputFormat == sysv) {
483       std::string PaddedName(I->Name);
484       while (PaddedName.length() < 20)
485         PaddedName += " ";
486       outs() << PaddedName << "|" << SymbolAddrStr << "|   " << I->TypeChar
487              << "  |                  |" << SymbolSizeStr << "|     |\n";
488     }
489   }
490
491   SymbolList.clear();
492 }
493
494 template <class ELFT>
495 static char getSymbolNMTypeChar(ELFObjectFile<ELFT> &Obj,
496                                 basic_symbol_iterator I) {
497   typedef typename ELFObjectFile<ELFT>::Elf_Sym Elf_Sym;
498   typedef typename ELFObjectFile<ELFT>::Elf_Shdr Elf_Shdr;
499
500   // OK, this is ELF
501   symbol_iterator SymI(I);
502
503   DataRefImpl Symb = I->getRawDataRefImpl();
504   const Elf_Sym *ESym = Obj.getSymbol(Symb);
505   const ELFFile<ELFT> &EF = *Obj.getELFFile();
506   const Elf_Shdr *ESec = EF.getSection(ESym);
507
508   if (ESec) {
509     switch (ESec->sh_type) {
510     case ELF::SHT_PROGBITS:
511     case ELF::SHT_DYNAMIC:
512       switch (ESec->sh_flags) {
513       case (ELF::SHF_ALLOC | ELF::SHF_EXECINSTR):
514         return 't';
515       case (ELF::SHF_TLS | ELF::SHF_ALLOC | ELF::SHF_WRITE):
516       case (ELF::SHF_ALLOC | ELF::SHF_WRITE):
517         return 'd';
518       case ELF::SHF_ALLOC:
519       case (ELF::SHF_ALLOC | ELF::SHF_MERGE):
520       case (ELF::SHF_ALLOC | ELF::SHF_MERGE | ELF::SHF_STRINGS):
521         return 'r';
522       }
523       break;
524     case ELF::SHT_NOBITS:
525       return 'b';
526     }
527   }
528
529   if (ESym->getType() == ELF::STT_SECTION) {
530     StringRef Name;
531     if (error(SymI->getName(Name)))
532       return '?';
533     return StringSwitch<char>(Name)
534         .StartsWith(".debug", 'N')
535         .StartsWith(".note", 'n')
536         .Default('?');
537   }
538
539   return '?';
540 }
541
542 static char getSymbolNMTypeChar(COFFObjectFile &Obj, symbol_iterator I) {
543   const coff_symbol *Symb = Obj.getCOFFSymbol(*I);
544   // OK, this is COFF.
545   symbol_iterator SymI(I);
546
547   StringRef Name;
548   if (error(SymI->getName(Name)))
549     return '?';
550
551   char Ret = StringSwitch<char>(Name)
552                  .StartsWith(".debug", 'N')
553                  .StartsWith(".sxdata", 'N')
554                  .Default('?');
555
556   if (Ret != '?')
557     return Ret;
558
559   uint32_t Characteristics = 0;
560   if (!COFF::isReservedSectionNumber(Symb->SectionNumber)) {
561     section_iterator SecI = Obj.section_end();
562     if (error(SymI->getSection(SecI)))
563       return '?';
564     const coff_section *Section = Obj.getCOFFSection(*SecI);
565     Characteristics = Section->Characteristics;
566   }
567
568   switch (Symb->SectionNumber) {
569   case COFF::IMAGE_SYM_DEBUG:
570     return 'n';
571   default:
572     // Check section type.
573     if (Characteristics & COFF::IMAGE_SCN_CNT_CODE)
574       return 't';
575     else if (Characteristics & COFF::IMAGE_SCN_MEM_READ &&
576              ~Characteristics & COFF::IMAGE_SCN_MEM_WRITE) // Read only.
577       return 'r';
578     else if (Characteristics & COFF::IMAGE_SCN_CNT_INITIALIZED_DATA)
579       return 'd';
580     else if (Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA)
581       return 'b';
582     else if (Characteristics & COFF::IMAGE_SCN_LNK_INFO)
583       return 'i';
584
585     // Check for section symbol.
586     else if (Symb->isSectionDefinition())
587       return 's';
588   }
589
590   return '?';
591 }
592
593 static uint8_t getNType(MachOObjectFile &Obj, DataRefImpl Symb) {
594   if (Obj.is64Bit()) {
595     MachO::nlist_64 STE = Obj.getSymbol64TableEntry(Symb);
596     return STE.n_type;
597   }
598   MachO::nlist STE = Obj.getSymbolTableEntry(Symb);
599   return STE.n_type;
600 }
601
602 static char getSymbolNMTypeChar(MachOObjectFile &Obj, basic_symbol_iterator I) {
603   DataRefImpl Symb = I->getRawDataRefImpl();
604   uint8_t NType = getNType(Obj, Symb);
605
606   switch (NType & MachO::N_TYPE) {
607   case MachO::N_ABS:
608     return 's';
609   case MachO::N_INDR:
610     return 'i';
611   case MachO::N_SECT: {
612     section_iterator Sec = Obj.section_end();
613     Obj.getSymbolSection(Symb, Sec);
614     DataRefImpl Ref = Sec->getRawDataRefImpl();
615     StringRef SectionName;
616     Obj.getSectionName(Ref, SectionName);
617     StringRef SegmentName = Obj.getSectionFinalSegmentName(Ref);
618     if (SegmentName == "__TEXT" && SectionName == "__text")
619       return 't';
620     else if (SegmentName == "__DATA" && SectionName == "__data")
621       return 'd';
622     else if (SegmentName == "__DATA" && SectionName == "__bss")
623       return 'b';
624     else
625       return 's';
626   }
627   }
628
629   return '?';
630 }
631
632 static char getSymbolNMTypeChar(const GlobalValue &GV) {
633   if (GV.getType()->getElementType()->isFunctionTy())
634     return 't';
635   // FIXME: should we print 'b'? At the IR level we cannot be sure if this
636   // will be in bss or not, but we could approximate.
637   return 'd';
638 }
639
640 static char getSymbolNMTypeChar(IRObjectFile &Obj, basic_symbol_iterator I) {
641   const GlobalValue *GV = Obj.getSymbolGV(I->getRawDataRefImpl());
642   if (!GV)
643     return 't';
644   return getSymbolNMTypeChar(*GV);
645 }
646
647 template <class ELFT>
648 static bool isObject(ELFObjectFile<ELFT> &Obj, symbol_iterator I) {
649   typedef typename ELFObjectFile<ELFT>::Elf_Sym Elf_Sym;
650
651   DataRefImpl Symb = I->getRawDataRefImpl();
652   const Elf_Sym *ESym = Obj.getSymbol(Symb);
653
654   return ESym->getType() == ELF::STT_OBJECT;
655 }
656
657 static bool isObject(SymbolicFile *Obj, basic_symbol_iterator I) {
658   if (ELF32LEObjectFile *ELF = dyn_cast<ELF32LEObjectFile>(Obj))
659     return isObject(*ELF, I);
660   if (ELF64LEObjectFile *ELF = dyn_cast<ELF64LEObjectFile>(Obj))
661     return isObject(*ELF, I);
662   if (ELF32BEObjectFile *ELF = dyn_cast<ELF32BEObjectFile>(Obj))
663     return isObject(*ELF, I);
664   if (ELF64BEObjectFile *ELF = dyn_cast<ELF64BEObjectFile>(Obj))
665     return isObject(*ELF, I);
666   return false;
667 }
668
669 static char getNMTypeChar(SymbolicFile *Obj, basic_symbol_iterator I) {
670   uint32_t Symflags = I->getFlags();
671   if ((Symflags & object::SymbolRef::SF_Weak) && !isa<MachOObjectFile>(Obj)) {
672     char Ret = isObject(Obj, I) ? 'v' : 'w';
673     if (!(Symflags & object::SymbolRef::SF_Undefined))
674       Ret = toupper(Ret);
675     return Ret;
676   }
677
678   if (Symflags & object::SymbolRef::SF_Undefined)
679     return 'U';
680
681   if (Symflags & object::SymbolRef::SF_Common)
682     return 'C';
683
684   char Ret = '?';
685   if (Symflags & object::SymbolRef::SF_Absolute)
686     Ret = 'a';
687   else if (IRObjectFile *IR = dyn_cast<IRObjectFile>(Obj))
688     Ret = getSymbolNMTypeChar(*IR, I);
689   else if (COFFObjectFile *COFF = dyn_cast<COFFObjectFile>(Obj))
690     Ret = getSymbolNMTypeChar(*COFF, I);
691   else if (MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(Obj))
692     Ret = getSymbolNMTypeChar(*MachO, I);
693   else if (ELF32LEObjectFile *ELF = dyn_cast<ELF32LEObjectFile>(Obj))
694     Ret = getSymbolNMTypeChar(*ELF, I);
695   else if (ELF64LEObjectFile *ELF = dyn_cast<ELF64LEObjectFile>(Obj))
696     Ret = getSymbolNMTypeChar(*ELF, I);
697   else if (ELF32BEObjectFile *ELF = dyn_cast<ELF32BEObjectFile>(Obj))
698     Ret = getSymbolNMTypeChar(*ELF, I);
699   else
700     Ret = getSymbolNMTypeChar(*cast<ELF64BEObjectFile>(Obj), I);
701
702   if (Symflags & object::SymbolRef::SF_Global)
703     Ret = toupper(Ret);
704
705   return Ret;
706 }
707
708 static void dumpSymbolNamesFromObject(SymbolicFile *Obj, bool printName) {
709   basic_symbol_iterator IBegin = Obj->symbol_begin();
710   basic_symbol_iterator IEnd = Obj->symbol_end();
711   if (DynamicSyms) {
712     if (!Obj->isELF()) {
713       error("File format has no dynamic symbol table", Obj->getFileName());
714       return;
715     }
716     std::pair<symbol_iterator, symbol_iterator> IDyn =
717         getELFDynamicSymbolIterators(Obj);
718     IBegin = IDyn.first;
719     IEnd = IDyn.second;
720   }
721   std::string NameBuffer;
722   raw_string_ostream OS(NameBuffer);
723   for (basic_symbol_iterator I = IBegin; I != IEnd; ++I) {
724     uint32_t SymFlags = I->getFlags();
725     if (!DebugSyms && (SymFlags & SymbolRef::SF_FormatSpecific))
726       continue;
727     if (WithoutAliases) {
728       if (IRObjectFile *IR = dyn_cast<IRObjectFile>(Obj)) {
729         const GlobalValue *GV = IR->getSymbolGV(I->getRawDataRefImpl());
730         if (GV && isa<GlobalAlias>(GV))
731           continue;
732       }
733     }
734     NMSymbol S;
735     S.Size = UnknownAddressOrSize;
736     S.Address = UnknownAddressOrSize;
737     if ((PrintSize || SizeSort) && isa<ObjectFile>(Obj)) {
738       symbol_iterator SymI = I;
739       if (error(SymI->getSize(S.Size)))
740         break;
741     }
742     if (PrintAddress && isa<ObjectFile>(Obj))
743       if (error(symbol_iterator(I)->getAddress(S.Address)))
744         break;
745     S.TypeChar = getNMTypeChar(Obj, I);
746     if (error(I->printName(OS)))
747       break;
748     OS << '\0';
749     S.Symb = I->getRawDataRefImpl();
750     SymbolList.push_back(S);
751   }
752
753   OS.flush();
754   const char *P = NameBuffer.c_str();
755   for (unsigned I = 0; I < SymbolList.size(); ++I) {
756     SymbolList[I].Name = P;
757     P += strlen(P) + 1;
758   }
759
760   CurrentFilename = Obj->getFileName();
761   sortAndPrintSymbolList(Obj, printName);
762 }
763
764 // checkMachOAndArchFlags() checks to see if the SymbolicFile is a Mach-O file
765 // and if it is and there is a list of architecture flags is specified then
766 // check to make sure this Mach-O file is one of those architectures or all
767 // architectures was specificed.  If not then an error is generated and this
768 // routine returns false.  Else it returns true.
769 static bool checkMachOAndArchFlags(SymbolicFile *O, std::string &Filename) {
770   if (isa<MachOObjectFile>(O) && !ArchAll && ArchFlags.size() != 0) {
771     MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(O);
772     bool ArchFound = false;
773     MachO::mach_header H;
774     MachO::mach_header_64 H_64;
775     Triple T;
776     if (MachO->is64Bit()) {
777       H_64 = MachO->MachOObjectFile::getHeader64();
778       T = MachOObjectFile::getArch(H_64.cputype, H_64.cpusubtype);
779     } else {
780       H = MachO->MachOObjectFile::getHeader();
781       T = MachOObjectFile::getArch(H.cputype, H.cpusubtype);
782     }
783     unsigned i;
784     for (i = 0; i < ArchFlags.size(); ++i) {
785       if (ArchFlags[i] == T.getArchName())
786         ArchFound = true;
787       break;
788     }
789     if (!ArchFound) {
790       error(ArchFlags[i],
791             "file: " + Filename + " does not contain architecture");
792       return false;
793     }
794   }
795   return true;
796 }
797
798 static void dumpSymbolNamesFromFile(std::string &Filename) {
799   std::unique_ptr<MemoryBuffer> Buffer;
800   if (error(MemoryBuffer::getFileOrSTDIN(Filename, Buffer), Filename))
801     return;
802
803   LLVMContext &Context = getGlobalContext();
804   ErrorOr<Binary *> BinaryOrErr = createBinary(Buffer, &Context);
805   if (error(BinaryOrErr.getError(), Filename))
806     return;
807   Buffer.release();
808   std::unique_ptr<Binary> Bin(BinaryOrErr.get());
809
810   if (Archive *A = dyn_cast<Archive>(Bin.get())) {
811     if (ArchiveMap) {
812       Archive::symbol_iterator I = A->symbol_begin();
813       Archive::symbol_iterator E = A->symbol_end();
814       if (I != E) {
815         outs() << "Archive map\n";
816         for (; I != E; ++I) {
817           ErrorOr<Archive::child_iterator> C = I->getMember();
818           if (error(C.getError()))
819             return;
820           ErrorOr<StringRef> FileNameOrErr = C.get()->getName();
821           if (error(FileNameOrErr.getError()))
822             return;
823           StringRef SymName = I->getName();
824           outs() << SymName << " in " << FileNameOrErr.get() << "\n";
825         }
826         outs() << "\n";
827       }
828     }
829
830     for (Archive::child_iterator I = A->child_begin(), E = A->child_end();
831          I != E; ++I) {
832       ErrorOr<std::unique_ptr<Binary>> ChildOrErr = I->getAsBinary(&Context);
833       if (ChildOrErr.getError())
834         continue;
835       if (SymbolicFile *O = dyn_cast<SymbolicFile>(&*ChildOrErr.get())) {
836         if (!checkMachOAndArchFlags(O, Filename))
837           return;
838         outs() << "\n";
839         if (isa<MachOObjectFile>(O)) {
840           outs() << Filename << "(" << O->getFileName() << ")";
841         } else
842           outs() << O->getFileName();
843         outs() << ":\n";
844         dumpSymbolNamesFromObject(O, false);
845       }
846     }
847     return;
848   }
849   if (MachOUniversalBinary *UB = dyn_cast<MachOUniversalBinary>(Bin.get())) {
850     // If we have a list of architecture flags specified dump only those.
851     if (!ArchAll && ArchFlags.size() != 0) {
852       // Look for a slice in the universal binary that matches each ArchFlag.
853       bool ArchFound;
854       for (unsigned i = 0; i < ArchFlags.size(); ++i) {
855         ArchFound = false;
856         for (MachOUniversalBinary::object_iterator I = UB->begin_objects(),
857                                                    E = UB->end_objects();
858              I != E; ++I) {
859           if (ArchFlags[i] == I->getArchTypeName()) {
860             ArchFound = true;
861             ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr =
862                 I->getAsObjectFile();
863             std::unique_ptr<Archive> A;
864             if (ObjOrErr) {
865               std::unique_ptr<ObjectFile> Obj = std::move(ObjOrErr.get());
866               if (ArchFlags.size() > 1) {
867                 outs() << "\n" << Obj->getFileName() << " (for architecture "
868                        << I->getArchTypeName() << ")"
869                        << ":\n";
870               }
871               dumpSymbolNamesFromObject(Obj.get(), false);
872             } else if (!I->getAsArchive(A)) {
873               for (Archive::child_iterator AI = A->child_begin(),
874                                            AE = A->child_end();
875                    AI != AE; ++AI) {
876                 ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
877                     AI->getAsBinary(&Context);
878                 if (ChildOrErr.getError())
879                   continue;
880                 if (SymbolicFile *O =
881                         dyn_cast<SymbolicFile>(&*ChildOrErr.get())) {
882                   outs() << "\n" << A->getFileName();
883                   outs() << "(" << O->getFileName() << ")";
884                   if (ArchFlags.size() > 1) {
885                     outs() << " (for architecture " << I->getArchTypeName()
886                            << ")";
887                   }
888                   outs() << ":\n";
889                   dumpSymbolNamesFromObject(O, false);
890                 }
891               }
892             }
893           }
894         }
895         if (!ArchFound) {
896           error(ArchFlags[i],
897                 "file: " + Filename + " does not contain architecture");
898           return;
899         }
900       }
901       return;
902     }
903     // No architecture flags were specified so if this contains a slice that
904     // matches the host architecture dump only that.
905     if (!ArchAll) {
906       StringRef HostArchName = MachOObjectFile::getHostArch().getArchName();
907       for (MachOUniversalBinary::object_iterator I = UB->begin_objects(),
908                                                  E = UB->end_objects();
909            I != E; ++I) {
910         if (HostArchName == I->getArchTypeName()) {
911           ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile();
912           std::unique_ptr<Archive> A;
913           if (ObjOrErr) {
914             std::unique_ptr<ObjectFile> Obj = std::move(ObjOrErr.get());
915             dumpSymbolNamesFromObject(Obj.get(), false);
916           } else if (!I->getAsArchive(A)) {
917             for (Archive::child_iterator AI = A->child_begin(),
918                                          AE = A->child_end();
919                  AI != AE; ++AI) {
920               ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
921                   AI->getAsBinary(&Context);
922               if (ChildOrErr.getError())
923                 continue;
924               if (SymbolicFile *O =
925                       dyn_cast<SymbolicFile>(&*ChildOrErr.get())) {
926                 outs() << "\n" << A->getFileName() << "(" << O->getFileName()
927                        << ")"
928                        << ":\n";
929                 dumpSymbolNamesFromObject(O, false);
930               }
931             }
932           }
933           return;
934         }
935       }
936     }
937     // Either all architectures have been specified or none have been specified
938     // and this does not contain the host architecture so dump all the slices.
939     bool moreThanOneArch = UB->getNumberOfObjects() > 1;
940     for (MachOUniversalBinary::object_iterator I = UB->begin_objects(),
941                                                E = UB->end_objects();
942          I != E; ++I) {
943       ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile();
944       std::unique_ptr<Archive> A;
945       if (ObjOrErr) {
946         std::unique_ptr<ObjectFile> Obj = std::move(ObjOrErr.get());
947         if (moreThanOneArch)
948           outs() << "\n";
949         outs() << Obj->getFileName();
950         if (isa<MachOObjectFile>(Obj.get()) && moreThanOneArch)
951           outs() << " (for architecture " << I->getArchTypeName() << ")";
952         outs() << ":\n";
953         dumpSymbolNamesFromObject(Obj.get(), false);
954       } else if (!I->getAsArchive(A)) {
955         for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end();
956              AI != AE; ++AI) {
957           ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
958               AI->getAsBinary(&Context);
959           if (ChildOrErr.getError())
960             continue;
961           if (SymbolicFile *O = dyn_cast<SymbolicFile>(&*ChildOrErr.get())) {
962             outs() << "\n" << A->getFileName();
963             if (isa<MachOObjectFile>(O)) {
964               outs() << "(" << O->getFileName() << ")";
965               if (moreThanOneArch)
966                 outs() << " (for architecture " << I->getArchTypeName() << ")";
967             } else
968               outs() << ":" << O->getFileName();
969             outs() << ":\n";
970             dumpSymbolNamesFromObject(O, false);
971           }
972         }
973       }
974     }
975     return;
976   }
977   if (SymbolicFile *O = dyn_cast<SymbolicFile>(Bin.get())) {
978     if (!checkMachOAndArchFlags(O, Filename))
979       return;
980     dumpSymbolNamesFromObject(O, true);
981     return;
982   }
983   error("unrecognizable file type", Filename);
984   return;
985 }
986
987 int main(int argc, char **argv) {
988   // Print a stack trace if we signal out.
989   sys::PrintStackTraceOnErrorSignal();
990   PrettyStackTraceProgram X(argc, argv);
991
992   llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
993   cl::ParseCommandLineOptions(argc, argv, "llvm symbol table dumper\n");
994
995   // llvm-nm only reads binary files.
996   if (error(sys::ChangeStdinToBinary()))
997     return 1;
998
999   llvm::InitializeAllTargetInfos();
1000   llvm::InitializeAllTargetMCs();
1001   llvm::InitializeAllAsmParsers();
1002
1003   ToolName = argv[0];
1004   if (BSDFormat)
1005     OutputFormat = bsd;
1006   if (POSIXFormat)
1007     OutputFormat = posix;
1008   if (DarwinFormat)
1009     OutputFormat = darwin;
1010
1011   // The relative order of these is important. If you pass --size-sort it should
1012   // only print out the size. However, if you pass -S --size-sort, it should
1013   // print out both the size and address.
1014   if (SizeSort && !PrintSize)
1015     PrintAddress = false;
1016   if (OutputFormat == sysv || SizeSort)
1017     PrintSize = true;
1018
1019   switch (InputFilenames.size()) {
1020   case 0:
1021     InputFilenames.push_back("a.out");
1022   case 1:
1023     break;
1024   default:
1025     MultipleFiles = true;
1026   }
1027
1028   for (unsigned i = 0; i < ArchFlags.size(); ++i) {
1029     if (ArchFlags[i] == "all") {
1030       ArchAll = true;
1031     } else {
1032       Triple T = MachOObjectFile::getArch(ArchFlags[i]);
1033       if (T.getArch() == Triple::UnknownArch)
1034         error("Unknown architecture named '" + ArchFlags[i] + "'",
1035               "for the -arch option");
1036     }
1037   }
1038
1039   std::for_each(InputFilenames.begin(), InputFilenames.end(),
1040                 dumpSymbolNamesFromFile);
1041
1042   if (HadError)
1043     return 1;
1044
1045   return 0;
1046 }