//===-- SymbolFileCTF.h -----------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_CTF_SYMBOLFILECTF_H #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_CTF_SYMBOLFILECTF_H #include #include #include #include "CTFTypes.h" #include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/SymbolFile.h" namespace lldb_private { class SymbolFileCTF : public lldb_private::SymbolFileCommon { /// LLVM RTTI support. static char ID; public: /// LLVM RTTI support. /// \{ bool isA(const void *ClassID) const override { return ClassID == &ID || SymbolFileCommon::isA(ClassID); } static bool classof(const SymbolFile *obj) { return obj->isA(&ID); } /// \} SymbolFileCTF(lldb::ObjectFileSP objfile_sp); static void Initialize(); static void Terminate(); static llvm::StringRef GetPluginNameStatic() { return "CTF"; } static llvm::StringRef GetPluginDescriptionStatic(); static lldb_private::SymbolFile * CreateInstance(lldb::ObjectFileSP objfile_sp); llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } uint32_t CalculateAbilities() override; void InitializeObject() override; lldb::LanguageType ParseLanguage(CompileUnit &comp_unit) override { return lldb::eLanguageTypeUnknown; } bool ParseHeader(); size_t ParseFunctions(CompileUnit &comp_unit) override; size_t ParseObjects(CompileUnit &comp_unit); bool ParseLineTable(CompileUnit &comp_unit) override { return false; } bool ParseDebugMacros(CompileUnit &comp_unit) override { return false; } bool ParseSupportFiles(CompileUnit &comp_unit, SupportFileList &support_files) override { return false; } size_t ParseTypes(CompileUnit &cu) override; bool ParseImportedModules( const SymbolContext &sc, std::vector &imported_modules) override { return false; } size_t ParseBlocksRecursive(Function &func) override { return 0; } size_t ParseVariablesForContext(const SymbolContext &sc) override; uint32_t CalculateNumCompileUnits() override { return 0; } lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override; Type *ResolveTypeUID(lldb::user_id_t type_uid) override; std::optional GetDynamicArrayInfoForUID( lldb::user_id_t type_uid, const lldb_private::ExecutionContext *exe_ctx) override { return std::nullopt; } bool CompleteType(CompilerType &compiler_type) override; uint32_t ResolveSymbolContext(const lldb_private::Address &so_addr, lldb::SymbolContextItem resolve_scope, lldb_private::SymbolContext &sc) override; void AddSymbols(Symtab &symtab) override; void GetTypes(lldb_private::SymbolContextScope *sc_scope, lldb::TypeClass type_mask, lldb_private::TypeList &type_list) override {} void FindTypes(const lldb_private::TypeQuery &match, lldb_private::TypeResults &results) override; void FindTypesByRegex(const lldb_private::RegularExpression ®ex, uint32_t max_matches, lldb_private::TypeMap &types); void FindFunctions(const lldb_private::Module::LookupInfo &lookup_info, const lldb_private::CompilerDeclContext &parent_decl_ctx, bool include_inlines, lldb_private::SymbolContextList &sc_list) override; void FindFunctions(const lldb_private::RegularExpression ®ex, bool include_inlines, lldb_private::SymbolContextList &sc_list) override; void FindGlobalVariables(lldb_private::ConstString name, const lldb_private::CompilerDeclContext &parent_decl_ctx, uint32_t max_matches, lldb_private::VariableList &variables) override; void FindGlobalVariables(const lldb_private::RegularExpression ®ex, uint32_t max_matches, lldb_private::VariableList &variables) override; enum TypeKind : uint32_t { eUnknown = 0, eInteger = 1, eFloat = 2, ePointer = 3, eArray = 4, eFunction = 5, eStruct = 6, eUnion = 7, eEnum = 8, eForward = 9, eTypedef = 10, eVolatile = 11, eConst = 12, eRestrict = 13, eSlice = 14, }; private: enum Flags : uint32_t { eFlagCompress = (1u << 0), eFlagNewFuncInfo = (1u << 1), eFlagIdxSorted = (1u << 2), eFlagDynStr = (1u << 3), }; enum IntEncoding : uint32_t { eSigned = 0x1, eChar = 0x2, eBool = 0x4, eVarArgs = 0x8, }; struct ctf_preamble_t { uint16_t magic; uint8_t version; uint8_t flags; }; struct ctf_header_t { ctf_preamble_t preamble; uint32_t parlabel; uint32_t parname; uint32_t lbloff; uint32_t objtoff; uint32_t funcoff; uint32_t typeoff; uint32_t stroff; uint32_t strlen; }; struct ctf_type_t { uint32_t name; uint32_t info; union { uint32_t size; uint32_t type; }; uint32_t lsizehi; uint32_t lsizelo; }; struct ctf_stype_t { uint32_t name; uint32_t info; union { uint32_t size; uint32_t type; }; bool IsLargeType() const { return size == 0xffff; } uint32_t GetStructSize() const { if (IsLargeType()) return sizeof(ctf_type_t); return sizeof(ctf_stype_t); } uint32_t GetType() const { return type; } uint32_t GetSize() const { return size; } }; llvm::Expected> ParseType(lldb::offset_t &offset, lldb::user_id_t uid); llvm::Expected CreateType(CTFType *ctf_type); llvm::Expected CreateInteger(const CTFInteger &ctf_integer); llvm::Expected CreateModifier(const CTFModifier &ctf_modifier); llvm::Expected CreateTypedef(const CTFTypedef &ctf_typedef); llvm::Expected CreateArray(const CTFArray &ctf_array); llvm::Expected CreateEnum(const CTFEnum &ctf_enum); llvm::Expected CreateFunction(const CTFFunction &ctf_function); llvm::Expected CreateRecord(const CTFRecord &ctf_record); llvm::Expected CreateForward(const CTFForward &ctf_forward); llvm::StringRef ReadString(lldb::offset_t offset) const; std::vector GetFieldSizes(lldb::offset_t field_offset, uint32_t fields, uint32_t struct_size); DataExtractor m_data; /// The start offset of the CTF body into m_data. If the body is uncompressed, /// m_data contains the header and the body and the body starts after the /// header. If the body is compressed, m_data only contains the body and the /// offset is zero. lldb::offset_t m_body_offset = 0; TypeSystemClang *m_ast; lldb::CompUnitSP m_comp_unit_sp; std::optional m_header; /// Parsed CTF types. llvm::DenseMap> m_ctf_types; /// Parsed LLDB types. llvm::DenseMap m_types; /// To complete types, we need a way to map (imcomplete) compiler types back /// to parsed CTF types. llvm::DenseMap m_compiler_types; std::vector m_functions; std::vector m_variables; static constexpr uint16_t g_ctf_magic = 0xcff1; static constexpr uint8_t g_ctf_version = 4; static constexpr uint16_t g_ctf_field_threshold = 0x2000; }; } // namespace lldb_private #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_CTF_SYMBOLFILECTF_H