-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 = UnknownAddressOrSize;
- S.Size = 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();
-}
-