summaryrefslogtreecommitdiffstats
path: root/debuginfo-tests/tests
diff options
context:
space:
mode:
Diffstat (limited to 'debuginfo-tests/tests')
-rw-r--r--debuginfo-tests/tests/aggregate-indirect-arg.cpp32
-rw-r--r--debuginfo-tests/tests/asan-blocks.c41
-rw-r--r--debuginfo-tests/tests/asan.c31
-rw-r--r--debuginfo-tests/tests/block_var.m32
-rw-r--r--debuginfo-tests/tests/blocks.m43
-rw-r--r--debuginfo-tests/tests/ctor.cpp25
-rw-r--r--debuginfo-tests/tests/dbg-arg.c46
-rw-r--r--debuginfo-tests/tests/foreach.m31
-rw-r--r--debuginfo-tests/tests/forward-declare-class.cpp27
-rw-r--r--debuginfo-tests/tests/lit.local.cfg3
-rw-r--r--debuginfo-tests/tests/llgdb.py157
-rw-r--r--debuginfo-tests/tests/nested-struct.cpp21
-rw-r--r--debuginfo-tests/tests/nrvo-string.cpp27
-rw-r--r--debuginfo-tests/tests/safestack.c51
-rw-r--r--debuginfo-tests/tests/sret.cpp71
-rw-r--r--debuginfo-tests/tests/stack-var.c18
-rw-r--r--debuginfo-tests/tests/static-member-2.cpp39
-rw-r--r--debuginfo-tests/tests/static-member.cpp36
-rw-r--r--debuginfo-tests/tests/vla.c24
19 files changed, 755 insertions, 0 deletions
diff --git a/debuginfo-tests/tests/aggregate-indirect-arg.cpp b/debuginfo-tests/tests/aggregate-indirect-arg.cpp
new file mode 100644
index 00000000000..eb2fd665cf6
--- /dev/null
+++ b/debuginfo-tests/tests/aggregate-indirect-arg.cpp
@@ -0,0 +1,32 @@
+// RUN: %clangxx %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o
+// RUN: %clangxx %target_itanium_abi_host_triple %t.o -o %t.out
+// RUN: %test_debuginfo %s %t.out
+// Radar 8945514
+// DEBUGGER: break 22
+// DEBUGGER: r
+// DEBUGGER: p v
+// CHECK: ${{[0-9]+}} =
+// CHECK: Data ={{.*}} 0x0{{(0*)}}
+// CHECK: Kind = 2142
+
+class SVal {
+public:
+ ~SVal() {}
+ const void* Data;
+ unsigned Kind;
+};
+
+void bar(SVal &v) {}
+class A {
+public:
+ void foo(SVal v) { bar(v); }
+};
+
+int main() {
+ SVal v;
+ v.Data = 0;
+ v.Kind = 2142;
+ A a;
+ a.foo(v);
+ return 0;
+}
diff --git a/debuginfo-tests/tests/asan-blocks.c b/debuginfo-tests/tests/asan-blocks.c
new file mode 100644
index 00000000000..b919a291eba
--- /dev/null
+++ b/debuginfo-tests/tests/asan-blocks.c
@@ -0,0 +1,41 @@
+// RUN: %clang -fblocks %target_itanium_abi_host_triple -arch x86_64 %s -o %t.out -g -fsanitize=address
+// RUN: %test_debuginfo %s %t.out
+// FIXME: Remove system-darwin when we build BlocksRuntime everywhere.
+// REQUIRES: not_asan, system-darwin
+// Zorg configures the ASAN stage2 bots to not build the asan
+// compiler-rt. Only run this test on non-asanified configurations.
+void b();
+struct S {
+ int a[8];
+};
+
+int f(struct S s, unsigned i) {
+ // DEBUGGER: break 17
+ // DEBUGGER: r
+ // DEBUGGER: p s
+ // CHECK: a = ([0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 5, [6] = 6, [7] = 7)
+ return s.a[i];
+}
+
+int main(int argc, const char **argv) {
+ struct S s = {{0, 1, 2, 3, 4, 5, 6, 7}};
+ if (f(s, 4) == 4) {
+ // DEBUGGER: break 27
+ // DEBUGGER: c
+ // DEBUGGER: p s
+ // CHECK: a = ([0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 5, [6] = 6, [7] = 7)
+ b();
+ }
+ return 0;
+}
+
+void c() {}
+
+void b() {
+ // DEBUGGER: break 40
+ // DEBUGGER: c
+ // DEBUGGER: p x
+ // CHECK: 42
+ __block int x = 42;
+ c();
+}
diff --git a/debuginfo-tests/tests/asan.c b/debuginfo-tests/tests/asan.c
new file mode 100644
index 00000000000..a2df7545722
--- /dev/null
+++ b/debuginfo-tests/tests/asan.c
@@ -0,0 +1,31 @@
+// RUN: %clang -fblocks %target_itanium_abi_host_triple -arch x86_64 %s -o %t.out -g -fsanitize=address
+// RUN: %test_debuginfo %s %t.out
+// REQUIRES: not_asan
+// Zorg configures the ASAN stage2 bots to not build the asan
+// compiler-rt. Only run this test on non-asanified configurations.
+//
+
+struct S {
+ int a[8];
+};
+
+int f(struct S s, unsigned i) {
+ // DEBUGGER: break 14
+ return s.a[i];
+}
+
+int main(int argc, const char **argv) {
+ struct S s = {{0, 1, 2, 3, 4, 5, 6, 7}};
+ if (f(s, 4) == 4)
+ return f(s, 0);
+ return 0;
+}
+
+// DEBUGGER: r
+// DEBUGGER: p s
+// CHECK: a =
+// DEBUGGER: p s.a[0]
+// CHECK: = 0
+// DEBUGGER: p s.a[1]
+// CHECK: = 1
+// DEBUGGER: p s.a[7]
diff --git a/debuginfo-tests/tests/block_var.m b/debuginfo-tests/tests/block_var.m
new file mode 100644
index 00000000000..32862172c57
--- /dev/null
+++ b/debuginfo-tests/tests/block_var.m
@@ -0,0 +1,32 @@
+// RUN: %clang %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o
+// RUN: %clang %target_itanium_abi_host_triple %t.o -o %t.out -framework Foundation
+// RUN: %test_debuginfo %s %t.out
+
+// REQUIRES: system-darwin
+
+// DEBUGGER: break 24
+// DEBUGGER: r
+// DEBUGGER: p result
+// CHECK: ${{[0-9]}} = 42
+
+void doBlock(void (^block)(void))
+{
+ block();
+}
+
+int I(int n)
+{
+ __block int result;
+ int i = 2;
+ doBlock(^{
+ result = n;
+ });
+ return result + i; /* Check value of 'result' */
+}
+
+
+int main (int argc, const char * argv[]) {
+ return I(42);
+}
+
+
diff --git a/debuginfo-tests/tests/blocks.m b/debuginfo-tests/tests/blocks.m
new file mode 100644
index 00000000000..12c99774a31
--- /dev/null
+++ b/debuginfo-tests/tests/blocks.m
@@ -0,0 +1,43 @@
+// RUN: %clang %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o
+// RUN: %clang %target_itanium_abi_host_triple %t.o -o %t.out -framework Foundation
+// RUN: %test_debuginfo %s %t.out
+
+// REQUIRES: system-darwin
+// Radar 9279956
+
+// DEBUGGER: break 31
+// DEBUGGER: r
+// DEBUGGER: p m2
+// CHECK: ${{[0-9]}} = 1
+// DEBUGGER: p dbTransaction
+// CHECK: ${{[0-9]}} = 0
+// DEBUGGER: p master
+// CHECK: ${{[0-9]}} = 0
+
+#include <Cocoa/Cocoa.h>
+
+extern void foo(void(^)(void));
+
+@interface A:NSObject @end
+@implementation A
+- (void) helper {
+ int master = 0;
+ __block int m2 = 0;
+ __block int dbTransaction = 0;
+ int (^x)(void) = ^(void) { (void) self;
+ (void) master;
+ (void) dbTransaction;
+ m2++;
+ return m2;
+ };
+ master = x();
+}
+@end
+
+void foo(void(^x)(void)) {}
+
+int main() {
+ A *a = [A alloc];
+ [a helper];
+ return 0;
+}
diff --git a/debuginfo-tests/tests/ctor.cpp b/debuginfo-tests/tests/ctor.cpp
new file mode 100644
index 00000000000..364401a2d5c
--- /dev/null
+++ b/debuginfo-tests/tests/ctor.cpp
@@ -0,0 +1,25 @@
+// RUN: %clangxx %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o
+// RUN: %clangxx %target_itanium_abi_host_triple %t.o -o %t.out
+// RUN: %test_debuginfo %s %t.out
+
+
+// DEBUGGER: break 14
+// DEBUGGER: r
+// DEBUGGER: p *this
+// CHECK-NEXT-NOT: Cannot access memory at address
+
+class A {
+public:
+ A() : zero(0), data(42)
+ {
+ }
+private:
+ int zero;
+ int data;
+};
+
+int main() {
+ A a;
+ return 0;
+}
+
diff --git a/debuginfo-tests/tests/dbg-arg.c b/debuginfo-tests/tests/dbg-arg.c
new file mode 100644
index 00000000000..a65dc910b8b
--- /dev/null
+++ b/debuginfo-tests/tests/dbg-arg.c
@@ -0,0 +1,46 @@
+// This test case checks debug info during register moves for an argument.
+// RUN: %clang %target_itanium_abi_host_triple -m64 -mllvm -fast-isel=false %s -c -o %t.o -g
+// RUN: %clang %target_itanium_abi_host_triple -m64 %t.o -o %t.out
+// RUN: %test_debuginfo %s %t.out
+//
+// DEBUGGER: break 26
+// DEBUGGER: r
+// DEBUGGER: print mutex
+// CHECK: ={{.* 0x[0-9A-Fa-f]+}}
+//
+// Radar 8412415
+
+struct _mtx
+{
+ long unsigned int ptr;
+ int waiters;
+ struct {
+ int tag;
+ int pad;
+ } mtxi;
+};
+
+
+int foobar(struct _mtx *mutex) {
+ int r = 1;
+ int l = 0;
+ int j = 0;
+ do {
+ if (mutex->waiters) {
+ r = 2;
+ }
+ j = bar(r, l);
+ ++l;
+ } while (l < j);
+ return r + j;
+}
+
+int bar(int i, int j) {
+ return i + j;
+}
+
+int main() {
+ struct _mtx m;
+ m.waiters = 0;
+ return foobar(&m);
+}
diff --git a/debuginfo-tests/tests/foreach.m b/debuginfo-tests/tests/foreach.m
new file mode 100644
index 00000000000..ccdc2827fd1
--- /dev/null
+++ b/debuginfo-tests/tests/foreach.m
@@ -0,0 +1,31 @@
+// RUN: %clang %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o
+// RUN: %clang %target_itanium_abi_host_triple %t.o -o %t.out -framework Foundation
+// RUN: %test_debuginfo %s %t.out
+//
+// REQUIRES: system-darwin
+// Radar 8757124
+
+// DEBUGGER: break 25
+// DEBUGGER: r
+// DEBUGGER: po thing
+// CHECK: aaa
+
+#import <Foundation/Foundation.h>
+
+int main (int argc, const char * argv[]) {
+
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ NSArray *things = [NSArray arrayWithObjects:@"one", @"two", @"three" , nil];
+ for (NSString *thing in things) {
+ NSLog (@"%@", thing);
+ }
+
+ things = [NSArray arrayWithObjects:@"aaa", @"bbb", @"ccc" , nil];
+ for (NSString *thing in things) {
+ NSLog (@"%@", thing);
+ }
+ [pool release];
+ return 0;
+}
+
+
diff --git a/debuginfo-tests/tests/forward-declare-class.cpp b/debuginfo-tests/tests/forward-declare-class.cpp
new file mode 100644
index 00000000000..132420009bd
--- /dev/null
+++ b/debuginfo-tests/tests/forward-declare-class.cpp
@@ -0,0 +1,27 @@
+// RUN: %clangxx %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o
+// RUN: %test_debuginfo %s %t.o
+// Radar 9168773
+
+// DEBUGGER: ptype A
+// Work around a gdb bug where it believes that a class is a
+// struct if there aren't any methods - even though it's tagged
+// as a class.
+// CHECK: type = {{struct|class}} A {
+// CHECK-NEXT: {{(public:){0,1}}}
+// CHECK-NEXT: int MyData;
+// CHECK-NEXT: }
+class A;
+class B {
+public:
+ void foo(const A *p);
+};
+
+B iEntry;
+
+class A {
+public:
+ int MyData;
+};
+
+A irp;
+
diff --git a/debuginfo-tests/tests/lit.local.cfg b/debuginfo-tests/tests/lit.local.cfg
new file mode 100644
index 00000000000..ce0175cf7f9
--- /dev/null
+++ b/debuginfo-tests/tests/lit.local.cfg
@@ -0,0 +1,3 @@
+# debuginfo-tests are not expected to pass in a cross-compilation setup.
+if 'native' not in config.available_features:
+ config.unsupported = True
diff --git a/debuginfo-tests/tests/llgdb.py b/debuginfo-tests/tests/llgdb.py
new file mode 100644
index 00000000000..7d4fdd64fd1
--- /dev/null
+++ b/debuginfo-tests/tests/llgdb.py
@@ -0,0 +1,157 @@
+#!/bin/env python
+"""
+A gdb-compatible frontend for lldb that implements just enough
+commands to run the tests in the debuginfo-tests repository with lldb.
+"""
+
+# ----------------------------------------------------------------------
+# Auto-detect lldb python module.
+import commands, platform, os, sys
+try:
+ # Just try for LLDB in case PYTHONPATH is already correctly setup.
+ import lldb
+except ImportError:
+ lldb_python_dirs = list()
+ # lldb is not in the PYTHONPATH, try some defaults for the current platform.
+ platform_system = platform.system()
+ if platform_system == 'Darwin':
+ # On Darwin, try the currently selected Xcode directory
+ xcode_dir = commands.getoutput("xcode-select --print-path")
+ if xcode_dir:
+ lldb_python_dirs.append(os.path.realpath(xcode_dir +
+'/../SharedFrameworks/LLDB.framework/Resources/Python'))
+ lldb_python_dirs.append(xcode_dir +
+'/Library/PrivateFrameworks/LLDB.framework/Resources/Python')
+ lldb_python_dirs.append(
+'/System/Library/PrivateFrameworks/LLDB.framework/Resources/Python')
+ success = False
+ for lldb_python_dir in lldb_python_dirs:
+ if os.path.exists(lldb_python_dir):
+ if not (sys.path.__contains__(lldb_python_dir)):
+ sys.path.append(lldb_python_dir)
+ try:
+ import lldb
+ except ImportError:
+ pass
+ else:
+ print 'imported lldb from: "%s"' % (lldb_python_dir)
+ success = True
+ break
+ if not success:
+ print "error: couldn't locate the 'lldb' module, please set PYTHONPATH correctly"
+ sys.exit(1)
+# ----------------------------------------------------------------------
+
+# Command line option handling.
+import argparse
+parser = argparse.ArgumentParser(description=__doc__)
+parser.add_argument('--quiet', '-q', action="store_true", help='ignored')
+parser.add_argument('-batch', action="store_true",
+ help='exit after processing comand line')
+parser.add_argument('-n', action="store_true", help='ignore .lldb file')
+parser.add_argument('-x', dest='script', type=file, help='execute commands from file')
+parser.add_argument("target", help="the program to debug")
+args = parser.parse_args()
+
+
+# Create a new debugger instance.
+debugger = lldb.SBDebugger.Create()
+debugger.SkipLLDBInitFiles(args.n)
+
+# Don't return from lldb function calls until the process stops.
+debugger.SetAsync(False)
+
+# Create a target from a file and arch.
+arch = os.popen("file "+args.target).read().split()[-1]
+target = debugger.CreateTargetWithFileAndArch(args.target, arch)
+
+if not target:
+ print "Could not create target", args.target
+ sys.exit(1)
+
+if not args.script:
+ print "Interactive mode is not implemented."
+ sys.exit(1)
+
+import re
+for command in args.script:
+ # Strip newline and whitespaces and split into words.
+ cmd = command[:-1].strip().split()
+ if not cmd:
+ continue
+
+ print '> %s'% command[:-1]
+
+ try:
+ if re.match('^r|(run)$', cmd[0]):
+ error = lldb.SBError()
+ launchinfo = lldb.SBLaunchInfo([])
+ launchinfo.SetWorkingDirectory(os.getcwd())
+ process = target.Launch(launchinfo, error)
+ print error
+ if not process or error.fail:
+ state = process.GetState()
+ print "State = %d" % state
+ print """
+ERROR: Could not launch process.
+NOTE: There are several reasons why this may happen:
+ * Root needs to run "DevToolsSecurity --enable".
+ * Older versions of lldb cannot launch more than one process simultaneously.
+"""
+ sys.exit(1)
+
+ elif re.match('^b|(break)$', cmd[0]) and len(cmd) == 2:
+ if re.match('[0-9]+', cmd[1]):
+ # b line
+ mainfile = target.FindFunctions('main')[0].compile_unit.file
+ print target.BreakpointCreateByLocation(mainfile, int(cmd[1]))
+ else:
+ # b file:line
+ file, line = cmd[1].split(':')
+ print target.BreakpointCreateByLocation(file, int(line))
+
+ elif re.match('^ptype$', cmd[0]) and len(cmd) == 2:
+ # GDB's ptype has multiple incarnations depending on its
+ # argument (global variable, function, type). The definition
+ # here is for looking up the signature of a function and only
+ # if that fails it looks for a type with that name.
+ # Type lookup in LLDB would be "image lookup --type".
+ for elem in target.FindFunctions(cmd[1]):
+ print elem.function.type
+ continue
+ print target.FindFirstType(cmd[1])
+
+ elif re.match('^po$', cmd[0]) and len(cmd) > 1:
+ try:
+ opts = lldb.SBExpressionOptions()
+ opts.SetFetchDynamicValue(True)
+ opts.SetCoerceResultToId(True)
+ print target.EvaluateExpression(' '.join(cmd[1:]), opts)
+ except:
+ # FIXME: This is a fallback path for the lab.llvm.org
+ # buildbot running OS X 10.7; it should be removed.
+ thread = process.GetThreadAtIndex(0)
+ frame = thread.GetFrameAtIndex(0)
+ print frame.EvaluateExpression(' '.join(cmd[1:]))
+
+ elif re.match('^p|(print)$', cmd[0]) and len(cmd) > 1:
+ thread = process.GetThreadAtIndex(0)
+ frame = thread.GetFrameAtIndex(0)
+ print frame.EvaluateExpression(' '.join(cmd[1:]))
+
+ elif re.match('^n|(next)$', cmd[0]):
+ thread = process.GetThreadAtIndex(0)
+ thread.StepOver()
+
+ elif re.match('^q|(quit)$', cmd[0]):
+ sys.exit(0)
+
+ else:
+ print debugger.HandleCommand(' '.join(cmd))
+
+ except SystemExit:
+ lldb.SBDebugger_Terminate()
+ raise
+ except:
+ print 'Could not handle the command "%s"' % ' '.join(cmd)
+
diff --git a/debuginfo-tests/tests/nested-struct.cpp b/debuginfo-tests/tests/nested-struct.cpp
new file mode 100644
index 00000000000..7533e6a8151
--- /dev/null
+++ b/debuginfo-tests/tests/nested-struct.cpp
@@ -0,0 +1,21 @@
+// RUN: %clangxx %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o
+// RUN: %test_debuginfo %s %t.o
+// Radar 9440721
+// If debug info for my_number() is emitted outside function foo's scope
+// then a debugger may not be able to handle it. At least one version of
+// gdb crashes in such cases.
+
+// DEBUGGER: ptype foo
+// CHECK: int (void)
+
+int foo() {
+ struct Local {
+ static int my_number() {
+ return 42;
+ }
+ };
+
+ int i = 0;
+ i = Local::my_number();
+ return i + 1;
+}
diff --git a/debuginfo-tests/tests/nrvo-string.cpp b/debuginfo-tests/tests/nrvo-string.cpp
new file mode 100644
index 00000000000..18acebb0e6d
--- /dev/null
+++ b/debuginfo-tests/tests/nrvo-string.cpp
@@ -0,0 +1,27 @@
+// This ensures that DW_OP_deref is inserted when necessary, such as when NRVO
+// of a string object occurs in C++.
+//
+// RUN: %clangxx -O0 -fno-exceptions %target_itanium_abi_host_triple %s -o %t.out -g
+// RUN: %test_debuginfo %s %t.out
+// RUN: %clangxx -O1 -fno-exceptions %target_itanium_abi_host_triple %s -o %t.out -g
+// RUN: %test_debuginfo %s %t.out
+//
+// PR34513
+
+struct string {
+ string() {}
+ string(int i) : i(i) {}
+ ~string() {}
+ int i = 0;
+};
+string get_string() {
+ string unused;
+ string result = 3;
+// DEBUGGER: break 21
+ return result;
+}
+int main() { get_string(); }
+
+// DEBUGGER: r
+// DEBUGGER: print result.i
+// CHECK: = 3
diff --git a/debuginfo-tests/tests/safestack.c b/debuginfo-tests/tests/safestack.c
new file mode 100644
index 00000000000..01c5f7ede92
--- /dev/null
+++ b/debuginfo-tests/tests/safestack.c
@@ -0,0 +1,51 @@
+// RUN: %clang %target_itanium_abi_host_triple -arch x86_64 %s -o %t.out -g -fsanitize=safe-stack
+// RUN: %test_debuginfo %s %t.out
+// REQUIRES: not_asan
+// Zorg configures the ASAN stage2 bots to not build the
+// safestack compiler-rt. Only run this test on
+// non-asanified configurations.
+
+struct S {
+ int a[8];
+};
+
+int f(struct S s, unsigned i);
+
+int main(int argc, const char **argv) {
+ struct S s = {{0, 1, 2, 3, 4, 5, 6, 7}};
+ // DEBUGGER: break 17
+ f(s, 4);
+ // DEBUGGER: break 19
+ return 0;
+}
+
+int f(struct S s, unsigned i) {
+ // DEBUGGER: break 24
+ return s.a[i];
+}
+
+// DEBUGGER: r
+// DEBUGGER: p s
+// CHECK: a =
+// DEBUGGER: p s.a[0]
+// CHECK: = 0
+// DEBUGGER: p s.a[1]
+// CHECK: = 1
+// DEBUGGER: p s.a[7]
+// CHECK: = 7
+// DEBUGGER: c
+// DEBUGGER: p s
+// CHECK: a =
+// DEBUGGER: p s.a[0]
+// CHECK: = 0
+// DEBUGGER: p s.a[1]
+// CHECK: = 1
+// DEBUGGER: p s.a[7]
+// DEBUGGER: c
+// DEBUGGER: p s
+// CHECK: a =
+// DEBUGGER: p s.a[0]
+// CHECK: = 0
+// DEBUGGER: p s.a[1]
+// CHECK: = 1
+// DEBUGGER: p s.a[7]
diff --git a/debuginfo-tests/tests/sret.cpp b/debuginfo-tests/tests/sret.cpp
new file mode 100644
index 00000000000..640015fab40
--- /dev/null
+++ b/debuginfo-tests/tests/sret.cpp
@@ -0,0 +1,71 @@
+// RUN: %clangxx %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o
+// RUN: %clangxx %target_itanium_abi_host_triple %t.o -o %t.out
+// RUN: %test_debuginfo %s %t.out
+// Radar 8775834
+// DEBUGGER: break 62
+// DEBUGGER: r
+// DEBUGGER: p a
+// CHECK: ${{[0-9]+}} =
+// LLDB does not print artificial members.
+// CHECK: {{(_vptr\$A =)?.*}}m_int = 12
+
+class A
+{
+public:
+ A (int i=0);
+ A (const A& rhs);
+ const A&
+ operator= (const A& rhs);
+ virtual ~A() {}
+
+ int get_int();
+
+protected:
+ int m_int;
+};
+
+A::A (int i) :
+ m_int(i)
+{
+}
+
+A::A (const A& rhs) :
+ m_int (rhs.m_int)
+{
+}
+
+const A &
+A::operator =(const A& rhs)
+{
+ m_int = rhs.m_int;
+ return *this;
+}
+
+int A::get_int()
+{
+ return m_int;
+}
+
+class B
+{
+public:
+ B () {}
+
+ A AInstance();
+};
+
+A
+B::AInstance()
+{
+ A a(12);
+ return a;
+}
+
+int main (int argc, char const *argv[])
+{
+ B b;
+ int return_val = b.AInstance().get_int();
+
+ A a(b.AInstance());
+ return return_val;
+}
diff --git a/debuginfo-tests/tests/stack-var.c b/debuginfo-tests/tests/stack-var.c
new file mode 100644
index 00000000000..372139c59b0
--- /dev/null
+++ b/debuginfo-tests/tests/stack-var.c
@@ -0,0 +1,18 @@
+// RUN: %clang %target_itanium_abi_host_triple %s -O -o %t.out -g
+// RUN: %test_debuginfo %s %t.out
+
+void __attribute__((noinline, optnone)) bar(int *test) {}
+int main() {
+ int test;
+ test = 23;
+ // DEBUGGER: break 12
+ // DEBUGGER: r
+ // DEBUGGER: p test
+ // CHECK: = 23
+ bar(&test);
+ // DEBUGGER: break 17
+ // DEBUGGER: c
+ // DEBUGGER: p test
+ // CHECK: = 23
+ return test;
+}
diff --git a/debuginfo-tests/tests/static-member-2.cpp b/debuginfo-tests/tests/static-member-2.cpp
new file mode 100644
index 00000000000..4edb2b060f1
--- /dev/null
+++ b/debuginfo-tests/tests/static-member-2.cpp
@@ -0,0 +1,39 @@
+// RUN: %clangxx %target_itanium_abi_host_triple -O0 -g %s -o %t -c
+// RUN: %clangxx %target_itanium_abi_host_triple %t -o %t.out
+// RUN: %test_debuginfo %s %t.out
+
+// FIXME: LLDB finds the wrong symbol for "C". rdar://problem/14933867
+// XFAIL: darwin
+
+// DEBUGGER: delete breakpoints
+// DEBUGGER: break static-member.cpp:33
+// DEBUGGER: r
+// DEBUGGER: ptype C
+// CHECK: {{struct|class}} C {
+// CHECK: static const int a;
+// CHECK-NEXT: static int b;
+// CHECK-NEXT: static int c;
+// CHECK-NEXT: int d;
+// CHECK-NEXT: }
+// DEBUGGER: p C::a
+// CHECK: ${{[0-9]}} = 4
+// DEBUGGER: p C::c
+// CHECK: ${{[0-9]}} = 15
+
+// PR14471, PR14734
+
+class C {
+public:
+ const static int a = 4;
+ static int b;
+ static int c;
+ int d;
+};
+
+int C::c = 15;
+const int C::a;
+
+int main() {
+ C instance_C;
+ return C::a;
+}
diff --git a/debuginfo-tests/tests/static-member.cpp b/debuginfo-tests/tests/static-member.cpp
new file mode 100644
index 00000000000..1d8ad62c5b8
--- /dev/null
+++ b/debuginfo-tests/tests/static-member.cpp
@@ -0,0 +1,36 @@
+// RUN: %clangxx %target_itanium_abi_host_triple -O0 -g %s -o %t -c
+// RUN: %clangxx %target_itanium_abi_host_triple %t -o %t.out
+// RUN: %test_debuginfo %s %t.out
+
+// DEBUGGER: delete breakpoints
+// DEBUGGER: break static-member.cpp:33
+// DEBUGGER: r
+// DEBUGGER: ptype MyClass
+// CHECK: {{struct|class}} MyClass {
+// CHECK: static const int a;
+// CHECK-NEXT: static int b;
+// CHECK-NEXT: static int c;
+// CHECK-NEXT: int d;
+// CHECK-NEXT: }
+// DEBUGGER: p MyClass::a
+// CHECK: ${{[0-9]}} = 4
+// DEBUGGER: p MyClass::c
+// CHECK: ${{[0-9]}} = 15
+
+// PR14471, PR14734
+
+class MyClass {
+public:
+ const static int a = 4;
+ static int b;
+ static int c;
+ int d;
+};
+
+int MyClass::c = 15;
+const int MyClass::a;
+
+int main() {
+ MyClass instance_MyClass;
+ return MyClass::a;
+}
diff --git a/debuginfo-tests/tests/vla.c b/debuginfo-tests/tests/vla.c
new file mode 100644
index 00000000000..e6ea1ef4ac2
--- /dev/null
+++ b/debuginfo-tests/tests/vla.c
@@ -0,0 +1,24 @@
+// This test case verifies the debug location for variable-length arrays.
+// RUN: %clang %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o
+// RUN: %clang %target_itanium_abi_host_triple %t.o -o %t.out
+// RUN: %test_debuginfo %s %t.out
+//
+// DEBUGGER: break 18
+// DEBUGGER: r
+// DEBUGGER: p vla[0]
+// CHECK: 23
+// DEBUGGER: p vla[1]
+// CHECK: 22
+
+void init_vla(int size) {
+ int i;
+ int vla[size];
+ for (i = 0; i < size; i++)
+ vla[i] = size-i;
+ vla[0] = size; // line 18
+}
+
+int main(int argc, const char **argv) {
+ init_vla(23);
+ return 0;
+}
OpenPOWER on IntegriCloud