1d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton//===-- ClangExternalASTSourceCallbacks.cpp ---------------------*- C++ -*-===//
2d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton//
3d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton//                     The LLVM Compiler Infrastructure
4d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton//
5d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// This file is distributed under the University of Illinois Open Source
6d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// License. See LICENSE.TXT for details.
7d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton//
8d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton//===----------------------------------------------------------------------===//
9d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
10d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h"
11d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
12d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// C Includes
13d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// C++ Includes
14d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// Other libraries and framework includes
15d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
16d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// Clang headers like to use NDEBUG inside of them to enable/disable debug
17d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// releated features using "#ifndef NDEBUG" preprocessor blocks to do one thing
18d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// or another. This is bad because it means that if clang was built in release
19d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// mode, it assumes that you are building in release mode which is not always
20d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// the case. You can end up with functions that are defined as empty in header
21d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// files when NDEBUG is not defined, and this can cause link errors with the
22d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// clang .a files that you have since you might be missing functions in the .a
23d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// file. So we have to define NDEBUG when including clang headers to avoid any
24d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// mismatches. This is covered by rdar://problem/8691220
25d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
26a31b4ddfd213da1c2595fe2c5ae599d05de65400Sean Callanan#if !defined(NDEBUG) && !defined(LLVM_NDEBUG_OFF)
27d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#define LLDB_DEFINED_NDEBUG_FOR_CLANG
28d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#define NDEBUG
29d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// Need to include assert.h so it is as clang would expect it to be (disabled)
30d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include <assert.h>
31d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#endif
32d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
33d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include "clang/AST/DeclBase.h"
34d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include "clang/AST/DeclarationName.h"
35d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
36d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
37d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#undef NDEBUG
38d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
39d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
40d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include <assert.h>
41d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#endif
42d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
43d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include "lldb/Core/Log.h"
44d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
45d8b65024a03833688b487535d6b8710bc2ffdd51Greg Claytonusing namespace clang;
46d8b65024a03833688b487535d6b8710bc2ffdd51Greg Claytonusing namespace lldb_private;
47d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
4879e9f965938ec5766b9caedfa85262ecb603c453Sean Callananbool
49d8b65024a03833688b487535d6b8710bc2ffdd51Greg ClaytonClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName
50d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton(
51d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    const clang::DeclContext *decl_ctx,
52d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    clang::DeclarationName clang_decl_name
53d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton)
54d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton{
55e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (m_callback_find_by_name)
56e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
57e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        llvm::SmallVector <clang::NamedDecl *, 3> results;
58e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
59e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        m_callback_find_by_name (m_callback_baton, decl_ctx, clang_decl_name, &results);
60e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
6179e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        SetExternalVisibleDeclsForName(decl_ctx, clang_decl_name, results);
62e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
6379e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        return (results.size() != 0);
64e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
65e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
66d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    std::string decl_name (clang_decl_name.getAsString());
67d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
68d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    switch (clang_decl_name.getNameKind()) {
69d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    // Normal identifiers.
70d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    case clang::DeclarationName::Identifier:
71d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"Identifier\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
72d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        if (clang_decl_name.getAsIdentifierInfo()->getBuiltinID() != 0)
7379e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        {
7479e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan            SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
7579e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan            return false;
7679e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        }
77d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        break;
78d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
79d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    case clang::DeclarationName::ObjCZeroArgSelector:
80d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"ObjCZeroArgSelector\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
8179e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
8279e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        return false;
83d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
84d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    case clang::DeclarationName::ObjCOneArgSelector:
85d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"ObjCOneArgSelector\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
8679e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
8779e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        return false;
88d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
89d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    case clang::DeclarationName::ObjCMultiArgSelector:
90d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"ObjCMultiArgSelector\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
9179e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
9279e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        return false;
93d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
94d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    case clang::DeclarationName::CXXConstructorName:
95d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXConstructorName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
9679e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
9779e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        return false;
9879e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan
99d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
100d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    case clang::DeclarationName::CXXDestructorName:
101d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXDestructorName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
10279e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
10379e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        return false;
104d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
105d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    case clang::DeclarationName::CXXConversionFunctionName:
106d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXConversionFunctionName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
10779e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
10879e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        return false;
109d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
110d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    case clang::DeclarationName::CXXOperatorName:
111d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXOperatorName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
11279e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
11379e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        return false;
114d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
115d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    case clang::DeclarationName::CXXLiteralOperatorName:
116d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXLiteralOperatorName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
11779e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
11879e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        return false;
119d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
120d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    case clang::DeclarationName::CXXUsingDirective:
121d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXUsingDirective\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
12279e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
12379e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan        return false;
124d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    }
125d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
12679e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan    SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
12779e9f965938ec5766b9caedfa85262ecb603c453Sean Callanan    return false;
128d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton}
129d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
130d8b65024a03833688b487535d6b8710bc2ffdd51Greg Claytonvoid
131d8b65024a03833688b487535d6b8710bc2ffdd51Greg ClaytonClangExternalASTSourceCallbacks::CompleteType (TagDecl *tag_decl)
132d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton{
133d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    if (m_callback_tag_decl)
134d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        m_callback_tag_decl (m_callback_baton, tag_decl);
135d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton}
136d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
137d8b65024a03833688b487535d6b8710bc2ffdd51Greg Claytonvoid
138d8b65024a03833688b487535d6b8710bc2ffdd51Greg ClaytonClangExternalASTSourceCallbacks::CompleteType (ObjCInterfaceDecl *objc_decl)
139d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton{
140d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    if (m_callback_objc_decl)
141d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        m_callback_objc_decl (m_callback_baton, objc_decl);
142d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton}
1438f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
1448f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callananbool
1458f2e392e8937aaf66f91201dc5f4190d61902c67Sean CallananClangExternalASTSourceCallbacks::layoutRecordType(const clang::RecordDecl *Record,
1468f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                                                  uint64_t &Size,
1478f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                                                  uint64_t &Alignment,
1488f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                                                  llvm::DenseMap <const clang::FieldDecl *, uint64_t> &FieldOffsets,
1498f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                                                  llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets,
1508f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                                                  llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &VirtualBaseOffsets)
1518f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan{
1528f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    if (m_callback_layout_record_type)
1538f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        return m_callback_layout_record_type(m_callback_baton,
1548f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                                             Record,
1558f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                                             Size,
1568f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                                             Alignment,
1578f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                                             FieldOffsets,
1588f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                                             BaseOffsets,
1598f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                                             VirtualBaseOffsets);
1608f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
1618f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    return false;
1628f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan}
1638f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
164