diff options
32 files changed, 1769 insertions, 1551 deletions
diff --git a/lldb/include/lldb/Core/ClangForward.h b/lldb/include/lldb/Core/ClangForward.h index 3f4a2aee832..ab5166fc09d 100644 --- a/lldb/include/lldb/Core/ClangForward.h +++ b/lldb/include/lldb/Core/ClangForward.h @@ -24,9 +24,13 @@ namespace clang class Context; } + class Action; class ASTContext; + class ASTRecordLayout; class AddrLabelExpr; + class AnalyzerOptions; class BinaryOperator; + class CodeGenOptions; class CodeGenerator; class CompilerInstance; class CXXBaseSpecifier; @@ -38,18 +42,23 @@ namespace clang class CharacterLiteral; class CompoundAssignOperator; class Decl; + class DeclarationName; class DeclaratorDecl; class DeclContext; class DeclRefExpr; class DeclStmt; + class DependencyOutputOptions; class Diagnostic; + class DiagnosticOptions; class EnumDecl; class Expr; class ExtVectorElementExpr; class FieldDecl; class FloatingLiteral; + class FrontendOptions; class FunctionDecl; class GotoStmt; + class HeaderSearchOptions; class IdentifierTable; class IntegerLiteral; class LabelStmt; @@ -72,6 +81,8 @@ namespace clang class ParenExpr; class ParmVarDecl; class PredefinedExpr; + class PreprocessorOptions; + class PreprocessorOutputOptions; class QualType; class QualifiedNameType; class RecordDecl; diff --git a/lldb/include/lldb/Expression/ClangExpressionDeclMap.h b/lldb/include/lldb/Expression/ClangExpressionDeclMap.h index 7e1bdca1244..366067ff859 100644 --- a/lldb/include/lldb/Expression/ClangExpressionDeclMap.h +++ b/lldb/include/lldb/Expression/ClangExpressionDeclMap.h @@ -21,13 +21,7 @@ // Project includes #include "lldb/Core/ClangForward.h" #include "lldb/Core/Value.h" -#include "lldb/Symbol/ASTType.h" - -namespace clang { - class DeclarationName; - class DeclContext; - class QualType; -} +#include "lldb/Symbol/ClangASTType.h" namespace llvm { class Value; @@ -35,6 +29,33 @@ namespace llvm { namespace lldb_private { +//---------------------------------------------------------------------- +// For cases in which there are multiple classes of types that are not +// interchangeable, to allow static type checking. +//---------------------------------------------------------------------- +template <unsigned int C> class TaggedClangASTType : public ClangASTType +{ +public: + TaggedClangASTType (void *type, clang::ASTContext *ast_context) : + ClangASTType(type, ast_context) { } + + TaggedClangASTType (const TaggedClangASTType<C> &tw) : + ClangASTType(tw) { } + + TaggedClangASTType () : + ClangASTType() { } + + ~TaggedClangASTType() { } + + const TaggedClangASTType<C> & + operator= (const TaggedClangASTType<C> &tw) + { + ClangASTType::operator= (tw); + return *this; + } +}; + + class Error; class Function; class NameSearchContext; @@ -83,8 +104,8 @@ public: void GetDecls (NameSearchContext &context, const char *name); private: - typedef TaggedASTType<0> TypeFromParser; - typedef TaggedASTType<1> TypeFromUser; + typedef TaggedClangASTType<0> TypeFromParser; + typedef TaggedClangASTType<1> TypeFromUser; struct Tuple { diff --git a/lldb/include/lldb/Expression/ClangFunction.h b/lldb/include/lldb/Expression/ClangFunction.h index f76157a9c6d..f0555bc916a 100644 --- a/lldb/include/lldb/Expression/ClangFunction.h +++ b/lldb/include/lldb/Expression/ClangFunction.h @@ -26,11 +26,6 @@ // Right now, this is just a toy. It calls a set function, with fixed // values. -namespace clang -{ - class ASTRecordLayout; -} - namespace lldb_private { diff --git a/lldb/include/lldb/Expression/ClangResultSynthesizer.h b/lldb/include/lldb/Expression/ClangResultSynthesizer.h index ed00401486a..4953bd4b707 100644 --- a/lldb/include/lldb/Expression/ClangResultSynthesizer.h +++ b/lldb/include/lldb/Expression/ClangResultSynthesizer.h @@ -11,10 +11,7 @@ #define liblldb_ClangResultSynthesizer_h_ #include "clang/Sema/SemaConsumer.h" - -namespace clang { - class Action; -} +#include "lldb/Core/ClangForward.h" namespace lldb_private { diff --git a/lldb/include/lldb/Symbol/ASTType.h b/lldb/include/lldb/Symbol/ASTType.h deleted file mode 100644 index 3ce0789ab47..00000000000 --- a/lldb/include/lldb/Symbol/ASTType.h +++ /dev/null @@ -1,113 +0,0 @@ -//===-- ASTType.h -----------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef liblldb_ASTType_h_ -#define liblldb_ASTType_h_ - -namespace clang -{ - class ASTContext; -} - -namespace lldb_private -{ - -class ASTTypeBase -{ -protected: - ASTTypeBase (void *type, clang::ASTContext *ast_context) : - m_type(type), - m_ast_context(ast_context) - { - } - - ASTTypeBase (const ASTTypeBase &tw) : - m_type(tw.m_type), - m_ast_context(tw.m_ast_context) - { - } - - ASTTypeBase () : - m_type(0), - m_ast_context(0) - { - } - - ~ASTTypeBase(); - - ASTTypeBase &operator= (const ASTTypeBase &atb) - { - m_type = atb.m_type; - m_ast_context = atb.m_ast_context; - return *this; - } - -public: - void *GetType() const - { - return m_type; - } - - clang::ASTContext *GetASTContext() const - { - return m_ast_context; - } - -private: - void *m_type; - clang::ASTContext *m_ast_context; -}; - -class ASTType : public ASTTypeBase -{ -public: - ASTType (void *type, clang::ASTContext *ast_context) : - ASTTypeBase(type, ast_context) { } - - ASTType (const ASTType &at) : - ASTTypeBase(at) { } - - ASTType () : - ASTTypeBase() { } - - ~ASTType(); - - ASTType &operator= (const ASTType &at) - { - ASTTypeBase::operator= (at); - return *this; - } -}; - -// For cases in which there are multiple classes of types that are not -// interchangeable, to allow static type checking. -template <unsigned int C> class TaggedASTType : public ASTTypeBase -{ -public: - TaggedASTType (void *type, clang::ASTContext *ast_context) : - ASTTypeBase(type, ast_context) { } - - TaggedASTType (const TaggedASTType<C> &tw) : - ASTTypeBase(tw) { } - - TaggedASTType () : - ASTTypeBase() { } - - ~TaggedASTType() { } - - TaggedASTType<C> &operator= (const TaggedASTType<C> &tw) - { - ASTTypeBase::operator= (tw); - return *this; - } -}; - -} - -#endif diff --git a/lldb/include/lldb/Symbol/ClangASTContext.h b/lldb/include/lldb/Symbol/ClangASTContext.h index faaf5872a60..565f3ce2e57 100644 --- a/lldb/include/lldb/Symbol/ClangASTContext.h +++ b/lldb/include/lldb/Symbol/ClangASTContext.h @@ -21,7 +21,7 @@ // Project includes #include "lldb/lldb-enumerations.h" #include "lldb/Core/ClangForward.h" -#include "lldb/Symbol/ASTType.h" +#include "lldb/Symbol/ClangASTType.h" namespace lldb_private { diff --git a/lldb/include/lldb/Symbol/ClangASTType.h b/lldb/include/lldb/Symbol/ClangASTType.h new file mode 100644 index 00000000000..b463d13d563 --- /dev/null +++ b/lldb/include/lldb/Symbol/ClangASTType.h @@ -0,0 +1,219 @@ +//===-- ClangASTType.h ------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_ClangASTType_h_ +#define liblldb_ClangASTType_h_ + +#include "lldb/lldb-include.h" +#include "lldb/Core/ClangForward.h" + +namespace lldb_private { + +//---------------------------------------------------------------------- +// A class that can carry around a clang ASTContext and a opaque clang +// QualType. A clang::QualType can be easily reconstructed from an +// opaque clang type and often the ASTContext is needed when doing +// various type related tasks, so this class allows both items to travel +// in a single very lightweight class that can be used. There are many +// static equivalents of the member functions that allow the ASTContext +// and the opaque clang QualType to be specified for ease of use and +// to avoid code duplication. +//---------------------------------------------------------------------- +class ClangASTType +{ +protected: + ClangASTType (void *type, clang::ASTContext *ast_context) : + m_type (type), + m_ast (ast_context) + { + } + + ClangASTType (const ClangASTType &tw) : + m_type (tw.m_type), + m_ast (tw.m_ast) + { + } + + ClangASTType () : + m_type (0), + m_ast (0) + { + } + + ~ClangASTType(); + + const ClangASTType & + operator= (const ClangASTType &atb) + { + m_type = atb.m_type; + m_ast = atb.m_ast; + return *this; + } + +public: + void * + GetOpaqueQualType() const + { + return m_type; + } + + clang::ASTContext * + GetASTContext() const + { + return m_ast; + } + + ConstString + GetClangTypeName (); + + static ConstString + GetClangTypeName (void *clang_type); + + void + DumpValue (ExecutionContext *exe_ctx, + Stream *s, + lldb::Format format, + const DataExtractor &data, + uint32_t data_offset, + size_t data_byte_size, + uint32_t bitfield_bit_size, + uint32_t bitfield_bit_offset, + bool show_types, + bool show_summary, + bool verbose, + uint32_t depth); + + static void + DumpValue (clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + ExecutionContext *exe_ctx, + Stream *s, + lldb::Format format, + const DataExtractor &data, + uint32_t data_offset, + size_t data_byte_size, + uint32_t bitfield_bit_size, + uint32_t bitfield_bit_offset, + bool show_types, + bool show_summary, + bool verbose, + uint32_t depth); + + bool + DumpTypeValue (Stream *s, + lldb::Format format, + const DataExtractor &data, + uint32_t data_offset, + size_t data_byte_size, + uint32_t bitfield_bit_size, + uint32_t bitfield_bit_offset); + + + static bool + DumpTypeValue (clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + Stream *s, + lldb::Format format, + const DataExtractor &data, + uint32_t data_offset, + size_t data_byte_size, + uint32_t bitfield_bit_size, + uint32_t bitfield_bit_offset); + + void + DumpSummary (ExecutionContext *exe_ctx, + Stream *s, + const DataExtractor &data, + uint32_t data_offset, + size_t data_byte_size); + + + static void + DumpSummary (clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + ExecutionContext *exe_ctx, + Stream *s, + const DataExtractor &data, + uint32_t data_offset, + size_t data_byte_size); + + + lldb::Encoding + GetEncoding (uint32_t &count); + + static lldb::Encoding + GetEncoding (void *opaque_clang_qual_type, uint32_t &count); + + lldb::Format + GetFormat (); + + static lldb::Format + GetFormat (void *opaque_clang_qual_type); + + bool + GetValueAsScalar (const DataExtractor &data, + uint32_t data_offset, + size_t data_byte_size, + Scalar &value); + + static bool + GetValueAsScalar (clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + const DataExtractor &data, + uint32_t data_offset, + size_t data_byte_size, + Scalar &value); + + bool + SetValueFromScalar (const Scalar &value, + Stream &strm); + + static bool + SetValueFromScalar (clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + const Scalar &value, + Stream &strm); + + bool + ReadFromMemory (ExecutionContext *exe_ctx, + lldb::addr_t addr, + lldb::AddressType address_type, + DataExtractor &data); + + static bool + ReadFromMemory (clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + ExecutionContext *exe_ctx, + lldb::addr_t addr, + lldb::AddressType address_type, + DataExtractor &data); + + bool + WriteToMemory (ExecutionContext *exe_ctx, + lldb::addr_t addr, + lldb::AddressType address_type, + StreamString &new_value); + + static bool + WriteToMemory (clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + ExecutionContext *exe_ctx, + lldb::addr_t addr, + lldb::AddressType address_type, + StreamString &new_value); + +private: + void *m_type; + clang::ASTContext *m_ast; +}; + + +} // namespace lldb_private + +#endif // #ifndef liblldb_ClangASTType_h_ diff --git a/lldb/include/lldb/Symbol/Type.h b/lldb/include/lldb/Symbol/Type.h index c25675ee584..d2b14018045 100644 --- a/lldb/include/lldb/Symbol/Type.h +++ b/lldb/include/lldb/Symbol/Type.h @@ -103,35 +103,6 @@ public: return m_name; } - static ConstString - GetClangTypeName (void *clang_qual_type); - - static void - DumpValue(ExecutionContext *exe_ctx, - clang::ASTContext *ast_context, - void *clang_qual_type, - Stream *s, - lldb::Format format, - const DataExtractor &data, - uint32_t data_offset, - size_t data_byte_size, - uint32_t bitfield_bit_size, - uint32_t bitfield_bit_offset, - bool show_types, - bool show_summary, - bool verbose, - uint32_t depth); - - static void - DumpSummary (ExecutionContext *exe_ctx, - clang::ASTContext *ast_context, - void *clang_qual_type, - Stream *s, - const DataExtractor &data, - uint32_t data_offset, - size_t data_byte_size); - - void DumpValue(ExecutionContext *exe_ctx, Stream *s, @@ -151,31 +122,6 @@ public: bool show_summary, bool verbose); - static bool - DumpTypeValue ( Stream *s, - clang::ASTContext *ast_context, - void *clang_qual_type, - lldb::Format format, - const DataExtractor &data, - uint32_t data_offset, - size_t data_byte_size, - uint32_t bitfield_bit_size, - uint32_t bitfield_bit_offset); - - static bool - GetValueAsScalar (clang::ASTContext *ast_context, - void *clang_qual_type, - const DataExtractor &data, - uint32_t data_offset, - size_t data_byte_size, - Scalar &value); - - static bool - SetValueFromScalar (clang::ASTContext *ast_context, - void *clang_qual_type, - const Scalar &value, - Stream &strm); - bool ReadFromMemory (ExecutionContext *exe_ctx, lldb::addr_t address, @@ -188,23 +134,6 @@ public: lldb::AddressType address_type, DataExtractor &data); - - static bool - ReadFromMemory (ExecutionContext *exe_ctx, - clang::ASTContext *ast_context, - void *clang_qual_type, - lldb::addr_t addr, - lldb::AddressType address_type, - DataExtractor &data); - - static bool - WriteToMemory (ExecutionContext *exe_ctx, - clang::ASTContext *ast_context, - void *clang_qual_type, - lldb::addr_t addr, - lldb::AddressType address_type, - StreamString &new_value); - bool GetIsDeclaration() const; @@ -223,9 +152,6 @@ public: lldb::Encoding GetEncoding (uint32_t &count); - static lldb::Encoding - GetEncoding (void *clang_qual_type, uint32_t &count); - SymbolContextScope * GetSymbolContextScope() { @@ -265,12 +191,6 @@ public: static int Compare(const Type &a, const Type &b); - static lldb::Format - GetFormat (void *clang_qual_type); - - static int - DumpClangTypeName(Stream *s, void *clang_qual_type); - protected: ConstString m_name; uint64_t m_byte_size; diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj index d14976fc0ee..6c8863448c2 100644 --- a/lldb/lldb.xcodeproj/project.pbxproj +++ b/lldb/lldb.xcodeproj/project.pbxproj @@ -335,8 +335,8 @@ 49D7072911B5AD11001AD875 /* ClangASTSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49D7072811B5AD11001AD875 /* ClangASTSource.cpp */; settings = {COMPILER_FLAGS = "-fno-rtti"; }; }; 49DA743011DE6A5A006AEF7E /* IRToDWARF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49DA742F11DE6A5A006AEF7E /* IRToDWARF.cpp */; }; 49DA743511DE6BB2006AEF7E /* IRToDWARF.h in Headers */ = {isa = PBXBuildFile; fileRef = 49DA743411DE6BB2006AEF7E /* IRToDWARF.h */; }; - 49E45FAA11F660DC008F7B28 /* ASTType.h in Headers */ = {isa = PBXBuildFile; fileRef = 49E45FA911F660DC008F7B28 /* ASTType.h */; }; - 49E45FAF11F660FE008F7B28 /* ASTType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49E45FAD11F660FE008F7B28 /* ASTType.cpp */; }; + 49E45FAA11F660DC008F7B28 /* ClangASTType.h in Headers */ = {isa = PBXBuildFile; fileRef = 49E45FA911F660DC008F7B28 /* ClangASTType.h */; }; + 49E45FAF11F660FE008F7B28 /* ClangASTType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49E45FAD11F660FE008F7B28 /* ClangASTType.cpp */; }; 49F1A74611B3388F003ED505 /* ClangExpressionDeclMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49F1A74511B3388F003ED505 /* ClangExpressionDeclMap.cpp */; }; 49F1A74A11B338AE003ED505 /* ClangExpressionDeclMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 49F1A74911B338AE003ED505 /* ClangExpressionDeclMap.h */; }; 4C08CDE811C81EF8001610A8 /* ThreadSpec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C08CDE711C81EF8001610A8 /* ThreadSpec.cpp */; }; @@ -912,8 +912,8 @@ 49D7072811B5AD11001AD875 /* ClangASTSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ClangASTSource.cpp; path = source/Expression/ClangASTSource.cpp; sourceTree = "<group>"; }; 49DA742F11DE6A5A006AEF7E /* IRToDWARF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = IRToDWARF.cpp; path = source/Expression/IRToDWARF.cpp; sourceTree = "<group>"; }; 49DA743411DE6BB2006AEF7E /* IRToDWARF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = IRToDWARF.h; path = include/lldb/Expression/IRToDWARF.h; sourceTree = "<group>"; }; - 49E45FA911F660DC008F7B28 /* ASTType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASTType.h; path = include/lldb/Symbol/ASTType.h; sourceTree = "<group>"; }; - 49E45FAD11F660FE008F7B28 /* ASTType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ASTType.cpp; path = source/Symbol/ASTType.cpp; sourceTree = "<group>"; }; + 49E45FA911F660DC008F7B28 /* ClangASTType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ClangASTType.h; path = include/lldb/Symbol/ClangASTType.h; sourceTree = "<group>"; }; + 49E45FAD11F660FE008F7B28 /* ClangASTType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ClangASTType.cpp; path = source/Symbol/ClangASTType.cpp; sourceTree = "<group>"; }; 49EC3E98118F90AC00B1265E /* ThreadPlanCallFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ThreadPlanCallFunction.cpp; path = source/Target/ThreadPlanCallFunction.cpp; sourceTree = "<group>"; }; 49EC3E9C118F90D400B1265E /* ThreadPlanCallFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThreadPlanCallFunction.h; path = include/lldb/Target/ThreadPlanCallFunction.h; sourceTree = "<group>"; }; 49F1A74511B3388F003ED505 /* ClangExpressionDeclMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ClangExpressionDeclMap.cpp; path = source/Expression/ClangExpressionDeclMap.cpp; sourceTree = "<group>"; }; @@ -1669,12 +1669,12 @@ isa = PBXGroup; children = ( AF94005711C03F6500085DB9 /* SymbolVendor.cpp */, - 49E45FA911F660DC008F7B28 /* ASTType.h */, - 49E45FAD11F660FE008F7B28 /* ASTType.cpp */, 26BC7C5510F1B6E900F91463 /* Block.h */, 26BC7F1310F1B8EC00F91463 /* Block.cpp */, 26BC7C5610F1B6E900F91463 /* ClangASTContext.h */, 26BC7F1410F1B8EC00F91463 /* ClangASTContext.cpp */, + 49E45FA911F660DC008F7B28 /* ClangASTType.h */, + 49E45FAD11F660FE008F7B28 /* ClangASTType.cpp */, 26BC7C5710F1B6E900F91463 /* CompileUnit.h */, 26BC7F1510F1B8EC00F91463 /* CompileUnit.cpp */, 26BC7C5810F1B6E900F91463 /* Declaration.h */, @@ -2201,7 +2201,7 @@ 49307AB211DEA4F20081F992 /* IRForTarget.h in Headers */, 4C5DBBC911E3FEC60035160F /* CommandObjectCommands.h in Headers */, 26D27CA011ED3A4E0024D721 /* ELFHeader.h in Headers */, - 49E45FAA11F660DC008F7B28 /* ASTType.h in Headers */, + 49E45FAA11F660DC008F7B28 /* ClangASTType.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2655,7 +2655,7 @@ 49307AAE11DEA4D90081F992 /* IRForTarget.cpp in Sources */, 4C5DBBC811E3FEC60035160F /* CommandObjectCommands.cpp in Sources */, 26D27C9F11ED3A4E0024D721 /* ELFHeader.cpp in Sources */, - 49E45FAF11F660FE008F7B28 /* ASTType.cpp in Sources */, + 49E45FAF11F660FE008F7B28 /* ClangASTType.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/lldb/source/Commands/CommandObjectExpression.cpp b/lldb/source/Commands/CommandObjectExpression.cpp index 637d3dcd52a..4135ed82cc0 100644 --- a/lldb/source/Commands/CommandObjectExpression.cpp +++ b/lldb/source/Commands/CommandObjectExpression.cpp @@ -12,8 +12,10 @@ // C Includes // C++ Includes // Other libraries and framework includes +#include "llvm/ADT/StringRef.h" + // Project includes -#include "lldb/Interpreter/Args.h" +#include "lldb/Core/Debugger.h" #include "lldb/Core/Value.h" #include "lldb/Core/InputReader.h" #include "lldb/Expression/ClangExpression.h" @@ -21,15 +23,15 @@ #include "lldb/Expression/ClangExpressionVariable.h" #include "lldb/Expression/DWARFExpression.h" #include "lldb/Host/Host.h" -#include "lldb/Core/Debugger.h" +#include "lldb/Interpreter/Args.h" #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/CommandReturnObject.h" +#include "lldb/Symbol/ClangASTType.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/Variable.h" #include "lldb/Target/Process.h" #include "lldb/Target/StackFrame.h" #include "lldb/Target/Target.h" -#include "llvm/ADT/StringRef.h" using namespace lldb; using namespace lldb_private; @@ -402,22 +404,26 @@ CommandObjectExpression::EvaluateExpression (const char *expr, bool bare, Stream if (clang_type) { if (m_options.show_types) - Type::DumpClangTypeName (&output_stream, clang_type); + { + ConstString type_name(ClangASTType::GetClangTypeName (clang_type)); + if (type_name) + output_stream.Printf("(%s) ", type_name.AsCString("<invalid>")); + } - Type::DumpValue (&m_exe_ctx, // The execution context for memory and variable access - ast_context, // The ASTContext that the clang type belongs to - clang_type, // The opaque clang type we want to dump that value of - &output_stream, // Stream to dump to - format, // Format to use when dumping - data, // A buffer containing the bytes for the clang type - 0, // Byte offset within "data" where value is - data.GetByteSize (), // Size in bytes of the value we are dumping - 0, // Bitfield bit size - 0, // Bitfield bit offset - m_options.show_types, // Show types? - m_options.show_summary, // Show summary? - m_options.debug, // Debug logging output? - UINT32_MAX); // Depth to dump in case this is an aggregate type + ClangASTType::DumpValue (ast_context, // The ASTContext that the clang type belongs to + clang_type, // The opaque clang type we want to dump that value of + &m_exe_ctx, // The execution context for memory and variable access + &output_stream, // Stream to dump to + format, // Format to use when dumping + data, // A buffer containing the bytes for the clang type + 0, // Byte offset within "data" where value is + data.GetByteSize (), // Size in bytes of the value we are dumping + 0, // Bitfield bit size + 0, // Bitfield bit offset + m_options.show_types, // Show types? + m_options.show_summary, // Show summary? + m_options.debug, // Debug logging output? + UINT32_MAX); // Depth to dump in case this is an aggregate type } else { diff --git a/lldb/source/Commands/CommandObjectVariable.cpp b/lldb/source/Commands/CommandObjectVariable.cpp index a14fa510d5c..7a6592b9b84 100644 --- a/lldb/source/Commands/CommandObjectVariable.cpp +++ b/lldb/source/Commands/CommandObjectVariable.cpp @@ -23,6 +23,7 @@ #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/CommandReturnObject.h" +#include "lldb/Symbol/ClangASTType.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolContext.h" @@ -386,12 +387,12 @@ public: Scalar scalar; - if (!Type::GetValueAsScalar (valobj->GetClangAST(), - valobj->GetOpaqueClangQualType(), - valobj->GetDataExtractor(), - 0, - valobj->GetByteSize(), - scalar)) + if (!ClangASTType::GetValueAsScalar (valobj->GetClangAST(), + valobj->GetOpaqueClangQualType(), + valobj->GetDataExtractor(), + 0, + valobj->GetByteSize(), + scalar)) return; ConstString po_output; diff --git a/lldb/source/Core/Value.cpp b/lldb/source/Core/Value.cpp index 32c27496b8f..2399059b730 100644 --- a/lldb/source/Core/Value.cpp +++ b/lldb/source/Core/Value.cpp @@ -17,6 +17,7 @@ #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Module.h" #include "lldb/Core/Stream.h" +#include "lldb/Symbol/ClangASTType.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolContext.h" @@ -472,7 +473,7 @@ Value::GetValueDefaultFormat () break; case eContextTypeOpaqueClangQualType: - return Type::GetFormat (m_context); + return ClangASTType::GetFormat (m_context); case eContextTypeDCRegisterInfo: if (GetRegisterInfo()) @@ -692,9 +693,9 @@ Value::ResolveValue(ExecutionContext *exe_ctx, clang::ASTContext *ast_context) lldb::AddressType address_type = m_value_type == eValueTypeLoadAddress ? eAddressTypeLoad : eAddressTypeHost; lldb::addr_t addr = m_value.ULongLong(LLDB_INVALID_ADDRESS); DataExtractor data; - if (Type::ReadFromMemory (exe_ctx, ast_context, opaque_clang_qual_type, addr, address_type, data)) + if (ClangASTType::ReadFromMemory (ast_context, opaque_clang_qual_type, exe_ctx, addr, address_type, data)) { - if (Type::GetValueAsScalar (ast_context, opaque_clang_qual_type, data, 0, data.GetByteSize(), scalar)) + if (ClangASTType::GetValueAsScalar (ast_context, opaque_clang_qual_type, data, 0, data.GetByteSize(), scalar)) { m_value = scalar; m_value_type = eValueTypeScalar; diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index 72984c6c082..065b18d0553 100644 --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/source/Core/ValueObject.cpp @@ -20,6 +20,7 @@ #include "lldb/Core/ValueObjectChild.h" #include "lldb/Core/ValueObjectList.h" +#include "lldb/Symbol/ClangASTType.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/Type.h" @@ -488,16 +489,16 @@ ValueObject::GetValueAsCString (ExecutionContextScope *exe_scope) if (clang_type) { StreamString sstr; - lldb::Format format = Type::GetFormat(clang_type); - if (Type::DumpTypeValue(&sstr, - GetClangAST(), // The clang AST - clang_type, // The clang type to display - format, // Format to display this type with - m_data, // Data to extract from - 0, // Byte offset into "m_data" - GetByteSize(), // Byte size of item in "m_data" - GetBitfieldBitSize(), // Bitfield bit size - GetBitfieldBitOffset())) // Bitfield bit offset + lldb::Format format = ClangASTType::GetFormat(clang_type); + if (ClangASTType::DumpTypeValue(GetClangAST(), // The clang AST + clang_type, // The clang type to display + &sstr, + format, // Format to display this type with + m_data, // Data to extract from + 0, // Byte offset into "m_data" + GetByteSize(), // Byte size of item in "m_data" + GetBitfieldBitSize(), // Bitfield bit size + GetBitfieldBitOffset())) // Bitfield bit offset m_value_str.swap(sstr.GetString()); else m_value_str.clear(); @@ -537,7 +538,7 @@ ValueObject::SetValueFromCString (ExecutionContextScope *exe_scope, const char * return false; uint32_t count = 0; - lldb::Encoding encoding = Type::GetEncoding (GetOpaqueClangQualType(), count); + lldb::Encoding encoding = ClangASTType::GetEncoding (GetOpaqueClangQualType(), count); char *end = NULL; const size_t byte_size = GetByteSize(); diff --git a/lldb/source/Core/ValueObjectChild.cpp b/lldb/source/Core/ValueObjectChild.cpp index 9b9b8d9e849..3093582998c 100644 --- a/lldb/source/Core/ValueObjectChild.cpp +++ b/lldb/source/Core/ValueObjectChild.cpp @@ -12,6 +12,7 @@ #include "lldb/Core/Module.h" #include "lldb/Core/ValueObjectList.h" +#include "lldb/Symbol/ClangASTType.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolContext.h" #include "lldb/Symbol/Type.h" @@ -103,7 +104,7 @@ ValueObjectChild::GetTypeName() { if (m_type_name.IsEmpty()) { - m_type_name = Type::GetClangTypeName (GetOpaqueClangQualType()); + m_type_name = ClangASTType::GetClangTypeName (GetOpaqueClangQualType()); if (m_type_name) { if (m_bitfield_bit_size > 0) diff --git a/lldb/source/Core/ValueObjectRegister.cpp b/lldb/source/Core/ValueObjectRegister.cpp index aae818eadd6..5d5215fe83d 100644 --- a/lldb/source/Core/ValueObjectRegister.cpp +++ b/lldb/source/Core/ValueObjectRegister.cpp @@ -15,6 +15,7 @@ // Other libraries and framework includes // Project includes #include "lldb/Core/Module.h" +#include "lldb/Symbol/ClangASTType.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/TypeList.h" #include "lldb/Target/ExecutionContext.h" @@ -250,7 +251,7 @@ ConstString ValueObjectRegister::GetTypeName() { if (m_type_name.IsEmpty()) - m_type_name = Type::GetClangTypeName (GetOpaqueClangQualType()); + m_type_name = ClangASTType::GetClangTypeName (GetOpaqueClangQualType()); return m_type_name; } diff --git a/lldb/source/Expression/ClangExpression.cpp b/lldb/source/Expression/ClangExpression.cpp index e996749de9e..9468a706c0b 100644 --- a/lldb/source/Expression/ClangExpression.cpp +++ b/lldb/source/Expression/ClangExpression.cpp @@ -55,6 +55,7 @@ // Project includes #include "lldb/Core/Log.h" +#include "lldb/Core/ClangForward.h" #include "lldb/Expression/ClangExpression.h" #include "lldb/Expression/ClangASTSource.h" #include "lldb/Expression/ClangResultSynthesizer.h" @@ -74,23 +75,6 @@ using namespace lldb_private; using namespace clang; using namespace llvm; -namespace clang { - -class AnalyzerOptions; -class CodeGenOptions; -class DependencyOutputOptions; -class DiagnosticOptions; -class FrontendOptions; -class HeaderSearchOptions; -class LangOptions; -class PreprocessorOptions; -class PreprocessorOutputOptions; -class TargetInfo; -class TargetOptions; - -} // end namespace clang - - //===----------------------------------------------------------------------===// // Utility Methods diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp index 5a6b6740750..54bfad5772a 100644 --- a/lldb/source/Expression/ClangExpressionDeclMap.cpp +++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp @@ -292,10 +292,11 @@ ClangExpressionDeclMap::DoMaterialize (bool dematerialize, TypeFromUser copied_type(ClangASTContext::CopyType(context, iter->m_parser_type.GetASTContext(), - iter->m_parser_type.GetType()), + iter->m_parser_type.GetOpaqueQualType()), context); - result_value->SetContext(Value::eContextTypeOpaqueClangQualType, copied_type.GetType()); + result_value->SetContext(Value::eContextTypeOpaqueClangQualType, + copied_type.GetOpaqueQualType()); } continue; @@ -329,7 +330,10 @@ ClangExpressionDeclMap::DoMaterializeOneVariable(bool dematerialize, return false; } - log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name, type.GetType()); + log->Printf("%s %s with type %p", + (dematerialize ? "Dematerializing" : "Materializing"), + name, + type.GetOpaqueQualType()); std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, var, @@ -345,7 +349,8 @@ ClangExpressionDeclMap::DoMaterializeOneVariable(bool dematerialize, { lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); - size_t bit_size = ClangASTContext::GetTypeBitSize(type.GetASTContext(), type.GetType()); + size_t bit_size = ClangASTContext::GetTypeBitSize (type.GetASTContext(), + type.GetOpaqueQualType()); size_t byte_size = bit_size % 8 ? ((bit_size + 8) / 8) : (bit_size / 8); DataBufferHeap data; @@ -488,7 +493,9 @@ ClangExpressionDeclMap::FindVariableInScope(const SymbolContext &sym_ctx, if (type->GetASTContext() == var->GetType()->GetClangAST()) { - if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetType(), var->GetType()->GetOpaqueClangQualType())) + if (!ClangASTContext::AreTypesSame(type->GetASTContext(), + type->GetOpaqueQualType(), + var->GetType()->GetOpaqueClangQualType())) return NULL; } else @@ -657,7 +664,7 @@ ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, &ut, &pt); - NamedDecl *var_decl = context.AddVarDecl(pt.GetType()); + NamedDecl *var_decl = context.AddVarDecl(pt.GetOpaqueQualType()); Tuple tuple; diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp index 839cf2ef592..20c97b28e07 100644 --- a/lldb/source/Expression/DWARFExpression.cpp +++ b/lldb/source/Expression/DWARFExpression.cpp @@ -24,6 +24,7 @@ #include "lldb/lldb-private-log.h" +#include "lldb/Symbol/ClangASTType.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/Type.h" @@ -2273,10 +2274,10 @@ DWARFExpression::Evaluate } else { - if (!Type::SetValueFromScalar(ast_context, - clang_type, - tmp.ResolveValue(exe_ctx, ast_context), - new_value)) + if (!ClangASTType::SetValueFromScalar (ast_context, + clang_type, + tmp.ResolveValue(exe_ctx, ast_context), + new_value)) { if (error_ptr) error_ptr->SetErrorStringWithFormat ("Couldn't extract a value from an integral type.\n"); @@ -2292,12 +2293,12 @@ DWARFExpression::Evaluate { lldb::AddressType address_type = (value_type == Value::eValueTypeLoadAddress ? eAddressTypeLoad : eAddressTypeHost); lldb::addr_t addr = stack.back().GetScalar().ULongLong(LLDB_INVALID_ADDRESS); - if (!Type::WriteToMemory (exe_ctx, - ast_context, - clang_type, - addr, - address_type, - new_value)) + if (!ClangASTType::WriteToMemory (ast_context, + clang_type, + exe_ctx, + addr, + address_type, + new_value)) { if (error_ptr) error_ptr->SetErrorStringWithFormat ("Failed to write value to memory at 0x%llx.\n", addr); diff --git a/lldb/source/Host/macosx/Symbols.cpp b/lldb/source/Host/macosx/Symbols.cpp index ccdde69bcbf..3502ff5d2b0 100644 --- a/lldb/source/Host/macosx/Symbols.cpp +++ b/lldb/source/Host/macosx/Symbols.cpp @@ -11,8 +11,7 @@ // C Includes #include <dirent.h> -#include <mach-o/loader.h> -#include <mach-o/fat.h> +#include "llvm/Support/MachO.h" // C++ Includes // Other libraries and framework includes @@ -29,6 +28,7 @@ using namespace lldb; using namespace lldb_private; +using namespace llvm::MachO; extern "C" { @@ -49,8 +49,8 @@ SkinnyMachOFileContainsArchAndUUID const uint32_t magic ) { - assert(magic == MH_CIGAM || magic == MH_MAGIC || magic == MH_CIGAM_64 || magic == MH_MAGIC_64); - if (magic == MH_MAGIC || magic == MH_MAGIC_64) + assert(magic == HeaderMagic32 || magic == HeaderMagic32Swapped || magic == HeaderMagic64 || magic == HeaderMagic64Swapped); + if (magic == HeaderMagic32 || magic == HeaderMagic64) data.SetByteOrder (eByteOrderHost); else if (eByteOrderHost == eByteOrderBig) data.SetByteOrder (eByteOrderLittle); @@ -80,11 +80,11 @@ SkinnyMachOFileContainsArchAndUUID if (uuid == NULL) return true; - if (magic == MH_CIGAM_64 || magic == MH_MAGIC_64) + if (magic == HeaderMagic64Swapped || magic == HeaderMagic64) data_offset += 4; // Skip reserved field for in mach_header_64 // Make sure we have enough data for all the load commands - if (magic == MH_CIGAM_64 || magic == MH_MAGIC_64) + if (magic == HeaderMagic64Swapped || magic == HeaderMagic64) { if (data.GetByteSize() < sizeof(struct mach_header_64) + sizeofcmds) { @@ -106,7 +106,7 @@ SkinnyMachOFileContainsArchAndUUID const uint32_t cmd_offset = data_offset; // Save this data_offset in case parsing of the segment goes awry! uint32_t cmd = data.GetU32(&data_offset); uint32_t cmd_size = data.GetU32(&data_offset); - if (cmd == LC_UUID) + if (cmd == LoadCommandUUID) { UUID file_uuid (data.GetData(&data_offset, 16), 16); return file_uuid == *uuid; @@ -128,7 +128,7 @@ UniversalMachOFileContainsArchAndUUID const uint32_t magic ) { - assert(magic == FAT_CIGAM || magic == FAT_MAGIC); + assert(magic == UniversalMagic || magic == UniversalMagicSwapped); // Universal mach-o files always have their headers encoded as BIG endian data.SetByteOrder(eByteOrderBig); @@ -167,10 +167,10 @@ UniversalMachOFileContainsArchAndUUID switch (arch_magic) { - case MH_CIGAM: // 32 bit mach-o file - case MH_MAGIC: // 32 bit mach-o file - case MH_CIGAM_64: // 64 bit mach-o file - case MH_MAGIC_64: // 64 bit mach-o file + case HeaderMagic32: + case HeaderMagic32Swapped: + case HeaderMagic64: + case HeaderMagic64Swapped: if (SkinnyMachOFileContainsArchAndUUID (file_spec, arch, uuid, file_offset + arch_offset, arch_data, arch_data_offset, arch_magic)) return true; break; @@ -201,15 +201,15 @@ FileAtPathContainsArchAndUUID switch (magic) { // 32 bit mach-o file - case MH_CIGAM: - case MH_MAGIC: - case MH_CIGAM_64: - case MH_MAGIC_64: + case HeaderMagic32: + case HeaderMagic32Swapped: + case HeaderMagic64: + case HeaderMagic64Swapped: return SkinnyMachOFileContainsArchAndUUID (file_spec, arch, uuid, file_offset, data, data_offset, magic); // fat mach-o file - case FAT_CIGAM: - case FAT_MAGIC: + case UniversalMagic: + case UniversalMagicSwapped: return UniversalMachOFileContainsArchAndUUID (file_spec, arch, uuid, file_offset, data, data_offset, magic); default: diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp index a8489dae8fb..fea069e5fc3 100644 --- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp +++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp @@ -34,7 +34,7 @@ using namespace lldb; using namespace lldb_private; - +using namespace llvm::MachO; /// FIXME - The ObjC Runtime trampoline handler doesn't really belong here. /// I am putting it here so I can invoke it in the Trampoline code here, but @@ -191,7 +191,7 @@ DynamicLoaderMacOSXDYLD::ReadDYLDInfoFromMemoryAndSetNotificationCallback(lldb:: DataExtractor data; // Load command data if (ReadMachHeader (addr, &m_dyld.header, &data)) { - if (m_dyld.header.filetype == MH_DYLINKER) + if (m_dyld.header.filetype == HeaderFileTypeDynamicLinkEditor) { m_dyld.address = addr; ModuleSP dyld_module_sp; @@ -670,15 +670,15 @@ DynamicLoaderMacOSXDYLD::UpdateAllImageInfos() // Returns true if we succeed, false if we fail for any reason. //---------------------------------------------------------------------- bool -DynamicLoaderMacOSXDYLD::ReadMachHeader (lldb::addr_t addr, struct mach_header *header, DataExtractor *load_command_data) +DynamicLoaderMacOSXDYLD::ReadMachHeader (lldb::addr_t addr, mach_header *header, DataExtractor *load_command_data) { - DataBufferHeap header_bytes(sizeof(struct mach_header), 0); + DataBufferHeap header_bytes(sizeof(mach_header), 0); Error error; size_t bytes_read = m_process->ReadMemory (addr, header_bytes.GetBytes(), header_bytes.GetByteSize(), error); - if (bytes_read == sizeof(struct mach_header)) + if (bytes_read == sizeof(mach_header)) { uint32_t offset = 0; ::memset (header, 0, sizeof(header)); @@ -690,16 +690,16 @@ DynamicLoaderMacOSXDYLD::ReadMachHeader (lldb::addr_t addr, struct mach_header * data.SetByteOrder(DynamicLoaderMacOSXDYLD::GetByteOrderFromMagic(header->magic)); switch (header->magic) { - case MH_MAGIC: - case MH_CIGAM: + case llvm::MachO::HeaderMagic32: + case llvm::MachO::HeaderMagic32Swapped: data.SetAddressByteSize(4); - load_cmd_addr += sizeof(struct mach_header); + load_cmd_addr += sizeof(mach_header); break; - case MH_MAGIC_64: - case MH_CIGAM_64: + case llvm::MachO::HeaderMagic64: + case llvm::MachO::HeaderMagic64Swapped: data.SetAddressByteSize(8); - load_cmd_addr += sizeof(struct mach_header_64); + load_cmd_addr += sizeof(mach_header_64); break; default: @@ -707,7 +707,7 @@ DynamicLoaderMacOSXDYLD::ReadMachHeader (lldb::addr_t addr, struct mach_header * } // Read the rest of dyld's mach header - if (data.GetU32(&offset, &header->cputype, (sizeof(struct mach_header)/sizeof(uint32_t)) - 1)) + if (data.GetU32(&offset, &header->cputype, (sizeof(mach_header)/sizeof(uint32_t)) - 1)) { if (load_command_data == NULL) return true; // We were able to read the mach_header and weren't asked to read the load command bytes @@ -752,15 +752,15 @@ DynamicLoaderMacOSXDYLD::ParseLoadCommands (const DataExtractor& data, struct DY // Clear out any load command specific data from DYLIB_INFO since // we are about to read it. - if (data.ValidOffsetForDataOfSize (offset, sizeof(struct load_command))) + if (data.ValidOffsetForDataOfSize (offset, sizeof(load_command))) { - struct load_command load_cmd; + load_command load_cmd; uint32_t load_cmd_offset = offset; load_cmd.cmd = data.GetU32 (&offset); load_cmd.cmdsize = data.GetU32 (&offset); switch (load_cmd.cmd) { - case LC_SEGMENT: + case LoadCommandSegment32: { segment.name.SetTrimmedCStringWithLength ((const char *)data.GetData(&offset, 16), 16); segment.addr = data.GetU32 (&offset); @@ -769,7 +769,7 @@ DynamicLoaderMacOSXDYLD::ParseLoadCommands (const DataExtractor& data, struct DY } break; - case LC_SEGMENT_64: + case LoadCommandSegment64: { segment.name.SetTrimmedCStringWithLength ((const char *)data.GetData(&offset, 16), 16); segment.addr = data.GetU64 (&offset); @@ -778,7 +778,7 @@ DynamicLoaderMacOSXDYLD::ParseLoadCommands (const DataExtractor& data, struct DY } break; - case LC_ID_DYLINKER: + case LoadCommandDynamicLinkerIdent: if (lc_id_dylinker) { uint32_t name_offset = load_cmd_offset + data.GetU32 (&offset); @@ -787,7 +787,7 @@ DynamicLoaderMacOSXDYLD::ParseLoadCommands (const DataExtractor& data, struct DY } break; - case LC_UUID: + case LoadCommandUUID: dylib_info.uuid.SetBytes(data.GetData (&offset, 16)); break; @@ -820,7 +820,7 @@ DynamicLoaderMacOSXDYLD::UpdateAllImageInfosHeaderAndLoadCommands() ParseLoadCommands (data, m_dyld_image_infos[i], NULL); - if (m_dyld_image_infos[i].header.filetype == MH_EXECUTE) + if (m_dyld_image_infos[i].header.filetype == HeaderFileTypeExecutable) exe_idx = i; } } diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h index 724a8b6bd6d..44fb329e35e 100644 --- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h +++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h @@ -11,19 +11,20 @@ #define liblldb_DynamicLoaderMacOSXDYLD_h_ // C Includes -#include <mach-o/loader.h> - // C++ Includes #include <map> #include <vector> #include <string> // Other libraries and framework includes +#include "llvm/Support/MachO.h" + #include "lldb/Target/DynamicLoader.h" #include "lldb/Core/FileSpec.h" #include "lldb/Core/UUID.h" #include "lldb/Host/Mutex.h" #include "lldb/Target/Process.h" + #include "ObjCTrampolineHandler.h" class DynamicLoaderMacOSXDYLD : public lldb_private::DynamicLoader @@ -144,12 +145,12 @@ protected: { switch (m_dyld.header.magic) { - case MH_MAGIC: - case MH_CIGAM: + case llvm::MachO::HeaderMagic32: + case llvm::MachO::HeaderMagic32Swapped: return 4; - case MH_MAGIC_64: - case MH_CIGAM_64: + case llvm::MachO::HeaderMagic64: + case llvm::MachO::HeaderMagic64Swapped: return 8; default: @@ -163,12 +164,12 @@ protected: { switch (magic) { - case MH_MAGIC: - case MH_MAGIC_64: + case llvm::MachO::HeaderMagic32: + case llvm::MachO::HeaderMagic64: return lldb::eByteOrderHost; - case MH_CIGAM: - case MH_CIGAM_64: + case llvm::MachO::HeaderMagic32Swapped: + case llvm::MachO::HeaderMagic64Swapped: if (lldb::eByteOrderHost == lldb::eByteOrderBig) return lldb::eByteOrderLittle; else @@ -182,7 +183,7 @@ protected: bool ReadMachHeader (lldb::addr_t addr, - struct mach_header *header, + llvm::MachO::mach_header *header, lldb_private::DataExtractor *load_command_data); class Segment { @@ -218,7 +219,7 @@ protected: lldb::addr_t mod_date; // Modification date for this dylib lldb_private::FileSpec file_spec; // Resolved path for this dylib lldb_private::UUID uuid; // UUID for this dylib if it has one, else all zeros - struct mach_header header; // The mach header for this image + llvm::MachO::mach_header header; // The mach header for this image std::vector<Segment> segments; // All segment vmaddr and vmsize pairs for this executable (from memory of inferior) DYLDImageInfo() : diff --git a/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp b/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp index 015e498a7cc..f9bf3eb8cb1 100644 --- a/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp +++ b/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp @@ -16,7 +16,7 @@ using namespace lldb; using namespace lldb_private; - +using namespace llvm::MachO; void ObjectContainerUniversalMachO::Initialize() @@ -75,7 +75,7 @@ ObjectContainerUniversalMachO::MagicBytesMatch (DataBufferSP& dataSP) DataExtractor data(dataSP, eByteOrderHost, 4); uint32_t offset = 0; uint32_t magic = data.GetU32(&offset); - return magic == FAT_MAGIC || magic == FAT_CIGAM; + return magic == UniversalMagic || magic == UniversalMagicSwapped; } ObjectContainerUniversalMachO::ObjectContainerUniversalMachO @@ -108,20 +108,20 @@ ObjectContainerUniversalMachO::ParseHeader () m_data.SetByteOrder (eByteOrderBig); m_header.magic = m_data.GetU32(&offset); - if (m_header.magic == FAT_MAGIC) + if (m_header.magic == UniversalMagic) { m_data.SetAddressByteSize(4); m_header.nfat_arch = m_data.GetU32(&offset); - const size_t nfat_arch_size = sizeof(fat_arch_t) * m_header.nfat_arch; + const size_t nfat_arch_size = sizeof(fat_arch) * m_header.nfat_arch; // See if the current data we have is enough for all of the fat headers? if (!m_data.ValidOffsetForDataOfSize(offset, nfat_arch_size)) { // The fat headers are larger than the number of bytes we have been // given when this class was constructed. We will read the exact number // of bytes that we need. - DataBufferSP data_sp(m_file.ReadFileContents(m_offset, nfat_arch_size + sizeof(fat_header_t))); + DataBufferSP data_sp(m_file.ReadFileContents(m_offset, nfat_arch_size + sizeof(fat_header))); m_data.SetData (data_sp); } @@ -130,10 +130,10 @@ ObjectContainerUniversalMachO::ParseHeader () uint32_t arch_idx = 0; for (arch_idx = 0; arch_idx < m_header.nfat_arch; ++arch_idx) { - if (m_data.ValidOffsetForDataOfSize(offset, sizeof(fat_arch_t))) + if (m_data.ValidOffsetForDataOfSize(offset, sizeof(fat_arch))) { - fat_arch_t arch; - if (m_data.GetU32(&offset, &arch, sizeof(fat_arch_t)/sizeof(uint32_t))) + fat_arch arch; + if (m_data.GetU32(&offset, &arch, sizeof(fat_arch)/sizeof(uint32_t))) { m_fat_archs.push_back(arch); } diff --git a/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.h b/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.h index 8a7f975bc67..55a88278d8a 100644 --- a/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.h +++ b/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.h @@ -10,11 +10,11 @@ #ifndef liblldb_ObjectContainerUniversalMachO_h_ #define liblldb_ObjectContainerUniversalMachO_h_ -#include <mach-o/fat.h> - #include "lldb/Symbol/ObjectContainer.h" #include "lldb/Core/FileSpec.h" +#include "llvm/Support/MachO.h" + class ObjectContainerUniversalMachO : public lldb_private::ObjectContainer { @@ -94,10 +94,8 @@ public: protected: - typedef struct fat_header fat_header_t; - typedef struct fat_arch fat_arch_t; - fat_header_t m_header; - std::vector<fat_arch_t> m_fat_archs; + llvm::MachO::fat_header m_header; + std::vector<llvm::MachO::fat_arch> m_fat_archs; }; #endif // liblldb_ObjectContainerUniversalMachO_h_ diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index e4810a219a4..de5c73c84b4 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -9,9 +9,6 @@ #include "ObjectFileMachO.h" -#include <mach-o/nlist.h> -#include <mach-o/stab.h> - #include "lldb/Core/ArchSpec.h" #include "lldb/Core/DataBuffer.h" #include "lldb/Core/FileSpec.h" @@ -25,18 +22,10 @@ #include "lldb/Core/UUID.h" #include "lldb/Symbol/ObjectFile.h" -#ifndef S_DTRACE_DOF -// section contains DTrace Object Format -#define S_DTRACE_DOF 0xf -#endif - -#ifndef S_LAZY_DYLIB_SYMBOL_POINTERS -// section with only lazy symbol pointers to lazy loaded dylibs -#define S_LAZY_DYLIB_SYMBOL_POINTERS 0x10 -#endif using namespace lldb; using namespace lldb_private; +using namespace llvm::MachO; void @@ -85,12 +74,12 @@ MachHeaderSizeFromMagic(uint32_t magic) { switch (magic) { - case MH_MAGIC: - case MH_CIGAM: + case HeaderMagic32: + case HeaderMagic32Swapped: return sizeof(struct mach_header); - case MH_MAGIC_64: - case MH_CIGAM_64: + case HeaderMagic64: + case HeaderMagic64Swapped: return sizeof(struct mach_header_64); break; @@ -139,25 +128,25 @@ ObjectFileMachO::ParseHeader () m_header.magic = m_data.GetU32(&offset); switch (m_header.magic) { - case MH_MAGIC: + case HeaderMagic32: m_data.SetByteOrder (eByteOrderHost); m_data.SetAddressByteSize(4); can_parse = true; break; - case MH_MAGIC_64: + case HeaderMagic64: m_data.SetByteOrder (eByteOrderHost); m_data.SetAddressByteSize(8); can_parse = true; break; - case MH_CIGAM: + case HeaderMagic32Swapped: m_data.SetByteOrder(eByteOrderHost == eByteOrderBig ? eByteOrderLittle : eByteOrderBig); m_data.SetAddressByteSize(4); can_parse = true; break; - case MH_CIGAM_64: + case HeaderMagic64Swapped: m_data.SetByteOrder(eByteOrderHost == eByteOrderBig ? eByteOrderLittle : eByteOrderBig); m_data.SetAddressByteSize(8); can_parse = true; @@ -245,7 +234,7 @@ ObjectFileMachO::ParseSections () if (m_data.GetU32(&offset, &load_cmd, 2) == NULL) break; - if (load_cmd.cmd == LC_SEGMENT || load_cmd.cmd == LC_SEGMENT_64) + if (load_cmd.cmd == LoadCommandSegment32 || load_cmd.cmd == LoadCommandSegment64) { if (m_data.GetU8(&offset, (uint8_t*)load_cmd.segname, 16)) { @@ -282,13 +271,13 @@ ObjectFileMachO::ParseSections () struct section_64 sect64; ::bzero (§64, sizeof(sect64)); // Push a section into our mach sections for the section at - // index zero (NO_SECT) + // index zero (NListSectionNoSection) m_mach_sections.push_back(sect64); uint32_t segment_sect_idx; const lldb::user_id_t first_segment_sectID = sectID + 1; - const uint32_t num_u32s = load_cmd.cmd == LC_SEGMENT ? 7 : 8; + const uint32_t num_u32s = load_cmd.cmd == LoadCommandSegment32 ? 7 : 8; for (segment_sect_idx=0; segment_sect_idx<load_cmd.nsects; ++segment_sect_idx) { if (m_data.GetU8(&offset, (uint8_t*)sect64.sectname, sizeof(sect64.sectname)) == NULL) @@ -375,7 +364,7 @@ ObjectFileMachO::ParseSections () } assert (segment_sp.get()); - uint32_t mach_sect_type = sect64.flags & SECTION_TYPE; + uint32_t mach_sect_type = sect64.flags & SectionFlagMaskSectionType; static ConstString g_sect_name_objc_data ("__objc_data"); static ConstString g_sect_name_objc_msgrefs ("__objc_msgrefs"); static ConstString g_sect_name_objc_selrefs ("__objc_selrefs"); @@ -412,26 +401,23 @@ ObjectFileMachO::ParseSections () switch (mach_sect_type) { // TODO: categorize sections by other flags for regular sections - case S_REGULAR: - - sect_type = eSectionTypeOther; - break; - case S_ZEROFILL: sect_type = eSectionTypeZeroFill; break; - case S_CSTRING_LITERALS: sect_type = eSectionTypeDataCString; break; // section with only literal C strings - case S_4BYTE_LITERALS: sect_type = eSectionTypeData4; break; // section with only 4 byte literals - case S_8BYTE_LITERALS: sect_type = eSectionTypeData8; break; // section with only 8 byte literals - case S_LITERAL_POINTERS: sect_type = eSectionTypeDataPointers; break; // section with only pointers to literals - case S_NON_LAZY_SYMBOL_POINTERS: sect_type = eSectionTypeDataPointers; break; // section with only non-lazy symbol pointers - case S_LAZY_SYMBOL_POINTERS: sect_type = eSectionTypeDataPointers; break; // section with only lazy symbol pointers - case S_SYMBOL_STUBS: sect_type = eSectionTypeCode; break; // section with only symbol stubs, byte size of stub in the reserved2 field - case S_MOD_INIT_FUNC_POINTERS: sect_type = eSectionTypeDataPointers; break; // section with only function pointers for initialization - case S_MOD_TERM_FUNC_POINTERS: sect_type = eSectionTypeDataPointers; break; // section with only function pointers for termination - case S_COALESCED: sect_type = eSectionTypeOther; break; - case S_GB_ZEROFILL: sect_type = eSectionTypeZeroFill; break; - case S_INTERPOSING: sect_type = eSectionTypeCode; break; // section with only pairs of function pointers for interposing - case S_16BYTE_LITERALS: sect_type = eSectionTypeData16; break; // section with only 16 byte literals - case S_DTRACE_DOF: sect_type = eSectionTypeDebug; break; - case S_LAZY_DYLIB_SYMBOL_POINTERS: sect_type = eSectionTypeDataPointers; break; + case SectionTypeRegular: sect_type = eSectionTypeOther; break; + case SectionTypeZeroFill: sect_type = eSectionTypeZeroFill; break; + case SectionTypeCStringLiterals: sect_type = eSectionTypeDataCString; break; // section with only literal C strings + case SectionType4ByteLiterals: sect_type = eSectionTypeData4; break; // section with only 4 byte literals + case SectionType8ByteLiterals: sect_type = eSectionTypeData8; break; // section with only 8 byte literals + case SectionTypeLiteralPointers: sect_type = eSectionTypeDataPointers; break; // section with only pointers to literals + case SectionTypeNonLazySymbolPointers: sect_type = eSectionTypeDataPointers; break; // section with only non-lazy symbol pointers + case SectionTypeLazySymbolPointers: sect_type = eSectionTypeDataPointers; break; // section with only lazy symbol pointers + case SectionTypeSymbolStubs: sect_type = eSectionTypeCode; break; // section with only symbol stubs, byte size of stub in the reserved2 field + case SectionTypeModuleInitFunctionPointers: sect_type = eSectionTypeDataPointers; break; // section with only function pointers for initialization + case SectionTypeModuleTermFunctionPointers: sect_type = eSectionTypeDataPointers; break; // section with only function pointers for termination + case SectionTypeCoalesced: sect_type = eSectionTypeOther; break; + case SectionTypeZeroFillLarge: sect_type = eSectionTypeZeroFill; break; + case SectionTypeInterposing: sect_type = eSectionTypeCode; break; // section with only pairs of function pointers for interposing + case SectionType16ByteLiterals: sect_type = eSectionTypeData16; break; // section with only 16 byte literals + case SectionTypeDTraceObjectFormat: sect_type = eSectionTypeDebug; break; + case SectionTypeLazyDylibSymbolPointers: sect_type = eSectionTypeDataPointers; break; default: break; } } @@ -454,7 +440,7 @@ ObjectFileMachO::ParseSections () segment_name.Clear(); } } - if (m_header.filetype == MH_DSYM) + if (m_header.filetype == HeaderFileTypeDSYM) { if (first_segment_sectID <= sectID) { @@ -482,7 +468,7 @@ ObjectFileMachO::ParseSections () } } } - else if (load_cmd.cmd == LC_DYSYMTAB) + else if (load_cmd.cmd == LoadCommandDynamicSymtabInfo) { m_dysymtab.cmd = load_cmd.cmd; m_dysymtab.cmdsize = load_cmd.cmdsize; @@ -569,7 +555,7 @@ ObjectFileMachO::ParseSymtab (bool minimize) if (m_data.GetU32(&offset, &symtab_load_command, 2) == NULL) break; // Watch for the symbol table load command - if (symtab_load_command.cmd == LC_SYMTAB) + if (symtab_load_command.cmd == LoadCommandSymtab) { // Read in the rest of the symtab load command if (m_data.GetU32(&offset, &symtab_load_command.symoff, 4)) // fill in symoff, nsyms, stroff, strsize fields @@ -602,7 +588,7 @@ ObjectFileMachO::ParseSymtab (bool minimize) else eh_frame_section_sp = section_list->FindSectionByName (g_section_name_eh_frame); - uint8_t TEXT_eh_frame_sectID = eh_frame_section_sp.get() ? eh_frame_section_sp->GetID() : NO_SECT; + uint8_t TEXT_eh_frame_sectID = eh_frame_section_sp.get() ? eh_frame_section_sp->GetID() : NListSectionNoSection; //uint32_t symtab_offset = 0; const uint8_t* nlist_data = symtab_data_sp->GetBytes(); assert (symtab_data_sp->GetByteSize()/nlist_size >= symtab_load_command.nsyms); @@ -635,7 +621,7 @@ ObjectFileMachO::ParseSymtab (bool minimize) if (bit_width_32) { struct nlist* nlist32_ptr = (struct nlist*)(nlist_data + (nlist_idx * nlist_size)); - nlist.n_un.n_strx = nlist32_ptr->n_un.n_strx; + nlist.n_strx = nlist32_ptr->n_strx; nlist.n_type = nlist32_ptr->n_type; nlist.n_sect = nlist32_ptr->n_sect; nlist.n_desc = nlist32_ptr->n_desc; @@ -647,12 +633,12 @@ ObjectFileMachO::ParseSymtab (bool minimize) } SymbolType type = eSymbolTypeInvalid; - const char* symbol_name = &strtab_data[nlist.n_un.n_strx]; + const char* symbol_name = &strtab_data[nlist.n_strx]; if (symbol_name[0] == '\0') symbol_name = NULL; Section* symbol_section = NULL; bool add_nlist = true; - bool is_debug = ((nlist.n_type & N_STAB) != 0); + bool is_debug = ((nlist.n_type & NlistMaskStab) != 0); assert (sym_idx < num_syms); @@ -662,18 +648,21 @@ ObjectFileMachO::ParseSymtab (bool minimize) { switch (nlist.n_type) { - case N_GSYM: // global symbol: name,,NO_SECT,type,0 + case StabGlobalSymbol: + // N_GSYM -- global symbol: name,,NO_SECT,type,0 // Sometimes the N_GSYM value contains the address. if (nlist.n_value != 0) symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); type = eSymbolTypeGlobal; break; - case N_FNAME: // procedure name (f77 kludge): name,,NO_SECT,0,0 + case StabFunctionName: + // N_FNAME -- procedure name (f77 kludge): name,,NO_SECT,0,0 type = eSymbolTypeFunction; break; - case N_FUN: // procedure: name,,n_sect,linenumber,address + case StabFunction: + // N_FUN -- procedure: name,,n_sect,linenumber,address if (symbol_name) { type = eSymbolTypeFunction; @@ -701,17 +690,20 @@ ObjectFileMachO::ParseSymtab (bool minimize) } break; - case N_STSYM: // static symbol: name,,n_sect,type,address + case StabStaticSymbol: + // N_STSYM -- static symbol: name,,n_sect,type,address symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); type = eSymbolTypeStatic; break; - case N_LCSYM: // .lcomm symbol: name,,n_sect,type,address + case StabLocalCommon: + // N_LCSYM -- .lcomm symbol: name,,n_sect,type,address symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); type = eSymbolTypeCommonBlock; break; - case N_BNSYM: + case StabBeginSymbol: + // N_BNSYM // We use the current number of symbols in the symbol table in lieu of // using nlist_idx in case we ever start trimming entries out if (minimize) @@ -727,7 +719,8 @@ ObjectFileMachO::ParseSymtab (bool minimize) } break; - case N_ENSYM: + case StabEndSymbol: + // N_ENSYM // Set the size of the N_BNSYM to the terminating index of this N_ENSYM // so that we can always skip the entire symbol if we need to navigate // more quickly at the source level when parsing STABS @@ -750,24 +743,29 @@ ObjectFileMachO::ParseSymtab (bool minimize) break; - case N_OPT: // emitted with gcc2_compiled and in gcc source + case StabSourceFileOptions: + // N_OPT - emitted with gcc2_compiled and in gcc source type = eSymbolTypeCompiler; break; - case N_RSYM: // register sym: name,,NO_SECT,type,register + case StabRegisterSymbol: + // N_RSYM - register sym: name,,NO_SECT,type,register type = eSymbolTypeVariable; break; - case N_SLINE: // src line: 0,,n_sect,linenumber,address + case StabSourceLine: + // N_SLINE - src line: 0,,n_sect,linenumber,address symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); type = eSymbolTypeLineEntry; break; - case N_SSYM: // structure elt: name,,NO_SECT,type,struct_offset + case StabStructureType: + // N_SSYM - structure elt: name,,NO_SECT,type,struct_offset type = eSymbolTypeVariableType; break; - case N_SO: + case StabSourceFileName: + // N_SO - source file name type = eSymbolTypeSourceFile; if (symbol_name == NULL) { @@ -802,25 +800,29 @@ ObjectFileMachO::ParseSymtab (bool minimize) } break; - case N_OSO: // object file name: name,,0,0,st_mtime + case StabObjectFileName: + // N_OSO - object file name: name,,0,0,st_mtime type = eSymbolTypeObjectFile; break; - case N_LSYM: // local sym: name,,NO_SECT,type,offset + case StabLocalSymbol: + // N_LSYM - local sym: name,,NO_SECT,type,offset type = eSymbolTypeLocal; break; //---------------------------------------------------------------------- // INCL scopes //---------------------------------------------------------------------- - case N_BINCL: // include file beginning: name,,NO_SECT,0,sum + case StabBeginIncludeFileName: + // N_BINCL - include file beginning: name,,NO_SECT,0,sum // We use the current number of symbols in the symbol table in lieu of // using nlist_idx in case we ever start trimming entries out N_INCL_indexes.push_back(sym_idx); type = eSymbolTypeScopeBegin; break; - case N_EINCL: // include file end: name,,NO_SECT,0,0 + case StabEndIncludeFile: + // N_EINCL - include file end: name,,NO_SECT,0,0 // Set the size of the N_BINCL to the terminating index of this N_EINCL // so that we can always skip the entire symbol if we need to navigate // more quickly at the source level when parsing STABS @@ -834,27 +836,33 @@ ObjectFileMachO::ParseSymtab (bool minimize) type = eSymbolTypeScopeEnd; break; - case N_SOL: // #included file name: name,,n_sect,0,address + case StabIncludeFileName: + // N_SOL - #included file name: name,,n_sect,0,address type = eSymbolTypeHeaderFile; break; - case N_PARAMS: // compiler parameters: name,,NO_SECT,0,0 + case StabCompilerParameters: + // N_PARAMS - compiler parameters: name,,NO_SECT,0,0 type = eSymbolTypeCompiler; break; - case N_VERSION: // compiler version: name,,NO_SECT,0,0 + case StabCompilerVersion: + // N_VERSION - compiler version: name,,NO_SECT,0,0 type = eSymbolTypeCompiler; break; - case N_OLEVEL: // compiler -O level: name,,NO_SECT,0,0 + case StabCompilerOptLevel: + // N_OLEVEL - compiler -O level: name,,NO_SECT,0,0 type = eSymbolTypeCompiler; break; - case N_PSYM: // parameter: name,,NO_SECT,type,offset + case StabParameter: + // N_PSYM - parameter: name,,NO_SECT,type,offset type = eSymbolTypeVariable; break; - case N_ENTRY: // alternate entry: name,,n_sect,linenumber,address + case StabAlternateEntry: + // N_ENTRY - alternate entry: name,,n_sect,linenumber,address symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); type = eSymbolTypeLineEntry; break; @@ -862,7 +870,8 @@ ObjectFileMachO::ParseSymtab (bool minimize) //---------------------------------------------------------------------- // Left and Right Braces //---------------------------------------------------------------------- - case N_LBRAC: // left bracket: 0,,NO_SECT,nesting level,address + case StabLeftBracket: + // N_LBRAC - left bracket: 0,,NO_SECT,nesting level,address // We use the current number of symbols in the symbol table in lieu of // using nlist_idx in case we ever start trimming entries out symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); @@ -870,7 +879,8 @@ ObjectFileMachO::ParseSymtab (bool minimize) type = eSymbolTypeScopeBegin; break; - case N_RBRAC: // right bracket: 0,,NO_SECT,nesting level,address + case StabRightBracket: + // N_RBRAC - right bracket: 0,,NO_SECT,nesting level,address // Set the size of the N_LBRAC to the terminating index of this N_RBRAC // so that we can always skip the entire symbol if we need to navigate // more quickly at the source level when parsing STABS @@ -885,25 +895,29 @@ ObjectFileMachO::ParseSymtab (bool minimize) type = eSymbolTypeScopeEnd; break; - case N_EXCL: // deleted include file: name,,NO_SECT,0,sum + case StabDeletedIncludeFile: + // N_EXCL - deleted include file: name,,NO_SECT,0,sum type = eSymbolTypeHeaderFile; break; //---------------------------------------------------------------------- // COMM scopes //---------------------------------------------------------------------- - case N_BCOMM: // begin common: name,,NO_SECT,0,0 + case StabBeginCommon: + // N_BCOMM - begin common: name,,NO_SECT,0,0 // We use the current number of symbols in the symbol table in lieu of // using nlist_idx in case we ever start trimming entries out type = eSymbolTypeScopeBegin; N_COMM_indexes.push_back(sym_idx); break; - case N_ECOML: // end common (local name): 0,,n_sect,0,address + case StabEndCommonLocal: + // N_ECOML - end common (local name): 0,,n_sect,0,address symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); // Fall through - case N_ECOMM: // end common: name,,n_sect,0,0 + case StabEndCommon: + // N_ECOMM - end common: name,,n_sect,0,0 // Set the size of the N_BCOMM to the terminating index of this N_ECOMM/N_ECOML // so that we can always skip the entire symbol if we need to navigate // more quickly at the source level when parsing STABS @@ -917,7 +931,8 @@ ObjectFileMachO::ParseSymtab (bool minimize) type = eSymbolTypeScopeEnd; break; - case N_LENG: // second stab entry with length information + case StabLength: + // N_LENG - second stab entry with length information type = eSymbolTypeAdditional; break; @@ -926,9 +941,9 @@ ObjectFileMachO::ParseSymtab (bool minimize) } else { - //uint8_t n_pext = N_PEXT & nlist.n_type; - uint8_t n_type = N_TYPE & nlist.n_type; - sym[sym_idx].SetExternal((N_EXT & nlist.n_type) != 0); + //uint8_t n_pext = NlistMaskPrivateExternal & nlist.n_type; + uint8_t n_type = NlistMaskType & nlist.n_type; + sym[sym_idx].SetExternal((NlistMaskExternal & nlist.n_type) != 0); if (symbol_name && ::strstr (symbol_name, ".objc") == symbol_name) { @@ -938,17 +953,17 @@ ObjectFileMachO::ParseSymtab (bool minimize) { switch (n_type) { - case N_INDR: // Fall through - case N_PBUD: // Fall through - case N_UNDF: + case NListTypeIndirect: // N_INDR - Fall through + case NListTypePreboundUndefined:// N_PBUD - Fall through + case NListTypeUndefined: // N_UNDF type = eSymbolTypeExtern; break; - case N_ABS: + case NListTypeAbsolute: // N_ABS type = eSymbolTypeAbsolute; break; - case N_SECT: + case NListTypeSection: // N_SECT symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); assert(symbol_section != NULL); @@ -958,27 +973,27 @@ ObjectFileMachO::ParseSymtab (bool minimize) } else { - uint32_t section_type = symbol_section->GetAllFlagBits() & SECTION_TYPE; + uint32_t section_type = symbol_section->GetAllFlagBits() & SectionFlagMaskSectionType; switch (section_type) { - case S_REGULAR: break; // regular section - //case S_ZEROFILL: type = eSymbolTypeData; break; // zero fill on demand section - case S_CSTRING_LITERALS: type = eSymbolTypeData; break; // section with only literal C strings - case S_4BYTE_LITERALS: type = eSymbolTypeData; break; // section with only 4 byte literals - case S_8BYTE_LITERALS: type = eSymbolTypeData; break; // section with only 8 byte literals - case S_LITERAL_POINTERS: type = eSymbolTypeTrampoline; break; // section with only pointers to literals - case S_NON_LAZY_SYMBOL_POINTERS: type = eSymbolTypeTrampoline; break; // section with only non-lazy symbol pointers - case S_LAZY_SYMBOL_POINTERS: type = eSymbolTypeTrampoline; break; // section with only lazy symbol pointers - case S_SYMBOL_STUBS: type = eSymbolTypeTrampoline; break; // section with only symbol stubs, byte size of stub in the reserved2 field - case S_MOD_INIT_FUNC_POINTERS: type = eSymbolTypeCode; break; // section with only function pointers for initialization - case S_MOD_TERM_FUNC_POINTERS: type = eSymbolTypeCode; break; // section with only function pointers for termination - //case S_COALESCED: type = eSymbolType; break; // section contains symbols that are to be coalesced - //case S_GB_ZEROFILL: type = eSymbolTypeData; break; // zero fill on demand section (that can be larger than 4 gigabytes) - case S_INTERPOSING: type = eSymbolTypeTrampoline; break; // section with only pairs of function pointers for interposing - case S_16BYTE_LITERALS: type = eSymbolTypeData; break; // section with only 16 byte literals - case S_DTRACE_DOF: type = eSymbolTypeInstrumentation; break; - case S_LAZY_DYLIB_SYMBOL_POINTERS: type = eSymbolTypeTrampoline; break; + case SectionTypeRegular: break; // regular section + //case SectionTypeZeroFill: type = eSymbolTypeData; break; // zero fill on demand section + case SectionTypeCStringLiterals: type = eSymbolTypeData; break; // section with only literal C strings + case SectionType4ByteLiterals: type = eSymbolTypeData; break; // section with only 4 byte literals + case SectionType8ByteLiterals: type = eSymbolTypeData; break; // section with only 8 byte literals + case SectionTypeLiteralPointers: type = eSymbolTypeTrampoline; break; // section with only pointers to literals + case SectionTypeNonLazySymbolPointers: type = eSymbolTypeTrampoline; break; // section with only non-lazy symbol pointers + case SectionTypeLazySymbolPointers: type = eSymbolTypeTrampoline; break; // section with only lazy symbol pointers + case SectionTypeSymbolStubs: type = eSymbolTypeTrampoline; break; // section with only symbol stubs, byte size of stub in the reserved2 field + case SectionTypeModuleInitFunctionPointers: type = eSymbolTypeCode; break; // section with only function pointers for initialization + case SectionTypeModuleTermFunctionPointers: type = eSymbolTypeCode; break; // section with only function pointers for termination + //case SectionTypeCoalesced: type = eSymbolType; break; // section contains symbols that are to be coalesced + //case SectionTypeZeroFillLarge: type = eSymbolTypeData; break; // zero fill on demand section (that can be larger than 4 gigabytes) + case SectionTypeInterposing: type = eSymbolTypeTrampoline; break; // section with only pairs of function pointers for interposing + case SectionType16ByteLiterals: type = eSymbolTypeData; break; // section with only 16 byte literals + case SectionTypeDTraceObjectFormat: type = eSymbolTypeInstrumentation; break; + case SectionTypeLazyDylibSymbolPointers: type = eSymbolTypeTrampoline; break; default: break; } @@ -987,7 +1002,9 @@ ObjectFileMachO::ParseSymtab (bool minimize) const char *symbol_sect_name = symbol_section->GetName().AsCString(); if (symbol_section->IsDescendant (text_section_sp.get())) { - if (symbol_section->IsClear(S_ATTR_PURE_INSTRUCTIONS | S_ATTR_SELF_MODIFYING_CODE | S_ATTR_SOME_INSTRUCTIONS)) + if (symbol_section->IsClear(SectionAttrUserPureInstructions | + SectionAttrUserSelfModifyingCode | + SectionAttrSytemSomeInstructions)) type = eSymbolTypeData; else type = eSymbolTypeCode; @@ -1097,7 +1114,7 @@ ObjectFileMachO::ParseSymtab (bool minimize) for (uint32_t sect_idx = 1; sect_idx < m_mach_sections.size(); ++sect_idx) { - if ((m_mach_sections[sect_idx].flags & SECTION_TYPE) == S_SYMBOL_STUBS) + if ((m_mach_sections[sect_idx].flags & SectionFlagMaskSectionType) == SectionTypeSymbolStubs) { uint32_t symbol_stub_byte_size = m_mach_sections[sect_idx].reserved2; if (symbol_stub_byte_size == 0) @@ -1177,7 +1194,7 @@ ObjectFileMachO::Dump (Stream *s) lldb_private::Mutex::Locker locker(m_mutex); s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); s->Indent(); - if (m_header.magic == MH_MAGIC_64 || m_header.magic == MH_CIGAM_64) + if (m_header.magic == HeaderMagic64 || m_header.magic == HeaderMagic64Swapped) s->PutCString("ObjectFileMachO64"); else s->PutCString("ObjectFileMachO32"); @@ -1207,7 +1224,7 @@ ObjectFileMachO::GetUUID (UUID* uuid) if (m_data.GetU32(&offset, &load_cmd, 2) == NULL) break; - if (load_cmd.cmd == LC_UUID) + if (load_cmd.cmd == LoadCommandUUID) { const uint8_t *uuid_bytes = m_data.PeekData(offset, 16); if (uuid_bytes) @@ -1239,11 +1256,11 @@ ObjectFileMachO::GetDependentModules (FileSpecList& files) switch (load_cmd.cmd) { - case LC_LOAD_DYLIB: - case LC_LOAD_WEAK_DYLIB: - case LC_REEXPORT_DYLIB: - case LC_LOAD_DYLINKER: - case LC_LOADFVMLIB: + case LoadCommandDylibLoad: + case LoadCommandDylibLoadWeak: + case LoadCommandDylibReexport: + case LoadCommandDynamicLinkerLoad: + case LoadCommandFixedVMShlibLoad: { uint32_t name_offset = cmd_offset + m_data.GetU32(&offset); const char *path = m_data.PeekCStr(name_offset); diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h index 3ffeb242b7c..d00ae0d73c0 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h @@ -10,7 +10,8 @@ #ifndef liblldb_ObjectFileMachO_h_ #define liblldb_ObjectFileMachO_h_ -#include <mach-o/loader.h> +#include "llvm/Support/MachO.h" + #include "lldb/Core/FileSpec.h" #include "lldb/Host/Mutex.h" #include "lldb/Symbol/ObjectFile.h" @@ -112,13 +113,13 @@ public: protected: mutable lldb_private::Mutex m_mutex; - struct mach_header m_header; + llvm::MachO::mach_header m_header; mutable std::auto_ptr<lldb_private::SectionList> m_sections_ap; mutable std::auto_ptr<lldb_private::Symtab> m_symtab_ap; - struct dysymtab_command m_dysymtab; - std::vector<struct segment_command_64> m_mach_segments; - std::vector<struct section_64> m_mach_sections; + llvm::MachO::dysymtab_command m_dysymtab; + std::vector<llvm::MachO::segment_command_64> m_mach_segments; + std::vector<llvm::MachO::section_64> m_mach_sections; size_t ParseSections (); diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index ea5ac5cd14f..268e08ae29c 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -9,15 +9,9 @@ // C Includes #include <errno.h> -#include <mach/mach.h> -#include <mach-o/dyld.h> #include <spawn.h> -#include <sys/fcntl.h> #include <sys/types.h> -#include <sys/ptrace.h> #include <sys/stat.h> -#include <sys/sysctl.h> -#include <unistd.h> // C++ Includes #include <algorithm> diff --git a/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp b/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp index 270d7ed0f5d..14a62198fdb 100644 --- a/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp +++ b/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp @@ -9,8 +9,6 @@ #include "SymbolVendorMacOSX.h" -#include <mach/machine.h> // DebugSymbols needs this on Leopard... - #include <AvailabilityMacros.h> #include "lldb/Core/Module.h" diff --git a/lldb/source/Symbol/ASTType.cpp b/lldb/source/Symbol/ASTType.cpp deleted file mode 100644 index 8ca19db4569..00000000000 --- a/lldb/source/Symbol/ASTType.cpp +++ /dev/null @@ -1,20 +0,0 @@ -//===-- ASTType.cpp ---------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/Symbol/ASTType.h" - -using namespace lldb_private; - -ASTTypeBase::~ASTTypeBase() -{ -} - -ASTType::~ASTType() -{ -}
\ No newline at end of file diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index 754ab195930..721656532cf 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -316,11 +316,11 @@ ClangASTContext::getSelectorTable() return m_selector_table_ap.get(); } -SourceManager * +clang::SourceManager * ClangASTContext::getSourceManager() { if (m_source_manager_ap.get() == NULL) - m_source_manager_ap.reset(new SourceManager(*getDiagnostic())); + m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic())); return m_source_manager_ap.get(); } @@ -758,7 +758,7 @@ ClangASTContext::AddFieldToRecordType (void * record_clang_type, const char *nam QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type)); - Type *clang_type = record_qual_type.getTypePtr(); + clang::Type *clang_type = record_qual_type.getTypePtr(); if (clang_type) { const RecordType *record_type = dyn_cast<RecordType>(clang_type); @@ -863,7 +863,7 @@ ClangASTContext::SetDefaultAccessForRecordFields (void *clang_qual_type, int def if (clang_qual_type) { QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); - Type *clang_type = qual_type.getTypePtr(); + clang::Type *clang_type = qual_type.getTypePtr(); if (clang_type) { RecordType *record_type = dyn_cast<RecordType>(clang_type); @@ -913,7 +913,7 @@ ClangASTContext::SetBaseClassesForClassType (void *class_clang_type, CXXBaseSpec { if (class_clang_type) { - Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr(); + clang::Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr(); if (clang_type) { RecordType *record_type = dyn_cast<RecordType>(clang_type); @@ -948,15 +948,15 @@ ClangASTContext::IsAggregateType (void *clang_type) switch (qual_type->getTypeClass()) { - case Type::IncompleteArray: - case Type::VariableArray: - case Type::ConstantArray: - case Type::ExtVector: - case Type::Vector: - case Type::Record: + case clang::Type::IncompleteArray: + case clang::Type::VariableArray: + case clang::Type::ConstantArray: + case clang::Type::ExtVector: + case clang::Type::Vector: + case clang::Type::Record: return true; - case Type::Typedef: + case clang::Type::Typedef: return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); default: @@ -976,7 +976,7 @@ ClangASTContext::GetNumChildren (void *clang_qual_type, bool omit_empty_base_cla QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); switch (qual_type->getTypeClass()) { - case Type::Record: + case clang::Type::Record: { const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); const RecordDecl *record_decl = record_type->getDecl(); @@ -1017,11 +1017,11 @@ ClangASTContext::GetNumChildren (void *clang_qual_type, bool omit_empty_base_cla } break; - case Type::ConstantArray: + case clang::Type::ConstantArray: num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); break; - case Type::Pointer: + case clang::Type::Pointer: { PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); QualType pointee_type = pointer_type->getPointeeType(); @@ -1034,7 +1034,7 @@ ClangASTContext::GetNumChildren (void *clang_qual_type, bool omit_empty_base_cla } break; - case Type::Typedef: + case clang::Type::Typedef: num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), omit_empty_base_classes); break; @@ -1103,7 +1103,7 @@ ClangASTContext::GetChildClangTypeAtIndex QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type)); switch (parent_qual_type->getTypeClass()) { - case Type::Record: + case clang::Type::Record: { const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr()); const RecordDecl *record_decl = record_type->getDecl(); @@ -1190,7 +1190,7 @@ ClangASTContext::GetChildClangTypeAtIndex } break; - case Type::ConstantArray: + case clang::Type::ConstantArray: { const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); const uint64_t element_count = array->getSize().getLimitedValue(); @@ -1211,7 +1211,7 @@ ClangASTContext::GetChildClangTypeAtIndex } break; - case Type::Pointer: + case clang::Type::Pointer: { PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr()); QualType pointee_type = pointer_type->getPointeeType(); @@ -1251,7 +1251,7 @@ ClangASTContext::GetChildClangTypeAtIndex } break; - case Type::Typedef: + case clang::Type::Typedef: return GetChildClangTypeAtIndex (ast_context, parent_name, cast<TypedefType>(parent_qual_type)->LookThroughTypedefs().getAsOpaquePtr(), @@ -1461,7 +1461,7 @@ ClangASTContext::GetIndexOfChildMemberWithName QualType qual_type(QualType::getFromOpaquePtr(clang_type)); switch (qual_type->getTypeClass()) { - case Type::Record: + case clang::Type::Record: { const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); const RecordDecl *record_decl = record_type->getDecl(); @@ -1548,7 +1548,7 @@ ClangASTContext::GetIndexOfChildMemberWithName } break; - case Type::ConstantArray: + case clang::Type::ConstantArray: { // const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); // const uint64_t element_count = array->getSize().getLimitedValue(); @@ -1569,7 +1569,7 @@ ClangASTContext::GetIndexOfChildMemberWithName } break; -// case Type::MemberPointerType: +// case clang::Type::MemberPointerType: // { // MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); // QualType pointee_type = mem_ptr_type->getPointeeType(); @@ -1583,8 +1583,8 @@ ClangASTContext::GetIndexOfChildMemberWithName // } // break; // - case Type::LValueReference: - case Type::RValueReference: + case clang::Type::LValueReference: + case clang::Type::RValueReference: { ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); QualType pointee_type = reference_type->getPointeeType(); @@ -1600,7 +1600,7 @@ ClangASTContext::GetIndexOfChildMemberWithName } break; - case Type::Pointer: + case clang::Type::Pointer: { PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); QualType pointee_type = pointer_type->getPointeeType(); @@ -1634,7 +1634,7 @@ ClangASTContext::GetIndexOfChildMemberWithName } break; - case Type::Typedef: + case clang::Type::Typedef: return GetIndexOfChildMemberWithName (ast_context, cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), name, @@ -1667,7 +1667,7 @@ ClangASTContext::GetIndexOfChildWithName QualType qual_type(QualType::getFromOpaquePtr(clang_type)); switch (qual_type->getTypeClass()) { - case Type::Record: + case clang::Type::Record: { const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); const RecordDecl *record_decl = record_type->getDecl(); @@ -1709,7 +1709,7 @@ ClangASTContext::GetIndexOfChildWithName } break; - case Type::ConstantArray: + case clang::Type::ConstantArray: { // const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); // const uint64_t element_count = array->getSize().getLimitedValue(); @@ -1730,7 +1730,7 @@ ClangASTContext::GetIndexOfChildWithName } break; -// case Type::MemberPointerType: +// case clang::Type::MemberPointerType: // { // MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); // QualType pointee_type = mem_ptr_type->getPointeeType(); @@ -1744,8 +1744,8 @@ ClangASTContext::GetIndexOfChildWithName // } // break; // - case Type::LValueReference: - case Type::RValueReference: + case clang::Type::LValueReference: + case clang::Type::RValueReference: { ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); QualType pointee_type = reference_type->getPointeeType(); @@ -1760,7 +1760,7 @@ ClangASTContext::GetIndexOfChildWithName } break; - case Type::Pointer: + case clang::Type::Pointer: { PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); QualType pointee_type = pointer_type->getPointeeType(); @@ -1793,7 +1793,7 @@ ClangASTContext::GetIndexOfChildWithName } break; - case Type::Typedef: + case clang::Type::Typedef: return GetIndexOfChildWithName (ast_context, cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), name, @@ -1814,7 +1814,7 @@ ClangASTContext::SetTagTypeKind (void *tag_clang_type, int kind) if (tag_clang_type) { QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type)); - Type *clang_type = tag_qual_type.getTypePtr(); + clang::Type *clang_type = tag_qual_type.getTypePtr(); if (clang_type) { TagType *tag_type = dyn_cast<TagType>(clang_type); @@ -1844,34 +1844,34 @@ ClangASTContext::GetDeclContextForType (void *clang_type) QualType qual_type(QualType::getFromOpaquePtr(clang_type)); switch (qual_type->getTypeClass()) { - case Type::FunctionNoProto: break; - case Type::FunctionProto: break; - case Type::IncompleteArray: break; - case Type::VariableArray: break; - case Type::ConstantArray: break; - case Type::ExtVector: break; - case Type::Vector: break; - case Type::Builtin: break; - case Type::ObjCObjectPointer: break; - case Type::BlockPointer: break; - case Type::Pointer: break; - case Type::LValueReference: break; - case Type::RValueReference: break; - case Type::MemberPointer: break; - case Type::Complex: break; - case Type::ObjCInterface: break; - case Type::Record: + case clang::Type::FunctionNoProto: break; + case clang::Type::FunctionProto: break; + case clang::Type::IncompleteArray: break; + case clang::Type::VariableArray: break; + case clang::Type::ConstantArray: break; + case clang::Type::ExtVector: break; + case clang::Type::Vector: break; + case clang::Type::Builtin: break; + case clang::Type::ObjCObjectPointer: break; + case clang::Type::BlockPointer: break; + case clang::Type::Pointer: break; + case clang::Type::LValueReference: break; + case clang::Type::RValueReference: break; + case clang::Type::MemberPointer: break; + case clang::Type::Complex: break; + case clang::Type::ObjCInterface: break; + case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl(); - case Type::Enum: + case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl(); - case Type::Typedef: + case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); - case Type::TypeOfExpr: break; - case Type::TypeOf: break; - case Type::Decltype: break; - //case Type::QualifiedName: break; - case Type::TemplateSpecialization: break; + case clang::Type::TypeOfExpr: break; + case clang::Type::TypeOf: break; + case clang::Type::Decltype: break; + //case clang::Type::QualifiedName: break; + case clang::Type::TemplateSpecialization: break; } // No DeclContext in this type... return NULL; @@ -2006,7 +2006,7 @@ ClangASTContext::StartTagDeclarationDefinition (void *clang_type) if (clang_type) { QualType qual_type (QualType::getFromOpaquePtr(clang_type)); - Type *t = qual_type.getTypePtr(); + clang::Type *t = qual_type.getTypePtr(); if (t) { TagType *tag_type = dyn_cast<TagType>(t); @@ -2030,7 +2030,7 @@ ClangASTContext::CompleteTagDeclarationDefinition (void *clang_type) if (clang_type) { QualType qual_type (QualType::getFromOpaquePtr(clang_type)); - Type *t = qual_type.getTypePtr(); + clang::Type *t = qual_type.getTypePtr(); if (t) { TagType *tag_type = dyn_cast<TagType>(t); @@ -2091,7 +2091,7 @@ ClangASTContext::AddEnumerationValueToEnumerationType assert (identifier_table != NULL); QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); - Type *clang_type = enum_qual_type.getTypePtr(); + clang::Type *clang_type = enum_qual_type.getTypePtr(); if (clang_type) { const EnumType *enum_type = dyn_cast<EnumType>(clang_type); @@ -2171,31 +2171,31 @@ ClangASTContext::IsPointerOrReferenceType (void *clang_type, void **target_type) QualType qual_type (QualType::getFromOpaquePtr(clang_type)); switch (qual_type->getTypeClass()) { - case Type::ObjCObjectPointer: + case clang::Type::ObjCObjectPointer: if (target_type) *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); return true; - case Type::BlockPointer: + case clang::Type::BlockPointer: if (target_type) *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); return true; - case Type::Pointer: + case clang::Type::Pointer: if (target_type) *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); return true; - case Type::MemberPointer: + case clang::Type::MemberPointer: if (target_type) *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); return true; - case Type::LValueReference: + case clang::Type::LValueReference: if (target_type) *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); return true; - case Type::RValueReference: + case clang::Type::RValueReference: if (target_type) *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); return true; - case Type::Typedef: + case clang::Type::Typedef: return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); default: break; @@ -2247,23 +2247,23 @@ ClangASTContext::IsPointerType (void *clang_type, void **target_type) QualType qual_type (QualType::getFromOpaquePtr(clang_type)); switch (qual_type->getTypeClass()) { - case Type::ObjCObjectPointer: + case clang::Type::ObjCObjectPointer: if (target_type) *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); return true; - case Type::BlockPointer: + case clang::Type::BlockPointer: if (target_type) *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); return true; - case Type::Pointer: + case clang::Type::Pointer: if (target_type) *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); return true; - case Type::MemberPointer: + case clang::Type::MemberPointer: if (target_type) *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); return true; - case Type::Typedef: + case clang::Type::Typedef: return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), target_type); default: break; @@ -2320,11 +2320,11 @@ ClangASTContext::IsCStringType (void *clang_type, uint32_t &length) QualType qual_type (QualType::getFromOpaquePtr(clang_type)); switch (qual_type->getTypeClass()) { - case Type::ConstantArray: + case clang::Type::ConstantArray: { ConstantArrayType *array = cast<ConstantArrayType>(qual_type.getTypePtr()); QualType element_qual_type = array->getElementType(); - Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr(); + clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr(); if (canonical_type && canonical_type->isCharType()) { // We know the size of the array and it could be a C string @@ -2335,13 +2335,13 @@ ClangASTContext::IsCStringType (void *clang_type, uint32_t &length) } break; - case Type::Pointer: + case clang::Type::Pointer: { PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); - Type *pointee_type_ptr = pointer_type->getPointeeType().getTypePtr(); + clang::Type *pointee_type_ptr = pointer_type->getPointeeType().getTypePtr(); if (pointee_type_ptr) { - Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr(); + clang::Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr(); length = 0; // No length info, read until a NULL terminator is received if (canonical_type_ptr) return canonical_type_ptr->isCharType(); @@ -2351,17 +2351,17 @@ ClangASTContext::IsCStringType (void *clang_type, uint32_t &length) } break; - case Type::Typedef: + case clang::Type::Typedef: return ClangASTContext::IsCStringType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), length); - case Type::LValueReference: - case Type::RValueReference: + case clang::Type::LValueReference: + case clang::Type::RValueReference: { ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); - Type *pointee_type_ptr = reference_type->getPointeeType().getTypePtr(); + clang::Type *pointee_type_ptr = reference_type->getPointeeType().getTypePtr(); if (pointee_type_ptr) { - Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr(); + clang::Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr(); length = 0; // No length info, read until a NULL terminator is received if (canonical_type_ptr) return canonical_type_ptr->isCharType(); @@ -2385,24 +2385,24 @@ ClangASTContext::IsArrayType (void * clang_type, void **member_type, uint64_t *s switch (qual_type->getTypeClass()) { - case Type::ConstantArray: + case clang::Type::ConstantArray: if (member_type) *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr(); if (size) *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX); return true; - case Type::IncompleteArray: + case clang::Type::IncompleteArray: if (member_type) *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr(); if (size) *size = 0; return true; - case Type::VariableArray: + case clang::Type::VariableArray: if (member_type) *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr(); if (size) *size = 0; - case Type::DependentSizedArray: + case clang::Type::DependentSizedArray: if (member_type) *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr(); if (size) diff --git a/lldb/source/Symbol/ClangASTType.cpp b/lldb/source/Symbol/ClangASTType.cpp new file mode 100644 index 00000000000..6c831db5e35 --- /dev/null +++ b/lldb/source/Symbol/ClangASTType.cpp @@ -0,0 +1,1114 @@ +//===-- ClangASTType.cpp ---------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Symbol/ClangASTType.h" + +#include "clang/AST/ASTConsumer.h" +#include "clang/AST/ASTContext.h" +#include "clang/AST/Decl.h" +#include "clang/AST/DeclCXX.h" +#include "clang/AST/DeclGroup.h" +#include "clang/AST/RecordLayout.h" + +#include "clang/Basic/Builtins.h" +#include "clang/Basic/IdentifierTable.h" +#include "clang/Basic/LangOptions.h" +#include "clang/Basic/SourceManager.h" +#include "clang/Basic/TargetInfo.h" + +#include "llvm/Support/FormattedStream.h" +#include "llvm/Support/raw_ostream.h" + +#include "lldb/Core/ConstString.h" +#include "lldb/Core/DataBufferHeap.h" +#include "lldb/Core/DataExtractor.h" +#include "lldb/Core/Scalar.h" +#include "lldb/Core/Stream.h" +#include "lldb/Core/StreamString.h" +#include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Target/ExecutionContext.h" +#include "lldb/Target/Process.h" + +using namespace lldb_private; + +ClangASTType::~ClangASTType() +{ +} + +ConstString +ClangASTType::GetClangTypeName () +{ + return GetClangTypeName (m_type); +} + +ConstString +ClangASTType::GetClangTypeName (void *opaque_clang_qual_type) +{ + ConstString clang_type_name; + if (opaque_clang_qual_type) + { + clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_clang_qual_type)); + + const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>(); + if (typedef_type) + { + const clang::TypedefDecl *typedef_decl = typedef_type->getDecl(); + std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString()); + if (!clang_typedef_name.empty()) + clang_type_name.SetCString (clang_typedef_name.c_str()); + } + else + { + std::string type_name(qual_type.getAsString()); + if (!type_name.empty()) + clang_type_name.SetCString (type_name.c_str()); + } + } + else + { + clang_type_name.SetCString ("<invalid>"); + } + + return clang_type_name; +} + +lldb::Encoding +ClangASTType::GetEncoding (uint32_t &count) +{ + return GetEncoding(m_type, count); +} + + +lldb::Encoding +ClangASTType::GetEncoding (void *opaque_clang_qual_type, uint32_t &count) +{ + count = 1; + clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_clang_qual_type)); + + switch (qual_type->getTypeClass()) + { + case clang::Type::FunctionNoProto: + case clang::Type::FunctionProto: + break; + + case clang::Type::IncompleteArray: + case clang::Type::VariableArray: + break; + + case clang::Type::ConstantArray: + break; + + case clang::Type::ExtVector: + case clang::Type::Vector: + // TODO: Set this to more than one??? + break; + + case clang::Type::Builtin: + switch (cast<clang::BuiltinType>(qual_type)->getKind()) + { + default: assert(0 && "Unknown builtin type!"); + case clang::BuiltinType::Void: + break; + + case clang::BuiltinType::Bool: + case clang::BuiltinType::Char_S: + case clang::BuiltinType::SChar: + case clang::BuiltinType::WChar: + case clang::BuiltinType::Char16: + case clang::BuiltinType::Char32: + case clang::BuiltinType::Short: + case clang::BuiltinType::Int: + case clang::BuiltinType::Long: + case clang::BuiltinType::LongLong: + case clang::BuiltinType::Int128: return lldb::eEncodingSint; + + case clang::BuiltinType::Char_U: + case clang::BuiltinType::UChar: + case clang::BuiltinType::UShort: + case clang::BuiltinType::UInt: + case clang::BuiltinType::ULong: + case clang::BuiltinType::ULongLong: + case clang::BuiltinType::UInt128: return lldb::eEncodingUint; + + case clang::BuiltinType::Float: + case clang::BuiltinType::Double: + case clang::BuiltinType::LongDouble: return lldb::eEncodingIEEE754; + + case clang::BuiltinType::NullPtr: return lldb::eEncodingUint; + } + break; + // All pointer types are represented as unsigned integer encodings. + // We may nee to add a eEncodingPointer if we ever need to know the + // difference + case clang::Type::ObjCObjectPointer: + case clang::Type::BlockPointer: + case clang::Type::Pointer: + case clang::Type::LValueReference: + case clang::Type::RValueReference: + case clang::Type::MemberPointer: return lldb::eEncodingUint; + // Complex numbers are made up of floats + case clang::Type::Complex: + count = 2; + return lldb::eEncodingIEEE754; + + case clang::Type::ObjCInterface: break; + case clang::Type::Record: break; + case clang::Type::Enum: return lldb::eEncodingSint; + case clang::Type::Typedef: + return GetEncoding(cast<clang::TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), count); + break; + + case clang::Type::TypeOfExpr: + case clang::Type::TypeOf: + case clang::Type::Decltype: +// case clang::Type::QualifiedName: + case clang::Type::TemplateSpecialization: break; + } + count = 0; + return lldb::eEncodingInvalid; +} + +lldb::Format +ClangASTType::GetFormat () +{ + return GetFormat (m_type); +} + +lldb::Format +ClangASTType::GetFormat (void *opaque_clang_qual_type) +{ + clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_clang_qual_type)); + + switch (qual_type->getTypeClass()) + { + case clang::Type::FunctionNoProto: + case clang::Type::FunctionProto: + break; + + case clang::Type::IncompleteArray: + case clang::Type::VariableArray: + break; + + case clang::Type::ConstantArray: + break; + + case clang::Type::ExtVector: + case clang::Type::Vector: + break; + + case clang::Type::Builtin: + switch (cast<clang::BuiltinType>(qual_type)->getKind()) + { + default: assert(0 && "Unknown builtin type!"); + case clang::BuiltinType::Void: + break; + + case clang::BuiltinType::Bool: return lldb::eFormatBoolean; + case clang::BuiltinType::Char_S: + case clang::BuiltinType::SChar: + case clang::BuiltinType::Char_U: + case clang::BuiltinType::UChar: + case clang::BuiltinType::WChar: return lldb::eFormatChar; + case clang::BuiltinType::Char16: return lldb::eFormatUnicode16; + case clang::BuiltinType::Char32: return lldb::eFormatUnicode32; + case clang::BuiltinType::UShort: return lldb::eFormatHex; + case clang::BuiltinType::Short: return lldb::eFormatDecimal; + case clang::BuiltinType::UInt: return lldb::eFormatHex; + case clang::BuiltinType::Int: return lldb::eFormatDecimal; + case clang::BuiltinType::ULong: return lldb::eFormatHex; + case clang::BuiltinType::Long: return lldb::eFormatDecimal; + case clang::BuiltinType::ULongLong: return lldb::eFormatHex; + case clang::BuiltinType::LongLong: return lldb::eFormatDecimal; + case clang::BuiltinType::UInt128: return lldb::eFormatHex; + case clang::BuiltinType::Int128: return lldb::eFormatDecimal; + case clang::BuiltinType::Float: return lldb::eFormatFloat; + case clang::BuiltinType::Double: return lldb::eFormatFloat; + case clang::BuiltinType::LongDouble: return lldb::eFormatFloat; + case clang::BuiltinType::NullPtr: return lldb::eFormatHex; + } + break; + case clang::Type::ObjCObjectPointer: return lldb::eFormatHex; + case clang::Type::BlockPointer: return lldb::eFormatHex; + case clang::Type::Pointer: return lldb::eFormatHex; + case clang::Type::LValueReference: + case clang::Type::RValueReference: return lldb::eFormatHex; + case clang::Type::MemberPointer: break; + case clang::Type::Complex: return lldb::eFormatComplex; + case clang::Type::ObjCInterface: break; + case clang::Type::Record: break; + case clang::Type::Enum: return lldb::eFormatEnum; + case clang::Type::Typedef: + return ClangASTType::GetFormat(cast<clang::TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); + + case clang::Type::TypeOfExpr: + case clang::Type::TypeOf: + case clang::Type::Decltype: +// case clang::Type::QualifiedName: + case clang::Type::TemplateSpecialization: break; + } + // We don't know hot to display this type... + return lldb::eFormatBytes; +} + + +void +ClangASTType::DumpValue +( + ExecutionContext *exe_ctx, + Stream *s, + lldb::Format format, + const lldb_private::DataExtractor &data, + uint32_t data_byte_offset, + size_t data_byte_size, + uint32_t bitfield_bit_size, + uint32_t bitfield_bit_offset, + bool show_types, + bool show_summary, + bool verbose, + uint32_t depth +) +{ + return DumpValue (m_ast, + m_type, + exe_ctx, + s, + format, + data, + data_byte_offset, + data_byte_size, + bitfield_bit_size, + bitfield_bit_offset, + show_types, + show_summary, + verbose, + depth); +} + +#define DEPTH_INCREMENT 2 +void +ClangASTType::DumpValue +( + clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + ExecutionContext *exe_ctx, + Stream *s, + lldb::Format format, + const lldb_private::DataExtractor &data, + uint32_t data_byte_offset, + size_t data_byte_size, + uint32_t bitfield_bit_size, + uint32_t bitfield_bit_offset, + bool show_types, + bool show_summary, + bool verbose, + uint32_t depth +) +{ + clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_clang_qual_type)); + switch (qual_type->getTypeClass()) + { + case clang::Type::Record: + { + const clang::RecordType *record_type = cast<clang::RecordType>(qual_type.getTypePtr()); + const clang::RecordDecl *record_decl = record_type->getDecl(); + assert(record_decl); + uint32_t field_bit_offset = 0; + uint32_t field_byte_offset = 0; + const clang::ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl); + uint32_t child_idx = 0; + + + const clang::CXXRecordDecl *cxx_record_decl = dyn_cast<clang::CXXRecordDecl>(record_decl); + if (cxx_record_decl) + { + // We might have base classes to print out first + clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end; + for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); + base_class != base_class_end; + ++base_class) + { + const clang::CXXRecordDecl *base_class_decl = cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl()); + + // Skip empty base classes + if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false) + continue; + + if (base_class->isVirtual()) + field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl); + else + field_bit_offset = record_layout.getBaseClassOffset(base_class_decl); + field_byte_offset = field_bit_offset / 8; + assert (field_bit_offset % 8 == 0); + if (child_idx == 0) + s->PutChar('{'); + else + s->PutChar(','); + + clang::QualType base_class_qual_type = base_class->getType(); + std::string base_class_type_name(base_class_qual_type.getAsString()); + + // Indent and print the base class type name + s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str()); + + std::pair<uint64_t, unsigned> base_class_type_info = ast_context->getTypeInfo(base_class_qual_type); + + // Dump the value of the member + DumpValue (ast_context, // The clang AST context for this type + base_class_qual_type.getAsOpaquePtr(),// The clang type we want to dump + exe_ctx, + s, // Stream to dump to + ClangASTType::GetFormat(base_class_qual_type.getAsOpaquePtr()), // The format with which to display the member + data, // Data buffer containing all bytes for this type + data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from + base_class_type_info.first / 8, // Size of this type in bytes + 0, // Bitfield bit size + 0, // Bitfield bit offset + show_types, // Boolean indicating if we should show the variable types + show_summary, // Boolean indicating if we should show a summary for the current type + verbose, // Verbose output? + depth + DEPTH_INCREMENT); // Scope depth for any types that have children + + ++child_idx; + } + } + uint32_t field_idx = 0; + clang::RecordDecl::field_iterator field, field_end; + for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) + { + // Print the starting squiggly bracket (if this is the + // first member) or comman (for member 2 and beyong) for + // the struct/union/class member. + if (child_idx == 0) + s->PutChar('{'); + else + s->PutChar(','); + + // Indent + s->Printf("\n%*s", depth + DEPTH_INCREMENT, ""); + + clang::QualType field_type = field->getType(); + // Print the member type if requested + // Figure out the type byte size (field_type_info.first) and + // alignment (field_type_info.second) from the AST context. + std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field_type); + assert(field_idx < record_layout.getFieldCount()); + // Figure out the field offset within the current struct/union/class type + field_bit_offset = record_layout.getFieldOffset (field_idx); + field_byte_offset = field_bit_offset / 8; + uint32_t field_bitfield_bit_size = 0; + uint32_t field_bitfield_bit_offset = 0; + if (ClangASTContext::FieldIsBitfield (ast_context, *field, field_bitfield_bit_size)) + field_bitfield_bit_offset = field_bit_offset % 8; + + if (show_types) + { + std::string field_type_name(field_type.getAsString()); + if (field_bitfield_bit_size > 0) + s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size); + else + s->Printf("(%s) ", field_type_name.c_str()); + } + // Print the member name and equal sign + s->Printf("%s = ", field->getNameAsString().c_str()); + + + // Dump the value of the member + DumpValue (ast_context, // The clang AST context for this type + field_type.getAsOpaquePtr(), // The clang type we want to dump + exe_ctx, + s, // Stream to dump to + ClangASTType::GetFormat(field_type.getAsOpaquePtr()), // The format with which to display the member + data, // Data buffer containing all bytes for this type + data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from + field_type_info.first / 8, // Size of this type in bytes + field_bitfield_bit_size, // Bitfield bit size + field_bitfield_bit_offset, // Bitfield bit offset + show_types, // Boolean indicating if we should show the variable types + show_summary, // Boolean indicating if we should show a summary for the current type + verbose, // Verbose output? + depth + DEPTH_INCREMENT); // Scope depth for any types that have children + } + + // Indent the trailing squiggly bracket + if (child_idx > 0) + s->Printf("\n%*s}", depth, ""); + } + return; + + case clang::Type::Enum: + { + const clang::EnumType *enum_type = cast<clang::EnumType>(qual_type.getTypePtr()); + const clang::EnumDecl *enum_decl = enum_type->getDecl(); + assert(enum_decl); + clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos; + uint32_t offset = data_byte_offset; + const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset); + for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos) + { + if (enum_pos->getInitVal() == enum_value) + { + s->Printf("%s", enum_pos->getNameAsCString()); + return; + } + } + // If we have gotten here we didn't get find the enumerator in the + // enum decl, so just print the integer. + s->Printf("%lli", enum_value); + } + return; + + case clang::Type::ConstantArray: + { + const clang::ConstantArrayType *array = cast<clang::ConstantArrayType>(qual_type.getTypePtr()); + bool is_array_of_characters = false; + clang::QualType element_qual_type = array->getElementType(); + + clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr(); + if (canonical_type) + is_array_of_characters = canonical_type->isCharType(); + + const uint64_t element_count = array->getSize().getLimitedValue(); + + std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(element_qual_type); + + uint32_t element_idx = 0; + uint32_t element_offset = 0; + uint64_t element_byte_size = field_type_info.first / 8; + uint32_t element_stride = element_byte_size; + + if (is_array_of_characters) + { + s->PutChar('"'); + data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0); + s->PutChar('"'); + return; + } + else + { + lldb::Format element_format = ClangASTType::GetFormat(element_qual_type.getAsOpaquePtr()); + + for (element_idx = 0; element_idx < element_count; ++element_idx) + { + // Print the starting squiggly bracket (if this is the + // first member) or comman (for member 2 and beyong) for + // the struct/union/class member. + if (element_idx == 0) + s->PutChar('{'); + else + s->PutChar(','); + + // Indent and print the index + s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx); + + // Figure out the field offset within the current struct/union/class type + element_offset = element_idx * element_stride; + + // Dump the value of the member + DumpValue (ast_context, // The clang AST context for this type + element_qual_type.getAsOpaquePtr(), // The clang type we want to dump + exe_ctx, + s, // Stream to dump to + element_format, // The format with which to display the element + data, // Data buffer containing all bytes for this type + data_byte_offset + element_offset,// Offset into "data" where to grab value from + element_byte_size, // Size of this type in bytes + 0, // Bitfield bit size + 0, // Bitfield bit offset + show_types, // Boolean indicating if we should show the variable types + show_summary, // Boolean indicating if we should show a summary for the current type + verbose, // Verbose output? + depth + DEPTH_INCREMENT); // Scope depth for any types that have children + } + + // Indent the trailing squiggly bracket + if (element_idx > 0) + s->Printf("\n%*s}", depth, ""); + } + } + return; + + case clang::Type::Typedef: + { + clang::QualType typedef_qual_type = cast<clang::TypedefType>(qual_type)->LookThroughTypedefs(); + lldb::Format typedef_format = ClangASTType::GetFormat(typedef_qual_type.getAsOpaquePtr()); + std::pair<uint64_t, unsigned> typedef_type_info = ast_context->getTypeInfo(typedef_qual_type); + uint64_t typedef_byte_size = typedef_type_info.first / 8; + + return DumpValue (ast_context, // The clang AST context for this type + typedef_qual_type.getAsOpaquePtr(), // The clang type we want to dump + exe_ctx, + s, // Stream to dump to + typedef_format, // The format with which to display the element + data, // Data buffer containing all bytes for this type + data_byte_offset, // Offset into "data" where to grab value from + typedef_byte_size, // Size of this type in bytes + bitfield_bit_size, // Bitfield bit size + bitfield_bit_offset,// Bitfield bit offset + show_types, // Boolean indicating if we should show the variable types + show_summary, // Boolean indicating if we should show a summary for the current type + verbose, // Verbose output? + depth); // Scope depth for any types that have children + } + break; + + default: + // We are down the a scalar type that we just need to display. + data.Dump(s, data_byte_offset, format, data_byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, bitfield_bit_size, bitfield_bit_offset); + + if (show_summary) + DumpSummary (ast_context, opaque_clang_qual_type, exe_ctx, s, data, data_byte_offset, data_byte_size); + break; + } +} + + + +bool +ClangASTType::DumpTypeValue +( + Stream *s, + lldb::Format format, + const lldb_private::DataExtractor &data, + uint32_t byte_offset, + size_t byte_size, + uint32_t bitfield_bit_size, + uint32_t bitfield_bit_offset +) +{ + return DumpTypeValue (m_ast, + m_type, + s, + format, + data, + byte_offset, + byte_size, + bitfield_bit_size, + bitfield_bit_offset); +} + + +bool +ClangASTType::DumpTypeValue +( + clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + Stream *s, + lldb::Format format, + const lldb_private::DataExtractor &data, + uint32_t byte_offset, + size_t byte_size, + uint32_t bitfield_bit_size, + uint32_t bitfield_bit_offset +) +{ + clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_clang_qual_type)); + if (ClangASTContext::IsAggregateType (opaque_clang_qual_type)) + { + return 0; + } + else + { + switch (qual_type->getTypeClass()) + { + case clang::Type::Enum: + { + const clang::EnumType *enum_type = cast<clang::EnumType>(qual_type.getTypePtr()); + const clang::EnumDecl *enum_decl = enum_type->getDecl(); + assert(enum_decl); + clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos; + uint32_t offset = byte_offset; + const int64_t enum_value = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset); + for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos) + { + if (enum_pos->getInitVal() == enum_value) + { + s->PutCString (enum_pos->getNameAsCString()); + return true; + } + } + // If we have gotten here we didn't get find the enumerator in the + // enum decl, so just print the integer. + + s->Printf("%lli", enum_value); + return true; + } + break; + + case clang::Type::Typedef: + { + clang::QualType typedef_qual_type = cast<clang::TypedefType>(qual_type)->LookThroughTypedefs(); + lldb::Format typedef_format = ClangASTType::GetFormat(typedef_qual_type.getAsOpaquePtr()); + std::pair<uint64_t, unsigned> typedef_type_info = ast_context->getTypeInfo(typedef_qual_type); + uint64_t typedef_byte_size = typedef_type_info.first / 8; + + return ClangASTType::DumpTypeValue( + ast_context, // The clang AST context for this type + typedef_qual_type.getAsOpaquePtr(), // The clang type we want to dump + s, + typedef_format, // The format with which to display the element + data, // Data buffer containing all bytes for this type + byte_offset, // Offset into "data" where to grab value from + typedef_byte_size, // Size of this type in bytes + bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield + bitfield_bit_offset); // Offset in bits of a bitfield value if bitfield_bit_size != 0 + } + break; + + default: + // We are down the a scalar type that we just need to display. + return data.Dump(s, + byte_offset, + format, + byte_size, + 1, + UINT32_MAX, + LLDB_INVALID_ADDRESS, + bitfield_bit_size, + bitfield_bit_offset); + break; + } + } + return 0; +} + + + +void +ClangASTType::DumpSummary +( + ExecutionContext *exe_ctx, + Stream *s, + const lldb_private::DataExtractor &data, + uint32_t data_byte_offset, + size_t data_byte_size +) +{ + return DumpSummary (m_ast, + m_type, + exe_ctx, + s, + data, + data_byte_offset, + data_byte_size); +} + +void +ClangASTType::DumpSummary +( + clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + ExecutionContext *exe_ctx, + Stream *s, + const lldb_private::DataExtractor &data, + uint32_t data_byte_offset, + size_t data_byte_size +) +{ + uint32_t length = 0; + clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_clang_qual_type)); + if (ClangASTContext::IsCStringType (opaque_clang_qual_type, length)) + { + + if (exe_ctx && exe_ctx->process) + { + uint32_t offset = data_byte_offset; + lldb::addr_t pointer_addresss = data.GetMaxU64(&offset, data_byte_size); + std::vector<uint8_t> buf; + if (length > 0) + buf.resize (length); + else + buf.resize (256); + + lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), exe_ctx->process->GetByteOrder(), 4); + buf.back() = '\0'; + size_t bytes_read; + size_t total_cstr_len = 0; + Error error; + while ((bytes_read = exe_ctx->process->ReadMemory (pointer_addresss, &buf.front(), buf.size(), error)) > 0) + { + const size_t len = strlen((const char *)&buf.front()); + if (len == 0) + break; + if (total_cstr_len == 0) + s->PutCString (" \""); + cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0); + total_cstr_len += len; + if (len < buf.size()) + break; + pointer_addresss += total_cstr_len; + } + if (total_cstr_len > 0) + s->PutChar ('"'); + } + } +} + +bool +ClangASTType::GetValueAsScalar +( + const lldb_private::DataExtractor &data, + uint32_t data_byte_offset, + size_t data_byte_size, + Scalar &value +) +{ + return GetValueAsScalar (m_ast, + m_type, + data, + data_byte_offset, + data_byte_size, + value); +} + +bool +ClangASTType::GetValueAsScalar +( + clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + const lldb_private::DataExtractor &data, + uint32_t data_byte_offset, + size_t data_byte_size, + Scalar &value +) +{ + clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_clang_qual_type)); + + if (ClangASTContext::IsAggregateType (opaque_clang_qual_type)) + { + return false; // Aggregate types don't have scalar values + } + else + { + uint32_t count = 0; + lldb::Encoding encoding = GetEncoding (opaque_clang_qual_type, count); + + if (encoding == lldb::eEncodingInvalid || count != 1) + return false; + + uint64_t bit_width = ast_context->getTypeSize(qual_type); + uint32_t byte_size = (bit_width + 7 ) / 8; + uint32_t offset = data_byte_offset; + switch (encoding) + { + case lldb::eEncodingUint: + if (byte_size <= sizeof(unsigned long long)) + { + uint64_t uval64 = data.GetMaxU64 (&offset, byte_size); + if (byte_size <= sizeof(unsigned int)) + { + value = (unsigned int)uval64; + return true; + } + else if (byte_size <= sizeof(unsigned long)) + { + value = (unsigned long)uval64; + return true; + } + else if (byte_size <= sizeof(unsigned long long)) + { + value = (unsigned long long )uval64; + return true; + } + else + value.Clear(); + } + break; + + case lldb::eEncodingSint: + if (byte_size <= sizeof(long long)) + { + int64_t sval64 = (int64_t)data.GetMaxU64 (&offset, byte_size); + if (byte_size <= sizeof(int)) + { + value = (int)sval64; + return true; + } + else if (byte_size <= sizeof(long)) + { + value = (long)sval64; + return true; + } + else if (byte_size <= sizeof(long long)) + { + value = (long long )sval64; + return true; + } + else + value.Clear(); + } + break; + + case lldb::eEncodingIEEE754: + if (byte_size <= sizeof(long double)) + { + uint32_t u32; + uint64_t u64; + if (byte_size == sizeof(float)) + { + if (sizeof(float) == sizeof(uint32_t)) + { + u32 = data.GetU32(&offset); + value = *((float *)&u32); + return true; + } + else if (sizeof(float) == sizeof(uint64_t)) + { + u64 = data.GetU64(&offset); + value = *((float *)&u64); + return true; + } + } + else + if (byte_size == sizeof(double)) + { + if (sizeof(double) == sizeof(uint32_t)) + { + u32 = data.GetU32(&offset); + value = *((double *)&u32); + return true; + } + else if (sizeof(double) == sizeof(uint64_t)) + { + u64 = data.GetU64(&offset); + value = *((double *)&u64); + return true; + } + } + else + if (byte_size == sizeof(long double)) + { + if (sizeof(long double) == sizeof(uint32_t)) + { + u32 = data.GetU32(&offset); + value = *((long double *)&u32); + return true; + } + else if (sizeof(long double) == sizeof(uint64_t)) + { + u64 = data.GetU64(&offset); + value = *((long double *)&u64); + return true; + } + } + } + break; + } + } + return false; +} + +bool +ClangASTType::SetValueFromScalar (const Scalar &value, Stream &strm) +{ + return SetValueFromScalar (m_ast, m_type, value, strm); +} + +bool +ClangASTType::SetValueFromScalar +( + clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + const Scalar &value, + Stream &strm +) +{ + clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_clang_qual_type)); + + // Aggregate types don't have scalar values + if (!ClangASTContext::IsAggregateType (opaque_clang_qual_type)) + { + strm.GetFlags().Set(Stream::eBinary); + uint32_t count = 0; + lldb::Encoding encoding = GetEncoding (opaque_clang_qual_type, count); + + if (encoding == lldb::eEncodingInvalid || count != 1) + return false; + + uint64_t bit_width = ast_context->getTypeSize(qual_type); + // This function doesn't currently handle non-byte aligned assignments + if ((bit_width % 8) != 0) + return false; + + uint32_t byte_size = (bit_width + 7 ) / 8; + switch (encoding) + { + case lldb::eEncodingUint: + switch (byte_size) + { + case 1: strm.PutHex8(value.UInt()); return true; + case 2: strm.PutHex16(value.UInt()); return true; + case 4: strm.PutHex32(value.UInt()); return true; + case 8: strm.PutHex64(value.ULongLong()); return true; + default: + break; + } + break; + + case lldb::eEncodingSint: + switch (byte_size) + { + case 1: strm.PutHex8(value.SInt()); return true; + case 2: strm.PutHex16(value.SInt()); return true; + case 4: strm.PutHex32(value.SInt()); return true; + case 8: strm.PutHex64(value.SLongLong()); return true; + default: + break; + } + break; + + case lldb::eEncodingIEEE754: + if (byte_size <= sizeof(long double)) + { + if (byte_size == sizeof(float)) + { + strm.PutFloat(value.Float()); + return true; + } + else + if (byte_size == sizeof(double)) + { + strm.PutDouble(value.Double()); + return true; + } + else + if (byte_size == sizeof(long double)) + { + strm.PutDouble(value.LongDouble()); + return true; + } + } + break; + } + } + return false; +} + +bool +ClangASTType::ReadFromMemory +( + lldb_private::ExecutionContext *exe_ctx, + lldb::addr_t addr, + lldb::AddressType address_type, + lldb_private::DataExtractor &data +) +{ + return ReadFromMemory (m_ast, + m_type, + exe_ctx, + addr, + address_type, + data); +} + + +bool +ClangASTType::ReadFromMemory +( + clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + lldb_private::ExecutionContext *exe_ctx, + lldb::addr_t addr, + lldb::AddressType address_type, + lldb_private::DataExtractor &data +) +{ + if (address_type == lldb::eAddressTypeFile) + { + // Can't convert a file address to anything valid without more + // context (which Module it came from) + return false; + } + clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_clang_qual_type)); + + const uint32_t byte_size = (ast_context->getTypeSize (qual_type) + 7) / 8; + if (data.GetByteSize() < byte_size) + { + lldb::DataBufferSP data_sp(new DataBufferHeap (byte_size, '\0')); + data.SetData(data_sp); + } + + uint8_t* dst = (uint8_t*)data.PeekData(0, byte_size); + if (dst != NULL) + { + if (address_type == lldb::eAddressTypeHost) + { + // The address is an address in this process, so just copy it + memcpy (dst, (uint8_t*)NULL + addr, byte_size); + return true; + } + else + { + if (exe_ctx && exe_ctx->process) + { + Error error; + return exe_ctx->process->ReadMemory(addr, dst, byte_size, error) == byte_size; + } + } + } + return false; +} + +bool +ClangASTType::WriteToMemory +( + lldb_private::ExecutionContext *exe_ctx, + lldb::addr_t addr, + lldb::AddressType address_type, + StreamString &new_value +) +{ + return WriteToMemory (m_ast, + m_type, + exe_ctx, + addr, + address_type, + new_value); +} + +bool +ClangASTType::WriteToMemory +( + clang::ASTContext *ast_context, + void *opaque_clang_qual_type, + lldb_private::ExecutionContext *exe_ctx, + lldb::addr_t addr, + lldb::AddressType address_type, + StreamString &new_value +) +{ + if (address_type == lldb::eAddressTypeFile) + { + // Can't convert a file address to anything valid without more + // context (which Module it came from) + return false; + } + clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_clang_qual_type)); + const uint32_t byte_size = (ast_context->getTypeSize (qual_type) + 7) / 8; + + if (byte_size > 0) + { + if (address_type == lldb::eAddressTypeHost) + { + // The address is an address in this process, so just copy it + memcpy ((void *)addr, new_value.GetData(), byte_size); + return true; + } + else + { + if (exe_ctx && exe_ctx->process) + { + Error error; + return exe_ctx->process->WriteMemory(addr, new_value.GetData(), byte_size, error) == byte_size; + } + } + } + return false; +} + + diff --git a/lldb/source/Symbol/Function.cpp b/lldb/source/Symbol/Function.cpp index 57f6cb4cd55..94eec1e7478 100644 --- a/lldb/source/Symbol/Function.cpp +++ b/lldb/source/Symbol/Function.cpp @@ -10,10 +10,11 @@ #include "lldb/Symbol/Function.h" #include "lldb/Core/Module.h" #include "lldb/Core/Section.h" +#include "lldb/Symbol/ClangASTType.h" +#include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/LineTable.h" #include "lldb/Symbol/SymbolVendor.h" -#include "lldb/Symbol/ClangASTContext.h" #include "clang/AST/Type.h" #include "clang/AST/CanonicalType.h" @@ -339,7 +340,7 @@ Function::GetReturnType () clang::FunctionType *function_type = dyn_cast<clang::FunctionType> (clang_type); clang::QualType fun_return_qualtype = function_type->getResultType(); - const ConstString fun_return_name(Type::GetClangTypeName(fun_return_qualtype.getAsOpaquePtr())); + const ConstString fun_return_name(ClangASTType::GetClangTypeName(fun_return_qualtype.getAsOpaquePtr())); SymbolContext sc; CalculateSymbolContext (&sc); @@ -381,7 +382,7 @@ Function::GetArgumentTypeAtIndex (size_t idx) return Type(); clang::QualType arg_qualtype = (function_proto_type->arg_type_begin())[idx]; - const ConstString arg_return_name(Type::GetClangTypeName(arg_qualtype.getAsOpaquePtr())); + const ConstString arg_return_name(ClangASTType::GetClangTypeName(arg_qualtype.getAsOpaquePtr())); SymbolContext sc; CalculateSymbolContext (&sc); // Null out everything below the CompUnit 'cause we don't actually know these. diff --git a/lldb/source/Symbol/Type.cpp b/lldb/source/Symbol/Type.cpp index 31a5bac7d51..e58d0d4f40b 100644 --- a/lldb/source/Symbol/Type.cpp +++ b/lldb/source/Symbol/Type.cpp @@ -30,6 +30,7 @@ #include "lldb/Core/Scalar.h" #include "lldb/Core/StreamString.h" +#include "lldb/Symbol/ClangASTType.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolContextScope.h" @@ -270,59 +271,6 @@ lldb_private::Type::GetName() return m_name; } -int -lldb_private::Type::DumpClangTypeName(Stream *s, void *clang_type) -{ - clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); - std::string type_name; - const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>(); - if (typedef_type) - { - const clang::TypedefDecl *typedef_decl = typedef_type->getDecl(); - type_name = typedef_decl->getQualifiedNameAsString(); - } - else - { - type_name = qual_type.getAsString(); - } - if (!type_name.empty()) - return s->Printf("(%s) ", type_name.c_str()); - return 0; -} - -lldb_private::ConstString -lldb_private::Type::GetClangTypeName (void *clang_type) -{ - ConstString clang_type_name; - if (clang_type) - { - clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); - - const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>(); - if (typedef_type) - { - const clang::TypedefDecl *typedef_decl = typedef_type->getDecl(); - std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString()); - if (!clang_typedef_name.empty()) - clang_type_name.SetCString (clang_typedef_name.c_str()); - } - else - { - std::string type_name(qual_type.getAsString()); - if (!type_name.empty()) - clang_type_name.SetCString (type_name.c_str()); - } - } - else - { - clang_type_name.SetCString ("<invalid>"); - } - - return clang_type_name; -} - - - void lldb_private::Type::DumpTypeName(Stream *s) { @@ -354,658 +302,23 @@ lldb_private::Type::DumpValue s->PutCString(") "); } - lldb_private::Type::DumpValue (exe_ctx, - GetClangAST (), - m_clang_qual_type, - s, - format == lldb::eFormatDefault ? GetFormat() : format, - data, - data_byte_offset, - GetByteSize(), - 0, // Bitfield bit size - 0, // Bitfield bit offset - show_types, - show_summary, - verbose, - 0); - } -} - - -void -lldb_private::Type::DumpSummary -( - ExecutionContext *exe_ctx, - clang::ASTContext *ast_context, - void *clang_type, - Stream *s, - const lldb_private::DataExtractor &data, - uint32_t data_byte_offset, - size_t data_byte_size -) -{ - uint32_t length = 0; - clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); - if (ClangASTContext::IsCStringType (clang_type, length)) - { - - if (exe_ctx && exe_ctx->process) - { - uint32_t offset = data_byte_offset; - lldb::addr_t pointer_addresss = data.GetMaxU64(&offset, data_byte_size); - std::vector<uint8_t> buf; - if (length > 0) - buf.resize (length); - else - buf.resize (256); - - lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), exe_ctx->process->GetByteOrder(), 4); - buf.back() = '\0'; - size_t bytes_read; - size_t total_cstr_len = 0; - Error error; - while ((bytes_read = exe_ctx->process->ReadMemory (pointer_addresss, &buf.front(), buf.size(), error)) > 0) - { - const size_t len = strlen((const char *)&buf.front()); - if (len == 0) - break; - if (total_cstr_len == 0) - s->PutCString (" \""); - cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0); - total_cstr_len += len; - if (len < buf.size()) - break; - pointer_addresss += total_cstr_len; - } - if (total_cstr_len > 0) - s->PutChar ('"'); - } - } -} - -#define DEPTH_INCREMENT 2 -void -lldb_private::Type::DumpValue -( - ExecutionContext *exe_ctx, - clang::ASTContext *ast_context, - void *clang_type, - Stream *s, - lldb::Format format, - const lldb_private::DataExtractor &data, - uint32_t data_byte_offset, - size_t data_byte_size, - uint32_t bitfield_bit_size, - uint32_t bitfield_bit_offset, - bool show_types, - bool show_summary, - bool verbose, - uint32_t depth -) -{ - clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); - switch (qual_type->getTypeClass()) - { - case clang::Type::Record: - { - const clang::RecordType *record_type = cast<clang::RecordType>(qual_type.getTypePtr()); - const clang::RecordDecl *record_decl = record_type->getDecl(); - assert(record_decl); - uint32_t field_bit_offset = 0; - uint32_t field_byte_offset = 0; - const clang::ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl); - uint32_t child_idx = 0; - - - const clang::CXXRecordDecl *cxx_record_decl = dyn_cast<clang::CXXRecordDecl>(record_decl); - if (cxx_record_decl) - { - // We might have base classes to print out first - clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end; - for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); - base_class != base_class_end; - ++base_class) - { - const clang::CXXRecordDecl *base_class_decl = cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl()); - - // Skip empty base classes - if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false) - continue; - - if (base_class->isVirtual()) - field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl); - else - field_bit_offset = record_layout.getBaseClassOffset(base_class_decl); - field_byte_offset = field_bit_offset / 8; - assert (field_bit_offset % 8 == 0); - if (child_idx == 0) - s->PutChar('{'); - else - s->PutChar(','); - - clang::QualType base_class_qual_type = base_class->getType(); - std::string base_class_type_name(base_class_qual_type.getAsString()); - - // Indent and print the base class type name - s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str()); - - std::pair<uint64_t, unsigned> base_class_type_info = ast_context->getTypeInfo(base_class_qual_type); - - // Dump the value of the member - Type::DumpValue ( - exe_ctx, - ast_context, // The clang AST context for this type - base_class_qual_type.getAsOpaquePtr(),// The clang type we want to dump - s, // Stream to dump to - Type::GetFormat(base_class_qual_type.getAsOpaquePtr()), // The format with which to display the member - data, // Data buffer containing all bytes for this type - data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from - base_class_type_info.first / 8, // Size of this type in bytes - 0, // Bitfield bit size - 0, // Bitfield bit offset - show_types, // Boolean indicating if we should show the variable types - show_summary, // Boolean indicating if we should show a summary for the current type - verbose, // Verbose output? - depth + DEPTH_INCREMENT); // Scope depth for any types that have children - - ++child_idx; - } - } - uint32_t field_idx = 0; - clang::RecordDecl::field_iterator field, field_end; - for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) - { - // Print the starting squiggly bracket (if this is the - // first member) or comman (for member 2 and beyong) for - // the struct/union/class member. - if (child_idx == 0) - s->PutChar('{'); - else - s->PutChar(','); - - // Indent - s->Printf("\n%*s", depth + DEPTH_INCREMENT, ""); - - clang::QualType field_type = field->getType(); - // Print the member type if requested - // Figure out the type byte size (field_type_info.first) and - // alignment (field_type_info.second) from the AST context. - std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field_type); - assert(field_idx < record_layout.getFieldCount()); - // Figure out the field offset within the current struct/union/class type - field_bit_offset = record_layout.getFieldOffset (field_idx); - field_byte_offset = field_bit_offset / 8; - uint32_t field_bitfield_bit_size = 0; - uint32_t field_bitfield_bit_offset = 0; - if (ClangASTContext::FieldIsBitfield (ast_context, *field, field_bitfield_bit_size)) - field_bitfield_bit_offset = field_bit_offset % 8; - - if (show_types) - { - std::string field_type_name(field_type.getAsString()); - if (field_bitfield_bit_size > 0) - s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size); - else - s->Printf("(%s) ", field_type_name.c_str()); - } - // Print the member name and equal sign - s->Printf("%s = ", field->getNameAsString().c_str()); - - - // Dump the value of the member - Type::DumpValue ( - exe_ctx, - ast_context, // The clang AST context for this type - field_type.getAsOpaquePtr(), // The clang type we want to dump - s, // Stream to dump to - Type::GetFormat(field_type.getAsOpaquePtr()), // The format with which to display the member - data, // Data buffer containing all bytes for this type - data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from - field_type_info.first / 8, // Size of this type in bytes - field_bitfield_bit_size, // Bitfield bit size - field_bitfield_bit_offset, // Bitfield bit offset - show_types, // Boolean indicating if we should show the variable types - show_summary, // Boolean indicating if we should show a summary for the current type - verbose, // Verbose output? - depth + DEPTH_INCREMENT); // Scope depth for any types that have children - } - - // Indent the trailing squiggly bracket - if (child_idx > 0) - s->Printf("\n%*s}", depth, ""); - } - return; - - case clang::Type::Enum: - { - const clang::EnumType *enum_type = cast<clang::EnumType>(qual_type.getTypePtr()); - const clang::EnumDecl *enum_decl = enum_type->getDecl(); - assert(enum_decl); - clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos; - uint32_t offset = data_byte_offset; - const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset); - for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos) - { - if (enum_pos->getInitVal() == enum_value) - { - s->Printf("%s", enum_pos->getNameAsCString()); - return; - } - } - // If we have gotten here we didn't get find the enumerator in the - // enum decl, so just print the integer. - s->Printf("%lli", enum_value); - } - return; - - case clang::Type::ConstantArray: - { - const clang::ConstantArrayType *array = cast<clang::ConstantArrayType>(qual_type.getTypePtr()); - bool is_array_of_characters = false; - clang::QualType element_qual_type = array->getElementType(); - - clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr(); - if (canonical_type) - is_array_of_characters = canonical_type->isCharType(); - - const uint64_t element_count = array->getSize().getLimitedValue(); - - std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(element_qual_type); - - uint32_t element_idx = 0; - uint32_t element_offset = 0; - uint64_t element_byte_size = field_type_info.first / 8; - uint32_t element_stride = element_byte_size; - - if (is_array_of_characters) - { - s->PutChar('"'); - data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0); - s->PutChar('"'); - return; - } - else - { - lldb::Format element_format = Type::GetFormat(element_qual_type.getAsOpaquePtr()); - - for (element_idx = 0; element_idx < element_count; ++element_idx) - { - // Print the starting squiggly bracket (if this is the - // first member) or comman (for member 2 and beyong) for - // the struct/union/class member. - if (element_idx == 0) - s->PutChar('{'); - else - s->PutChar(','); - - // Indent and print the index - s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx); - - // Figure out the field offset within the current struct/union/class type - element_offset = element_idx * element_stride; - - // Dump the value of the member - Type::DumpValue ( - exe_ctx, - ast_context, // The clang AST context for this type - element_qual_type.getAsOpaquePtr(), // The clang type we want to dump - s, // Stream to dump to - element_format, // The format with which to display the element - data, // Data buffer containing all bytes for this type - data_byte_offset + element_offset,// Offset into "data" where to grab value from - element_byte_size, // Size of this type in bytes - 0, // Bitfield bit size - 0, // Bitfield bit offset - show_types, // Boolean indicating if we should show the variable types - show_summary, // Boolean indicating if we should show a summary for the current type - verbose, // Verbose output? - depth + DEPTH_INCREMENT); // Scope depth for any types that have children - } - - // Indent the trailing squiggly bracket - if (element_idx > 0) - s->Printf("\n%*s}", depth, ""); - } - } - return; - - case clang::Type::Typedef: - { - clang::QualType typedef_qual_type = cast<clang::TypedefType>(qual_type)->LookThroughTypedefs(); - lldb::Format typedef_format = lldb_private::Type::GetFormat(typedef_qual_type.getAsOpaquePtr()); - std::pair<uint64_t, unsigned> typedef_type_info = ast_context->getTypeInfo(typedef_qual_type); - uint64_t typedef_byte_size = typedef_type_info.first / 8; - - return Type::DumpValue( - exe_ctx, - ast_context, // The clang AST context for this type - typedef_qual_type.getAsOpaquePtr(), // The clang type we want to dump - s, // Stream to dump to - typedef_format, // The format with which to display the element - data, // Data buffer containing all bytes for this type - data_byte_offset, // Offset into "data" where to grab value from - typedef_byte_size, // Size of this type in bytes - bitfield_bit_size, // Bitfield bit size - bitfield_bit_offset,// Bitfield bit offset - show_types, // Boolean indicating if we should show the variable types - show_summary, // Boolean indicating if we should show a summary for the current type - verbose, // Verbose output? - depth); // Scope depth for any types that have children - } - break; - - default: - // We are down the a scalar type that we just need to display. - data.Dump(s, data_byte_offset, format, data_byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, bitfield_bit_size, bitfield_bit_offset); - - if (show_summary) - Type::DumpSummary (exe_ctx, ast_context, clang_type, s, data, data_byte_offset, data_byte_size); - break; - } -} - -bool -lldb_private::Type::DumpTypeValue -( - Stream *s, - clang::ASTContext *ast_context, - void *clang_type, - lldb::Format format, - const lldb_private::DataExtractor &data, - uint32_t byte_offset, - size_t byte_size, - uint32_t bitfield_bit_size, - uint32_t bitfield_bit_offset -) -{ - clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); - if (ClangASTContext::IsAggregateType (clang_type)) - { - return 0; - } - else - { - switch (qual_type->getTypeClass()) - { - case clang::Type::Enum: - { - const clang::EnumType *enum_type = cast<clang::EnumType>(qual_type.getTypePtr()); - const clang::EnumDecl *enum_decl = enum_type->getDecl(); - assert(enum_decl); - clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos; - uint32_t offset = byte_offset; - const int64_t enum_value = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset); - for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos) - { - if (enum_pos->getInitVal() == enum_value) - { - s->PutCString (enum_pos->getNameAsCString()); - return true; - } - } - // If we have gotten here we didn't get find the enumerator in the - // enum decl, so just print the integer. - - s->Printf("%lli", enum_value); - return true; - } - break; - - case clang::Type::Typedef: - { - clang::QualType typedef_qual_type = cast<clang::TypedefType>(qual_type)->LookThroughTypedefs(); - lldb::Format typedef_format = Type::GetFormat(typedef_qual_type.getAsOpaquePtr()); - std::pair<uint64_t, unsigned> typedef_type_info = ast_context->getTypeInfo(typedef_qual_type); - uint64_t typedef_byte_size = typedef_type_info.first / 8; - - return Type::DumpTypeValue( - s, - ast_context, // The clang AST context for this type - typedef_qual_type.getAsOpaquePtr(), // The clang type we want to dump - typedef_format, // The format with which to display the element - data, // Data buffer containing all bytes for this type - byte_offset, // Offset into "data" where to grab value from - typedef_byte_size, // Size of this type in bytes - bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield - bitfield_bit_offset); // Offset in bits of a bitfield value if bitfield_bit_size != 0 - } - break; - - default: - // We are down the a scalar type that we just need to display. - return data.Dump(s, - byte_offset, - format, - byte_size, - 1, - UINT32_MAX, - LLDB_INVALID_ADDRESS, - bitfield_bit_size, - bitfield_bit_offset); - break; - } - } - return 0; -} - -bool -lldb_private::Type::GetValueAsScalar -( - clang::ASTContext *ast_context, - void *clang_type, - const lldb_private::DataExtractor &data, - uint32_t data_byte_offset, - size_t data_byte_size, - Scalar &value -) -{ - clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); - - if (ClangASTContext::IsAggregateType (clang_type)) - { - return false; // Aggregate types don't have scalar values - } - else - { - uint32_t count = 0; - lldb::Encoding encoding = Type::GetEncoding (clang_type, count); - - if (encoding == lldb::eEncodingInvalid || count != 1) - return false; - - uint64_t bit_width = ast_context->getTypeSize(qual_type); - uint32_t byte_size = (bit_width + 7 ) / 8; - uint32_t offset = data_byte_offset; - switch (encoding) - { - case lldb::eEncodingUint: - if (byte_size <= sizeof(unsigned long long)) - { - uint64_t uval64 = data.GetMaxU64 (&offset, byte_size); - if (byte_size <= sizeof(unsigned int)) - { - value = (unsigned int)uval64; - return true; - } - else if (byte_size <= sizeof(unsigned long)) - { - value = (unsigned long)uval64; - return true; - } - else if (byte_size <= sizeof(unsigned long long)) - { - value = (unsigned long long )uval64; - return true; - } - else - value.Clear(); - } - break; - - case lldb::eEncodingSint: - if (byte_size <= sizeof(long long)) - { - int64_t sval64 = (int64_t)data.GetMaxU64 (&offset, byte_size); - if (byte_size <= sizeof(int)) - { - value = (int)sval64; - return true; - } - else if (byte_size <= sizeof(long)) - { - value = (long)sval64; - return true; - } - else if (byte_size <= sizeof(long long)) - { - value = (long long )sval64; - return true; - } - else - value.Clear(); - } - break; - - case lldb::eEncodingIEEE754: - if (byte_size <= sizeof(long double)) - { - uint32_t u32; - uint64_t u64; - if (byte_size == sizeof(float)) - { - if (sizeof(float) == sizeof(uint32_t)) - { - u32 = data.GetU32(&offset); - value = *((float *)&u32); - return true; - } - else if (sizeof(float) == sizeof(uint64_t)) - { - u64 = data.GetU64(&offset); - value = *((float *)&u64); - return true; - } - } - else - if (byte_size == sizeof(double)) - { - if (sizeof(double) == sizeof(uint32_t)) - { - u32 = data.GetU32(&offset); - value = *((double *)&u32); - return true; - } - else if (sizeof(double) == sizeof(uint64_t)) - { - u64 = data.GetU64(&offset); - value = *((double *)&u64); - return true; - } - } - else - if (byte_size == sizeof(long double)) - { - if (sizeof(long double) == sizeof(uint32_t)) - { - u32 = data.GetU32(&offset); - value = *((long double *)&u32); - return true; - } - else if (sizeof(long double) == sizeof(uint64_t)) - { - u64 = data.GetU64(&offset); - value = *((long double *)&u64); - return true; - } - } - } - break; - } - } - return false; -} - -bool -lldb_private::Type::SetValueFromScalar -( - clang::ASTContext *ast_context, - void *clang_type, - const Scalar &value, - Stream &strm -) -{ - clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); - - // Aggregate types don't have scalar values - if (!ClangASTContext::IsAggregateType (clang_type)) - { - strm.GetFlags().Set(Stream::eBinary); - uint32_t count = 0; - lldb::Encoding encoding = Type::GetEncoding (clang_type, count); - - if (encoding == lldb::eEncodingInvalid || count != 1) - return false; - - uint64_t bit_width = ast_context->getTypeSize(qual_type); - // This function doesn't currently handle non-byte aligned assignments - if ((bit_width % 8) != 0) - return false; - - uint32_t byte_size = (bit_width + 7 ) / 8; - switch (encoding) - { - case lldb::eEncodingUint: - switch (byte_size) - { - case 1: strm.PutHex8(value.UInt()); return true; - case 2: strm.PutHex16(value.UInt()); return true; - case 4: strm.PutHex32(value.UInt()); return true; - case 8: strm.PutHex64(value.ULongLong()); return true; - default: - break; - } - break; - - case lldb::eEncodingSint: - switch (byte_size) - { - case 1: strm.PutHex8(value.SInt()); return true; - case 2: strm.PutHex16(value.SInt()); return true; - case 4: strm.PutHex32(value.SInt()); return true; - case 8: strm.PutHex64(value.SLongLong()); return true; - default: - break; - } - break; - - case lldb::eEncodingIEEE754: - if (byte_size <= sizeof(long double)) - { - if (byte_size == sizeof(float)) - { - strm.PutFloat(value.Float()); - return true; - } - else - if (byte_size == sizeof(double)) - { - strm.PutDouble(value.Double()); - return true; - } - else - if (byte_size == sizeof(long double)) - { - strm.PutDouble(value.LongDouble()); - return true; - } - } - break; - } + lldb_private::ClangASTType::DumpValue (GetClangAST (), + m_clang_qual_type, + exe_ctx, + s, + format == lldb::eFormatDefault ? GetFormat() : format, + data, + data_byte_offset, + GetByteSize(), + 0, // Bitfield bit size + 0, // Bitfield bit offset + show_types, + show_summary, + verbose, + 0); } - return false; } - uint64_t lldb_private::Type::GetByteSize() { @@ -1066,86 +379,10 @@ lldb_private::Type::GetFormat () // Make sure we resolve our type if it already hasn't been. if (!ResolveClangType()) return lldb::eFormatInvalid; - return lldb_private::Type::GetFormat (m_clang_qual_type); + return lldb_private::ClangASTType::GetFormat (m_clang_qual_type); } -lldb::Format -lldb_private::Type::GetFormat (void *clang_type) -{ - clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); - - switch (qual_type->getTypeClass()) - { - case clang::Type::FunctionNoProto: - case clang::Type::FunctionProto: - break; - - case clang::Type::IncompleteArray: - case clang::Type::VariableArray: - break; - - case clang::Type::ConstantArray: - break; - - case clang::Type::ExtVector: - case clang::Type::Vector: - break; - - case clang::Type::Builtin: - switch (cast<clang::BuiltinType>(qual_type)->getKind()) - { - default: assert(0 && "Unknown builtin type!"); - case clang::BuiltinType::Void: - break; - - case clang::BuiltinType::Bool: return lldb::eFormatBoolean; - case clang::BuiltinType::Char_S: - case clang::BuiltinType::SChar: - case clang::BuiltinType::Char_U: - case clang::BuiltinType::UChar: - case clang::BuiltinType::WChar: return lldb::eFormatChar; - case clang::BuiltinType::Char16: return lldb::eFormatUnicode16; - case clang::BuiltinType::Char32: return lldb::eFormatUnicode32; - case clang::BuiltinType::UShort: return lldb::eFormatHex; - case clang::BuiltinType::Short: return lldb::eFormatDecimal; - case clang::BuiltinType::UInt: return lldb::eFormatHex; - case clang::BuiltinType::Int: return lldb::eFormatDecimal; - case clang::BuiltinType::ULong: return lldb::eFormatHex; - case clang::BuiltinType::Long: return lldb::eFormatDecimal; - case clang::BuiltinType::ULongLong: return lldb::eFormatHex; - case clang::BuiltinType::LongLong: return lldb::eFormatDecimal; - case clang::BuiltinType::UInt128: return lldb::eFormatHex; - case clang::BuiltinType::Int128: return lldb::eFormatDecimal; - case clang::BuiltinType::Float: return lldb::eFormatFloat; - case clang::BuiltinType::Double: return lldb::eFormatFloat; - case clang::BuiltinType::LongDouble: return lldb::eFormatFloat; - case clang::BuiltinType::NullPtr: return lldb::eFormatHex; - } - break; - case clang::Type::ObjCObjectPointer: return lldb::eFormatHex; - case clang::Type::BlockPointer: return lldb::eFormatHex; - case clang::Type::Pointer: return lldb::eFormatHex; - case clang::Type::LValueReference: - case clang::Type::RValueReference: return lldb::eFormatHex; - case clang::Type::MemberPointer: break; - case clang::Type::Complex: return lldb::eFormatComplex; - case clang::Type::ObjCInterface: break; - case clang::Type::Record: break; - case clang::Type::Enum: return lldb::eFormatEnum; - case clang::Type::Typedef: - return lldb_private::Type::GetFormat(cast<clang::TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); - - case clang::Type::TypeOfExpr: - case clang::Type::TypeOf: - case clang::Type::Decltype: -// case clang::Type::QualifiedName: - case clang::Type::TemplateSpecialization: break; - } - // We don't know hot to display this type... - return lldb::eFormatBytes; -} - lldb::Encoding lldb_private::Type::GetEncoding (uint32_t &count) @@ -1154,99 +391,10 @@ lldb_private::Type::GetEncoding (uint32_t &count) if (!ResolveClangType()) return lldb::eEncodingInvalid; - return Type::GetEncoding (m_clang_qual_type, count); + return lldb_private::ClangASTType::GetEncoding (m_clang_qual_type, count); } -lldb::Encoding -lldb_private::Type::GetEncoding (void *clang_type, uint32_t &count) -{ - count = 1; - clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); - - switch (qual_type->getTypeClass()) - { - case clang::Type::FunctionNoProto: - case clang::Type::FunctionProto: - break; - - case clang::Type::IncompleteArray: - case clang::Type::VariableArray: - break; - - case clang::Type::ConstantArray: - break; - - case clang::Type::ExtVector: - case clang::Type::Vector: - // TODO: Set this to more than one??? - break; - - case clang::Type::Builtin: - switch (cast<clang::BuiltinType>(qual_type)->getKind()) - { - default: assert(0 && "Unknown builtin type!"); - case clang::BuiltinType::Void: - break; - - case clang::BuiltinType::Bool: - case clang::BuiltinType::Char_S: - case clang::BuiltinType::SChar: - case clang::BuiltinType::WChar: - case clang::BuiltinType::Char16: - case clang::BuiltinType::Char32: - case clang::BuiltinType::Short: - case clang::BuiltinType::Int: - case clang::BuiltinType::Long: - case clang::BuiltinType::LongLong: - case clang::BuiltinType::Int128: return lldb::eEncodingSint; - - case clang::BuiltinType::Char_U: - case clang::BuiltinType::UChar: - case clang::BuiltinType::UShort: - case clang::BuiltinType::UInt: - case clang::BuiltinType::ULong: - case clang::BuiltinType::ULongLong: - case clang::BuiltinType::UInt128: return lldb::eEncodingUint; - - case clang::BuiltinType::Float: - case clang::BuiltinType::Double: - case clang::BuiltinType::LongDouble: return lldb::eEncodingIEEE754; - - case clang::BuiltinType::NullPtr: return lldb::eEncodingUint; - } - break; - // All pointer types are represented as unsigned integer encodings. - // We may nee to add a eEncodingPointer if we ever need to know the - // difference - case clang::Type::ObjCObjectPointer: - case clang::Type::BlockPointer: - case clang::Type::Pointer: - case clang::Type::LValueReference: - case clang::Type::RValueReference: - case clang::Type::MemberPointer: return lldb::eEncodingUint; - // Complex numbers are made up of floats - case clang::Type::Complex: - count = 2; - return lldb::eEncodingIEEE754; - - case clang::Type::ObjCInterface: break; - case clang::Type::Record: break; - case clang::Type::Enum: return lldb::eEncodingSint; - case clang::Type::Typedef: - return Type::GetEncoding(cast<clang::TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), count); - break; - - case clang::Type::TypeOfExpr: - case clang::Type::TypeOf: - case clang::Type::Decltype: -// case clang::Type::QualifiedName: - case clang::Type::TemplateSpecialization: break; - } - count = 0; - return lldb::eEncodingInvalid; -} - bool lldb_private::Type::DumpValueInMemory @@ -1273,93 +421,6 @@ lldb_private::Type::DumpValueInMemory return false; } -bool -lldb_private::Type::ReadFromMemory -( - lldb_private::ExecutionContext *exe_ctx, - clang::ASTContext *ast_context, - void *clang_type, - lldb::addr_t addr, - lldb::AddressType address_type, - lldb_private::DataExtractor &data -) -{ - if (address_type == lldb::eAddressTypeFile) - { - // Can't convert a file address to anything valid without more - // context (which Module it came from) - return false; - } - clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); - - const uint32_t byte_size = (ast_context->getTypeSize (qual_type) + 7) / 8; - if (data.GetByteSize() < byte_size) - { - lldb::DataBufferSP data_sp(new DataBufferHeap (byte_size, '\0')); - data.SetData(data_sp); - } - - uint8_t* dst = (uint8_t*)data.PeekData(0, byte_size); - if (dst != NULL) - { - if (address_type == lldb::eAddressTypeHost) - { - // The address is an address in this process, so just copy it - memcpy (dst, (uint8_t*)NULL + addr, byte_size); - return true; - } - else - { - if (exe_ctx && exe_ctx->process) - { - Error error; - return exe_ctx->process->ReadMemory(addr, dst, byte_size, error) == byte_size; - } - } - } - return false; -} - -bool -lldb_private::Type::WriteToMemory -( - lldb_private::ExecutionContext *exe_ctx, - clang::ASTContext *ast_context, - void *clang_type, - lldb::addr_t addr, - lldb::AddressType address_type, - StreamString &new_value -) -{ - if (address_type == lldb::eAddressTypeFile) - { - // Can't convert a file address to anything valid without more - // context (which Module it came from) - return false; - } - clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); - const uint32_t byte_size = (ast_context->getTypeSize (qual_type) + 7) / 8; - - if (byte_size > 0) - { - if (address_type == lldb::eAddressTypeHost) - { - // The address is an address in this process, so just copy it - memcpy ((void *)addr, new_value.GetData(), byte_size); - return true; - } - else - { - if (exe_ctx && exe_ctx->process) - { - Error error; - return exe_ctx->process->WriteMemory(addr, new_value.GetData(), byte_size, error) == byte_size; - } - } - } - return false; -} - bool lldb_private::Type::ReadFromMemory (lldb_private::ExecutionContext *exe_ctx, lldb::addr_t addr, lldb::AddressType address_type, lldb_private::DataExtractor &data) |