summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/array_typedef/Makefile3
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/array_typedef/TestArrayTypedef.py15
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/array_typedef/main.cpp7
-rw-r--r--lldb/source/API/SBType.cpp6
-rw-r--r--lldb/source/DataFormatters/FormatManager.cpp24
-rw-r--r--lldb/source/Symbol/ClangASTContext.cpp5
6 files changed, 54 insertions, 6 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/array_typedef/Makefile b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/array_typedef/Makefile
new file mode 100644
index 00000000000..99998b20bcb
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/array_typedef/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/array_typedef/TestArrayTypedef.py b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/array_typedef/TestArrayTypedef.py
new file mode 100644
index 00000000000..1f2914ad633
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/array_typedef/TestArrayTypedef.py
@@ -0,0 +1,15 @@
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+
+class ArrayTypedefTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+ NO_DEBUG_INFO_TESTCASE = True
+
+ def test_array_typedef(self):
+ self.build()
+ lldbutil.run_to_source_breakpoint(self, "// break here",
+ lldb.SBFileSpec("main.cpp", False))
+ self.expect("expr str", substrs=['"abcd"'])
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/array_typedef/main.cpp b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/array_typedef/main.cpp
new file mode 100644
index 00000000000..5c581b07ace
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/data-formatter/array_typedef/main.cpp
@@ -0,0 +1,7 @@
+typedef char MCHAR;
+
+int main() {
+ MCHAR str[5] = "abcd";
+ return 0; // break here
+}
+
diff --git a/lldb/source/API/SBType.cpp b/lldb/source/API/SBType.cpp
index 8efc701a79f..33b67ad4c00 100644
--- a/lldb/source/API/SBType.cpp
+++ b/lldb/source/API/SBType.cpp
@@ -212,8 +212,10 @@ SBType SBType::GetArrayElementType() {
if (!IsValid())
return LLDB_RECORD_RESULT(SBType());
- return LLDB_RECORD_RESULT(SBType(TypeImplSP(
- new TypeImpl(m_opaque_sp->GetCompilerType(true).GetArrayElementType()))));
+ CompilerType canonical_type =
+ m_opaque_sp->GetCompilerType(true).GetCanonicalType();
+ return LLDB_RECORD_RESULT(
+ SBType(TypeImplSP(new TypeImpl(canonical_type.GetArrayElementType()))));
}
SBType SBType::GetArrayType(uint64_t size) {
diff --git a/lldb/source/DataFormatters/FormatManager.cpp b/lldb/source/DataFormatters/FormatManager.cpp
index 08fc56a72ea..d5db3ee75bf 100644
--- a/lldb/source/DataFormatters/FormatManager.cpp
+++ b/lldb/source/DataFormatters/FormatManager.cpp
@@ -230,11 +230,33 @@ void FormatManager::GetPossibleMatches(
if (non_ptr_type.IsTypedefType()) {
CompilerType deffed_pointed_type =
non_ptr_type.GetTypedefedType().GetPointerType();
+ const bool stripped_typedef = true;
GetPossibleMatches(
valobj, deffed_pointed_type,
reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs,
use_dynamic, entries, did_strip_ptr, did_strip_ref,
- true); // this is not exactly the usual meaning of stripping typedefs
+ stripped_typedef); // this is not exactly the usual meaning of
+ // stripping typedefs
+ }
+ }
+
+ // For arrays with typedef-ed elements, we add a candidate with the typedef
+ // stripped.
+ uint64_t array_size;
+ if (compiler_type.IsArrayType(nullptr, &array_size, nullptr)) {
+ CompilerType element_type = compiler_type.GetArrayElementType();
+ if (element_type.IsTypedefType()) {
+ // Get the stripped element type and compute the stripped array type
+ // from it.
+ CompilerType deffed_array_type =
+ element_type.GetTypedefedType().GetArrayType(array_size);
+ const bool stripped_typedef = true;
+ GetPossibleMatches(
+ valobj, deffed_array_type,
+ reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs,
+ use_dynamic, entries, did_strip_ptr, did_strip_ref,
+ stripped_typedef); // this is not exactly the usual meaning of
+ // stripping typedefs
}
}
diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp
index c846e410acf..0cc83254947 100644
--- a/lldb/source/Symbol/ClangASTContext.cpp
+++ b/lldb/source/Symbol/ClangASTContext.cpp
@@ -3924,7 +3924,7 @@ CompilerType
ClangASTContext::GetArrayElementType(lldb::opaque_compiler_type_t type,
uint64_t *stride) {
if (type) {
- clang::QualType qual_type(GetCanonicalQualType(type));
+ clang::QualType qual_type(GetQualType(type));
const clang::Type *array_eletype =
qual_type.getTypePtr()->getArrayElementTypeNoTypeQual();
@@ -3932,8 +3932,7 @@ ClangASTContext::GetArrayElementType(lldb::opaque_compiler_type_t type,
if (!array_eletype)
return CompilerType();
- CompilerType element_type =
- GetType(array_eletype->getCanonicalTypeUnqualified());
+ CompilerType element_type = GetType(clang::QualType(array_eletype, 0));
// TODO: the real stride will be >= this value.. find the real one!
if (stride)
OpenPOWER on IntegriCloud