X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fllvm-nm%2Fllvm-nm.cpp;h=008c2e0431fca956121cc8abd9584a420a592f3f;hb=56867520990a4fea1353d55f71bb74a0126554e6;hp=80a02c37f95c3af82be7253f050d50df7fb6d9af;hpb=11db4b8084270cb91446485b9534864ce52a95ef;p=oota-llvm.git diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index 80a02c37f95..008c2e0431f 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -1,32 +1,33 @@ //===-- llvm-nm.cpp - Symbol table dumping utility for llvm ---------------===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// //===----------------------------------------------------------------------===// // // This program is a utility that works like traditional Unix "nm", -// that is, it prints out the names of symbols in a bytecode file, +// that is, it prints out the names of symbols in a bitcode file, // along with some information about each symbol. -// +// // This "nm" does not print symbols' addresses. It supports many of // the features of GNU "nm", including its different output formats. // //===----------------------------------------------------------------------===// #include "llvm/Module.h" -#include "llvm/Bytecode/Reader.h" -#include "llvm/Bytecode/Archive.h" +#include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/Bitcode/Archive.h" #include "llvm/Support/CommandLine.h" -#include "llvm/Support/FileUtilities.h" +#include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/MemoryBuffer.h" #include "llvm/System/Signals.h" +#include #include #include #include #include - using namespace llvm; namespace { @@ -36,13 +37,13 @@ namespace { cl::desc("Specify output format"), cl::values(clEnumVal(bsd, "BSD format"), clEnumVal(sysv, "System V format"), - clEnumVal(posix, "POSIX.2 format"), + clEnumVal(posix, "POSIX.2 format"), clEnumValEnd), cl::init(bsd)); cl::alias OutputFormat2("f", cl::desc("Alias for --format"), cl::aliasopt(OutputFormat)); - cl::list - InputFilenames(cl::Positional, cl::desc(""), + cl::list + InputFilenames(cl::Positional, cl::desc(""), cl::ZeroOrMore); cl::opt UndefinedOnly("undefined-only", @@ -64,20 +65,26 @@ namespace { bool MultipleFiles = false; std::string ToolName; -}; - -char TypeCharForSymbol (GlobalValue &GV) { - if (GV.isExternal ()) return 'U'; - if (GV.hasLinkOnceLinkage ()) return 'C'; - if (GV.hasWeakLinkage ()) return 'W'; - if (isa (GV) && GV.hasInternalLinkage ()) return 't'; - if (isa (GV)) return 'T'; - if (isa (GV) && GV.hasInternalLinkage ()) return 'd'; - if (isa (GV)) return 'D'; - return '?'; } -void DumpSymbolNameForGlobalValue (GlobalValue &GV) { +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(GV) && GV.hasInternalLinkage()) return 't'; + if (isa(GV)) return 'T'; + if (isa(GV) && GV.hasInternalLinkage()) return 'd'; + if (isa(GV)) return 'D'; + if (const GlobalAlias *GA = dyn_cast(&GV)) { + const GlobalValue *AliasedGV = GA->getAliasedGlobal(); + if (isa(AliasedGV)) return 'T'; + if (isa(AliasedGV)) return 'D'; + } + return '?'; +} + +static void DumpSymbolNameForGlobalValue(GlobalValue &GV) { const std::string SymbolAddrStr = " "; // Not used yet... char TypeChar = TypeCharForSymbol (GV); if ((TypeChar != 'U') && UndefinedOnly) @@ -102,7 +109,7 @@ void DumpSymbolNameForGlobalValue (GlobalValue &GV) { } } -void DumpSymbolNamesFromModule (Module *M) { +static void DumpSymbolNamesFromModule(Module *M) { const std::string &Filename = M->getModuleIdentifier (); if (OutputFormat == posix && MultipleFiles) { std::cout << Filename << ":\n"; @@ -114,37 +121,42 @@ void DumpSymbolNamesFromModule (Module *M) { << " Size Line Section\n"; } std::for_each (M->begin (), M->end (), DumpSymbolNameForGlobalValue); - std::for_each (M->gbegin (), M->gend (), DumpSymbolNameForGlobalValue); + std::for_each (M->global_begin (), M->global_end (), + DumpSymbolNameForGlobalValue); + std::for_each (M->alias_begin (), M->alias_end (), + DumpSymbolNameForGlobalValue); } -void DumpSymbolNamesFromFile (std::string &Filename) { +static void DumpSymbolNamesFromFile(std::string &Filename) { std::string ErrorMessage; sys::Path aPath(Filename); - if (Filename != "-" && !aPath.readable()) { - std::cerr << ToolName << ": " << Filename << ": " << strerror (errno) - << "\n"; - return; - } // Note: Currently we do not support reading an archive from stdin. - if (Filename == "-" || aPath.isBytecodeFile()) { - Module *Result = ParseBytecodeFile(Filename, &ErrorMessage); - if (Result) { - DumpSymbolNamesFromModule (Result); - } else { + if (Filename == "-" || aPath.isBitcodeFile()) { + std::auto_ptr Buffer( + MemoryBuffer::getFileOrSTDIN(Filename, &ErrorMessage)); + Module *Result = 0; + if (Buffer.get()) + Result = ParseBitcodeFile(Buffer.get(), &ErrorMessage); + + if (Result) + DumpSymbolNamesFromModule(Result); + else { std::cerr << ToolName << ": " << Filename << ": " << ErrorMessage << "\n"; return; } + } else if (aPath.isArchive()) { - Archive* archive = Archive::OpenAndLoad(sys::Path(Filename)); + std::string ErrMsg; + Archive* archive = Archive::OpenAndLoad(sys::Path(Filename), &ErrorMessage); if (!archive) std::cerr << ToolName << ": " << Filename << ": " << ErrorMessage << "\n"; std::vector Modules; - if (archive->getAllModules(Modules,&ErrorMessage)) { + if (archive->getAllModules(Modules, &ErrorMessage)) { std::cerr << ToolName << ": " << Filename << ": " << ErrorMessage << "\n"; return; } MultipleFiles = true; - std::for_each (Modules.begin (), Modules.end (), DumpSymbolNamesFromModule); + std::for_each (Modules.begin(), Modules.end(), DumpSymbolNamesFromModule); } else { std::cerr << ToolName << ": " << Filename << ": " << "unrecognizable file type\n"; @@ -153,7 +165,8 @@ void DumpSymbolNamesFromFile (std::string &Filename) { } int main(int argc, char **argv) { - cl::ParseCommandLineOptions(argc, argv, " llvm symbol table dumper\n"); + llvm_shutdown_obj X; // Call llvm_shutdown() on exit. + cl::ParseCommandLineOptions(argc, argv, "llvm symbol table dumper\n"); sys::PrintStackTraceOnErrorSignal(); ToolName = argv[0]; @@ -166,7 +179,7 @@ int main(int argc, char **argv) { default: MultipleFiles = true; } - std::for_each (InputFilenames.begin (), InputFilenames.end (), - DumpSymbolNamesFromFile); + std::for_each(InputFilenames.begin(), InputFilenames.end(), + DumpSymbolNamesFromFile); return 0; }