1bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar//===- CIndexer.h - Clang-C Source Indexing Library -------------*- C++ -*-===//
2ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//
3ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//                     The LLVM Compiler Infrastructure
4ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//
5ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// This file is distributed under the University of Illinois Open Source
6ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// License. See LICENSE.TXT for details.
7ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//
8ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//===----------------------------------------------------------------------===//
9ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//
10ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// This file defines CIndexer, a subclass of Indexer that provides extra
11ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek// functionality needed by the CIndex library.
12ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//
13ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek//===----------------------------------------------------------------------===//
14ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek
15ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#ifndef LLVM_CLANG_CINDEXER_H
16ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#define LLVM_CLANG_CINDEXER_H
17ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek
18ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#include "clang-c/Index.h"
19fc8ea23eb6cbaaa5046f2abb4c033e24c8659efdDouglas Gregor#include "llvm/ADT/StringRef.h"
2003013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h"
214db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor#include <vector>
22ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek
23bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbarnamespace llvm {
24bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  class CrashRecoveryContext;
25bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar}
26bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar
27bbca564eec4eb841848a40014f7ddc9e5807125eArgyrios Kyrtzidisnamespace clang {
28e722ed6f5464232e23be52f4976312ef526fae99Argyrios Kyrtzidis  class ASTUnit;
29664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  class MacroInfo;
30664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  class MacroDefinition;
31664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  class SourceLocation;
32664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  class Token;
33664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis  class IdentifierInfo;
34bbca564eec4eb841848a40014f7ddc9e5807125eArgyrios Kyrtzidis
35a030b7cf5e6aad5889b1b662b6979840bc75f87fDouglas Gregorclass CIndexer {
36ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  bool OnlyLocalDecls;
370a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  bool DisplayDiagnostics;
38fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  unsigned Options; // CXGlobalOptFlags.
390a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor
40082ad2bd3f6fb0aef727f6c9ab53d2c4aa75fd53Benjamin Kramer  std::string ResourcesPath;
41389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis
42ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekpublic:
43fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis CIndexer() : OnlyLocalDecls(false), DisplayDiagnostics(false),
44fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis              Options(CXGlobalOpt_None) { }
45ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek
46ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  /// \brief Whether we only want to see "local" declarations (that did not
47ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  /// come from a previous precompiled header). If false, we want to see all
48ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  /// declarations.
49ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  bool getOnlyLocalDecls() const { return OnlyLocalDecls; }
50ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  void setOnlyLocalDecls(bool Local = true) { OnlyLocalDecls = Local; }
51ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek
520a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  bool getDisplayDiagnostics() const { return DisplayDiagnostics; }
530a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  void setDisplayDiagnostics(bool Display = true) {
540a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    DisplayDiagnostics = Display;
550a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  }
560a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor
57fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  unsigned getCXGlobalOptFlags() const { return Options; }
58fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  void setCXGlobalOptFlags(unsigned options) { Options = options; }
59fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis
60fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  bool isOptEnabled(CXGlobalOptFlags opt) const {
61f962eb4dde12366c8617d0b9958b9ed70a328f21Argyrios Kyrtzidis    return Options & opt;
62fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  }
63fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis
64ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  /// \brief Get the path of the clang resource files.
65082ad2bd3f6fb0aef727f6c9ab53d2c4aa75fd53Benjamin Kramer  const std::string &getClangResourcesPath();
66ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek};
67ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek
68bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  /// \brief Return the current size to request for "safety".
69bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  unsigned GetSafetyThreadStackSize();
70bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar
71bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  /// \brief Set the current size to request for "safety" (or 0, if safety
72bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  /// threads should not be used).
73bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  void SetSafetyThreadStackSize(unsigned Value);
74bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar
75bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  /// \brief Execution the given code "safely", using crash recovery or safety
76bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  /// threads when possible.
77bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  ///
78bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  /// \return False if a crash was detected.
79bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  bool RunSafely(llvm::CrashRecoveryContext &CRC,
806c53fdd88f0d75875365463822fa817d7b1a9573Ted Kremenek                 void (*Fn)(void*), void *UserData, unsigned Size = 0);
816df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor
82fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  /// \brief Set the thread priority to background.
83fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  /// FIXME: Move to llvm/Support.
8481b5ac39a97cde1a54b8d0eb7105290c40eb84d7Argyrios Kyrtzidis  void setThreadBackgroundPriority();
85fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis
866df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor  /// \brief Print libclang's resource usage to standard error.
876df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor  void PrintLibclangResourceUsage(CXTranslationUnit TU);
88e722ed6f5464232e23be52f4976312ef526fae99Argyrios Kyrtzidis
89e722ed6f5464232e23be52f4976312ef526fae99Argyrios Kyrtzidis  namespace cxindex {
90e722ed6f5464232e23be52f4976312ef526fae99Argyrios Kyrtzidis    void printDiagsToStderr(ASTUnit *Unit);
91664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
92664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    /// \brief If \c MacroDefLoc points at a macro definition with \c II as
93664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    /// its name, this retrieves its MacroInfo.
94664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    MacroInfo *getMacroInfo(const IdentifierInfo &II,
95664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                            SourceLocation MacroDefLoc,
96664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                            CXTranslationUnit TU);
97664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
98664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    /// \brief Retrieves the corresponding MacroInfo of a MacroDefinition.
9967812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko    const MacroInfo *getMacroInfo(const MacroDefinition *MacroDef,
10067812b2f94f4b5e7d2596db1705ffa1149ddc45aDmitri Gribenko                                  CXTranslationUnit TU);
101664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
102664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    /// \brief If \c Loc resides inside the definition of \c MI and it points at
103664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    /// an identifier that has ever been a macro name, this returns the latest
104664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    /// MacroDefinition for that name, otherwise it returns NULL.
105664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    MacroDefinition *checkForMacroInMacroDefinition(const MacroInfo *MI,
106664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                                                    SourceLocation Loc,
107664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                                                    CXTranslationUnit TU);
108664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis
109664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    /// \brief If \c Tok resides inside the definition of \c MI and it points at
110664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    /// an identifier that has ever been a macro name, this returns the latest
111664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    /// MacroDefinition for that name, otherwise it returns NULL.
112664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis    MacroDefinition *checkForMacroInMacroDefinition(const MacroInfo *MI,
113664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                                                    const Token &Tok,
114664b06f9bd2ea83443ddc8553feba8ba48880752Argyrios Kyrtzidis                                                    CXTranslationUnit TU);
115e722ed6f5464232e23be52f4976312ef526fae99Argyrios Kyrtzidis  }
1164db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor}
1174db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor
118ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#endif
119