CIndexer.h revision fdc1795acc9d5d73a767cc7d43ad1546e93adbba
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 {
28bbca564eec4eb841848a40014f7ddc9e5807125eArgyrios Kyrtzidis
29a030b7cf5e6aad5889b1b662b6979840bc75f87fDouglas Gregorclass CIndexer {
30ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  bool OnlyLocalDecls;
310a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  bool DisplayDiagnostics;
32fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  unsigned Options; // CXGlobalOptFlags.
330a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor
34d1e6fdb4c5325c61fedfa62751f70ee373880a52Douglas Gregor  llvm::sys::Path ResourcesPath;
35389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis  std::string WorkingDir;
36389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis
37ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenekpublic:
38fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis CIndexer() : OnlyLocalDecls(false), DisplayDiagnostics(false),
39fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis              Options(CXGlobalOpt_None) { }
40ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek
41ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  /// \brief Whether we only want to see "local" declarations (that did not
42ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  /// come from a previous precompiled header). If false, we want to see all
43ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  /// declarations.
44ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  bool getOnlyLocalDecls() const { return OnlyLocalDecls; }
45ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  void setOnlyLocalDecls(bool Local = true) { OnlyLocalDecls = Local; }
46ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek
470a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  bool getDisplayDiagnostics() const { return DisplayDiagnostics; }
480a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  void setDisplayDiagnostics(bool Display = true) {
490a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    DisplayDiagnostics = Display;
500a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  }
510a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor
52fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  unsigned getCXGlobalOptFlags() const { return Options; }
53fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  void setCXGlobalOptFlags(unsigned options) { Options = options; }
54fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis
55fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  bool isOptEnabled(CXGlobalOptFlags opt) const {
56fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis    return Options & ~unsigned(opt);
57fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  }
58fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis
59ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  /// \brief Get the path of the clang resource files.
60ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek  std::string getClangResourcesPath();
61389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis
62389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis  const std::string &getWorkingDirectory() const { return WorkingDir; }
63389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis  void setWorkingDirectory(const std::string &Dir) { WorkingDir = Dir; }
64ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek};
65ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek
664db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor  /**
674db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor   * \brief Given a set of "unsaved" files, create temporary files and
684db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor   * construct the clang -cc1 argument list needed to perform the remapping.
694db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor   *
704db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor   * \returns true if an error occurred.
714db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor   */
724db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor  bool RemapFiles(unsigned num_unsaved_files,
734db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor                  struct CXUnsavedFile *unsaved_files,
744db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor                  std::vector<std::string> &RemapArgs,
754db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor                  std::vector<llvm::sys::Path> &TemporaryFiles);
76bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar
77bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  /// \brief Return the current size to request for "safety".
78bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  unsigned GetSafetyThreadStackSize();
79bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar
80bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  /// \brief Set the current size to request for "safety" (or 0, if safety
81bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  /// threads should not be used).
82bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  void SetSafetyThreadStackSize(unsigned Value);
83bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar
84bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  /// \brief Execution the given code "safely", using crash recovery or safety
85bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  /// threads when possible.
86bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  ///
87bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  /// \return False if a crash was detected.
88bf44c3b099602c9c967f1b20995919fb4ef39a51Daniel Dunbar  bool RunSafely(llvm::CrashRecoveryContext &CRC,
896c53fdd88f0d75875365463822fa817d7b1a9573Ted Kremenek                 void (*Fn)(void*), void *UserData, unsigned Size = 0);
906df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor
91fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  /// \brief Set the thread priority to background.
92fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  /// FIXME: Move to llvm/Support.
93fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis  void setBackGroundPriority();
94fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis
956df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor  /// \brief Print libclang's resource usage to standard error.
966df78739f3b3f672f9735445741cbcfa7c10fb1fDouglas Gregor  void PrintLibclangResourceUsage(CXTranslationUnit TU);
974db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor}
984db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor
99ab1889321f6f8f200f2b318ac26883ac18e49d03Ted Kremenek#endif
100