| """ |
| Test mpx-table command. |
| """ |
| |
| import os |
| import time |
| import re |
| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class TestMPXTable(TestBase): |
| def setUp(self): |
| TestBase.setUp(self) |
| |
| @skipIf(compiler="clang") |
| @skipIf(oslist=no_match(["linux"])) |
| @skipIf(archs=no_match(["i386", "x86_64"])) |
| @skipIf(compiler="gcc", compiler_version=["<", "5"]) # GCC version >= 5 supports |
| # Intel(R) Memory Protection Extensions (Intel(R) MPX). |
| def test_show_command(self): |
| """Test 'mpx-table show' command""" |
| self.build() |
| |
| plugin_file = os.path.join( |
| configuration.lldb_libs_dir, "liblldbIntelFeatures.so" |
| ) |
| if not os.path.isfile(plugin_file): |
| self.skipTest("features plugin missing.") |
| plugin_command = " " |
| seq = ("plugin", "load", plugin_file) |
| plugin_command = plugin_command.join(seq) |
| self.runCmd(plugin_command) |
| |
| exe = os.path.join(os.getcwd(), "a.out") |
| self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) |
| |
| self.b1 = line_number("main.cpp", "// Break 1.") |
| self.b2 = line_number("main.cpp", "// Break 2.") |
| self.b3 = line_number("main.cpp", "// Break 3.") |
| self.b4 = line_number("main.cpp", "// Break 4.") |
| lldbutil.run_break_set_by_file_and_line( |
| self, "main.cpp", self.b1, num_expected_locations=1 |
| ) |
| lldbutil.run_break_set_by_file_and_line( |
| self, "main.cpp", self.b2, num_expected_locations=1 |
| ) |
| lldbutil.run_break_set_by_file_and_line( |
| self, "main.cpp", self.b3, num_expected_locations=1 |
| ) |
| lldbutil.run_break_set_by_file_and_line( |
| self, "main.cpp", self.b4, num_expected_locations=1 |
| ) |
| self.runCmd("run", RUN_SUCCEEDED) |
| |
| target = self.dbg.GetSelectedTarget() |
| process = target.GetProcess() |
| |
| if process.GetState() == lldb.eStateExited: |
| self.skipTest("Intel(R) MPX is not supported.") |
| else: |
| self.expect( |
| "thread backtrace", |
| STOPPED_DUE_TO_BREAKPOINT, |
| substrs=["stop reason = breakpoint 1."], |
| ) |
| |
| self.expect( |
| "mpx-table show a", |
| substrs=[ |
| "lbound = 0x", |
| ", ubound = 0x", |
| "(pointer value = 0x", |
| ", metadata = 0x", |
| ")", |
| ], |
| error=False, |
| ) |
| |
| self.expect( |
| "continue", |
| STOPPED_DUE_TO_BREAKPOINT, |
| substrs=["stop reason = breakpoint 2."], |
| ) |
| |
| # Check that out of scope pointer cannot be reached. |
| # |
| self.expect("mpx-table show a", substrs=["Invalid pointer."], error=True) |
| |
| self.expect( |
| "mpx-table show tmp", |
| substrs=[ |
| "lbound = 0x", |
| ", ubound = 0x", |
| "(pointer value = 0x", |
| ", metadata = 0x", |
| ")", |
| ], |
| error=False, |
| ) |
| |
| self.expect( |
| "continue", |
| STOPPED_DUE_TO_BREAKPOINT, |
| substrs=["stop reason = breakpoint 3."], |
| ) |
| |
| # Check that the pointer value is correctly updated. |
| # |
| self.expect( |
| "mpx-table show tmp", |
| substrs=[ |
| "lbound = 0x", |
| ", ubound = 0x", |
| "(pointer value = 0x2", |
| ", metadata = 0x", |
| ")", |
| ], |
| error=False, |
| ) |
| |
| self.expect( |
| "continue", |
| STOPPED_DUE_TO_BREAKPOINT, |
| substrs=["stop reason = breakpoint 4."], |
| ) |
| |
| # After going back to main(), check that out of scope pointer cannot be |
| # reached. |
| # |
| self.expect("mpx-table show tmp", substrs=["Invalid pointer."], error=True) |
| |
| self.expect( |
| "mpx-table show a", |
| substrs=[ |
| "lbound = 0x", |
| ", ubound = 0x", |
| "(pointer value = 0x", |
| ", metadata = 0x", |
| ")", |
| ], |
| error=False, |
| ) |
| |
| def test_set_command(self): |
| """Test 'mpx-table set' command""" |
| self.build() |
| |
| plugin_file = os.path.join( |
| configuration.lldb_libs_dir, "liblldbIntelFeatures.so" |
| ) |
| if not os.path.isfile(plugin_file): |
| self.skipTest("features plugin missing.") |
| plugin_command = " " |
| seq = ("plugin", "load", plugin_file) |
| plugin_command = plugin_command.join(seq) |
| self.runCmd(plugin_command) |
| |
| exe = os.path.join(os.getcwd(), "a.out") |
| self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) |
| |
| self.b1 = line_number("main.cpp", "// Break 1.") |
| lldbutil.run_break_set_by_file_and_line( |
| self, "main.cpp", self.b1, num_expected_locations=1 |
| ) |
| self.runCmd("run", RUN_SUCCEEDED) |
| |
| target = self.dbg.GetSelectedTarget() |
| process = target.GetProcess() |
| |
| if process.GetState() == lldb.eStateExited: |
| self.skipTest("Intel(R) MPX is not supported.") |
| else: |
| self.expect( |
| "thread backtrace", |
| STOPPED_DUE_TO_BREAKPOINT, |
| substrs=["stop reason = breakpoint 1."], |
| ) |
| |
| # Check that the BT Entry doesn't already contain the test values. |
| # |
| self.expect( |
| "mpx-table show a", |
| matching=False, |
| substrs=["lbound = 0xcafecafe", ", ubound = 0xbeefbeef"], |
| ) |
| |
| # Set the test values. |
| # |
| self.expect("mpx-table set a 0xcafecafe 0xbeefbeef", error=False) |
| |
| # Verify that the test values have been correctly written in the BT |
| # entry. |
| # |
| self.expect( |
| "mpx-table show a", |
| substrs=["lbound = 0xcafecafe", ", ubound = 0xbeefbeef"], |
| error=False, |
| ) |