summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2013-04-05 09:22:24 +0000
committerAlexey Samsonov <samsonov@google.com>2013-04-05 09:22:24 +0000
commitd2069321e0b6bcba6290a35ed407f9b1190abd03 (patch)
treee70d4b03e03a3fdb5305b0c3abc8ca1cbc4b6948
parentc6ee5835d640e3ea1fae871e80838bc84547bf39 (diff)
downloadbcm5719-llvm-d2069321e0b6bcba6290a35ed407f9b1190abd03.tar.gz
bcm5719-llvm-d2069321e0b6bcba6290a35ed407f9b1190abd03.zip
llvm-symbolizer: correctly parse filenames given in quotes
llvm-svn: 178859
-rwxr-xr-xllvm/test/DebugInfo/Inputs/dwarfdump-test3.elf-x86-64 space (renamed from llvm/test/DebugInfo/Inputs/dwarfdump-test3.elf-x86-64)bin8944 -> 8944 bytes
-rw-r--r--llvm/test/DebugInfo/dwarfdump-test.test6
-rw-r--r--llvm/test/DebugInfo/llvm-symbolizer.test6
-rw-r--r--llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp23
4 files changed, 26 insertions, 9 deletions
diff --git a/llvm/test/DebugInfo/Inputs/dwarfdump-test3.elf-x86-64 b/llvm/test/DebugInfo/Inputs/dwarfdump-test3.elf-x86-64 space
index 7330cd8baa1..7330cd8baa1 100755
--- a/llvm/test/DebugInfo/Inputs/dwarfdump-test3.elf-x86-64
+++ b/llvm/test/DebugInfo/Inputs/dwarfdump-test3.elf-x86-64 space
Binary files differ
diff --git a/llvm/test/DebugInfo/dwarfdump-test.test b/llvm/test/DebugInfo/dwarfdump-test.test
index 355445e6495..058d6a36981 100644
--- a/llvm/test/DebugInfo/dwarfdump-test.test
+++ b/llvm/test/DebugInfo/dwarfdump-test.test
@@ -8,11 +8,11 @@ RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test2.elf-x86-64 \
RUN: --address=0x4004e8 --functions | FileCheck %s -check-prefix MANY_CU_1
RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test2.elf-x86-64 \
RUN: --address=0x4004f4 --functions | FileCheck %s -check-prefix MANY_CU_2
-RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test3.elf-x86-64 \
+RUN: llvm-dwarfdump "%p/Inputs/dwarfdump-test3.elf-x86-64 space" \
RUN: --address=0x640 --functions | FileCheck %s -check-prefix ABS_ORIGIN_1
-RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test3.elf-x86-64 \
+RUN: llvm-dwarfdump "%p/Inputs/dwarfdump-test3.elf-x86-64 space" \
RUN: --address=0x633 --functions | FileCheck %s -check-prefix INCLUDE_TEST_1
-RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test3.elf-x86-64 \
+RUN: llvm-dwarfdump "%p/Inputs/dwarfdump-test3.elf-x86-64 space" \
RUN: --address=0x62d --functions | FileCheck %s -check-prefix INCLUDE_TEST_2
RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test4.elf-x86-64 \
RUN: --address=0x62c --functions \
diff --git a/llvm/test/DebugInfo/llvm-symbolizer.test b/llvm/test/DebugInfo/llvm-symbolizer.test
index 7776ec59783..842a5e603eb 100644
--- a/llvm/test/DebugInfo/llvm-symbolizer.test
+++ b/llvm/test/DebugInfo/llvm-symbolizer.test
@@ -1,6 +1,7 @@
RUN: echo "%p/Inputs/dwarfdump-test.elf-x86-64 0x400559" > %t.input
RUN: echo "%p/Inputs/dwarfdump-test4.elf-x86-64 0x62c" >> %t.input
RUN: echo "%p/Inputs/dwarfdump-inl-test.elf-x86-64 0x710" >> %t.input
+RUN: echo '"%p/Inputs/dwarfdump-test3.elf-x86-64 space" 0x633' >> %t.input
RUN: llvm-symbolizer --functions --inlining --demangle=false < %t.input \
RUN: | FileCheck %s
@@ -18,4 +19,7 @@ CHECK-NEXT: dwarfdump-inl-test.h:7
CHECK-NEXT: inlined_f
CHECK-NEXT: dwarfdump-inl-test.cc:3
CHECK-NEXT: main
-CHECK-NEXT: dwarfdump-inl-test.cc:8
+CHECK-NEXT: dwarfdump-inl-test.cc:
+
+CHECK: _Z3do1v
+CHECK-NEXT: dwarfdump-test3-decl.h:7
diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
index d039ec691f1..0cafffaf712 100644
--- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
+++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
@@ -70,12 +70,25 @@ static bool parseCommand(bool &IsData, std::string &ModuleName,
// 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;
OpenPOWER on IntegriCloud