werat created this revision.
werat requested review of this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.
Add a method for getting the enumeration underlying type.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D93696
Files:
lldb/bindings/interface/SBType.i
lldb/include/lldb/API/SBType.h
lldb/include/lldb/Symbol/CompilerType.h
lldb/include/lldb/Symbol/TypeSystem.h
lldb/source/API/SBType.cpp
lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
lldb/source/Symbol/CompilerType.cpp
lldb/test/API/python_api/type/TestTypeList.py
lldb/test/API/python_api/type/main.cpp
Index: lldb/test/API/python_api/type/main.cpp
===================================================================
--- lldb/test/API/python_api/type/main.cpp
+++ lldb/test/API/python_api/type/main.cpp
@@ -31,6 +31,7 @@
enum EnumType {};
enum class ScopedEnumType {};
+enum class EnumUChar : unsigned char {};
int main (int argc, char const *argv[])
{
@@ -63,6 +64,7 @@
EnumType enum_type;
ScopedEnumType scoped_enum_type;
+ EnumUChar scoped_enum_type_uchar;
return 0; // Break at this line
}
Index: lldb/test/API/python_api/type/TestTypeList.py
===================================================================
--- lldb/test/API/python_api/type/TestTypeList.py
+++ lldb/test/API/python_api/type/TestTypeList.py
@@ -150,7 +150,24 @@
self.assertTrue(enum_type)
self.DebugSBType(enum_type)
self.assertFalse(enum_type.IsScopedEnumerationType())
+ int_enum_type = enum_type.GetEnumerationIntegerType()
+ self.assertTrue(int_enum_type)
+ self.DebugSBType(int_enum_type)
+ self.assertEquals(int_enum_type.GetName(), 'unsigned int')
+
scoped_enum_type = target.FindFirstType('ScopedEnumType')
self.assertTrue(scoped_enum_type)
self.DebugSBType(scoped_enum_type)
self.assertTrue(scoped_enum_type.IsScopedEnumerationType())
+ int_scoped_enum_type = scoped_enum_type.GetEnumerationIntegerType()
+ self.assertTrue(int_scoped_enum_type)
+ self.DebugSBType(int_scoped_enum_type)
+ self.assertEquals(int_scoped_enum_type.GetName(), 'int')
+
+ enum_uchar = target.FindFirstType('EnumUChar')
+ self.assertTrue(enum_uchar)
+ self.DebugSBType(enum_uchar)
+ int_enum_uchar = enum_uchar.GetEnumerationIntegerType()
+ self.assertTrue(int_enum_uchar)
+ self.DebugSBType(int_enum_uchar)
+ self.assertEquals(int_enum_uchar.GetName(), 'unsigned char')
Index: lldb/source/Symbol/CompilerType.cpp
===================================================================
--- lldb/source/Symbol/CompilerType.cpp
+++ lldb/source/Symbol/CompilerType.cpp
@@ -350,6 +350,12 @@
return CompilerType();
}
+CompilerType CompilerType::GetEnumerationIntegerType() const {
+ if (IsValid())
+ return m_type_system->GetEnumerationIntegerType(m_type);
+ return CompilerType();
+}
+
int CompilerType::GetFunctionArgumentCount() const {
if (IsValid()) {
return m_type_system->GetFunctionArgumentCount(m_type);
Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
===================================================================
--- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
+++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
@@ -698,6 +698,9 @@
CompilerType
GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) override;
+ CompilerType
+ GetEnumerationIntegerType(lldb::opaque_compiler_type_t type) override;
+
// Returns -1 if this isn't a function of if the function doesn't have a
// prototype Returns a value >= 0 if there is a prototype.
int GetFunctionArgumentCount(lldb::opaque_compiler_type_t type) override;
Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
===================================================================
--- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -4189,6 +4189,13 @@
return CompilerType();
}
+CompilerType
+TypeSystemClang::GetEnumerationIntegerType(lldb::opaque_compiler_type_t type) {
+ if (type)
+ return GetEnumerationIntegerType(GetType(GetCanonicalQualType(type)));
+ return CompilerType();
+}
+
int TypeSystemClang::GetFunctionArgumentCount(
lldb::opaque_compiler_type_t type) {
if (type) {
Index: lldb/source/API/SBType.cpp
===================================================================
--- lldb/source/API/SBType.cpp
+++ lldb/source/API/SBType.cpp
@@ -344,6 +344,16 @@
return LLDB_RECORD_RESULT(SBType());
}
+SBType SBType::GetEnumerationIntegerType() {
+ LLDB_RECORD_METHOD_NO_ARGS(lldb::SBType, SBType, GetEnumerationIntegerType);
+
+ if (IsValid()) {
+ return LLDB_RECORD_RESULT(
+ SBType(m_opaque_sp->GetCompilerType(true).GetEnumerationIntegerType()));
+ }
+ return LLDB_RECORD_RESULT(SBType());
+}
+
lldb::BasicType SBType::GetBasicType() {
LLDB_RECORD_METHOD_NO_ARGS(lldb::BasicType, SBType, GetBasicType);
Index: lldb/include/lldb/Symbol/TypeSystem.h
===================================================================
--- lldb/include/lldb/Symbol/TypeSystem.h
+++ lldb/include/lldb/Symbol/TypeSystem.h
@@ -228,6 +228,9 @@
virtual CompilerType GetCanonicalType(lldb::opaque_compiler_type_t type) = 0;
+ virtual CompilerType
+ GetEnumerationIntegerType(lldb::opaque_compiler_type_t type) = 0;
+
// Returns -1 if this isn't a function of if the function doesn't have a
// prototype Returns a value >= 0 if there is a prototype.
virtual int GetFunctionArgumentCount(lldb::opaque_compiler_type_t type) = 0;
Index: lldb/include/lldb/Symbol/CompilerType.h
===================================================================
--- lldb/include/lldb/Symbol/CompilerType.h
+++ lldb/include/lldb/Symbol/CompilerType.h
@@ -187,6 +187,8 @@
CompilerType GetFullyUnqualifiedType() const;
+ CompilerType GetEnumerationIntegerType() const;
+
/// Returns -1 if this isn't a function of if the function doesn't
/// have a prototype Returns a value >= 0 if there is a prototype.
int GetFunctionArgumentCount() const;
Index: lldb/include/lldb/API/SBType.h
===================================================================
--- lldb/include/lldb/API/SBType.h
+++ lldb/include/lldb/API/SBType.h
@@ -152,6 +152,9 @@
lldb::SBType GetVectorElementType();
lldb::SBType GetCanonicalType();
+
+ lldb::SBType GetEnumerationIntegerType();
+
// Get the "lldb::BasicType" enumeration for a type. If a type is not a basic
// type eBasicTypeInvalid will be returned
lldb::BasicType GetBasicType();
Index: lldb/bindings/interface/SBType.i
===================================================================
--- lldb/bindings/interface/SBType.i
+++ lldb/bindings/interface/SBType.i
@@ -244,6 +244,9 @@
lldb::SBType
GetCanonicalType();
+ lldb::SBType
+ GetEnumerationIntegerType();
+
lldb::SBType
GetArrayElementType ();
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits