From: Sean Callanan Date: Mon, 21 May 2012 23:31:51 +0000 (+0000) Subject: Added support for rvalue references in debug information X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ce8af862ae3c39fb9109be955794d94a0e30549c;p=platform%2Fupstream%2Fllvm.git Added support for rvalue references in debug information (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 --- diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 135b43b..4fb4d11 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -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 index 0000000..e6d12ca --- /dev/null +++ b/lldb/test/lang/cpp/rvalue-references/Makefile @@ -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 index 0000000..897df84 --- /dev/null +++ b/lldb/test/lang/cpp/rvalue-references/TestRvalueReferences.py @@ -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 index 0000000..6da34c7 --- /dev/null +++ b/lldb/test/lang/cpp/rvalue-references/main.cpp @@ -0,0 +1,12 @@ +#include + +void foo (int &&i) +{ + printf("%d\n", i); // breakpoint 1 +} + +int main() +{ + foo(3); + return 0; // breakpoint 2 +}