X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=interface%2Fextract_interface.cc;h=f39febc9dc3b69e3d990fbfab56ba56cb9ba8b6d;hb=878927f72cedcd887da29d89ec4b1193b90fb33e;hp=89baf812fb6cefbf77dc91ab1ae17443167339f2;hpb=2b6dabfaa33f983315cc284838830e9dcd76ba54;p=platform%2Fupstream%2Fisl.git diff --git a/interface/extract_interface.cc b/interface/extract_interface.cc index 89baf81..f39febc 100644 --- a/interface/extract_interface.cc +++ b/interface/extract_interface.cc @@ -31,6 +31,8 @@ * Sven Verdoolaege. */ +#include "isl_config.h" + #include #include #include @@ -44,9 +46,16 @@ #include #include #include +#include +#include +#include #include #include +#ifdef HAVE_BASIC_DIAGNOSTICOPTIONS_H +#include +#else #include +#endif #include #include #include @@ -54,12 +63,12 @@ #include #include -#include "isl_config.h" #include "extract_interface.h" #include "python.h" using namespace std; using namespace clang; +using namespace clang::driver; static llvm::cl::opt InputFilename(llvm::cl::Positional, llvm::cl::Required, llvm::cl::desc("")); @@ -106,14 +115,14 @@ struct MyASTConsumer : public ASTConsumer { set types; set functions; - virtual void HandleTopLevelDecl(DeclGroupRef D) { + virtual HandleTopLevelDeclReturn HandleTopLevelDecl(DeclGroupRef D) { Decl *decl; if (!D.isSingleDecl()) - return; + return HandleTopLevelDeclContinue; decl = D.getSingleDecl(); if (!is_exported(decl)) - return; + return HandleTopLevelDeclContinue; switch (decl->getKind()) { case Decl::Record: types.insert(cast(decl)); @@ -124,22 +133,98 @@ struct MyASTConsumer : public ASTConsumer { default: break; } + return HandleTopLevelDeclContinue; } }; +#ifdef USE_ARRAYREF + +#ifdef HAVE_CXXISPRODUCTION +static Driver *construct_driver(const char *binary, DiagnosticsEngine &Diags) +{ + return new Driver(binary, llvm::sys::getDefaultTargetTriple(), + "", false, false, Diags); +} +#else +static Driver *construct_driver(const char *binary, DiagnosticsEngine &Diags) +{ + return new Driver(binary, llvm::sys::getDefaultTargetTriple(), + "", false, Diags); +} +#endif + +/* Create a CompilerInvocation object that stores the command line + * arguments constructed by the driver. + * The arguments are mainly useful for setting up the system include + * paths on newer clangs and on some platforms. + */ +static CompilerInvocation *construct_invocation(const char *filename, + DiagnosticsEngine &Diags) +{ + const char *binary = CLANG_PREFIX"/bin/clang"; + const llvm::OwningPtr driver(construct_driver(binary, Diags)); + std::vector Argv; + Argv.push_back(binary); + Argv.push_back(filename); + const llvm::OwningPtr compilation( + driver->BuildCompilation(llvm::ArrayRef(Argv))); + JobList &Jobs = compilation->getJobs(); + + Command *cmd = cast(*Jobs.begin()); + if (strcmp(cmd->getCreator().getName(), "clang")) + return NULL; + + const ArgStringList *args = &cmd->getArguments(); + + CompilerInvocation *invocation = new CompilerInvocation; + CompilerInvocation::CreateFromArgs(*invocation, args->data() + 1, + args->data() + args->size(), + Diags); + return invocation; +} + +#else + +static CompilerInvocation *construct_invocation(const char *filename, + DiagnosticsEngine &Diags) +{ + return NULL; +} + +#endif + +#ifdef HAVE_BASIC_DIAGNOSTICOPTIONS_H + +static TextDiagnosticPrinter *construct_printer(void) +{ + return new TextDiagnosticPrinter(llvm::errs(), new DiagnosticOptions()); +} + +#else + +static TextDiagnosticPrinter *construct_printer(void) +{ + DiagnosticOptions DO; + return new TextDiagnosticPrinter(llvm::errs(), DO); +} + +#endif + int main(int argc, char *argv[]) { llvm::cl::ParseCommandLineOptions(argc, argv); CompilerInstance *Clang = new CompilerInstance(); - DiagnosticOptions DO; - Clang->createDiagnostics(0, NULL, - new TextDiagnosticPrinter(llvm::errs(), DO)); + Clang->createDiagnostics(0, NULL, construct_printer()); DiagnosticsEngine &Diags = Clang->getDiagnostics(); Diags.setSuppressSystemWarnings(true); + CompilerInvocation *invocation = + construct_invocation(InputFilename.c_str(), Diags); + if (invocation) + Clang->setInvocation(invocation); Clang->createFileManager(); Clang->createSourceManager(Clang->getFileManager()); - TargetOptions TO; + TargetOptions &TO = Clang->getTargetOpts(); TO.Triple = llvm::sys::getDefaultTargetTriple(); TargetInfo *target = TargetInfo::CreateTargetInfo(Diags, TO); Clang->setTarget(target);