aboutsummaryrefslogtreecommitdiff
path: root/packages/Python/lldbsuite/test/functionalities/watchpoint/watchpoint_size/TestWatchpointSizes.py
blob: e342e34667fe9dffef7612ae9285078175375894 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
"""
Test watchpoint size cases (1-byte, 2-byte, 4-byte).
Make sure we can watch all bytes, words or double words individually
when they are packed in a 8-byte region.

"""

from __future__ import print_function

import os
import time
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class WatchpointSizeTestCase(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    mydir = TestBase.compute_mydir(__file__)

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)

        # Source filename.
        self.source = 'main.c'

        # Output filename.
        self.exe_name = 'a.out'
        self.d = {'C_SOURCES': self.source, 'EXE': self.exe_name}

    # Watchpoints not supported
    @expectedFailureAndroid(archs=['arm', 'aarch64'])
    @expectedFailureAll(
        oslist=["windows"],
        bugnumber="llvm.org/pr24446: WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows")
    # Read-write watchpoints not supported on SystemZ
    @expectedFailureAll(archs=['s390x'])
    def test_byte_size_watchpoints_with_byte_selection(self):
        """Test to selectively watch different bytes in a 8-byte array."""
        self.run_watchpoint_size_test('byteArray', 8, '1')

    # Watchpoints not supported
    @expectedFailureAndroid(archs=['arm', 'aarch64'])
    @expectedFailureAll(
        oslist=["windows"],
        bugnumber="llvm.org/pr24446: WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows")
    # Read-write watchpoints not supported on SystemZ
    @expectedFailureAll(archs=['s390x'])
    def test_two_byte_watchpoints_with_word_selection(self):
        """Test to selectively watch different words in an 8-byte word array."""
        self.run_watchpoint_size_test('wordArray', 4, '2')

    # Watchpoints not supported
    @expectedFailureAndroid(archs=['arm', 'aarch64'])
    @expectedFailureAll(
        oslist=["windows"],
        bugnumber="llvm.org/pr24446: WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows")
    # Read-write watchpoints not supported on SystemZ
    @expectedFailureAll(archs=['s390x'])
    def test_four_byte_watchpoints_with_dword_selection(self):
        """Test to selectively watch two double words in an 8-byte dword array."""
        self.run_watchpoint_size_test('dwordArray', 2, '4')

    def run_watchpoint_size_test(self, arrayName, array_size, watchsize):
        self.build(dictionary=self.d)
        self.setTearDownCleanup(dictionary=self.d)

        exe = os.path.join(os.getcwd(), self.exe_name)
        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)

        # Detect line number after which we are going to increment arrayName.
        loc_line = line_number('main.c', '// About to write ' + arrayName)

        # Set a breakpoint on the line detected above.
        lldbutil.run_break_set_by_file_and_line(
            self, "main.c", loc_line, num_expected_locations=1, loc_exact=True)

        # Run the program.
        self.runCmd("run", RUN_SUCCEEDED)

        for i in range(array_size):
            # We should be stopped again due to the breakpoint.
            # The stop reason of the thread should be breakpoint.
            self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
                        substrs=['stopped', 'stop reason = breakpoint'])

            # Set a read_write type watchpoint arrayName
            watch_loc = arrayName + "[" + str(i) + "]"
            self.expect(
                "watchpoint set variable -w read_write " +
                watch_loc,
                WATCHPOINT_CREATED,
                substrs=[
                    'Watchpoint created',
                    'size = ' +
                    watchsize,
                    'type = rw'])

            # Use the '-v' option to do verbose listing of the watchpoint.
            # The hit count should be 0 initially.
            self.expect("watchpoint list -v", substrs=['hit_count = 0'])

            self.runCmd("process continue")

            # We should be stopped due to the watchpoint.
            # The stop reason of the thread should be watchpoint.
            self.expect("thread list", STOPPED_DUE_TO_WATCHPOINT,
                        substrs=['stopped', 'stop reason = watchpoint'])

            # Use the '-v' option to do verbose listing of the watchpoint.
            # The hit count should now be 1.
            self.expect("watchpoint list -v",
                        substrs=['hit_count = 1'])

            self.runCmd("process continue")

            # We should be stopped due to the watchpoint.
            # The stop reason of the thread should be watchpoint.
            self.expect("thread list", STOPPED_DUE_TO_WATCHPOINT,
                        substrs=['stopped', 'stop reason = watchpoint'])

            # Use the '-v' option to do verbose listing of the watchpoint.
            # The hit count should now be 1.
            # Verify hit_count has been updated after value has been read.
            self.expect("watchpoint list -v",
                        substrs=['hit_count = 2'])

            # Delete the watchpoint immediately, but set auto-confirm to true
            # first.
            self.runCmd("settings set auto-confirm true")
            self.expect(
                "watchpoint delete",
                substrs=['All watchpoints removed.'])
            # Restore the original setting of auto-confirm.
            self.runCmd("settings clear auto-confirm")

            self.runCmd("process continue")