+
+ for (SymbolListT::iterator i = SymbolList.begin(),
+ e = SymbolList.end(); i != e; ++i) {
+ if ((i->TypeChar != 'U') && UndefinedOnly)
+ continue;
+ if ((i->TypeChar == 'U') && DefinedOnly)
+ continue;
+ if (SizeSort && !PrintAddress && i->Size == UnknownAddressOrSize)
+ continue;
+
+ char SymbolAddrStr[10] = "";
+ char SymbolSizeStr[10] = "";
+
+ if (OutputFormat == sysv || i->Address == object::UnknownAddressOrSize)
+ strcpy(SymbolAddrStr, " ");
+ if (OutputFormat == sysv)
+ strcpy(SymbolSizeStr, " ");
+
+ if (i->Address != object::UnknownAddressOrSize)
+ format("%08" PRIx64, i->Address).print(SymbolAddrStr,
+ sizeof(SymbolAddrStr));
+ if (i->Size != object::UnknownAddressOrSize)
+ format("%08" PRIx64, i->Size).print(SymbolSizeStr, sizeof(SymbolSizeStr));
+
+ if (OutputFormat == posix) {
+ outs() << i->Name << " " << i->TypeChar << " "
+ << SymbolAddrStr << SymbolSizeStr << "\n";
+ } else if (OutputFormat == bsd) {
+ if (PrintAddress)
+ outs() << SymbolAddrStr << ' ';
+ if (PrintSize) {
+ outs() << SymbolSizeStr;
+ if (i->Size != object::UnknownAddressOrSize)
+ outs() << ' ';
+ }
+ outs() << i->TypeChar << " " << i->Name << "\n";
+ } else if (OutputFormat == sysv) {
+ std::string PaddedName (i->Name);
+ while (PaddedName.length () < 20)
+ PaddedName += " ";
+ outs() << PaddedName << "|" << SymbolAddrStr << "| "
+ << i->TypeChar
+ << " | |" << SymbolSizeStr << "| |\n";
+ }
+ }
+
+ SymbolList.clear();
+}
+
+static char TypeCharForSymbol(GlobalValue &GV) {
+ if (GV.isDeclaration()) return 'U';
+ if (GV.hasLinkOnceLinkage()) return 'C';
+ if (GV.hasCommonLinkage()) return 'C';
+ if (GV.hasWeakLinkage()) return 'W';
+ if (isa<Function>(GV) && GV.hasInternalLinkage()) return 't';
+ if (isa<Function>(GV)) return 'T';
+ if (isa<GlobalVariable>(GV) && GV.hasInternalLinkage()) return 'd';
+ if (isa<GlobalVariable>(GV)) return 'D';
+ if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(&GV)) {
+ const GlobalValue *AliasedGV = GA->getAliasedGlobal();
+ if (isa<Function>(AliasedGV)) return 'T';
+ if (isa<GlobalVariable>(AliasedGV)) return 'D';
+ }
+ return '?';
+}
+
+static void DumpSymbolNameForGlobalValue(GlobalValue &GV) {
+ // Private linkage and available_externally linkage don't exist in symtab.
+ if (GV.hasPrivateLinkage() ||
+ GV.hasLinkerPrivateLinkage() ||
+ GV.hasLinkerPrivateWeakLinkage() ||
+ GV.hasAvailableExternallyLinkage())
+ return;
+ char TypeChar = TypeCharForSymbol(GV);
+ if (GV.hasLocalLinkage () && ExternalOnly)
+ return;
+
+ NMSymbol s;
+ s.Address = object::UnknownAddressOrSize;
+ s.Size = object::UnknownAddressOrSize;
+ s.TypeChar = TypeChar;
+ s.Name = GV.getName();
+ SymbolList.push_back(s);
+}
+
+static void DumpSymbolNamesFromModule(Module *M) {
+ CurrentFilename = M->getModuleIdentifier();
+ std::for_each (M->begin(), M->end(), DumpSymbolNameForGlobalValue);
+ std::for_each (M->global_begin(), M->global_end(),
+ DumpSymbolNameForGlobalValue);
+ if (!WithoutAliases)
+ std::for_each (M->alias_begin(), M->alias_end(),
+ DumpSymbolNameForGlobalValue);
+
+ SortAndPrintSymbolList();