1#include <isl-interface/config.h>
5#ifdef HAVE_LLVM_OPTION_ARG_H
6#include <llvm/Option/Arg.h>
8#ifdef HAVE_TARGETPARSER_HOST_H
9#include <llvm/TargetParser/Host.h>
11#include <llvm/Support/Host.h>
13#include <clang/AST/ASTContext.h>
14#include <clang/Basic/Builtins.h>
15#include <clang/Basic/DiagnosticOptions.h>
16#include <clang/Basic/FileManager.h>
17#include <clang/Basic/TargetOptions.h>
18#include <clang/Basic/TargetInfo.h>
19#include <clang/Basic/Version.h>
20#include <clang/Driver/Compilation.h>
21#include <clang/Driver/Driver.h>
22#include <clang/Driver/Tool.h>
23#include <clang/Frontend/CompilerInstance.h>
24#include <clang/Frontend/CompilerInvocation.h>
25#include <clang/Frontend/TextDiagnosticPrinter.h>
26#include <clang/Lex/HeaderSearch.h>
27#include <clang/Lex/PreprocessorOptions.h>
28#include <clang/Lex/Preprocessor.h>
35using namespace ::
clang;
37#ifdef HAVE_LLVM_OPTION_ARG_H
38using namespace llvm::opt;
41#ifndef ISL_CLANG_RESOURCE_DIR
42#define ISL_CLANG_RESOURCE_DIR \
43 ISL_CLANG_PREFIX "/lib/clang/" CLANG_VERSION_STRING
49 return new Driver(
binary, llvm::sys::getDefaultTargetTriple(), Diags);
57 static Job *
command(Job &J) {
return &J; }
61#ifdef CREATE_FROM_ARGS_TAKES_ARRAYREF
67 const ArgStringList *args, DiagnosticsEngine &Diags)
69 CompilerInvocation::CreateFromArgs(invocation, *args, Diags);
78 const ArgStringList *args, DiagnosticsEngine &Diags)
80 CompilerInvocation::CreateFromArgs(invocation, args->data() + 1,
81 args->data() + args->size(),
87#ifdef ISL_CLANG_SYSROOT
94 args.push_back(
"-isysroot");
95 args.push_back(ISL_CLANG_SYSROOT);
113 const char *filename, DiagnosticsEngine &Diags)
115 const char *
binary = ISL_CLANG_PREFIX
"/bin/clang";
117 std::vector<const char *> Argv;
119 Argv.push_back(filename);
120 const std::unique_ptr<Compilation> compilation(
121 driver->BuildCompilation(llvm::ArrayRef<const char *>(Argv)));
122 JobList &Jobs = compilation->getJobs();
125 if (strcmp(cmd->getCreator().getName(),
"clang"))
128 ArgStringList args = cmd->getArguments();
134#ifdef CREATETARGETINFO_TAKES_SHARED_PTR
137 DiagnosticsEngine &Diags)
139 std::shared_ptr<TargetOptions> TO = Clang->getInvocation().TargetOpts;
140 TO->Triple = llvm::sys::getDefaultTargetTriple();
141 return TargetInfo::CreateTargetInfo(Diags, TO);
147 DiagnosticsEngine &Diags)
149 TargetOptions &TO = Clang->getTargetOpts();
150 TO.Triple = llvm::sys::getDefaultTargetTriple();
151 return TargetInfo::CreateTargetInfo(Diags, TO);
156#ifdef CREATEDIAGNOSTICS_TAKES_VFS
160 Clang->createDiagnostics(*llvm::vfs::getRealFileSystem());
167 Clang->createDiagnostics();
174 Clang->createPreprocessor(TU_Complete);
181static void add_path(HeaderSearchOptions &HSO, std::string Path)
183 HSO.AddPath(Path, frontend::Angled,
false,
true);
189 SM.setMainFileID(SM.createFileID(file, SourceLocation(),
193#ifdef SETLANGDEFAULTS_TAKES_5_ARGUMENTS
199 PreprocessorOptions &PO = Clang->getPreprocessorOpts();
200 TargetOptions &TO = Clang->getTargetOpts();
201 llvm::Triple T(TO.Triple);
202 SETLANGDEFAULTS::setLangDefaults(Clang->getLangOpts(), IK_C, T,
204 LangStandard::lang_unspecified);
211 CompilerInvocation::setLangDefaults(Clang->getLangOpts(), IK_C,
212 LangStandard::lang_unspecified);
223 int[1][
sizeof(
obj.getError())])
250#define ISL_VALID_EXPR_FOR_TEMPLATE_ARG(CLASS, EXPR) \
251template <typename T> \
254 template <typename U> \
255 static auto test(int) -> decltype(EXPR, std::true_type()); \
257 template <typename> \
258 static std::false_type test(...); \
261 using type = decltype(test<T>(0)); \
262 static constexpr bool value = type::value; \
269 std::declval<U>().getFileRef(std::declval<const std::string &>()))
281 typename std::enable_if<HasGetFileRef<T>::value,
bool>::
type = true>
282static auto getFile(T&
obj, const std::
string &filename)
283 -> decltype(
obj.getFileRef(filename))
285 return obj.getFileRef(filename);
288 typename std::enable_if<!HasGetFileRef<T>::value,
bool>
::type =
true>
289static llvm::ErrorOr<const FileEntry *> getFile(T&
obj,
290 const std::string &filename)
294 return std::error_code();
302 new U(llvm::errs(), std::declval<DiagnosticOptions &>()))
311 typename std::enable_if<TakesDiagnosticOptionsRef<T>::value,
315 typename std::enable_if<!TakesDiagnosticOptionsRef<T>::value,
341 template <
typename T,
342 typename std::enable_if<TakesDiagnosticOptionsRef<T>::value,
347 template <
typename T,
348 typename std::enable_if<!TakesDiagnosticOptionsRef<T>::value,
351 return new DiagnosticOptions();
375 virtual bool handle(CompilerInstance *Clang) = 0;
381 CompilerInstance *Clang =
new CompilerInstance();
383 DiagnosticsEngine &Diags = Clang->getDiagnostics();
384 Diags.setSuppressSystemWarnings(
true);
387 Clang->setTarget(target);
391 Clang->createFileManager();
392 Clang->createSourceManager(Clang->getFileManager());
393 HeaderSearchOptions &HSO = Clang->getHeaderSearchOpts();
394 LangOptions &LO = Clang->getLangOpts();
395 PreprocessorOptions &PO = Clang->getPreprocessorOpts();
398 clang::frontend::System,
false,
false);
404 Preprocessor &PP = Clang->getPreprocessor();
406 PP.getBuiltinInfo().initializeBuiltins(PP.getIdentifierTable(),
408 auto file = getFile(Clang->getFileManager(), filename);
416 Clang->createASTContext();
#define ISL_VALID_EXPR_FOR_TEMPLATE_ARG(CLASS, EXPR)
#define ISL_CLANG_RESOURCE_DIR
static DiagnosticOptions * diag_opts_type()
static void construct_invocation(CompilerInstance *Clang, const char *filename, DiagnosticsEngine &Diags)
static void create_preprocessor(CompilerInstance *Clang)
static const char * ResourceDir
static TargetInfo * create_target_info(CompilerInstance *Clang, DiagnosticsEngine &Diags)
static void create_diagnostics(CompilerInstance *Clang)
static void set_lang_defaults(CompilerInstance *Clang)
static void create_from_args(CompilerInvocation &invocation, const ArgStringList *args, DiagnosticsEngine &Diags)
static void create_main_file_id(SourceManager &SM, const T &file)
static void set_sysroot(ArgStringList &args)
static Driver * construct_driver(const char *binary, DiagnosticsEngine &Diags)
static const FileEntry * ignore_error_helper(const T obj, int, int[1][sizeof(obj.getError())])
static const FileEntry * ignore_error(const T obj)
static void add_path(HeaderSearchOptions &HSO, std::string Path)
These are automatically generated conversions between the default and the checked C++ bindings for is...
static Command * command(Command &C)
static Job * command(Job &J)
static Job * command(Job *J)
DiagnosticOptions & getDiagOpts()
virtual void suppress_errors(DiagnosticsEngine &Diags)=0
virtual bool handle(CompilerInstance *Clang)=0
virtual void add_macros(PreprocessorOptions &PO)=0
DiagOptsType getDiagnosticOptions()
bool invoke(const char *filename)
virtual void add_paths(HeaderSearchOptions &HSO)=0
virtual TextDiagnosticPrinter * construct_printer()=0
DiagnosticOptions DiagOpts
virtual void handle_error()=0
decltype(diag_opts_type< TextDiagnosticPrinter >()) DiagOptsType
DiagnosticOptions * getDiagOpts()