Author: Jonas Devlieghere Date: 2023-07-28T19:10:36-07:00 New Revision: 9c70a3d9178f46c3eccb2243286deb1830c276f4
URL: https://github.com/llvm/llvm-project/commit/9c70a3d9178f46c3eccb2243286deb1830c276f4 DIFF: https://github.com/llvm/llvm-project/commit/9c70a3d9178f46c3eccb2243286deb1830c276f4.diff LOG: [lldb] Support CTF forward declarations Add support for parsing CTF forward declarations and converting them into LLDB types. Differential revision: https://reviews.llvm.org/D156483 Added: Modified: lldb/source/Plugins/SymbolFile/CTF/CTFTypes.h lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.h lldb/test/API/macosx/ctf/test.c Removed: ################################################################################ diff --git a/lldb/source/Plugins/SymbolFile/CTF/CTFTypes.h b/lldb/source/Plugins/SymbolFile/CTF/CTFTypes.h index 8c6ee278bbe356..b2cf5cf3191b64 100644 --- a/lldb/source/Plugins/SymbolFile/CTF/CTFTypes.h +++ b/lldb/source/Plugins/SymbolFile/CTF/CTFTypes.h @@ -163,6 +163,11 @@ struct CTFUnion : public CTFRecord { : CTFRecord(eUnion, uid, name, nfields, size, std::move(fields)){}; }; +struct CTFForward : public CTFType { + CTFForward(lldb::user_id_t uid, llvm::StringRef name) + : CTFType(eForward, uid, name) {} +}; + } // namespace lldb_private #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_CTF_CTFTYPES_H diff --git a/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp b/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp index 2798bc674471e1..f737db3ed4e4b2 100644 --- a/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp +++ b/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp @@ -525,6 +525,17 @@ SymbolFileCTF::CreateRecord(const CTFRecord &ctf_record) { decl, record_type, lldb_private::Type::ResolveState::Full); } +llvm::Expected<lldb::TypeSP> +SymbolFileCTF::CreateForward(const CTFForward &ctf_forward) { + CompilerType forward_compiler_type = m_ast->CreateRecordType( + nullptr, OptionalClangModuleID(), eAccessPublic, ctf_forward.name, + clang::TTK_Struct, eLanguageTypeC); + Declaration decl; + return MakeType(ctf_forward.uid, ConstString(ctf_forward.name), 0, nullptr, + LLDB_INVALID_UID, Type::eEncodingIsUID, decl, + forward_compiler_type, Type::ResolveState::Forward); +} + llvm::Expected<TypeSP> SymbolFileCTF::CreateType(CTFType *ctf_type) { if (!ctf_type) return llvm::make_error<llvm::StringError>( @@ -549,9 +560,10 @@ llvm::Expected<TypeSP> SymbolFileCTF::CreateType(CTFType *ctf_type) { case CTFType::Kind::eStruct: case CTFType::Kind::eUnion: return CreateRecord(*static_cast<CTFRecord *>(ctf_type)); + case CTFType::Kind::eForward: + return CreateForward(*static_cast<CTFForward *>(ctf_type)); case CTFType::Kind::eUnknown: case CTFType::Kind::eFloat: - case CTFType::Kind::eForward: case CTFType::Kind::eSlice: return llvm::make_error<llvm::StringError>( llvm::formatv("unsupported type (uid = {0}, name = {1}, kind = {2})", @@ -637,11 +649,12 @@ SymbolFileCTF::ParseType(lldb::offset_t &offset, lldb::user_id_t uid) { return std::make_unique<CTFRecord>(static_cast<CTFType::Kind>(kind), uid, name, variable_length, size, fields); } + case TypeKind::eForward: + return std::make_unique<CTFForward>(uid, name); case TypeKind::eUnknown: return std::make_unique<CTFType>(static_cast<CTFType::Kind>(kind), uid, name); case TypeKind::eFloat: - case TypeKind::eForward: case TypeKind::eSlice: offset += (variable_length * sizeof(uint32_t)); break; diff --git a/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.h b/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.h index 73854275ff674b..f5a78e5b59a908 100644 --- a/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.h +++ b/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.h @@ -225,6 +225,7 @@ class SymbolFileCTF : public lldb_private::SymbolFileCommon { llvm::Expected<lldb::TypeSP> CreateEnum(const CTFEnum &ctf_enum); llvm::Expected<lldb::TypeSP> CreateFunction(const CTFFunction &ctf_function); llvm::Expected<lldb::TypeSP> CreateRecord(const CTFRecord &ctf_record); + llvm::Expected<lldb::TypeSP> CreateForward(const CTFForward &ctf_forward); llvm::StringRef ReadString(lldb::offset_t offset) const; diff --git a/lldb/test/API/macosx/ctf/test.c b/lldb/test/API/macosx/ctf/test.c index a844a01f82a3db..30be60320c47ff 100644 --- a/lldb/test/API/macosx/ctf/test.c +++ b/lldb/test/API/macosx/ctf/test.c @@ -1,5 +1,7 @@ #include <stdio.h> +struct ForwardDecl; + typedef int MyInt; void populate(MyInt i); @@ -30,6 +32,7 @@ typedef struct MyStruct { } MyStructT; MyStructT foo; +struct ForwardDecl *forward; void populate(MyInt i) { foo.n.i = i; @@ -41,6 +44,7 @@ void populate(MyInt i) { foo.n.a[3] = 'd'; foo.n.e = eOne; foo.f = NULL; + forward = NULL; } int main(int argc, char** argv) { _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits