Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- ASTImporterLookupTable.h - ASTImporter specific lookup--*- C++ -*---===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
//  This file defines the ASTImporterLookupTable class which implements a
10
//  lookup procedure for the import mechanism.
11
//
12
//===----------------------------------------------------------------------===//
13
 
14
#ifndef LLVM_CLANG_AST_ASTIMPORTERLOOKUPTABLE_H
15
#define LLVM_CLANG_AST_ASTIMPORTERLOOKUPTABLE_H
16
 
17
#include "clang/AST/DeclBase.h" // lookup_result
18
#include "clang/AST/DeclarationName.h"
19
#include "llvm/ADT/DenseMap.h"
20
#include "llvm/ADT/SetVector.h"
21
 
22
namespace clang {
23
 
24
class NamedDecl;
25
class DeclContext;
26
 
27
// There are certain cases when normal C/C++ lookup (localUncachedLookup)
28
// does not find AST nodes. E.g.:
29
// Example 1:
30
//   template <class T>
31
//   struct X {
32
//     friend void foo(); // this is never found in the DC of the TU.
33
//   };
34
// Example 2:
35
//   // The fwd decl to Foo is not found in the lookupPtr of the DC of the
36
//   // translation unit decl.
37
//   // Here we could find the node by doing a traverse throught the list of
38
//   // the Decls in the DC, but that would not scale.
39
//   struct A { struct Foo *p; };
40
// This is a severe problem because the importer decides if it has to create a
41
// new Decl or not based on the lookup results.
42
// To overcome these cases we need an importer specific lookup table which
43
// holds every node and we are not interested in any C/C++ specific visibility
44
// considerations. Simply, we must know if there is an existing Decl in a
45
// given DC. Once we found it then we can handle any visibility related tasks.
46
class ASTImporterLookupTable {
47
 
48
  // We store a list of declarations for each name.
49
  // And we collect these lists for each DeclContext.
50
  // We could have a flat map with (DeclContext, Name) tuple as key, but a two
51
  // level map seems easier to handle.
52
  using DeclList = llvm::SmallSetVector<NamedDecl *, 2>;
53
  using NameMap = llvm::SmallDenseMap<DeclarationName, DeclList, 4>;
54
  using DCMap = llvm::DenseMap<DeclContext *, NameMap>;
55
 
56
  void add(DeclContext *DC, NamedDecl *ND);
57
  void remove(DeclContext *DC, NamedDecl *ND);
58
 
59
  DCMap LookupTable;
60
 
61
public:
62
  ASTImporterLookupTable(TranslationUnitDecl &TU);
63
  void add(NamedDecl *ND);
64
  void remove(NamedDecl *ND);
65
  // Sometimes a declaration is created first with a temporarily value of decl
66
  // context (often the translation unit) and later moved to the final context.
67
  // This happens for declarations that are created before the final declaration
68
  // context. In such cases the lookup table needs to be updated.
69
  // (The declaration is in these cases not added to the temporary decl context,
70
  // only its parent is set.)
71
  // FIXME: It would be better to not add the declaration to the temporary
72
  // context at all in the lookup table, but this requires big change in
73
  // ASTImporter.
74
  // The function should be called when the old context is definitely different
75
  // from the new.
76
  void update(NamedDecl *ND, DeclContext *OldDC);
77
  // Same as 'update' but allow if 'ND' is not in the table or the old context
78
  // is the same as the new.
79
  // FIXME: The old redeclaration context is not handled.
80
  void updateForced(NamedDecl *ND, DeclContext *OldDC);
81
  using LookupResult = DeclList;
82
  LookupResult lookup(DeclContext *DC, DeclarationName Name) const;
83
  // Check if the `ND` is within the lookup table (with its current name) in
84
  // context `DC`. This is intended for debug purposes when the DeclContext of a
85
  // NamedDecl is changed.
86
  bool contains(DeclContext *DC, NamedDecl *ND) const;
87
  void dump(DeclContext *DC) const;
88
  void dump() const;
89
};
90
 
91
} // namespace clang
92
 
93
#endif // LLVM_CLANG_AST_ASTIMPORTERLOOKUPTABLE_H