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