1775bee71ad21c84bc130af22ac47c1c8e0f9e72fDaniel Dunbar//===--- Utils.h - Misc utilities for the front-end -------------*- C++ -*-===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 10b09f6e15c59b89d5820db8ef40598eb1d1323c1fEli Friedman// This header contains miscellaneous utilities for various front-end actions. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 14b09f6e15c59b89d5820db8ef40598eb1d1323c1fEli Friedman#ifndef LLVM_CLANG_FRONTEND_UTILS_H 15b09f6e15c59b89d5820db8ef40598eb1d1323c1fEli Friedman#define LLVM_CLANG_FRONTEND_UTILS_H 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1790feede34bf8edb9ee417109c6b72bf96c3c8fb8Benjamin Kramer#include "clang/Basic/Diagnostic.h" 18c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include "clang/Basic/VirtualFileSystem.h" 19832316e9a04242972f4b57281dccb8e4cf5894eaArgyrios Kyrtzidis#include "llvm/ADT/IntrusiveRefCntPtr.h" 202e033a7cc58f92c5351a66efc62e9e9253201c12Benjamin Kramer#include "llvm/ADT/StringRef.h" 21c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include "llvm/ADT/StringSet.h" 22b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/OptSpecifier.h" 23ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek 24f54fce8ff8818cde6b421265f709319f5fea0844Eli Friedmannamespace llvm { 252e033a7cc58f92c5351a66efc62e9e9253201c12Benjamin Kramerclass raw_fd_ostream; 262cdafa8001ee69b75d2906cbb36f16cf8e1dc60aDaniel Dunbarclass Triple; 27b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner 28b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknernamespace opt { 29b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerclass ArgList; 30b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner} 31f54fce8ff8818cde6b421265f709319f5fea0844Eli Friedman} 32f54fce8ff8818cde6b421265f709319f5fea0844Eli Friedman 335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang { 34445797873fcd5810e48e4c8937c33959a647bbf7Ted Kremenekclass ASTConsumer; 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass ASTReader; 368eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarclass CompilerInstance; 37832316e9a04242972f4b57281dccb8e4cf5894eaArgyrios Kyrtzidisclass CompilerInvocation; 388863b985f1cf78a2fb62913e184dc45162853cf9Daniel Dunbarclass Decl; 390e0bae8139e25de81f18b6a519783a06f7ba1e25Daniel Dunbarclass DependencyOutputOptions; 40d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikieclass DiagnosticsEngine; 416907943901e0aae5be7618c36c0f8275634e6ab5Daniel Dunbarclass DiagnosticOptions; 42c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass ExternalSemaSource; 43277a6e752512cff286190d35cb353ce717e86b18Nick Lewyckyclass FileManager; 442cdafa8001ee69b75d2906cbb36f16cf8e1dc60aDaniel Dunbarclass HeaderSearch; 452cdafa8001ee69b75d2906cbb36f16cf8e1dc60aDaniel Dunbarclass HeaderSearchOptions; 46b4292f221fb879fd2274683ace4f73d3d99af8c5Steve Naroffclass IdentifierTable; 474908d36c3a6c28a231d60de8a2bfc6a516ec4940Eli Friedmanclass LangOptions; 488863b985f1cf78a2fb62913e184dc45162853cf9Daniel Dunbarclass Preprocessor; 498863b985f1cf78a2fb62913e184dc45162853cf9Daniel Dunbarclass PreprocessorOptions; 50775bee71ad21c84bc130af22ac47c1c8e0f9e72fDaniel Dunbarclass PreprocessorOutputOptions; 518863b985f1cf78a2fb62913e184dc45162853cf9Daniel Dunbarclass SourceManager; 5253d4c14a989523afc6aa8fff275ec3ab26eb6c18Argyrios Kyrtzidisclass Stmt; 538863b985f1cf78a2fb62913e184dc45162853cf9Daniel Dunbarclass TargetInfo; 547d957472ef9a09048c03d8a11028536f908c18b9Fariborz Jahanianclass FrontendOptions; 558863b985f1cf78a2fb62913e184dc45162853cf9Daniel Dunbar 562cdafa8001ee69b75d2906cbb36f16cf8e1dc60aDaniel Dunbar/// Apply the header search options to get given HeaderSearch object. 575814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbarvoid ApplyHeaderSearchOptions(HeaderSearch &HS, 585814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar const HeaderSearchOptions &HSOpts, 595814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar const LangOptions &Lang, 602cdafa8001ee69b75d2906cbb36f16cf8e1dc60aDaniel Dunbar const llvm::Triple &triple); 612cdafa8001ee69b75d2906cbb36f16cf8e1dc60aDaniel Dunbar 628863b985f1cf78a2fb62913e184dc45162853cf9Daniel Dunbar/// InitializePreprocessor - Initialize the preprocessor getting it and the 638863b985f1cf78a2fb62913e184dc45162853cf9Daniel Dunbar/// environment ready to process a single file. 648863b985f1cf78a2fb62913e184dc45162853cf9Daniel Dunbarvoid InitializePreprocessor(Preprocessor &PP, 65961c76ea8d5089293e448e5d538570653e28080cDaniel Dunbar const PreprocessorOptions &PPOpts, 667d957472ef9a09048c03d8a11028536f908c18b9Fariborz Jahanian const FrontendOptions &FEOpts); 675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// DoPrintPreprocessedInput - Implement -E mode. 698cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattnervoid DoPrintPreprocessedInput(Preprocessor &PP, raw_ostream* OS, 7029cf746aef63b1984c013448e843a290b2badf7bDaniel Dunbar const PreprocessorOutputOptions &Opts); 715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 72c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// An interface for collecting the dependencies of a compilation. Users should 73c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// use \c attachToPreprocessor and \c attachToASTReader to get all of the 74c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// dependencies. 75c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// FIXME: Migrate DependencyFileGen, DependencyGraphGen, ModuleDepCollectory to 76c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// use this interface. 77c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass DependencyCollector { 78c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic: 79c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void attachToPreprocessor(Preprocessor &PP); 80c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void attachToASTReader(ASTReader &R); 81c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines llvm::ArrayRef<std::string> getDependencies() const { return Dependencies; } 82c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 83c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /// Called when a new file is seen. Return true if \p Filename should be added 84c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /// to the list of dependencies. 85c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /// 86c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /// The default implementation ignores <built-in> and system files. 87c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines virtual bool sawDependency(StringRef Filename, bool FromModule, 88c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines bool IsSystem, bool IsModuleFile, bool IsMissing); 89c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /// Called when the end of the main file is reached. 90c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines virtual void finishedMainFile() { } 91c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /// Return true if system files should be passed to sawDependency(). 92c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines virtual bool needSystemDependencies() { return false; } 93c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines virtual ~DependencyCollector(); 94c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 95c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic: // implementation detail 96c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /// Add a dependency \p Filename if it has not been seen before and 97c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /// sawDependency() returns true. 98c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void maybeAddDependency(StringRef Filename, bool FromModule, bool IsSystem, 99c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines bool IsModuleFile, bool IsMissing); 100c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesprivate: 101c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines llvm::StringSet<> Seen; 102c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines std::vector<std::string> Dependencies; 103c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}; 104c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// Builds a depdenency file when attached to a Preprocessor (for includes) and 106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// ASTReader (for module imports), and writes it out at the end of processing 107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// a source file. Users should attach to the ast reader whenever a module is 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// loaded. 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass DependencyFileGenerator { 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void *Impl; // Opaque implementation 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DependencyFileGenerator(void *Impl); 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic: 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static DependencyFileGenerator *CreateAndAttachToPreprocessor( 114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Preprocessor &PP, const DependencyOutputOptions &Opts); 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void AttachToASTReader(ASTReader &R); 116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 117750c358049a0e91fd71a8d10a9ac8299c943e238Daniel Dunbar 118c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// Collects the dependencies for imported modules into a directory. Users 119c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// should attach to the AST reader whenever a module is loaded. 120c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass ModuleDependencyCollector { 121c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines std::string DestDir; 122c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines bool HasErrors; 123c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines llvm::StringSet<> Seen; 124c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines vfs::YAMLVFSWriter VFSWriter; 125c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 126c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic: 127c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines StringRef getDest() { return DestDir; } 128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool insertSeen(StringRef Filename) { return Seen.insert(Filename).second; } 129c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void setHasErrors() { HasErrors = true; } 130c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void addFileMapping(StringRef VPath, StringRef RPath) { 131c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines VFSWriter.addFileMapping(VPath, RPath); 132c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 133c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 134c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void attachToASTReader(ASTReader &R); 135c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void writeFileMap(); 136c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines bool hasErrors() { return HasErrors; } 137c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ModuleDependencyCollector(std::string DestDir) 138c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines : DestDir(DestDir), HasErrors(false) {} 139c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ~ModuleDependencyCollector() { writeFileMap(); } 140c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}; 141c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 142c69a181049ab52da29f8f69316a34c90c3ea3b8eDouglas Gregor/// AttachDependencyGraphGen - Create a dependency graph generator, and attach 143c69a181049ab52da29f8f69316a34c90c3ea3b8eDouglas Gregor/// it to the given preprocessor. 144c69a181049ab52da29f8f69316a34c90c3ea3b8eDouglas Gregor void AttachDependencyGraphGen(Preprocessor &PP, StringRef OutputFile, 145c69a181049ab52da29f8f69316a34c90c3ea3b8eDouglas Gregor StringRef SysRoot); 146c69a181049ab52da29f8f69316a34c90c3ea3b8eDouglas Gregor 147eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar/// AttachHeaderIncludeGen - Create a header include list generator, and attach 148eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar/// it to the given preprocessor. 149b376e5e71aa3e608c0481a9a7facb5d8b29d3163Daniel Dunbar/// 150b376e5e71aa3e608c0481a9a7facb5d8b29d3163Daniel Dunbar/// \param ShowAllHeaders - If true, show all header information instead of just 151b376e5e71aa3e608c0481a9a7facb5d8b29d3163Daniel Dunbar/// headers following the predefines buffer. This is useful for making sure 152b376e5e71aa3e608c0481a9a7facb5d8b29d3163Daniel Dunbar/// includes mentioned on the command line are also reported, but differs from 153b376e5e71aa3e608c0481a9a7facb5d8b29d3163Daniel Dunbar/// the default behavior used by -H. 154b376e5e71aa3e608c0481a9a7facb5d8b29d3163Daniel Dunbar/// \param OutputPath - If non-empty, a path to write the header include 155b376e5e71aa3e608c0481a9a7facb5d8b29d3163Daniel Dunbar/// information to, instead of writing to stderr. 156708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg/// \param ShowDepth - Whether to indent to show the nesting of the includes. 157708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg/// \param MSStyle - Whether to print in cl.exe /showIncludes style. 158b376e5e71aa3e608c0481a9a7facb5d8b29d3163Daniel Dunbarvoid AttachHeaderIncludeGen(Preprocessor &PP, bool ShowAllHeaders = false, 159686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef OutputPath = "", 160708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg bool ShowDepth = true, bool MSStyle = false); 161eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar 16233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar/// Cache tokens for use with PCH. Note that this requires a seekable stream. 16333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarvoid CacheTokens(Preprocessor &PP, raw_pwrite_stream *OS); 1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 165c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// The ChainedIncludesSource class converts headers to chained PCHs in 166c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines/// memory, mainly for testing. 167c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesIntrusiveRefCntPtr<ExternalSemaSource> 168c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinescreateChainedIncludesSource(CompilerInstance &CI, 169c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines IntrusiveRefCntPtr<ExternalSemaSource> &Reader); 170c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 171832316e9a04242972f4b57281dccb8e4cf5894eaArgyrios Kyrtzidis/// createInvocationFromCommandLine - Construct a compiler invocation object for 172832316e9a04242972f4b57281dccb8e4cf5894eaArgyrios Kyrtzidis/// a command line argument vector. 173832316e9a04242972f4b57281dccb8e4cf5894eaArgyrios Kyrtzidis/// 174832316e9a04242972f4b57281dccb8e4cf5894eaArgyrios Kyrtzidis/// \return A CompilerInvocation, or 0 if none was built for the given 175832316e9a04242972f4b57281dccb8e4cf5894eaArgyrios Kyrtzidis/// argument vector. 176832316e9a04242972f4b57281dccb8e4cf5894eaArgyrios KyrtzidisCompilerInvocation * 1772d3ba4f5a923a90c3fc290ddfba5e36c2d0a9b46Chris LattnercreateInvocationFromCommandLine(ArrayRef<const char *> Args, 178c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticsEngine> Diags = 179c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticsEngine>()); 180832316e9a04242972f4b57281dccb8e4cf5894eaArgyrios Kyrtzidis 181b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner/// Return the value of the last argument as an integer, or a default. If Diags 182b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner/// is non-null, emits an error if the argument is given, but non-integral. 183b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerint getLastArgIntValue(const llvm::opt::ArgList &Args, 184b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner llvm::opt::OptSpecifier Id, int Default, 1856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DiagnosticsEngine *Diags = nullptr); 186b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner 187b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerinline int getLastArgIntValue(const llvm::opt::ArgList &Args, 188b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner llvm::opt::OptSpecifier Id, int Default, 189b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner DiagnosticsEngine &Diags) { 190b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner return getLastArgIntValue(Args, Id, Default, &Diags); 191b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner} 192b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner 193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint64_t getLastArgUInt64Value(const llvm::opt::ArgList &Args, 194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::OptSpecifier Id, uint64_t Default, 1956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DiagnosticsEngine *Diags = nullptr); 196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesinline uint64_t getLastArgUInt64Value(const llvm::opt::ArgList &Args, 198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::OptSpecifier Id, 199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint64_t Default, 200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagnosticsEngine &Diags) { 201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return getLastArgUInt64Value(Args, Id, Default, &Diags); 202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// When Clang->getFrontendOpts().DisableFree is set we don't delete some of the 205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// global objects, but we don't want LeakDetectors to complain, so we bury them 206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// in a globally visible array. 207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid BuryPointer(const void *Ptr); 208176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename T> void BuryPointer(std::unique_ptr<T> Ptr) { 209176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BuryPointer(Ptr.release()); 210176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 212b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner} // end namespace clang 2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 215