Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.48 KB | None | 0 0
  1. Scripter::Scripter() :
  2.     imfs(new clang::vfs::InMemoryFileSystem),
  3.     file_manager(new clang::FileManager(clang::FileSystemOptions(), imfs))
  4. {
  5.     ci.createDiagnostics(nullptr, false);
  6.     ci.getLangOpts().CPlusPlus = 1;
  7.     ci.getLangOpts().CPlusPlus11 = 1;
  8.     ci.getLangOpts().Bool = 1;
  9.     ci.getLangOpts().WChar = 1;
  10.     ci.getLangOpts().GNUMode = 1;
  11.     ci.getLangOpts().GNUKeywords = 1;
  12.     ci.getDiagnosticOpts().Pedantic = 1;
  13.     ci.getHeaderSearchOpts().UseBuiltinIncludes = 1;
  14.     auto to = std::make_shared<clang::TargetOptions>();
  15.     to->Triple = llvm::sys::getDefaultTargetTriple();
  16.     auto *pti = clang::TargetInfo::CreateTargetInfo(ci.getDiagnostics(), to);
  17.     ci.setTarget(pti);
  18.     ci.setFileManager(file_manager);
  19.     ci.createSourceManager(ci.getFileManager());
  20.  
  21.     ci.createPreprocessor(clang::TU_Complete);
  22.  
  23.     const std::string dirs[] = {
  24.         "/src",
  25.         "/src/libstdcxx1/include",
  26.         "/src/libstdcxx1/include/c++",
  27.         "/src/libstdcxx1/include/c++/x86_64-w64-mingw32",
  28.         "/src/libstdcxx2/include"
  29.     };
  30.  
  31.     for (auto dir : dirs)
  32.     {
  33.         ci.getFileManager().getVirtualFile(dir + "/.", 0, 0);
  34.         clang::DirectoryLookup inc(ci.getFileManager().getDirectory(dir), clang::SrcMgr::CharacteristicKind::C_System, false);
  35.         ci.getPreprocessor().getHeaderSearchInfo().AddSearchPath(inc, true);
  36.     }
  37. }
  38.  
  39. void
  40. Scripter::initialize(const Script& _source)
  41. {
  42.     bool module_is_valid = true;
  43.     llvm::FunctionCreator lfc = LazyFunctionCreator(&module_is_valid, &app_proxy);
  44.  
  45.     auto file_buffer = ci.getFileManager().getBufferForFile(_source.get_name());
  46.     auto mem_fid = ci.getSourceManager().createFileID(std::move(*file_buffer));
  47.     ci.getSourceManager().setMainFileID(mem_fid);
  48.     ci.getDiagnosticClient().BeginSourceFile(
  49.         ci.getLangOpts(),
  50.         &ci.getPreprocessor());
  51.  
  52.     LLVMLinkInMCJIT();
  53.     llvm::InitializeNativeTarget();
  54.     llvm::InitializeNativeTargetAsmPrinter();
  55.     llvm::InitializeNativeTargetAsmParser();
  56.  
  57.     llvm::LLVMContext context;
  58.  
  59.     std::shared_ptr<clang::CodeGenerator>
  60.         cg(clang::CreateLLVMCodeGen(
  61.             ci.getDiagnostics(),
  62.             _source.get_name(),
  63.             ci.getHeaderSearchOpts(),
  64.             ci.getPreprocessorOpts(),
  65.             ci.getCodeGenOpts(),
  66.             context));
  67.  
  68.     clang::IdentifierTable it(ci.getLangOpts());
  69.     clang::SelectorTable st;
  70.     clang::Builtin::Context ctx;
  71.     ctx.InitializeTarget(ci.getTarget(), nullptr);
  72.     ctx.initializeBuiltins(it, ci.getLangOpts());
  73.  
  74.     clang::ASTContext ast_context(
  75.         ci.getLangOpts(),
  76.         ci.getSourceManager(),
  77.         it,
  78.         st,
  79.         ctx);
  80.     ast_context.InitBuiltinTypes(ci.getTarget());
  81.  
  82.     bool haveclz = false;
  83.     for (auto iter = it.begin(); iter != it.end(); ++iter) {
  84.         if (iter->second->getName() == "__builtin_clz") {
  85.             llvm::outs() << "We got __builtin_clz\n";
  86.             haveclz = true;
  87.             break;
  88.         }
  89.     }
  90.     if (!haveclz) {
  91.         llvm::outs() << "We don't got __builtin_clz\n";
  92.     }
  93.     if (ast_context.getBuiltinVaListDecl()) {
  94.         llvm::outs() << "We got __builtin_va_list\n";
  95.     }
  96.     else {
  97.         llvm::outs() << "We don't got __builtin_va_list\n";
  98.     }
  99.     llvm::outs().flush();
  100.  
  101.     cg->Initialize(ast_context);
  102.  
  103.     clang::ParseAST(
  104.         ci.getPreprocessor(),
  105.         cg.get(),
  106.         // ci.getASTContext(),
  107.         ast_context,
  108.         false,
  109.         clang::TU_Complete);
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement