[lldbsuite, windows] Don't crash LLDB when we try to retrieve a register on Windows

Summary:
1) When ReadRegister is called with a null register into on Windows, rather than crashing due to an access violation, simply return false. Not all registers and properties will be read or calculated correctly, but that is consistent with other platforms that also return false in that case
2) Update a couple of tests to reference pr37995 as their reason for failure since it is much more accurate. Support for floating point registers doesn't exist on Windows at all, rather than having issues.

Reviewers: asmith, labath, zturner

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D48844

llvm-svn: 336147
This commit is contained in:
Stella Stamenova 2018-07-02 21:50:31 +00:00
parent 2443bbd4aa
commit 696ce3770b
5 changed files with 18 additions and 12 deletions

View File

@ -22,6 +22,7 @@ class TestYMMRegister(TestBase):
@skipIfTargetAndroid()
@skipIf(archs=no_match(['i386', 'x86_64']))
@expectedFailureAll(oslist=["linux"], bugnumber="rdar://30523153")
@expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr37995")
def test(self):
self.build(dictionary={"CFLAGS_EXTRAS": "-march=haswell"})
self.setTearDownCleanup()

View File

@ -59,7 +59,7 @@ class RegisterCommandsTestCase(TestBase):
# problem
@skipIfTargetAndroid(archs=["i386"])
@skipIf(archs=no_match(['amd64', 'arm', 'i386', 'x86_64']))
@expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr37683")
@expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr37995")
def test_fp_register_write(self):
"""Test commands that write to registers, in particular floating-point registers."""
self.build()
@ -71,7 +71,7 @@ class RegisterCommandsTestCase(TestBase):
@skipIfFreeBSD # llvm.org/pr25057
@skipIf(archs=no_match(['amd64', 'i386', 'x86_64']))
@skipIfOutOfTreeDebugserver
@expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr37683")
@expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr37995")
def test_fp_special_purpose_register_read(self):
"""Test commands that read fpu special purpose registers."""
self.build()

View File

@ -9,25 +9,26 @@ import os
import time
import re
import lldb
import lldbsuite.test.lldbutil as lldbutil
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import decorators
from lldbsuite.test import lldbutil
class TestTrivialABI(TestBase):
mydir = TestBase.compute_mydir(__file__)
NO_DEBUG_INFO_TESTCASE = True
@decorators.skipUnlessSupportedTypeAttribute("trivial_abi")
@skipUnlessSupportedTypeAttribute("trivial_abi")
@expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr37995")
def test_call_trivial(self):
"""Test that we can print a variable & call a function with a trivial ABI class."""
self.build()
self.main_source_file = lldb.SBFileSpec("main.cpp")
self.expr_test(True)
@decorators.skipUnlessSupportedTypeAttribute("trivial_abi")
@decorators.expectedFailureAll(bugnumber="llvm.org/pr36870")
@skipUnlessSupportedTypeAttribute("trivial_abi")
@expectedFailureAll(bugnumber="llvm.org/pr36870")
def test_call_nontrivial(self):
"""Test that we can print a variable & call a function on the same class w/o the trivial ABI marker."""
self.build()
@ -43,7 +44,7 @@ class TestTrivialABI(TestBase):
ivar = test_var.GetChildMemberWithName("ivar")
self.assertTrue(test_var.GetError().Success(), "Failed to fetch ivar")
self.assertEqual(ivar_value, ivar.GetValueAsSigned(), "Got the right value for ivar")
def check_frame(self, thread):
frame = thread.frames[0]
inVal_var = frame.FindVariable("inVal")
@ -56,7 +57,7 @@ class TestTrivialABI(TestBase):
thread.StepOut()
outVal_ret = thread.GetStopReturnValue()
self.check_value(outVal_ret, 30)
def expr_test(self, trivial):
(target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self,
"Set a breakpoint here", self.main_source_file)
@ -71,5 +72,3 @@ class TestTrivialABI(TestBase):
self.assertEqual(len(threads), 1, "Hit my breakpoint the second time.")
self.check_frame(threads[0])

View File

@ -206,6 +206,9 @@ bool RegisterContextWindows_x64::ReadRegister(const RegisterInfo *reg_info,
if (!CacheAllRegisterValues())
return false;
if (reg_info == nullptr)
return false;
switch (reg_info->kinds[eRegisterKindLLDB]) {
case lldb_rax_x86_64:
reg_value.SetUInt64(m_context.Rax);

View File

@ -176,6 +176,9 @@ bool RegisterContextWindows_x86::ReadRegister(const RegisterInfo *reg_info,
if (!CacheAllRegisterValues())
return false;
if (reg_info == nullptr)
return false;
uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
switch (reg) {
case lldb_eax_i386: