X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fllvm-symbolizer%2Fllvm-symbolizer.cpp;h=c32e9494ea35937a265e325ab620f7900c297ef9;hb=fc699872e35ec794d7373680be6f1946fe8e9ca6;hp=819f1f84759b07e55cf8852200ee8b9b0f54dca1;hpb=c4c7ea3184335259da63d973acbed2043e8a6523;p=oota-llvm.git diff --git a/tools/llvm-symbolizer/llvm-symbolizer.cpp b/tools/llvm-symbolizer/llvm-symbolizer.cpp index 819f1f84759..c32e9494ea3 100644 --- a/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -32,24 +32,26 @@ using namespace symbolize; static cl::opt ClUseSymbolTable("use-symbol-table", cl::init(true), - cl::desc("Prefer names in symbol table to names " - "in debug info")); + cl::desc("Prefer names in symbol table to names " + "in debug info")); static cl::opt ClPrintFunctions("functions", cl::init(true), - cl::desc("Print function names as well as line " - "information for a given address")); + cl::desc("Print function names as well as line " + "information for a given address")); static cl::opt ClPrintInlining("inlining", cl::init(true), - cl::desc("Print all inlined frames for a given address")); + cl::desc("Print all inlined frames for a given address")); static cl::opt -ClDemangle("demangle", cl::init(true), - cl::desc("Demangle function names")); +ClDemangle("demangle", cl::init(true), cl::desc("Demangle function names")); -static bool parseCommand(bool &IsData, - std::string &ModuleName, +static cl::opt ClDefaultArch("default-arch", cl::init(""), + cl::desc("Default architecture " + "(for multi-arch objects)")); + +static bool parseCommand(bool &IsData, std::string &ModuleName, uint64_t &ModuleOffset) { const char *kDataCmd = "DATA "; const char *kCodeCmd = "CODE "; @@ -72,12 +74,25 @@ static bool parseCommand(bool &IsData, // If no cmd, assume it's CODE. IsData = false; } - // FIXME: Handle case when filename is given in quotes. - if (char *FilePath = strtok(pos, kDelimiters)) { - ModuleName = FilePath; - if (char *OffsetStr = strtok((char*)0, kDelimiters)) - ModuleOffsetStr = OffsetStr; + // Skip delimiters and parse input filename. + pos += strspn(pos, kDelimiters); + if (*pos == '"' || *pos == '\'') { + char quote = *pos; + pos++; + char *end = strchr(pos, quote); + if (end == 0) + return false; + ModuleName = std::string(pos, end - pos); + pos = end + 1; + } else { + int name_length = strcspn(pos, kDelimiters); + ModuleName = std::string(pos, name_length); + pos += name_length; } + // Skip delimiters and parse module offset. + pos += strspn(pos, kDelimiters); + int offset_length = strcspn(pos, kDelimiters); + ModuleOffsetStr = std::string(pos, offset_length); if (StringRef(ModuleOffsetStr).getAsInteger(0, ModuleOffset)) return false; return true; @@ -87,11 +102,11 @@ int main(int argc, char **argv) { // Print stack trace if we signal out. sys::PrintStackTraceOnErrorSignal(); PrettyStackTraceProgram X(argc, argv); - llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. + llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. cl::ParseCommandLineOptions(argc, argv, "llvm symbolizer for compiler-rt\n"); LLVMSymbolizer::Options Opts(ClUseSymbolTable, ClPrintFunctions, - ClPrintInlining, ClDemangle); + ClPrintInlining, ClDemangle, ClDefaultArch); LLVMSymbolizer Symbolizer(Opts); bool IsData = false;