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
This commit is contained in:
Sean Callanan 2012-05-21 23:31:51 +00:00
parent 2fe1ed3e0d
commit ce8af862ae
4 changed files with 92 additions and 6 deletions

View 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))

View File

@ -0,0 +1,7 @@
LEVEL = ../../../make
CXX_SOURCES := main.cpp
CXXFLAGS = -std=c++11
include $(LEVEL)/Makefile.rules

View File

@ -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()

View File

@ -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
}