34#include "isl_config.h"
40#ifdef HAVE_ADT_OWNINGPTR_H
41#include <llvm/ADT/OwningPtr.h>
45#ifdef HAVE_LLVM_OPTION_ARG_H
46#include <llvm/Option/Arg.h>
48#include <llvm/Support/raw_ostream.h>
49#include <llvm/Support/CommandLine.h>
50#include <llvm/Support/ManagedStatic.h>
51#include <llvm/TargetParser/Host.h>
52#include <clang/AST/ASTContext.h>
53#include <clang/AST/ASTConsumer.h>
54#include <clang/Basic/Builtins.h>
55#include <clang/Basic/FileSystemOptions.h>
56#include <clang/Basic/FileManager.h>
57#include <clang/Basic/TargetOptions.h>
58#include <clang/Basic/TargetInfo.h>
59#include <clang/Basic/Version.h>
60#include <clang/Driver/Compilation.h>
61#include <clang/Driver/Driver.h>
62#include <clang/Driver/Tool.h>
63#include <clang/Frontend/CompilerInstance.h>
64#include <clang/Frontend/CompilerInvocation.h>
65#ifdef HAVE_BASIC_DIAGNOSTICOPTIONS_H
66#include <clang/Basic/DiagnosticOptions.h>
68#include <clang/Frontend/DiagnosticOptions.h>
70#include <clang/Frontend/TextDiagnosticPrinter.h>
71#include <clang/Frontend/Utils.h>
72#include <clang/Lex/HeaderSearch.h>
73#ifdef HAVE_LEX_PREPROCESSOROPTIONS_H
74#include <clang/Lex/PreprocessorOptions.h>
76#include <clang/Frontend/PreprocessorOptions.h>
78#include <clang/Lex/Preprocessor.h>
79#include <clang/Parse/ParseAST.h>
80#include <clang/Sema/Sema.h>
91using namespace clang::driver;
92#ifdef HAVE_LLVM_OPTION_ARG_H
93using namespace llvm::opt;
96#ifdef HAVE_ADT_OWNINGPTR_H
97#define unique_ptr llvm::OwningPtr
101 llvm::cl::Required, llvm::cl::desc(
"<input file>"));
103 llvm::cl::desc(
"Header search path"),
104 llvm::cl::value_desc(
"path"), llvm::cl::Prefix);
107 llvm::cl::ValueRequired,
"language",
108 llvm::cl::desc(
"Bindings to generate"),
109 llvm::cl::value_desc(
"name"));
112 CLANG_PREFIX
"/lib/clang/" CLANG_VERSION_STRING;
120 if (!decl->hasAttrs())
123 AttrVec attrs = decl->getAttrs();
124 for (AttrVec::const_iterator i = attrs.begin() ; i != attrs.end(); ++i) {
125 const AnnotateAttr *ann = dyn_cast<AnnotateAttr>(*i);
128 if (ann->getAnnotation().str() ==
name)
156 if (!D.isSingleDecl())
157 return HandleTopLevelDeclContinue;
158 decl = D.getSingleDecl();
159 if (isa<FunctionDecl>(decl))
160 functions.insert(cast<FunctionDecl>(decl));
162 return HandleTopLevelDeclContinue;
163 switch (decl->getKind()) {
173 return HandleTopLevelDeclContinue;
179#ifdef HAVE_CXXISPRODUCTION
180static Driver *construct_driver(
const char *
binary, DiagnosticsEngine &Diags)
182 return new Driver(
binary, llvm::sys::getDefaultTargetTriple(),
183 "",
false,
false, Diags);
185#elif defined(HAVE_ISPRODUCTION)
186static Driver *construct_driver(
const char *
binary, DiagnosticsEngine &Diags)
188 return new Driver(
binary, llvm::sys::getDefaultTargetTriple(),
191#elif defined(DRIVER_CTOR_TAKES_DEFAULTIMAGENAME)
192static Driver *construct_driver(
const char *
binary, DiagnosticsEngine &Diags)
194 return new Driver(
binary, llvm::sys::getDefaultTargetTriple(),
198static Driver *construct_driver(
const char *
binary, DiagnosticsEngine &Diags)
200 return new Driver(
binary, llvm::sys::getDefaultTargetTriple(), Diags);
204namespace clang {
namespace driver {
class Job; } }
210 static Job *command(Job *J) {
return J; }
211 static Job *command(Job &J) {
return &J; }
212 static Command *command(Command &
C) {
return &
C; }
215#ifdef CREATE_FROM_ARGS_TAKES_ARRAYREF
220static void create_from_args(CompilerInvocation &invocation,
221 const ArgStringList *args, DiagnosticsEngine &Diags)
223 CompilerInvocation::CreateFromArgs(invocation, *args, Diags);
231static void create_from_args(CompilerInvocation &invocation,
232 const ArgStringList *args, DiagnosticsEngine &Diags)
234 CompilerInvocation::CreateFromArgs(invocation, args->data() + 1,
235 args->data() + args->size(),
246static void set_sysroot(ArgStringList &args)
248 args.push_back(
"-isysroot");
249 args.push_back(CLANG_SYSROOT);
256static void set_sysroot(ArgStringList &args)
267 DiagnosticsEngine &Diags)
269 const char *
binary = CLANG_PREFIX
"/bin/clang";
270 const unique_ptr<Driver> driver(construct_driver(
binary, Diags));
271 std::vector<const char *> Argv;
273 Argv.push_back(filename);
274 const unique_ptr<Compilation> compilation(
275 driver->BuildCompilation(llvm::ArrayRef<const char *>(Argv)));
276 JobList &Jobs = compilation->getJobs();
278 Command *cmd = cast<Command>(ClangAPI::command(*Jobs.begin()));
279 if (strcmp(cmd->getCreator().getName(),
"clang"))
282 ArgStringList args = cmd->getArguments();
285 CompilerInvocation *invocation =
new CompilerInvocation;
286 create_from_args(*invocation, &args, Diags);
293 DiagnosticsEngine &Diags)
300#ifdef HAVE_BASIC_DIAGNOSTICOPTIONS_H
304 return new TextDiagnosticPrinter(llvm::errs(),
new DiagnosticOptions());
311 DiagnosticOptions DO;
312 return new TextDiagnosticPrinter(llvm::errs(), DO);
317#ifdef CREATETARGETINFO_TAKES_SHARED_PTR
320 DiagnosticsEngine &Diags)
322 shared_ptr<TargetOptions> TO = Clang->getInvocation().TargetOpts;
323 TO->Triple = llvm::sys::getDefaultTargetTriple();
324 return TargetInfo::CreateTargetInfo(Diags, TO);
327#elif defined(CREATETARGETINFO_TAKES_POINTER)
330 DiagnosticsEngine &Diags)
332 TargetOptions &TO = Clang->getTargetOpts();
333 TO.Triple = llvm::sys::getDefaultTargetTriple();
334 return TargetInfo::CreateTargetInfo(Diags, &TO);
340 DiagnosticsEngine &Diags)
342 TargetOptions &TO = Clang->getTargetOpts();
343 TO.Triple = llvm::sys::getDefaultTargetTriple();
344 return TargetInfo::CreateTargetInfo(Diags, TO);
349#ifdef CREATEDIAGNOSTICS_TAKES_ARG
365#ifdef CREATEPREPROCESSOR_TAKES_TUKIND
369 Clang->createPreprocessor(TU_Complete);
376 Clang->createPreprocessor();
381#ifdef ADDPATH_TAKES_4_ARGUMENTS
387void add_path(HeaderSearchOptions &HSO,
string Path)
389 HSO.AddPath(Path, frontend::Angled,
false,
true);
398void add_path(HeaderSearchOptions &HSO,
string Path)
400 HSO.AddPath(Path, frontend::Angled,
true,
false,
false);
405#ifdef HAVE_SETMAINFILEID
409 SM.setMainFileID(SM.createFileID(file, SourceLocation(),
417 SM.createMainFileID(file);
422#ifdef SETLANGDEFAULTS_TAKES_5_ARGUMENTS
428 PreprocessorOptions &PO = Clang->getPreprocessorOpts();
429 TargetOptions &TO = Clang->getTargetOpts();
430 llvm::Triple T(TO.Triple);
431 SETLANGDEFAULTS::setLangDefaults(Clang->getLangOpts(), IK_C, T,
433 LangStandard::lang_unspecified);
440 CompilerInvocation::setLangDefaults(Clang->getLangOpts(), IK_C,
441 LangStandard::lang_unspecified);
446#ifdef SETINVOCATION_TAKES_SHARED_PTR
449 CompilerInvocation *invocation)
451 Clang->setInvocation(std::make_shared<CompilerInvocation>(*invocation));
457 CompilerInvocation *invocation)
459 Clang->setInvocation(invocation);
470 int[1][
sizeof(
obj.getError())])
497static const FileEntry *
getFile(CompilerInstance *Clang, std::string Filename)
499 return ignore_error(Clang->getFileManager().getFile(Filename));
518 }
else if (
OutputLanguage.compare(
"cpp-checked-conversion") == 0) {
526 <<
"' not recognized." << endl
527 <<
"Not generating bindings." << endl;
534int main(
int argc,
char *argv[])
536 llvm::cl::ParseCommandLineOptions(argc, argv);
538 CompilerInstance *Clang =
new CompilerInstance();
540 DiagnosticsEngine &Diags = Clang->getDiagnostics();
541 Diags.setSuppressSystemWarnings(
true);
543 Clang->setTarget(target);
545 CompilerInvocation *invocation =
549 Clang->createFileManager();
550 Clang->createSourceManager(Clang->getFileManager());
551 HeaderSearchOptions &HSO = Clang->getHeaderSearchOpts();
552 LangOptions &LO = Clang->getLangOpts();
553 PreprocessorOptions &PO = Clang->getPreprocessorOpts();
556 for (llvm::cl::list<string>::size_type i = 0; i <
Includes.size(); ++i)
559 PO.addMacroDef(
"__isl_give=__attribute__((annotate(\"isl_give\")))");
560 PO.addMacroDef(
"__isl_keep=__attribute__((annotate(\"isl_keep\")))");
561 PO.addMacroDef(
"__isl_take=__attribute__((annotate(\"isl_take\")))");
562 PO.addMacroDef(
"__isl_export=__attribute__((annotate(\"isl_export\")))");
563 PO.addMacroDef(
"__isl_overload="
564 "__attribute__((annotate(\"isl_overload\"))) "
565 "__attribute__((annotate(\"isl_export\")))");
566 PO.addMacroDef(
"__isl_constructor=__attribute__((annotate(\"isl_constructor\"))) __attribute__((annotate(\"isl_export\")))");
567 PO.addMacroDef(
"__isl_subclass(super)=__attribute__((annotate(\"isl_subclass(\" #super \")\"))) __attribute__((annotate(\"isl_export\")))");
570 Preprocessor &PP = Clang->getPreprocessor();
572 PP.getBuiltinInfo().initializeBuiltins(PP.getIdentifierTable(), LO);
578 Clang->createASTContext();
580 Sema *sema =
new Sema(PP, Clang->getASTContext(), consumer);
582 Diags.getClient()->BeginSourceFile(LO, &PP);
584 Diags.getClient()->EndSourceFile();
586 generate(consumer, Clang->getSourceManager());
590 llvm::llvm_shutdown();
592 if (Diags.hasErrorOccurred())
virtual void generate()=0
set< FunctionDecl * > functions
set< RecordDecl * > exported_types
set< FunctionDecl * > exported_functions
virtual HandleTopLevelDeclReturn HandleTopLevelDecl(DeclGroupRef D)