summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorDehao Chen <dehao@google.com>2017-04-17 20:10:39 +0000
committerDehao Chen <dehao@google.com>2017-04-17 20:10:39 +0000
commitef700d550e7349c94081c1dc93eac6a5be2fc1f5 (patch)
tree7f7e16bea15f8fbdfdace4ab5f7e55fa03f1b778 /llvm
parent7f7f323e4fc561555f7521131559ca47bcde4184 (diff)
downloadbcm5719-llvm-ef700d550e7349c94081c1dc93eac6a5be2fc1f5.tar.gz
bcm5719-llvm-ef700d550e7349c94081c1dc93eac6a5be2fc1f5.zip
Add GNU_discriminator support for inline callsites in llvm-symbolizer.
Summary: LLVM symbolize cannot recognize GNU_discriminator for inline callsites. This patch adds support for it. Reviewers: dblaikie Reviewed By: dblaikie Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D32134 llvm-svn: 300486
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h4
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFContext.cpp6
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFDie.cpp4
-rw-r--r--llvm/test/tools/llvm-symbolizer/Inputs/discrimbin9973 -> 9056 bytes
-rw-r--r--llvm/test/tools/llvm-symbolizer/Inputs/discrim.c13
-rw-r--r--llvm/test/tools/llvm-symbolizer/Inputs/discrim.inp9
-rw-r--r--llvm/test/tools/llvm-symbolizer/sym-verbose.test98
7 files changed, 102 insertions, 32 deletions
diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h
index 33e24fe3adc..9b260c08198 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h
@@ -247,8 +247,10 @@ public:
/// DW_AT_call_line attribute in this DIE.
/// \param CallColumn filled in with non-zero if successful, zero if there is
/// no DW_AT_call_column attribute in this DIE.
+ /// \param CallDiscriminator filled in with non-zero if successful, zero if
+ /// there is no DW_AT_GNU_discriminator attribute in this DIE.
void getCallerFrame(uint32_t &CallFile, uint32_t &CallLine,
- uint32_t &CallColumn) const;
+ uint32_t &CallColumn, uint32_t &CallDiscriminator) const;
/// Get inlined chain for a given address, rooted at the current DIE.
/// Returns empty chain if address is not contained in address range
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
index cbce2dc89de..bbb19b5e998 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
@@ -579,7 +579,7 @@ DWARFContext::getInliningInfoForAddress(uint64_t Address,
return InliningInfo;
}
- uint32_t CallFile = 0, CallLine = 0, CallColumn = 0;
+ uint32_t CallFile = 0, CallLine = 0, CallColumn = 0, CallDiscriminator = 0;
for (uint32_t i = 0, n = InlinedChain.size(); i != n; i++) {
DWARFDie &FunctionDIE = InlinedChain[i];
DILineInfo Frame;
@@ -605,10 +605,12 @@ DWARFContext::getInliningInfoForAddress(uint64_t Address,
Spec.FLIKind, Frame.FileName);
Frame.Line = CallLine;
Frame.Column = CallColumn;
+ Frame.Discriminator = CallDiscriminator;
}
// Get call file/line/column of a current DIE.
if (i + 1 < n) {
- FunctionDIE.getCallerFrame(CallFile, CallLine, CallColumn);
+ FunctionDIE.getCallerFrame(CallFile, CallLine, CallColumn,
+ CallDiscriminator);
}
}
InliningInfo.addFrame(Frame);
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
index 4308cc2e263..b88cc636d84 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
@@ -290,10 +290,12 @@ uint64_t DWARFDie::getDeclLine() const {
}
void DWARFDie::getCallerFrame(uint32_t &CallFile, uint32_t &CallLine,
- uint32_t &CallColumn) const {
+ uint32_t &CallColumn,
+ uint32_t &CallDiscriminator) const {
CallFile = toUnsigned(find(DW_AT_call_file), 0);
CallLine = toUnsigned(find(DW_AT_call_line), 0);
CallColumn = toUnsigned(find(DW_AT_call_column), 0);
+ CallDiscriminator = toUnsigned(find(DW_AT_GNU_discriminator), 0);
}
void DWARFDie::dump(raw_ostream &OS, unsigned RecurseDepth,
diff --git a/llvm/test/tools/llvm-symbolizer/Inputs/discrim b/llvm/test/tools/llvm-symbolizer/Inputs/discrim
index ec61fe960bf..0e5e847a5ed 100644
--- a/llvm/test/tools/llvm-symbolizer/Inputs/discrim
+++ b/llvm/test/tools/llvm-symbolizer/Inputs/discrim
Binary files differ
diff --git a/llvm/test/tools/llvm-symbolizer/Inputs/discrim.c b/llvm/test/tools/llvm-symbolizer/Inputs/discrim.c
index decbce8d454..e53cbd46713 100644
--- a/llvm/test/tools/llvm-symbolizer/Inputs/discrim.c
+++ b/llvm/test/tools/llvm-symbolizer/Inputs/discrim.c
@@ -1,8 +1,11 @@
static volatile int do_mul;
-static volatile int do_inc;
+static volatile int x, v;
-int main () {
- int x = 1;
- if (do_mul) x *= 2; else x /= 2;
- return do_inc ? ++x : --x;
+int foo () {
+ if (do_mul) x *= v; else x /= v;
+ return x;
+}
+
+int main() {
+ return foo() + foo();
}
diff --git a/llvm/test/tools/llvm-symbolizer/Inputs/discrim.inp b/llvm/test/tools/llvm-symbolizer/Inputs/discrim.inp
index f8ad6018d70..a5cfcb2558f 100644
--- a/llvm/test/tools/llvm-symbolizer/Inputs/discrim.inp
+++ b/llvm/test/tools/llvm-symbolizer/Inputs/discrim.inp
@@ -1,5 +1,8 @@
some text
-0x4004f2
-0x400509
-0x40050d
+0x400590
+0x4005a5
+0x4005ad
+0x4005b9
+0x4005ce
+0x4005d4
some more text
diff --git a/llvm/test/tools/llvm-symbolizer/sym-verbose.test b/llvm/test/tools/llvm-symbolizer/sym-verbose.test
index ef66db919fa..dbb1b3fae1f 100644
--- a/llvm/test/tools/llvm-symbolizer/sym-verbose.test
+++ b/llvm/test/tools/llvm-symbolizer/sym-verbose.test
@@ -1,39 +1,97 @@
#static volatile int do_mul;
-#static volatile int do_inc;
+#static volatile int x, v;
#
-#int main () {
-# int x = 1;
-# if (do_mul) x *= 2; else x /= 2;
-# return do_inc ? ++x : --x;
+#int foo () {
+# if (do_mul) x *= v; else x /= v;
+# return x;
#}
-#Build as : clang -g -O2 discrim.c -o discrim
+#
+#int main() {
+# return foo() + foo();
+#}
+#Build as : clang -gmlt -fdebug-info-for-profiling -O2 discrim.c -o discrim
RUN: llvm-symbolizer -verbose -print-address -obj=%p/Inputs/discrim < %p/Inputs/discrim.inp | FileCheck %s
#CHECK: some text
-#CHECK: 0x4004f2
+#CHECK: 0x400590
+#CHECK-NEXT: foo
+#CHECK-NEXT: Filename: /tmp/discrim.c
+#CHECK-NEXT: Function start line: 4
+#CHECK-NEXT: Line: 9
+#CHECK-NEXT: Column: 0
#CHECK-NEXT: main
-#CHECK-NEXT: Filename: /tmp{{[\\/]}}discrim.c
+#CHECK-NEXT: Filename: /tmp/discrim.c
+#CHECK-NEXT: Function start line: 9
+#CHECK-NEXT: Line: 10
+#CHECK-NEXT: Column: 0
+
+#CHECK: 0x4005a5
+#CHECK-NEXT: foo
+#CHECK-NEXT: Filename: /tmp/discrim.c
#CHECK-NEXT: Function start line: 4
-#CHECK-NEXT: Line: 6
-#CHECK-NEXT: Column: 7
-#CHECK-NOT: Discriminator: 0
+#CHECK-NEXT: Line: 5
+#CHECK-NEXT: Column: 17
+#CHECK-NEXT: Discriminator: 2
+#CHECK-NEXT: main
+#CHECK-NEXT: Filename: /tmp/discrim.c
+#CHECK-NEXT: Function start line: 9
+#CHECK-NEXT: Line: 10
+#CHECK-NEXT: Column: 0
-#CHECK: 0x400509
+#CHECK: 0x4005ad
+#CHECK-NEXT: foo
+#CHECK-NEXT: Filename: /tmp/discrim.c
+#CHECK-NEXT: Function start line: 4
+#CHECK-NEXT: Line: 0
+#CHECK-NEXT: Column: 30
+#CHECK-NEXT: Discriminator: 4
#CHECK-NEXT: main
-#CHECK-NEXT: Filename: /tmp{{[\\/]}}discrim.c
+#CHECK-NEXT: Filename: /tmp/discrim.c
+#CHECK-NEXT: Function start line: 9
+#CHECK-NEXT: Line: 10
+#CHECK-NEXT: Column: 0
+
+#CHECK: 0x4005b9
+#CHECK-NEXT: foo
+#CHECK-NEXT: Filename: /tmp/discrim.c
#CHECK-NEXT: Function start line: 4
-#CHECK-NEXT: Line: 7
-#CHECK-NEXT: Column: 3
-#CHECK-NEXT: Discriminator: 1
+#CHECK-NEXT: Line: 5
+#CHECK-NEXT: Column: 7
+#CHECK-NEXT: main
+#CHECK-NEXT: Filename: /tmp/discrim.c
+#CHECK-NEXT: Function start line: 9
+#CHECK-NEXT: Line: 10
+#CHECK-NEXT: Column: 0
+#CHECK-NEXT: Discriminator: 2
-#CHECK: 0x40050d
+#CHECK: 0x4005ce
+#CHECK-NEXT: foo
+#CHECK-NEXT: Filename: /tmp/discrim.c
+#CHECK-NEXT: Function start line: 4
+#CHECK-NEXT: Line: 5
+#CHECK-NEXT: Column: 17
+#CHECK-NEXT: Discriminator: 2
#CHECK-NEXT: main
-#CHECK-NEXT: Filename: /tmp{{[\\/]}}discrim.c
+#CHECK-NEXT: Filename: /tmp/discrim.c
+#CHECK-NEXT: Function start line: 9
+#CHECK-NEXT: Line: 10
+#CHECK-NEXT: Column: 0
+#CHECK-NEXT: Discriminator: 2
+
+#CHECK: 0x4005d4
+#CHECK-NEXT: foo
+#CHECK-NEXT: Filename: /tmp/discrim.c
#CHECK-NEXT: Function start line: 4
-#CHECK-NEXT: Line: 7
-#CHECK-NEXT: Column: 3
+#CHECK-NEXT: Line: 5
+#CHECK-NEXT: Column: 30
+#CHECK-NEXT: Discriminator: 4
+#CHECK-NEXT: main
+#CHECK-NEXT: Filename: /tmp/discrim.c
+#CHECK-NEXT: Function start line: 9
+#CHECK-NEXT: Line: 10
+#CHECK-NEXT: Column: 0
#CHECK-NEXT: Discriminator: 2
#CHECK: some more text
OpenPOWER on IntegriCloud