llvm-nm.cpp revision 4d616646966b9effa05472ff3575fc3ce4df2b29
1972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke//===-- llvm-nm.cpp - Symbol table dumping utility for llvm ---------------===//
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//                     The LLVM Compiler Infrastructure
47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
521c62da287237d39d0d95004881ea4baae3be6daChris Lattner// This file is distributed under the University of Illinois Open Source
621c62da287237d39d0d95004881ea4baae3be6daChris Lattner// License. See LICENSE.TXT for details.
73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===//
9972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke//
104d616646966b9effa05472ff3575fc3ce4df2b29Michael J. Spencer// This program is a utility that works like traditional Unix "nm", that is, it
114d616646966b9effa05472ff3575fc3ce4df2b29Michael J. Spencer// prints out the names of symbols in a bitcode or object file, along with some
124d616646966b9effa05472ff3575fc3ce4df2b29Michael J. Spencer// information about each symbol.
133da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
144d616646966b9effa05472ff3575fc3ce4df2b29Michael J. Spencer// This "nm" supports many of the features of GNU "nm", including its different
154d616646966b9effa05472ff3575fc3ce4df2b29Michael J. Spencer// output formats.
16972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke//
17972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke//===----------------------------------------------------------------------===//
18972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke
198b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson#include "llvm/LLVMContext.h"
20972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke#include "llvm/Module.h"
214d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner#include "llvm/Bitcode/ReaderWriter.h"
2244dadffe4bd58ab32961ca5fe537e8ba69c09243Chris Lattner#include "llvm/Bitcode/Archive.h"
239142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer#include "llvm/Object/Archive.h"
2420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer#include "llvm/Object/ObjectFile.h"
25551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h"
2620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer#include "llvm/Support/FileSystem.h"
27c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner#include "llvm/Support/ManagedStatic.h"
284d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner#include "llvm/Support/MemoryBuffer.h"
29cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner#include "llvm/Support/PrettyStackTrace.h"
30a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer#include "llvm/Support/Program.h"
3165f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman#include "llvm/Support/raw_ostream.h"
321f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Signals.h"
3320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer#include "llvm/Support/Format.h"
34333fb04506233255f10d8095c9e2de5e5f0fdc6fMichael J. Spencer#include "llvm/Support/system_error.h"
35ca5183d445954a9b2a570d6bbba1bc2b00ad6442Jeff Cohen#include <algorithm>
36972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke#include <cctype>
3709233fb86e237715d138db5dc5b72ada386089f2Alkis Evlogimenos#include <cerrno>
3808d03c79a238dba0ea7b59b38304c431bd392432Brian Gaeke#include <cstring>
3920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer#include <vector>
40d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm;
4120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencerusing namespace object;
42d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
43972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaekenamespace {
44972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  enum OutputFormatTy { bsd, sysv, posix };
45972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  cl::opt<OutputFormatTy>
46972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  OutputFormat("format",
47972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke       cl::desc("Specify output format"),
48972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke         cl::values(clEnumVal(bsd,   "BSD format"),
49972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke                    clEnumVal(sysv,  "System V format"),
503da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman                    clEnumVal(posix, "POSIX.2 format"),
514d143ee01988e1b52e106ffccbb313937ca5e886Chris Lattner                    clEnumValEnd), cl::init(bsd));
52972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  cl::alias OutputFormat2("f", cl::desc("Alias for --format"),
53972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke                          cl::aliasopt(OutputFormat));
54972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke
553da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman  cl::list<std::string>
56a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif  InputFilenames(cl::Positional, cl::desc("<input bitcode files>"),
57fc046d52e442324fe238e572c314f86dbc894f92Chris Lattner                 cl::ZeroOrMore);
58972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke
59972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  cl::opt<bool> UndefinedOnly("undefined-only",
60972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke                              cl::desc("Show only undefined symbols"));
61972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  cl::alias UndefinedOnly2("u", cl::desc("Alias for --undefined-only"),
62972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke                           cl::aliasopt(UndefinedOnly));
63972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke
64dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer  cl::opt<bool> DynamicSyms("dynamic",
65dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer                             cl::desc("Display the dynamic symbols instead "
66dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer                                      "of normal symbols."));
67dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer  cl::alias DynamicSyms2("D", cl::desc("Alias for --dynamic"),
68dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer                         cl::aliasopt(DynamicSyms));
69dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer
70972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  cl::opt<bool> DefinedOnly("defined-only",
71972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke                            cl::desc("Show only defined symbols"));
72972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke
73972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  cl::opt<bool> ExternalOnly("extern-only",
74972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke                             cl::desc("Show only external symbols"));
75972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  cl::alias ExternalOnly2("g", cl::desc("Alias for --extern-only"),
76972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke                          cl::aliasopt(ExternalOnly));
77972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke
78972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  cl::opt<bool> BSDFormat("B", cl::desc("Alias for --format=bsd"));
79972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  cl::opt<bool> POSIXFormat("P", cl::desc("Alias for --format=posix"));
80972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke
8120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  cl::opt<bool> PrintFileName("print-file-name",
8220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    cl::desc("Precede each symbol with the object file it came from"));
8320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
8420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  cl::alias PrintFileNameA("A", cl::desc("Alias for --print-file-name"),
8520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer                                cl::aliasopt(PrintFileName));
8620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  cl::alias PrintFileNameo("o", cl::desc("Alias for --print-file-name"),
8720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer                                cl::aliasopt(PrintFileName));
8820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
8920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  cl::opt<bool> DebugSyms("debug-syms",
9020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    cl::desc("Show all symbols, even debugger only"));
9120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  cl::alias DebugSymsa("a", cl::desc("Alias for --debug-syms"),
9220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer                            cl::aliasopt(DebugSyms));
9320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
9420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  cl::opt<bool> NumericSort("numeric-sort",
9520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    cl::desc("Sort symbols by address"));
9620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  cl::alias NumericSortn("n", cl::desc("Alias for --numeric-sort"),
9720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer                              cl::aliasopt(NumericSort));
9820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  cl::alias NumericSortv("v", cl::desc("Alias for --numeric-sort"),
9920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer                              cl::aliasopt(NumericSort));
10020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
10120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  cl::opt<bool> NoSort("no-sort",
10220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    cl::desc("Show symbols in order encountered"));
10320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  cl::alias NoSortp("p", cl::desc("Alias for --no-sort"),
10420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer                         cl::aliasopt(NoSort));
10520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
10620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  cl::opt<bool> PrintSize("print-size",
10720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    cl::desc("Show symbol size instead of address"));
10820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  cl::alias PrintSizeS("S", cl::desc("Alias for --print-size"),
10920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer                            cl::aliasopt(PrintSize));
11020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
11120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  cl::opt<bool> SizeSort("size-sort", cl::desc("Sort symbols by size"));
11220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
11320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  bool PrintAddress = true;
11420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
115972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  bool MultipleFiles = false;
116972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke
117972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  std::string ToolName;
118d74ea2bbd8bb630331f35ead42d385249bd42af8Chris Lattner}
119972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke
120a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer
121a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencerstatic void error(Twine message, Twine path = Twine()) {
122a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  errs() << ToolName << ": " << path << ": " << message << ".\n";
123a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer}
124a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer
125a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencerstatic bool error(error_code ec, Twine path = Twine()) {
126a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  if (ec) {
127a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer    error(ec.message(), path);
128a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer    return true;
129a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  }
130a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  return false;
131a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer}
132a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer
13320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencernamespace {
13420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  struct NMSymbol {
13520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    uint64_t  Address;
13620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    uint64_t  Size;
13720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    char      TypeChar;
13820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    StringRef Name;
13920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  };
14020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
14120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  static bool CompareSymbolAddress(const NMSymbol &a, const NMSymbol &b) {
14220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    if (a.Address < b.Address)
14320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      return true;
14420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    else if (a.Address == b.Address && a.Name < b.Name)
14520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      return true;
14620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    else
14720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      return false;
14820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
14920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  }
15020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
15120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  static bool CompareSymbolSize(const NMSymbol &a, const NMSymbol &b) {
15220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    if (a.Size < b.Size)
15320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      return true;
15420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    else if (a.Size == b.Size && a.Name < b.Name)
15520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      return true;
15620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    else
15720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      return false;
15820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  }
15920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
16020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  static bool CompareSymbolName(const NMSymbol &a, const NMSymbol &b) {
16120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    return a.Name < b.Name;
16220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  }
16320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
16420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  StringRef CurrentFilename;
16520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  typedef std::vector<NMSymbol> SymbolListT;
16620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  SymbolListT SymbolList;
16720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer}
16820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
16920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencerstatic void SortAndPrintSymbolList() {
17020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  if (!NoSort) {
17120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    if (NumericSort)
17220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      std::sort(SymbolList.begin(), SymbolList.end(), CompareSymbolAddress);
17320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    else if (SizeSort)
17420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      std::sort(SymbolList.begin(), SymbolList.end(), CompareSymbolSize);
17520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    else
17620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      std::sort(SymbolList.begin(), SymbolList.end(), CompareSymbolName);
17720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  }
17820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
17920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  if (OutputFormat == posix && MultipleFiles) {
18020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    outs() << '\n' << CurrentFilename << ":\n";
18120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  } else if (OutputFormat == bsd && MultipleFiles) {
18220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    outs() << "\n" << CurrentFilename << ":\n";
18320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  } else if (OutputFormat == sysv) {
18420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    outs() << "\n\nSymbols from " << CurrentFilename << ":\n\n"
18520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer           << "Name                  Value   Class        Type"
18620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer           << "         Size   Line  Section\n";
18720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  }
18820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
18920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  for (SymbolListT::iterator i = SymbolList.begin(),
19020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer                             e = SymbolList.end(); i != e; ++i) {
19120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    if ((i->TypeChar != 'U') && UndefinedOnly)
19220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      continue;
19320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    if ((i->TypeChar == 'U') && DefinedOnly)
19420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      continue;
19520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    if (SizeSort && !PrintAddress && i->Size == UnknownAddressOrSize)
19620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      continue;
19720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
19820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    char SymbolAddrStr[10] = "";
19920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    char SymbolSizeStr[10] = "";
20020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
20120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    if (OutputFormat == sysv || i->Address == object::UnknownAddressOrSize)
20220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      strcpy(SymbolAddrStr, "        ");
20320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    if (OutputFormat == sysv)
20420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      strcpy(SymbolSizeStr, "        ");
20520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
20620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    if (i->Address != object::UnknownAddressOrSize)
20751cf8661637c114e4b4f178bd2677a6bb246be0dBenjamin Kramer      format("%08" PRIx64, i->Address).print(SymbolAddrStr,
20851cf8661637c114e4b4f178bd2677a6bb246be0dBenjamin Kramer                                             sizeof(SymbolAddrStr));
20920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    if (i->Size != object::UnknownAddressOrSize)
21051cf8661637c114e4b4f178bd2677a6bb246be0dBenjamin Kramer      format("%08" PRIx64, i->Size).print(SymbolSizeStr, sizeof(SymbolSizeStr));
21120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
21220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    if (OutputFormat == posix) {
21320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      outs() << i->Name << " " << i->TypeChar << " "
21420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer             << SymbolAddrStr << SymbolSizeStr << "\n";
21520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    } else if (OutputFormat == bsd) {
21620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      if (PrintAddress)
21720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer        outs() << SymbolAddrStr << ' ';
21820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      if (PrintSize) {
21920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer        outs() << SymbolSizeStr;
22020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer        if (i->Size != object::UnknownAddressOrSize)
22120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer          outs() << ' ';
22220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      }
22320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      outs() << i->TypeChar << " " << i->Name  << "\n";
22420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    } else if (OutputFormat == sysv) {
22520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      std::string PaddedName (i->Name);
22620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      while (PaddedName.length () < 20)
22720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer        PaddedName += " ";
22820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      outs() << PaddedName << "|" << SymbolAddrStr << "|   "
22920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer             << i->TypeChar
23020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer             << "  |                  |" << SymbolSizeStr << "|     |\n";
23120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    }
23220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  }
23320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
23420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  SymbolList.clear();
23520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer}
23620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
237c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattnerstatic char TypeCharForSymbol(GlobalValue &GV) {
2384a828eeed33a6f11698b625190bc7eafceee3100Lauro Ramos Venancio  if (GV.isDeclaration())                                  return 'U';
239c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner  if (GV.hasLinkOnceLinkage())                             return 'C';
2407d5633e9074db9eaf796e677451f6642c0174facDale Johannesen  if (GV.hasCommonLinkage())                               return 'C';
241c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner  if (GV.hasWeakLinkage())                                 return 'W';
2424a828eeed33a6f11698b625190bc7eafceee3100Lauro Ramos Venancio  if (isa<Function>(GV) && GV.hasInternalLinkage())        return 't';
243c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner  if (isa<Function>(GV))                                   return 'T';
2444a828eeed33a6f11698b625190bc7eafceee3100Lauro Ramos Venancio  if (isa<GlobalVariable>(GV) && GV.hasInternalLinkage())  return 'd';
245c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner  if (isa<GlobalVariable>(GV))                             return 'D';
2464a828eeed33a6f11698b625190bc7eafceee3100Lauro Ramos Venancio  if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(&GV)) {
2474a828eeed33a6f11698b625190bc7eafceee3100Lauro Ramos Venancio    const GlobalValue *AliasedGV = GA->getAliasedGlobal();
2484a828eeed33a6f11698b625190bc7eafceee3100Lauro Ramos Venancio    if (isa<Function>(AliasedGV))                          return 'T';
2494a828eeed33a6f11698b625190bc7eafceee3100Lauro Ramos Venancio    if (isa<GlobalVariable>(AliasedGV))                    return 'D';
2504a828eeed33a6f11698b625190bc7eafceee3100Lauro Ramos Venancio  }
2514a828eeed33a6f11698b625190bc7eafceee3100Lauro Ramos Venancio                                                           return '?';
252972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke}
253972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke
254c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattnerstatic void DumpSymbolNameForGlobalValue(GlobalValue &GV) {
255266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner  // Private linkage and available_externally linkage don't exist in symtab.
2564e34d502727df36cc2caa59307953444b1ee9914Bill Wendling  if (GV.hasPrivateLinkage() ||
2574e34d502727df36cc2caa59307953444b1ee9914Bill Wendling      GV.hasLinkerPrivateLinkage() ||
2584e34d502727df36cc2caa59307953444b1ee9914Bill Wendling      GV.hasLinkerPrivateWeakLinkage() ||
2594e34d502727df36cc2caa59307953444b1ee9914Bill Wendling      GV.hasLinkerPrivateWeakDefAutoLinkage() ||
2604e34d502727df36cc2caa59307953444b1ee9914Bill Wendling      GV.hasAvailableExternallyLinkage())
2615e721d768254a920b78b9129d79a84c0163cb3f4Bill Wendling    return;
262266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner  char TypeChar = TypeCharForSymbol(GV);
263bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola  if (GV.hasLocalLinkage () && ExternalOnly)
264972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke    return;
26520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
26620d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  NMSymbol s;
26720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  s.Address = object::UnknownAddressOrSize;
26820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  s.Size = object::UnknownAddressOrSize;
26920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  s.TypeChar = TypeChar;
27020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  s.Name     = GV.getName();
27120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  SymbolList.push_back(s);
272972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke}
273972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke
274c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattnerstatic void DumpSymbolNamesFromModule(Module *M) {
27520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  CurrentFilename = M->getModuleIdentifier();
276266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner  std::for_each (M->begin(), M->end(), DumpSymbolNameForGlobalValue);
277266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner  std::for_each (M->global_begin(), M->global_end(),
2784a828eeed33a6f11698b625190bc7eafceee3100Lauro Ramos Venancio                 DumpSymbolNameForGlobalValue);
279266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner  std::for_each (M->alias_begin(), M->alias_end(),
2804a828eeed33a6f11698b625190bc7eafceee3100Lauro Ramos Venancio                 DumpSymbolNameForGlobalValue);
28120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
28220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  SortAndPrintSymbolList();
28320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer}
28420d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
28520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencerstatic void DumpSymbolNamesFromObject(ObjectFile *obj) {
28625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer  error_code ec;
287dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer  symbol_iterator ibegin = obj->begin_symbols();
288dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer  symbol_iterator iend = obj->end_symbols();
289dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer  if (DynamicSyms) {
290dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer    ibegin = obj->begin_dynamic_symbols();
291dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer    iend = obj->end_dynamic_symbols();
292dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer  }
293dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer  for (symbol_iterator i = ibegin; i != iend; i.increment(ec)) {
29425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer    if (error(ec)) break;
295c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer    uint32_t symflags;
296c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer    if (error(i->getFlags(symflags))) break;
297c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer    if (!DebugSyms && (symflags & SymbolRef::SF_FormatSpecific))
29820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      continue;
29920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    NMSymbol s;
30020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    s.Size = object::UnknownAddressOrSize;
30120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    s.Address = object::UnknownAddressOrSize;
30225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer    if (PrintSize || SizeSort) {
30325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer      if (error(i->getSize(s.Size))) break;
30425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer    }
30520d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    if (PrintAddress)
306b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev      if (error(i->getAddress(s.Address))) break;
30725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer    if (error(i->getNMTypeChar(s.TypeChar))) break;
30825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer    if (error(i->getName(s.Name))) break;
30920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer    SymbolList.push_back(s);
31020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  }
31120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
312001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer  CurrentFilename = obj->getFileName();
31320d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  SortAndPrintSymbolList();
314972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke}
315972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke
316c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattnerstatic void DumpSymbolNamesFromFile(std::string &Filename) {
317a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  if (Filename != "-" && !sys::fs::exists(Filename)) {
318a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer    errs() << ToolName << ": '" << Filename << "': " << "No such file\n";
319a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer    return;
320a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  }
321a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer
322a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  OwningPtr<MemoryBuffer> Buffer;
323a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  if (error(MemoryBuffer::getFileOrSTDIN(Filename, Buffer), Filename))
324a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer    return;
325a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer
326a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  sys::fs::file_magic magic = sys::fs::identify_magic(Buffer->getBuffer());
327a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer
3280d7c695c74ae6d5f68cc07378c17491915e607d3Owen Anderson  LLVMContext &Context = getGlobalContext();
329972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  std::string ErrorMessage;
330a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  if (magic == sys::fs::file_magic::bitcode) {
3314d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner    Module *Result = 0;
332a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer    Result = ParseBitcodeFile(Buffer.get(), Context, &ErrorMessage);
3338018f5d5a4134f8b2ceb315095996a552a80ee25Nuno Lopes    if (Result) {
3344d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner      DumpSymbolNamesFromModule(Result);
3358018f5d5a4134f8b2ceb315095996a552a80ee25Nuno Lopes      delete Result;
336a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer    } else {
337a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer      error(ErrorMessage, Filename);
33808d03c79a238dba0ea7b59b38304c431bd392432Brian Gaeke      return;
33908d03c79a238dba0ea7b59b38304c431bd392432Brian Gaeke    }
340a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  } else if (magic == sys::fs::file_magic::archive) {
341a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer    OwningPtr<Binary> arch;
342a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer    if (error(object::createBinary(Buffer.take(), arch), Filename))
343a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer      return;
344a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer
3459142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer    if (object::Archive *a = dyn_cast<object::Archive>(arch.get())) {
3469142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer      for (object::Archive::child_iterator i = a->begin_children(),
3479142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer                                           e = a->end_children(); i != e; ++i) {
3489142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer        OwningPtr<Binary> child;
349aba65b05fc5dd8649725431e38359b7fa1ab59e8Rafael Espindola        if (i->getAsBinary(child)) {
3509142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer          // Try opening it as a bitcode file.
3511a9908daebd5c416d71ff7fe9c8250074d817733Benjamin Kramer          OwningPtr<MemoryBuffer> buff(i->getBuffer());
3529142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer          Module *Result = 0;
3539142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer          if (buff)
3541a9908daebd5c416d71ff7fe9c8250074d817733Benjamin Kramer            Result = ParseBitcodeFile(buff.get(), Context, &ErrorMessage);
3559142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer
3569142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer          if (Result) {
3579142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer            DumpSymbolNamesFromModule(Result);
3589142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer            delete Result;
3599142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer          }
3609142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer          continue;
3619142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer        }
3629142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer        if (object::ObjectFile *o = dyn_cast<ObjectFile>(child.get())) {
3639142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer          outs() << o->getFileName() << ":\n";
3649142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer          DumpSymbolNamesFromObject(o);
3659142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer        }
3669142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer      }
3679142ae2cf802dbcd1c622154ac9b5305fb26c38fMichael J. Spencer    }
368a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  } else if (magic.is_object()) {
36976fb9b0e5f553f03321777ff634eb245dd8a821eMichael J. Spencer    OwningPtr<Binary> obj;
370a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer    if (error(object::createBinary(Buffer.take(), obj), Filename))
37120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer      return;
37276fb9b0e5f553f03321777ff634eb245dd8a821eMichael J. Spencer    if (object::ObjectFile *o = dyn_cast<ObjectFile>(obj.get()))
37376fb9b0e5f553f03321777ff634eb245dd8a821eMichael J. Spencer      DumpSymbolNamesFromObject(o);
374820428711f651a6ae6b9caf78ae170a4434d1670Brian Gaeke  } else {
37565f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman    errs() << ToolName << ": " << Filename << ": "
37665f57c233cd4499e2e8b52a503201e64edfd6a9eDan Gohman           << "unrecognizable file type\n";
377820428711f651a6ae6b9caf78ae170a4434d1670Brian Gaeke    return;
378972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke  }
379972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke}
380972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke
381972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaekeint main(int argc, char **argv) {
382cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner  // Print a stack trace if we signal out.
3834d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner  sys::PrintStackTraceOnErrorSignal();
384cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner  PrettyStackTraceProgram X(argc, argv);
3854a295d301d83f07ad2840abe25a1691aef481c83Michael J. Spencer
386cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner  llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
387cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner  cl::ParseCommandLineOptions(argc, argv, "llvm symbol table dumper\n");
388fc046d52e442324fe238e572c314f86dbc894f92Chris Lattner
389a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  // llvm-nm only reads binary files.
390a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer  if (error(sys::Program::ChangeStdinToBinary()))
391a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer    return 1;
392a740e19e7e4ef29a7404fac3ac7e513beacf1bf7Michael J. Spencer
3934d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner  ToolName = argv[0];
3944d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner  if (BSDFormat) OutputFormat = bsd;
3954d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner  if (POSIXFormat) OutputFormat = posix;
3964d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner
39720d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  // The relative order of these is important. If you pass --size-sort it should
39820d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  // only print out the size. However, if you pass -S --size-sort, it should
39920d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  // print out both the size and address.
40020d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  if (SizeSort && !PrintSize) PrintAddress = false;
40120d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer  if (OutputFormat == sysv || SizeSort) PrintSize = true;
40220d335aa04e31fe9a16004982e2a333914c1ee82Michael J. Spencer
4034d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner  switch (InputFilenames.size()) {
4044d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner  case 0: InputFilenames.push_back("-");
4054d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner  case 1: break;
4064d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner  default: MultipleFiles = true;
407fc046d52e442324fe238e572c314f86dbc894f92Chris Lattner  }
4084d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner
4094d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner  std::for_each(InputFilenames.begin(), InputFilenames.end(),
4104d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner                DumpSymbolNamesFromFile);
4114d5aad2d99233fdee38cbbf844f65b7a74073954Chris Lattner  return 0;
412972d3d7fff89c50612e86dfc8222da51bb23f387Brian Gaeke}
413