static cl::opt<bool>
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<bool>
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<bool>
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<bool>
-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<std::string> 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 ";
// 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;
// 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;