#include "llvm/Support/Program.h"
#include "llvm/Support/Signals.h"
#include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/TargetSelect.h"
#include <algorithm>
#include <cctype>
#include <cerrno>
cl::opt<bool> DefinedOnly("defined-only",
cl::desc("Show only defined symbols"));
+cl::alias DefinedOnly2("U", cl::desc("Alias for --defined-only"),
+ cl::aliasopt(DefinedOnly));
cl::opt<bool> ExternalOnly("extern-only",
cl::desc("Show only external symbols"));
cl::opt<bool> NoSort("no-sort", cl::desc("Show symbols in order encountered"));
cl::alias NoSortp("p", cl::desc("Alias for --no-sort"), cl::aliasopt(NoSort));
+cl::opt<bool> ReverseSort("reverse-sort", cl::desc("Sort in reverse order"));
+cl::alias ReverseSortr("r", cl::desc("Alias for --reverse-sort"),
+ cl::aliasopt(ReverseSort));
+
cl::opt<bool> PrintSize("print-size",
cl::desc("Show symbol size instead of address"));
cl::alias PrintSizeS("S", cl::desc("Alias for --print-size"),
cl::opt<bool> ArchiveMap("print-armap", cl::desc("Print the archive map"));
cl::alias ArchiveMaps("s", cl::desc("Alias for --print-armap"),
cl::aliasopt(ArchiveMap));
+
+cl::opt<bool> JustSymbolName("just-symbol-name",
+ cl::desc("Print just the symbol's name"));
+cl::alias JustSymbolNames("j", cl::desc("Alias for --just-symbol-name"),
+ cl::aliasopt(JustSymbolName));
bool PrintAddress = true;
bool MultipleFiles = false;
}
static bool compareSymbolAddress(const NMSymbol &A, const NMSymbol &B) {
- if (A.Address < B.Address)
- return true;
- else if (A.Address == B.Address && A.Name < B.Name)
- return true;
- else if (A.Address == B.Address && A.Name == B.Name && A.Size < B.Size)
- return true;
- else
- return false;
+ if (!ReverseSort) {
+ if (A.Address < B.Address)
+ return true;
+ else if (A.Address == B.Address && A.Name < B.Name)
+ return true;
+ else if (A.Address == B.Address && A.Name == B.Name && A.Size < B.Size)
+ return true;
+ else
+ return false;
+ } else {
+ if (A.Address > B.Address)
+ return true;
+ else if (A.Address == B.Address && A.Name > B.Name)
+ return true;
+ else if (A.Address == B.Address && A.Name == B.Name && A.Size > B.Size)
+ return true;
+ else
+ return false;
+ }
}
static bool compareSymbolSize(const NMSymbol &A, const NMSymbol &B) {
- if (A.Size < B.Size)
- return true;
- else if (A.Size == B.Size && A.Name < B.Name)
- return true;
- else if (A.Size == B.Size && A.Name == B.Name && A.Address < B.Address)
- return true;
- else
- return false;
+ if (!ReverseSort) {
+ if (A.Size < B.Size)
+ return true;
+ else if (A.Size == B.Size && A.Name < B.Name)
+ return true;
+ else if (A.Size == B.Size && A.Name == B.Name && A.Address < B.Address)
+ return true;
+ else
+ return false;
+ } else {
+ if (A.Size > B.Size)
+ return true;
+ else if (A.Size == B.Size && A.Name > B.Name)
+ return true;
+ else if (A.Size == B.Size && A.Name == B.Name && A.Address > B.Address)
+ return true;
+ else
+ return false;
+ }
}
static bool compareSymbolName(const NMSymbol &A, const NMSymbol &B) {
- if (A.Name < B.Name)
- return true;
- else if (A.Name == B.Name && A.Size < B.Size)
- return true;
- else if (A.Name == B.Name && A.Size == B.Size && A.Address < B.Address)
- return true;
- else
- return false;
+ if (!ReverseSort) {
+ if (A.Name < B.Name)
+ return true;
+ else if (A.Name == B.Name && A.Size < B.Size)
+ return true;
+ else if (A.Name == B.Name && A.Size == B.Size && A.Address < B.Address)
+ return true;
+ else
+ return false;
+ } else {
+ if (A.Name > B.Name)
+ return true;
+ else if (A.Name == B.Name && A.Size > B.Size)
+ return true;
+ else if (A.Name == B.Name && A.Size == B.Size && A.Address > B.Address)
+ return true;
+ else
+ return false;
+ }
}
static char isSymbolList64Bit(SymbolicFile *Obj) {
continue;
if (SizeSort && !PrintAddress && I->Size == UnknownAddressOrSize)
continue;
+ if (JustSymbolName) {
+ outs() << I->Name << "\n";
+ continue;
+ }
char SymbolAddrStr[18] = "";
char SymbolSizeStr[18] = "";
}
static char getSymbolNMTypeChar(IRObjectFile &Obj, basic_symbol_iterator I) {
- const GlobalValue &GV = Obj.getSymbolGV(I->getRawDataRefImpl());
- return getSymbolNMTypeChar(GV);
+ const GlobalValue *GV = Obj.getSymbolGV(I->getRawDataRefImpl());
+ if (!GV)
+ return 't';
+ return getSymbolNMTypeChar(*GV);
}
template <class ELFT>
continue;
if (WithoutAliases) {
if (IRObjectFile *IR = dyn_cast<IRObjectFile>(Obj)) {
- const GlobalValue &GV = IR->getSymbolGV(I->getRawDataRefImpl());
- if (isa<GlobalAlias>(GV))
+ const GlobalValue *GV = IR->getSymbolGV(I->getRawDataRefImpl());
+ if (GV && isa<GlobalAlias>(GV))
continue;
}
}
}
static void dumpSymbolNamesFromFile(std::string &Filename) {
- std::unique_ptr<MemoryBuffer> Buffer;
- if (error(MemoryBuffer::getFileOrSTDIN(Filename, Buffer), Filename))
+ ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr =
+ MemoryBuffer::getFileOrSTDIN(Filename);
+ if (error(BufferOrErr.getError(), Filename))
return;
+ std::unique_ptr<MemoryBuffer> Buffer = std::move(BufferOrErr.get());
LLVMContext &Context = getGlobalContext();
ErrorOr<Binary *> BinaryOrErr = createBinary(Buffer, &Context);
if (error(sys::ChangeStdinToBinary()))
return 1;
+ llvm::InitializeAllTargetInfos();
+ llvm::InitializeAllTargetMCs();
+ llvm::InitializeAllAsmParsers();
+
ToolName = argv[0];
if (BSDFormat)
OutputFormat = bsd;