diff options
author | Siva Chandra <sivachandra@google.com> | 2016-03-10 01:15:17 +0000 |
---|---|---|
committer | Siva Chandra <sivachandra@google.com> | 2016-03-10 01:15:17 +0000 |
commit | aaae5f87af8945cdeac81e86429a303954473a88 (patch) | |
tree | 57a8fd611259d2bef4eda1516658745023814bc0 /lldb/packages/Python/lldbsuite/test/lang/c | |
parent | 7776377e62abfa1fae567377d5faae74a2e559ad (diff) | |
download | bcm5719-llvm-aaae5f87af8945cdeac81e86429a303954473a88.tar.gz bcm5719-llvm-aaae5f87af8945cdeac81e86429a303954473a88.zip |
[DWARFASTParserClang] Start with member offset of 0 for members of union types.
Summary:
GCC does not emit DW_AT_data_member_location for members of a union.
Starting with a 0 value for member locations helps is reading union types
in such cases.
Reviewers: clayborg
Subscribers: ldrumm, lldb-commits
Differential Revision: http://reviews.llvm.org/D18008
llvm-svn: 263085
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/lang/c')
3 files changed, 69 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/unions/Makefile b/lldb/packages/Python/lldbsuite/test/lang/c/unions/Makefile new file mode 100644 index 00000000000..b09a579159d --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/unions/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../../make + +C_SOURCES := main.c + +include $(LEVEL)/Makefile.rules diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/unions/TestUnionMembers.py b/lldb/packages/Python/lldbsuite/test/lang/c/unions/TestUnionMembers.py new file mode 100644 index 00000000000..114be3ade01 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/unions/TestUnionMembers.py @@ -0,0 +1,46 @@ +import lldb +from lldbsuite.test.lldbtest import * +import lldbsuite.test.lldbutil as lldbutil + +class TestUnionMembers(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def test_union_members(self): + self._load_exe() + + # Set breakpoints + bp = self.target.BreakpointCreateBySourceRegex("Break here", self.src_file_spec) + self.assertTrue(bp.IsValid() and bp.GetNumLocations() >= 1, VALID_BREAKPOINT) + + # Launch the process + self.process = self.target.LaunchSimple(None, None, self.get_process_working_directory()) + self.assertTrue(self.process.IsValid(), PROCESS_IS_VALID) + self.assertTrue(self.process.GetState() == lldb.eStateStopped, PROCESS_STOPPED) + + thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) + self.assertTrue(thread.IsValid()) + frame = thread.GetSelectedFrame() + self.assertTrue(frame.IsValid()) + + val = frame.EvaluateExpression("u"); + self.assertTrue(val.IsValid()) + val = frame.EvaluateExpression("u.s"); + self.assertTrue(val.IsValid()) + self.assertEqual(val.GetNumChildren(), 2) + + def _load_exe(self): + self.build() + + cwd = os.getcwd() + + src_file = os.path.join(cwd, "main.c") + self.src_file_spec = lldb.SBFileSpec(src_file) + self.assertTrue(self.src_file_spec.IsValid(), "breakpoint file") + + # Get the path of the executable + exe_path = os.path.join(cwd, 'a.out') + + # Load the executable + self.target = self.dbg.CreateTarget(exe_path) + self.assertTrue(self.target.IsValid(), VALID_TARGET) diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/unions/main.c b/lldb/packages/Python/lldbsuite/test/lang/c/unions/main.c new file mode 100644 index 00000000000..2c6a7d1e782 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/unions/main.c @@ -0,0 +1,18 @@ +#include <stdint.h> + +union S +{ + int32_t n; // occupies 4 bytes + uint16_t s[2]; // occupies 4 bytes + uint8_t c; // occupies 1 byte +}; // the whole union occupies 4 bytes + +int main() +{ + union S u; + + u.s[0] = 1234; + u.s[1] = 4321; + + return 0; // Break here +} |