summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
diff options
context:
space:
mode:
authordim <dim@FreeBSD.org>2014-11-24 17:02:24 +0000
committerdim <dim@FreeBSD.org>2014-11-24 17:02:24 +0000
commit2c8643c6396b0a3db33430cf9380e70bbb9efce0 (patch)
tree4df130b28021d86e13bf4565ef58c1c5a5e093b4 /contrib/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
parent678318cd20f7db4e6c6b85d83fe00fa327b04fca (diff)
parente27feadae0885aa074df58ebfda2e7a7f7a7d590 (diff)
downloadFreeBSD-src-2c8643c6396b0a3db33430cf9380e70bbb9efce0.zip
FreeBSD-src-2c8643c6396b0a3db33430cf9380e70bbb9efce0.tar.gz
Merge llvm 3.5.0 release from ^/vendor/llvm/dist, resolve conflicts, and
preserve our customizations, where necessary.
Diffstat (limited to 'contrib/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp')
-rw-r--r--contrib/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp54
1 files changed, 33 insertions, 21 deletions
diff --git a/contrib/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/contrib/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
index c32e949..29db172 100644
--- a/contrib/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
+++ b/contrib/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
@@ -35,10 +35,15 @@ ClUseSymbolTable("use-symbol-table", cl::init(true),
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"));
+static cl::opt<FunctionNameKind> ClPrintFunctions(
+ "functions", cl::init(FunctionNameKind::LinkageName),
+ cl::desc("Print function name for a given address:"),
+ cl::values(clEnumValN(FunctionNameKind::None, "none", "omit function name"),
+ clEnumValN(FunctionNameKind::ShortName, "short",
+ "print short function name"),
+ clEnumValN(FunctionNameKind::LinkageName, "linkage",
+ "print function linkage name"),
+ clEnumValEnd));
static cl::opt<bool>
ClPrintInlining("inlining", cl::init(true),
@@ -51,6 +56,11 @@ static cl::opt<std::string> ClDefaultArch("default-arch", cl::init(""),
cl::desc("Default architecture "
"(for multi-arch objects)"));
+static cl::opt<std::string>
+ClBinaryName("obj", cl::init(""),
+ cl::desc("Path to object file to be symbolized (if not provided, "
+ "object file should be specified for each input line)"));
+
static bool parseCommand(bool &IsData, std::string &ModuleName,
uint64_t &ModuleOffset) {
const char *kDataCmd = "DATA ";
@@ -62,7 +72,6 @@ static bool parseCommand(bool &IsData, std::string &ModuleName,
return false;
IsData = false;
ModuleName = "";
- std::string ModuleOffsetStr = "";
char *pos = InputString;
if (strncmp(pos, kDataCmd, strlen(kDataCmd)) == 0) {
IsData = true;
@@ -74,26 +83,29 @@ static bool parseCommand(bool &IsData, std::string &ModuleName,
// If no cmd, assume it's CODE.
IsData = false;
}
- // 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;
+ // Skip delimiters and parse input filename (if needed).
+ if (ClBinaryName == "") {
+ pos += strspn(pos, kDelimiters);
+ if (*pos == '"' || *pos == '\'') {
+ char quote = *pos;
+ pos++;
+ char *end = strchr(pos, quote);
+ if (!end)
+ 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;
+ }
} else {
- int name_length = strcspn(pos, kDelimiters);
- ModuleName = std::string(pos, name_length);
- pos += name_length;
+ ModuleName = ClBinaryName;
}
// 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))
+ if (StringRef(pos, offset_length).getAsInteger(0, ModuleOffset))
return false;
return true;
}
@@ -104,7 +116,7 @@ int main(int argc, char **argv) {
PrettyStackTraceProgram X(argc, argv);
llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
- cl::ParseCommandLineOptions(argc, argv, "llvm symbolizer for compiler-rt\n");
+ cl::ParseCommandLineOptions(argc, argv, "llvm-symbolizer\n");
LLVMSymbolizer::Options Opts(ClUseSymbolTable, ClPrintFunctions,
ClPrintInlining, ClDemangle, ClDefaultArch);
LLVMSymbolizer Symbolizer(Opts);
OpenPOWER on IntegriCloud