forked from OSchip/llvm-project
Fix bug in expression display when determining if a pointer should be treated as a string
Summary: Currently if the "first child" of the pointer is a char type then the pointer is displayed as a string. This test succeeds incorrectly when the pointer is to a structured type with a char type as its first field. Fix this by switching the test to retrieve the pointee type and checking that it is a char type. Reviewers: abidh, ChuckR, ki.stfu Subscribers: greggm, lldb-commits Differential Revision: http://reviews.llvm.org/D11488 llvm-svn: 243619
This commit is contained in:
parent
6fc590dadc
commit
6940581e45
|
@ -132,6 +132,10 @@ class MiGdbSetShowTestCase(lldbmi_testcase.MiTestCaseBase):
|
|||
self.runCmd("-var-create var2 * complx_array")
|
||||
self.expect("\^done,name=\"var2\",numchild=\"2\",value=\"\[2\]\",type=\"complex_type \[2\]\",thread-id=\"1\",has_more=\"0\"")
|
||||
|
||||
# Test that a struct with a char first element is not formatted as a string
|
||||
self.runCmd("-var-create - * &nstr")
|
||||
self.expect("\^done,name=\"var\d+\",numchild=\"2\",value=\"0x[0-9a-f]+\",type=\"not_str \*\",thread-id=\"1\",has_more=\"0\"")
|
||||
|
||||
# Test that -gdb-set can set print expand-aggregates flag
|
||||
self.runCmd("-gdb-set print expand-aggregates on")
|
||||
self.expect("\^done")
|
||||
|
|
|
@ -67,11 +67,20 @@ gdb_set_show_print_char_array_as_string_test(void)
|
|||
// BP_gdb_set_show_print_char_array_as_string_test
|
||||
}
|
||||
|
||||
struct not_str
|
||||
{
|
||||
not_str(char _c, int _f)
|
||||
: c(_c), f(_f) { }
|
||||
char c;
|
||||
int f;
|
||||
};
|
||||
|
||||
void
|
||||
gdb_set_show_print_expand_aggregates(void)
|
||||
{
|
||||
complex_type complx = { 3, { 3L }, &complx };
|
||||
complex_type complx_array[2] = { { 4, { 4L }, &complx_array[1] }, { 5, { 5 }, &complx_array[0] } };
|
||||
not_str nstr('a', 0), *pnstr = &nstr;
|
||||
|
||||
// BP_gdb_set_show_print_expand_aggregates
|
||||
}
|
||||
|
|
|
@ -136,7 +136,7 @@ CMICmnLLDBUtilSBValue::GetSimpleValue(const bool vbHandleArrayType, CMIUtilStrin
|
|||
}
|
||||
else if (IsPointerType())
|
||||
{
|
||||
if (m_bHandleCharType && IsFirstChildCharType())
|
||||
if (m_bHandleCharType && IsPointeeCharType())
|
||||
{
|
||||
vwrValue = GetSimpleValueCStringPointer();
|
||||
return MIstatus::success;
|
||||
|
@ -348,17 +348,15 @@ CMICmnLLDBUtilSBValue::GetCompositeValue(const bool vbPrintFieldNames, CMICmnMIV
|
|||
}
|
||||
|
||||
//++ ------------------------------------------------------------------------------------
|
||||
// Details: Retrieve the flag stating whether this value object is a char type or some
|
||||
// other type. Char type can be signed or unsigned.
|
||||
// Type: Method.
|
||||
// Args: None.
|
||||
// Details: Check that basic type is a char type. Char type can be signed or unsigned.
|
||||
// Type: Static.
|
||||
// Args: eType - type to check
|
||||
// Return: bool - True = Yes is a char type, false = some other type.
|
||||
// Throws: None.
|
||||
//--
|
||||
bool
|
||||
CMICmnLLDBUtilSBValue::IsCharType(void) const
|
||||
CMICmnLLDBUtilSBValue::IsCharBasicType(lldb::BasicType eType)
|
||||
{
|
||||
const lldb::BasicType eType = m_rValue.GetType().GetBasicType();
|
||||
switch (eType)
|
||||
{
|
||||
case lldb::eBasicTypeChar:
|
||||
|
@ -372,6 +370,21 @@ CMICmnLLDBUtilSBValue::IsCharType(void) const
|
|||
}
|
||||
}
|
||||
|
||||
//++ ------------------------------------------------------------------------------------
|
||||
// Details: Retrieve the flag stating whether this value object is a char type or some
|
||||
// other type. Char type can be signed or unsigned.
|
||||
// Type: Method.
|
||||
// Args: None.
|
||||
// Return: bool - True = Yes is a char type, false = some other type.
|
||||
// Throws: None.
|
||||
//--
|
||||
bool
|
||||
CMICmnLLDBUtilSBValue::IsCharType(void) const
|
||||
{
|
||||
const lldb::BasicType eType = m_rValue.GetType().GetBasicType();
|
||||
return IsCharBasicType(eType);
|
||||
}
|
||||
|
||||
//++ ------------------------------------------------------------------------------------
|
||||
// Details: Retrieve the flag stating whether first child value object of *this object is
|
||||
// a char type or some other type. Returns false if there are not children. Char
|
||||
|
@ -395,6 +408,28 @@ CMICmnLLDBUtilSBValue::IsFirstChildCharType(void) const
|
|||
return utilValue.IsCharType();
|
||||
}
|
||||
|
||||
//++ ------------------------------------------------------------------------------------
|
||||
// Details: Retrieve the flag stating whether pointee object of *this object is
|
||||
// a char type or some other type. Returns false if there are not children. Char
|
||||
// type can be signed or unsigned.
|
||||
// Type: Method.
|
||||
// Args: None.
|
||||
// Return: bool - True = Yes is a char type, false = some other type.
|
||||
// Throws: None.
|
||||
//--
|
||||
bool
|
||||
CMICmnLLDBUtilSBValue::IsPointeeCharType(void) const
|
||||
{
|
||||
const MIuint nChildren = m_rValue.GetNumChildren();
|
||||
|
||||
// Is it a basic type
|
||||
if (nChildren == 0)
|
||||
return false;
|
||||
|
||||
const lldb::BasicType eType = m_rValue.GetType().GetPointeeType().GetBasicType();
|
||||
return IsCharBasicType(eType);
|
||||
}
|
||||
|
||||
//++ ------------------------------------------------------------------------------------
|
||||
// Details: Retrieve the flag stating whether this value object is a integer type or some
|
||||
// other type. Char type can be signed or unsigned and short or long/very long.
|
||||
|
|
|
@ -37,6 +37,7 @@ class CMICmnLLDBUtilSBValue
|
|||
CMIUtilString GetTypeNameDisplay(void) const;
|
||||
bool IsCharType(void) const;
|
||||
bool IsFirstChildCharType(void) const;
|
||||
bool IsPointeeCharType(void) const;
|
||||
bool IsIntegerType(void) const;
|
||||
bool IsPointerType(void) const;
|
||||
bool IsArrayType(void) const;
|
||||
|
@ -55,6 +56,10 @@ class CMICmnLLDBUtilSBValue
|
|||
CMIUtilString GetSimpleValueCStringArray(void) const;
|
||||
bool GetCompositeValue(const bool vbPrintFieldNames, CMICmnMIValueTuple &vwrMiValueTuple, const MIuint vnDepth = 1) const;
|
||||
|
||||
// Statics:
|
||||
private:
|
||||
static bool IsCharBasicType(lldb::BasicType eType);
|
||||
|
||||
// Attributes:
|
||||
private:
|
||||
lldb::SBValue &m_rValue;
|
||||
|
|
Loading…
Reference in New Issue