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.

<rdar://problem/31159173>

llvm-svn: 298331
This commit is contained in:
Jim Ingham 2017-03-21 02:13:50 +00:00
parent dc205b3db2
commit 9a4bce70fa
4 changed files with 96 additions and 1 deletions

View File

@ -0,0 +1,3 @@
LEVEL = ../../../make
C_SOURCES := main.c
include $(LEVEL)/Makefile.rules

View File

@ -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")

View File

@ -0,0 +1,25 @@
#include <stdio.h>
#include <stdlib.h>
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;
}

View File

@ -1032,7 +1032,7 @@ size_t Module::FindTypes(
// The "type_name_cstr" will have been modified if we have a valid type // The "type_name_cstr" will have been modified if we have a valid type
// class // class
// prefix (like "struct", "class", "union", "typedef" etc). // 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); max_matches, searched_symbol_files, typesmap);
typesmap.RemoveMismatchedTypes(type_class); typesmap.RemoveMismatchedTypes(type_class);
num_matches = typesmap.GetSize(); num_matches = typesmap.GetSize();