Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allow installing watchpoints at less than 8-byte alligned addresses f…
…or AArch64 targets This patch allows LLDB for AArch64 to watch all bytes, words or double words individually on non 8-byte alligned addresses. This patch also adds tests to verify this functionality. Differential revision: http://reviews.llvm.org/D21280 llvm-svn: 272916
- Loading branch information
Showing
6 changed files
with
232 additions
and
4 deletions.
There are no files selected for viewing
5 changes: 5 additions & 0 deletions
5
lldb/packages/Python/lldbsuite/test/functionalities/watchpoint/watchpoint_size/Makefile
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
LEVEL = ../../../make | ||
|
||
C_SOURCES := main.c | ||
|
||
include $(LEVEL)/Makefile.rules |
117 changes: 117 additions & 0 deletions
117
...s/Python/lldbsuite/test/functionalities/watchpoint/watchpoint_size/TestWatchpointSizes.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
""" | ||
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, 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} | ||
|
||
@expectedFailureAndroid(archs=['arm', 'aarch64']) # Watchpoints not supported | ||
@expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24446: WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows") | ||
@expectedFailureAll(archs=['s390x']) # Read-write watchpoints not supported on SystemZ | ||
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') | ||
|
||
@expectedFailureAndroid(archs=['arm', 'aarch64']) # Watchpoints not supported | ||
@expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24446: WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows") | ||
@expectedFailureAll(archs=['s390x']) # Read-write watchpoints not supported on SystemZ | ||
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') | ||
|
||
@expectedFailureAndroid(archs=['arm', 'aarch64']) # Watchpoints not supported | ||
@expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24446: WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows") | ||
@expectedFailureAll(archs=['s390x']) # Read-write watchpoints not supported on SystemZ | ||
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") |
66 changes: 66 additions & 0 deletions
66
lldb/packages/Python/lldbsuite/test/functionalities/watchpoint/watchpoint_size/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
//===-- main.c --------------------------------------------------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
#include <stdio.h> | ||
#include <stdint.h> | ||
|
||
uint64_t pad0 = 0; | ||
uint8_t byteArray[8] = {0}; | ||
uint64_t pad1 = 0; | ||
uint16_t wordArray[4] = {0}; | ||
uint64_t pad2 = 0; | ||
uint32_t dwordArray[2] = {0}; | ||
|
||
int main(int argc, char** argv) { | ||
|
||
int i; | ||
uint8_t localByte; | ||
uint16_t localWord; | ||
uint32_t localDword; | ||
|
||
for (i = 0; i < 8; i++) | ||
{ | ||
printf("About to write byteArray[%d] ...\n", i); // About to write byteArray | ||
pad0++; | ||
byteArray[i]++; | ||
pad1++; | ||
localByte = byteArray[i]; // Here onwards we should'nt be stopped in loop | ||
byteArray[i]++; | ||
localByte = byteArray[i]; | ||
} | ||
|
||
pad0 = 0; | ||
pad1 = 0; | ||
|
||
for (i = 0; i < 4; i++) | ||
{ | ||
printf("About to write wordArray[%d] ...\n", i); // About to write wordArray | ||
pad0++; | ||
wordArray[i]++; | ||
pad1++; | ||
localWord = wordArray[i]; // Here onwards we should'nt be stopped in loop | ||
wordArray[i]++; | ||
localWord = wordArray[i]; | ||
} | ||
|
||
pad0 = 0; | ||
pad1 = 0; | ||
|
||
for (i = 0; i < 2; i++) | ||
{ | ||
printf("About to write dwordArray[%d] ...\n", i); // About to write dwordArray | ||
pad0++; | ||
dwordArray[i]++; | ||
pad1++; | ||
localDword = dwordArray[i]; // Here onwards we shouldn't be stopped in loop | ||
dwordArray[i]++; | ||
localDword = dwordArray[i]; | ||
} | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters