""" Test mpx-table command. """ from __future__ import print_function 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): mydir = TestBase.compute_mydir(__file__) 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)