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