Added support for rvalue references in debug information
authorSean Callanan <scallanan@apple.com>
Mon, 21 May 2012 23:31:51 +0000 (23:31 +0000)
committerSean Callanan <scallanan@apple.com>
Mon, 21 May 2012 23:31:51 +0000 (23:31 +0000)
(actually, mainly just hooked up support that was already
there).  Added a test case, although it's expected to fail
right now unless you're using top-of-tree LLVM.

llvm-svn: 157220

lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
lldb/test/lang/cpp/rvalue-references/Makefile [new file with mode: 0644]
lldb/test/lang/cpp/rvalue-references/TestRvalueReferences.py [new file with mode: 0644]
lldb/test/lang/cpp/rvalue-references/main.cpp [new file with mode: 0644]

index 135b43b..4fb4d11 100644 (file)
@@ -5091,6 +5091,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
             case DW_TAG_base_type:
             case DW_TAG_pointer_type:
             case DW_TAG_reference_type:
+            case DW_TAG_rvalue_reference_type:
             case DW_TAG_typedef:
             case DW_TAG_const_type:
             case DW_TAG_restrict_type:
@@ -5165,12 +5166,13 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
                                                                                    byte_size * 8);
                         break;
 
-                    case DW_TAG_pointer_type:   encoding_data_type = Type::eEncodingIsPointerUID;           break;
-                    case DW_TAG_reference_type: encoding_data_type = Type::eEncodingIsLValueReferenceUID;   break;
-                    case DW_TAG_typedef:        encoding_data_type = Type::eEncodingIsTypedefUID;           break;
-                    case DW_TAG_const_type:     encoding_data_type = Type::eEncodingIsConstUID;             break;
-                    case DW_TAG_restrict_type:  encoding_data_type = Type::eEncodingIsRestrictUID;          break;
-                    case DW_TAG_volatile_type:  encoding_data_type = Type::eEncodingIsVolatileUID;          break;
+                    case DW_TAG_pointer_type:           encoding_data_type = Type::eEncodingIsPointerUID;           break;
+                    case DW_TAG_reference_type:         encoding_data_type = Type::eEncodingIsLValueReferenceUID;   break;
+                    case DW_TAG_rvalue_reference_type:  encoding_data_type = Type::eEncodingIsRValueReferenceUID;   break;
+                    case DW_TAG_typedef:                encoding_data_type = Type::eEncodingIsTypedefUID;           break;
+                    case DW_TAG_const_type:             encoding_data_type = Type::eEncodingIsConstUID;             break;
+                    case DW_TAG_restrict_type:          encoding_data_type = Type::eEncodingIsRestrictUID;          break;
+                    case DW_TAG_volatile_type:          encoding_data_type = Type::eEncodingIsVolatileUID;          break;
                     }
 
                     if (clang_type == NULL && (encoding_data_type == Type::eEncodingIsPointerUID || encoding_data_type == Type::eEncodingIsTypedefUID))
diff --git a/lldb/test/lang/cpp/rvalue-references/Makefile b/lldb/test/lang/cpp/rvalue-references/Makefile
new file mode 100644 (file)
index 0000000..e6d12ca
--- /dev/null
@@ -0,0 +1,7 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+CXXFLAGS = -std=c++11
+
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/test/lang/cpp/rvalue-references/TestRvalueReferences.py b/lldb/test/lang/cpp/rvalue-references/TestRvalueReferences.py
new file mode 100644 (file)
index 0000000..897df84
--- /dev/null
@@ -0,0 +1,65 @@
+"""
+Tests that rvalue references are supported in C++
+"""
+
+from lldbtest import *
+
+class CPPThisTestCase(TestBase):
+    
+    mydir = os.path.join("lang", "cpp", "rvalue-references")
+    
+    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
+    #rdar://problem/11479676
+    @expectedFailureClang
+    @dsym_test
+    def test_with_dsym_and_run_command(self):
+        """Test that rvalues are supported in the C++ expression parser"""
+        self.buildDsym()
+        self.static_method_commands()
+
+    #rdar://problem/11479676
+    @expectedFailureClang
+    @dwarf_test
+    def test_with_dwarf_and_run_command(self):
+        """Test that rvalues are supported in the C++ expression parser"""
+        self.buildDwarf()
+        self.static_method_commands()
+
+    def setUp(self):
+        TestBase.setUp(self)
+    
+    def set_breakpoint(self, line):
+        self.expect("breakpoint set -f main.cpp -l %d" % line,
+                    BREAKPOINT_CREATED,
+                    startstr = "Breakpoint created")
+    
+    def static_method_commands(self):
+        """Test that rvalues are supported in the C++ expression parser"""
+        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+        self.set_breakpoint(line_number('main.cpp', '// breakpoint 1'))
+        self.set_breakpoint(line_number('main.cpp', '// breakpoint 2'))
+
+        self.runCmd("process launch", RUN_SUCCEEDED)
+
+        self.expect("expression -- i",
+                    startstr = "(int &&) $0 =",
+                    substrs = ["3"])
+
+        self.expect("breakpoint delete 1")
+
+        self.runCmd("process continue")
+        
+        self.expect("expression -- foo(2)")
+
+        self.expect("expression -- int &&j = 3; foo(j)",
+                    error = True)
+
+        self.expect("expression -- int &&k = 6; k",
+                    startstr = "(int) $1 = 6")
+        
+if __name__ == '__main__':
+    import atexit
+    lldb.SBDebugger.Initialize()
+    atexit.register(lambda: lldb.SBDebugger.Terminate())
+    unittest2.main()
diff --git a/lldb/test/lang/cpp/rvalue-references/main.cpp b/lldb/test/lang/cpp/rvalue-references/main.cpp
new file mode 100644 (file)
index 0000000..6da34c7
--- /dev/null
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+void foo (int &&i)
+{
+  printf("%d\n", i); // breakpoint 1
+}
+
+int main()
+{
+  foo(3);
+  return 0; // breakpoint 2
+}