Home | History | Annotate | Download | only in Symbol
      1 //===-- ClangASTContext.h ---------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef liblldb_ClangASTContext_h_
     11 #define liblldb_ClangASTContext_h_
     12 
     13 // C Includes
     14 #include <stdint.h>
     15 
     16 // C++ Includes
     17 #include <string>
     18 #include <vector>
     19 
     20 // Other libraries and framework includes
     21 #include "llvm/ADT/OwningPtr.h"
     22 #include "llvm/ADT/SmallVector.h"
     23 #include "clang/AST/TemplateBase.h"
     24 
     25 
     26 // Project includes
     27 #include "lldb/lldb-enumerations.h"
     28 #include "lldb/Core/ClangForward.h"
     29 #include "lldb/Symbol/ClangASTType.h"
     30 
     31 namespace lldb_private {
     32 
     33 class Declaration;
     34 
     35 class ClangASTContext
     36 {
     37 public:
     38     typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
     39     typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *);
     40 
     41     //------------------------------------------------------------------
     42     // Constructors and Destructors
     43     //------------------------------------------------------------------
     44     ClangASTContext (const char *triple = NULL);
     45 
     46     ~ClangASTContext();
     47 
     48     clang::ASTContext *
     49     getASTContext();
     50 
     51     clang::Builtin::Context *
     52     getBuiltinContext();
     53 
     54     clang::IdentifierTable *
     55     getIdentifierTable();
     56 
     57     clang::LangOptions *
     58     getLanguageOptions();
     59 
     60     clang::SelectorTable *
     61     getSelectorTable();
     62 
     63     clang::FileManager *
     64     getFileManager();
     65 
     66     clang::SourceManager *
     67     getSourceManager();
     68 
     69     clang::DiagnosticsEngine *
     70     getDiagnosticsEngine();
     71 
     72     clang::DiagnosticConsumer *
     73     getDiagnosticConsumer();
     74 
     75     clang::TargetOptions *
     76     getTargetOptions();
     77 
     78     clang::TargetInfo *
     79     getTargetInfo();
     80 
     81     void
     82     Clear();
     83 
     84     const char *
     85     GetTargetTriple ();
     86 
     87     void
     88     SetTargetTriple (const char *target_triple);
     89 
     90     void
     91     SetArchitecture (const ArchSpec &arch);
     92 
     93     bool
     94     HasExternalSource ();
     95 
     96     void
     97     SetExternalSource (llvm::OwningPtr<clang::ExternalASTSource> &ast_source_ap);
     98 
     99     void
    100     RemoveExternalSource ();
    101 
    102     bool
    103     GetCompleteDecl (clang::Decl *decl)
    104     {
    105         return ClangASTContext::GetCompleteDecl(getASTContext(), decl);
    106     }
    107 
    108     static bool
    109     GetCompleteDecl (clang::ASTContext *ast,
    110                      clang::Decl *decl);
    111 
    112     void SetMetadataAsUserID (const void *object,
    113                               lldb::user_id_t user_id);
    114 
    115     void SetMetadata (const void *object,
    116                       ClangASTMetadata &meta_data)
    117     {
    118         SetMetadata(getASTContext(), object, meta_data);
    119     }
    120 
    121     static void
    122     SetMetadata (clang::ASTContext *ast,
    123                  const void *object,
    124                  ClangASTMetadata &meta_data);
    125 
    126     ClangASTMetadata *
    127     GetMetadata (const void *object)
    128     {
    129         return GetMetadata(getASTContext(), object);
    130     }
    131 
    132     static ClangASTMetadata *
    133     GetMetadata (clang::ASTContext *ast,
    134                  const void *object);
    135 
    136     //------------------------------------------------------------------
    137     // Basic Types
    138     //------------------------------------------------------------------
    139     ClangASTType
    140     GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding,
    141                                           uint32_t bit_size);
    142 
    143     static ClangASTType
    144     GetBuiltinTypeForEncodingAndBitSize (clang::ASTContext *ast,
    145                                          lldb::Encoding encoding,
    146                                          uint32_t bit_size);
    147 
    148     ClangASTType
    149     GetBasicType (lldb::BasicType type);
    150 
    151     static ClangASTType
    152     GetBasicType (clang::ASTContext *ast, lldb::BasicType type);
    153 
    154     static ClangASTType
    155     GetBasicType (clang::ASTContext *ast, const ConstString &name);
    156 
    157     static lldb::BasicType
    158     GetBasicTypeEnumeration (const ConstString &name);
    159 
    160     ClangASTType
    161     GetBuiltinTypeForDWARFEncodingAndBitSize (
    162         const char *type_name,
    163         uint32_t dw_ate,
    164         uint32_t bit_size);
    165 
    166     ClangASTType
    167     GetCStringType(bool is_const);
    168 
    169     static ClangASTType
    170     GetUnknownAnyType(clang::ASTContext *ast);
    171 
    172     ClangASTType
    173     GetUnknownAnyType()
    174     {
    175         return ClangASTContext::GetUnknownAnyType(getASTContext());
    176     }
    177 
    178     uint32_t
    179     GetPointerByteSize ();
    180 
    181     static clang::DeclContext *
    182     GetTranslationUnitDecl (clang::ASTContext *ast);
    183 
    184     clang::DeclContext *
    185     GetTranslationUnitDecl ()
    186     {
    187         return GetTranslationUnitDecl (getASTContext());
    188     }
    189 
    190     static bool
    191     GetClassMethodInfoForDeclContext (clang::DeclContext *decl_ctx,
    192                                       lldb::LanguageType &language,
    193                                       bool &is_instance_method,
    194                                       ConstString &language_object_name);
    195 
    196     static ClangASTType
    197     CopyType(clang::ASTContext *dest_context,
    198              ClangASTType source_type);
    199 
    200     static clang::Decl *
    201     CopyDecl (clang::ASTContext *dest_context,
    202               clang::ASTContext *source_context,
    203               clang::Decl *source_decl);
    204 
    205     static bool
    206     AreTypesSame(ClangASTType type1,
    207                  ClangASTType type2,
    208                  bool ignore_qualifiers = false);
    209 
    210     ClangASTType
    211     GetTypeForDecl (clang::TagDecl *decl);
    212 
    213     ClangASTType
    214     GetTypeForDecl (clang::ObjCInterfaceDecl *objc_decl);
    215 
    216     //------------------------------------------------------------------
    217     // Structure, Unions, Classes
    218     //------------------------------------------------------------------
    219 
    220     static clang::AccessSpecifier
    221     ConvertAccessTypeToAccessSpecifier (lldb::AccessType access);
    222 
    223     static clang::AccessSpecifier
    224     UnifyAccessSpecifiers (clang::AccessSpecifier lhs, clang::AccessSpecifier rhs);
    225 
    226     static uint32_t
    227     GetNumBaseClasses (const clang::CXXRecordDecl *cxx_record_decl,
    228                        bool omit_empty_base_classes);
    229 
    230     static uint32_t
    231     GetIndexForRecordBase (const clang::RecordDecl *record_decl,
    232                            const clang::CXXBaseSpecifier *base_spec,
    233                            bool omit_empty_base_classes);
    234 
    235     ClangASTType
    236     CreateRecordType (clang::DeclContext *decl_ctx,
    237                       lldb::AccessType access_type,
    238                       const char *name,
    239                       int kind,
    240                       lldb::LanguageType language,
    241                       ClangASTMetadata *metadata = NULL);
    242 
    243     class TemplateParameterInfos
    244     {
    245     public:
    246         bool
    247         IsValid() const
    248         {
    249             if (args.empty())
    250                 return false;
    251             return args.size() == names.size();
    252         }
    253 
    254         size_t
    255         GetSize () const
    256         {
    257             if (IsValid())
    258                 return args.size();
    259             return 0;
    260         }
    261 
    262         llvm::SmallVector<const char *, 8> names;
    263         llvm::SmallVector<clang::TemplateArgument, 8> args;
    264     };
    265 
    266     clang::FunctionTemplateDecl *
    267     CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
    268                                 clang::FunctionDecl *func_decl,
    269                                 const char *name,
    270                                 const TemplateParameterInfos &infos);
    271 
    272     void
    273     CreateFunctionTemplateSpecializationInfo (clang::FunctionDecl *func_decl,
    274                                               clang::FunctionTemplateDecl *Template,
    275                                               const TemplateParameterInfos &infos);
    276 
    277     clang::ClassTemplateDecl *
    278     CreateClassTemplateDecl (clang::DeclContext *decl_ctx,
    279                              lldb::AccessType access_type,
    280                              const char *class_name,
    281                              int kind,
    282                              const TemplateParameterInfos &infos);
    283 
    284     clang::ClassTemplateSpecializationDecl *
    285     CreateClassTemplateSpecializationDecl (clang::DeclContext *decl_ctx,
    286                                            clang::ClassTemplateDecl *class_template_decl,
    287                                            int kind,
    288                                            const TemplateParameterInfos &infos);
    289 
    290     ClangASTType
    291     CreateClassTemplateSpecializationType (clang::ClassTemplateSpecializationDecl *class_template_specialization_decl);
    292 
    293     static clang::DeclContext *
    294     GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl);
    295 
    296     static clang::DeclContext *
    297     GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl);
    298 
    299 
    300     static bool
    301     CheckOverloadedOperatorKindParameterCount (uint32_t op_kind,
    302                                                uint32_t num_params);
    303 
    304     bool
    305     FieldIsBitfield (clang::FieldDecl* field,
    306                      uint32_t& bitfield_bit_size);
    307 
    308     static bool
    309     FieldIsBitfield (clang::ASTContext *ast,
    310                      clang::FieldDecl* field,
    311                      uint32_t& bitfield_bit_size);
    312 
    313     static bool
    314     RecordHasFields (const clang::RecordDecl *record_decl);
    315 
    316 
    317     ClangASTType
    318     CreateObjCClass (const char *name,
    319                      clang::DeclContext *decl_ctx,
    320                      bool isForwardDecl,
    321                      bool isInternal,
    322                      ClangASTMetadata *metadata = NULL);
    323 
    324     // Returns a mask containing bits from the ClangASTContext::eTypeXXX enumerations
    325 
    326 
    327     //------------------------------------------------------------------
    328     // Namespace Declarations
    329     //------------------------------------------------------------------
    330 
    331     clang::NamespaceDecl *
    332     GetUniqueNamespaceDeclaration (const char *name,
    333                                    clang::DeclContext *decl_ctx);
    334 
    335     //------------------------------------------------------------------
    336     // Function Types
    337     //------------------------------------------------------------------
    338 
    339     clang::FunctionDecl *
    340     CreateFunctionDeclaration (clang::DeclContext *decl_ctx,
    341                                const char *name,
    342                                const ClangASTType &function_Type,
    343                                int storage,
    344                                bool is_inline);
    345 
    346     static ClangASTType
    347     CreateFunctionType (clang::ASTContext *ast,
    348                         const ClangASTType &result_type,
    349                         const ClangASTType *args,
    350                         unsigned num_args,
    351                         bool is_variadic,
    352                         unsigned type_quals);
    353 
    354     ClangASTType
    355     CreateFunctionType (const ClangASTType &result_type,
    356                         const ClangASTType *args,
    357                         unsigned num_args,
    358                         bool is_variadic,
    359                         unsigned type_quals)
    360     {
    361         return ClangASTContext::CreateFunctionType(getASTContext(),
    362                                                    result_type,
    363                                                    args,
    364                                                    num_args,
    365                                                    is_variadic,
    366                                                    type_quals);
    367     }
    368 
    369     clang::ParmVarDecl *
    370     CreateParameterDeclaration (const char *name,
    371                                 const ClangASTType &param_type,
    372                                 int storage);
    373 
    374     void
    375     SetFunctionParameters (clang::FunctionDecl *function_decl,
    376                            clang::ParmVarDecl **params,
    377                            unsigned num_params);
    378 
    379     //------------------------------------------------------------------
    380     // Array Types
    381     //------------------------------------------------------------------
    382 
    383     ClangASTType
    384     CreateArrayType (const ClangASTType &element_type,
    385                      size_t element_count,
    386                      bool is_vector);
    387 
    388     //------------------------------------------------------------------
    389     // Enumeration Types
    390     //------------------------------------------------------------------
    391     ClangASTType
    392     CreateEnumerationType (const char *name,
    393                            clang::DeclContext *decl_ctx,
    394                            const Declaration &decl,
    395                            const ClangASTType &integer_qual_type);
    396 
    397     //------------------------------------------------------------------
    398     // Floating point functions
    399     //------------------------------------------------------------------
    400 
    401     ClangASTType
    402     GetFloatTypeFromBitSize (size_t bit_size)
    403     {
    404         return GetFloatTypeFromBitSize (getASTContext(), bit_size);
    405     }
    406 
    407     static ClangASTType
    408     GetFloatTypeFromBitSize (clang::ASTContext *ast,
    409                              size_t bit_size);
    410 protected:
    411     //------------------------------------------------------------------
    412     // Classes that inherit from ClangASTContext can see and modify these
    413     //------------------------------------------------------------------
    414     std::string                                     m_target_triple;
    415     std::unique_ptr<clang::ASTContext>              m_ast_ap;
    416     std::unique_ptr<clang::LangOptions>             m_language_options_ap;
    417     std::unique_ptr<clang::FileManager>             m_file_manager_ap;
    418     std::unique_ptr<clang::FileSystemOptions>       m_file_system_options_ap;
    419     std::unique_ptr<clang::SourceManager>           m_source_manager_ap;
    420     std::unique_ptr<clang::DiagnosticsEngine>       m_diagnostics_engine_ap;
    421     std::unique_ptr<clang::DiagnosticConsumer>      m_diagnostic_consumer_ap;
    422     llvm::IntrusiveRefCntPtr<clang::TargetOptions>  m_target_options_rp;
    423     std::unique_ptr<clang::TargetInfo>              m_target_info_ap;
    424     std::unique_ptr<clang::IdentifierTable>         m_identifier_table_ap;
    425     std::unique_ptr<clang::SelectorTable>           m_selector_table_ap;
    426     std::unique_ptr<clang::Builtin::Context>        m_builtins_ap;
    427     CompleteTagDeclCallback                         m_callback_tag_decl;
    428     CompleteObjCInterfaceDeclCallback               m_callback_objc_decl;
    429     void *                                          m_callback_baton;
    430     uint32_t                                        m_pointer_byte_size;
    431 private:
    432     //------------------------------------------------------------------
    433     // For ClangASTContext only
    434     //------------------------------------------------------------------
    435     ClangASTContext(const ClangASTContext&);
    436     const ClangASTContext& operator=(const ClangASTContext&);
    437 };
    438 
    439 } // namespace lldb_private
    440 
    441 #endif  // liblldb_ClangASTContext_h_
    442