From 9a4bce70faf67e635dbc91db7597b308f196f9e0 Mon Sep 17 00:00:00 2001 From: Jim Ingham Date: Tue, 21 Mar 2017 02:13:50 +0000 Subject: [PATCH] FindTypes should find "struct TypeName" as well as "TypeName". This fixes a bug introduced by r291559. The Module's FindType was passing the original name not the basename in the case where it didn't find any separators. I also added a testcase for this. llvm-svn: 298331 --- .../test/lang/c/find_struct_type/Makefile | 3 + .../c/find_struct_type/TestFindStructTypes.py | 67 +++++++++++++++++++ .../test/lang/c/find_struct_type/main.c | 25 +++++++ lldb/source/Core/Module.cpp | 2 +- 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 lldb/packages/Python/lldbsuite/test/lang/c/find_struct_type/Makefile create mode 100644 lldb/packages/Python/lldbsuite/test/lang/c/find_struct_type/TestFindStructTypes.py create mode 100644 lldb/packages/Python/lldbsuite/test/lang/c/find_struct_type/main.c diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/find_struct_type/Makefile b/lldb/packages/Python/lldbsuite/test/lang/c/find_struct_type/Makefile new file mode 100644 index 000000000000..cd9ca5c86d84 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/find_struct_type/Makefile @@ -0,0 +1,3 @@ +LEVEL = ../../../make +C_SOURCES := main.c +include $(LEVEL)/Makefile.rules diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/find_struct_type/TestFindStructTypes.py b/lldb/packages/Python/lldbsuite/test/lang/c/find_struct_type/TestFindStructTypes.py new file mode 100644 index 000000000000..bbe5be67c08d --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/find_struct_type/TestFindStructTypes.py @@ -0,0 +1,67 @@ +""" +Make sure FindTypes finds struct types with the struct prefix. +""" + +from __future__ import print_function + + +import os +import time +import re +import lldb +import lldbsuite.test.lldbutil as lldbutil +from lldbsuite.test.lldbtest import * + + +class TestFindTypesOnStructType(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + # If your test case doesn't stress debug info, the + # set this to true. That way it won't be run once for + # each debug info format. + NO_DEBUG_INFO_TESTCASE = True + + def test_find_types_struct_type(self): + """Make sure FindTypes actually finds 'struct typename' not just 'typename'.""" + self.build() + self.do_test() + + def setUp(self): + # Call super's setUp(). + TestBase.setUp(self) + + def do_test(self): + """Make sure FindTypes actually finds 'struct typename' not just 'typename'.""" + exe = os.path.join(os.getcwd(), "a.out") + + # Create a target by the debugger. + target = self.dbg.CreateTarget(exe) + self.assertTrue(target, VALID_TARGET) + + # Make sure this works with struct + type_list = target.FindTypes("struct mytype") + self.assertEqual(type_list.GetSize(), 1, "Found one instance of the type with struct") + + # Make sure this works without the struct: + type_list = target.FindTypes("mytype") + self.assertEqual(type_list.GetSize(), 1, "Found one instance of the type without struct") + + # Make sure it works with union + type_list = target.FindTypes("union myunion") + self.assertEqual(type_list.GetSize(), 1, "Found one instance of the type with union") + + # Make sure this works without the union: + type_list = target.FindTypes("myunion") + self.assertEqual(type_list.GetSize(), 1, "Found one instance of the type without union") + + # Make sure it works with typedef + type_list = target.FindTypes("typedef MyType") + self.assertEqual(type_list.GetSize(), 1, "Found one instance of the type with typedef") + + # Make sure this works without the typedef: + type_list = target.FindTypes("MyType") + self.assertEqual(type_list.GetSize(), 1, "Found one instance of the type without typedef") + + + diff --git a/lldb/packages/Python/lldbsuite/test/lang/c/find_struct_type/main.c b/lldb/packages/Python/lldbsuite/test/lang/c/find_struct_type/main.c new file mode 100644 index 000000000000..fa009af27e17 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/c/find_struct_type/main.c @@ -0,0 +1,25 @@ +#include +#include +struct mytype { + int c; + int d; +}; + +union myunion { + int num; + char *str; +}; + +typedef struct mytype MyType; + +int main() +{ + struct mytype v; + MyType *v_ptr = &v; + + union myunion u = {5}; + v.c = u.num; + v.d = 10; + return v.c + v.d; +} + diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index d2034d6518d2..2156cbe26be9 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -1032,7 +1032,7 @@ size_t Module::FindTypes( // The "type_name_cstr" will have been modified if we have a valid type // class // prefix (like "struct", "class", "union", "typedef" etc). - FindTypes_Impl(sc, ConstString(type_name_cstr), nullptr, append, + FindTypes_Impl(sc, ConstString(type_basename), nullptr, append, max_matches, searched_symbol_files, typesmap); typesmap.RemoveMismatchedTypes(type_class); num_matches = typesmap.GetSize();