Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Scripter::Scripter() :
- imfs(new clang::vfs::InMemoryFileSystem),
- file_manager(new clang::FileManager(clang::FileSystemOptions(), imfs))
- {
- ci.createDiagnostics(nullptr, false);
- ci.getLangOpts().CPlusPlus = 1;
- ci.getLangOpts().CPlusPlus11 = 1;
- ci.getLangOpts().Bool = 1;
- ci.getLangOpts().WChar = 1;
- ci.getLangOpts().GNUMode = 1;
- ci.getLangOpts().GNUKeywords = 1;
- ci.getDiagnosticOpts().Pedantic = 1;
- ci.getHeaderSearchOpts().UseBuiltinIncludes = 1;
- auto to = std::make_shared<clang::TargetOptions>();
- to->Triple = llvm::sys::getDefaultTargetTriple();
- auto *pti = clang::TargetInfo::CreateTargetInfo(ci.getDiagnostics(), to);
- ci.setTarget(pti);
- ci.setFileManager(file_manager);
- ci.createSourceManager(ci.getFileManager());
- ci.createPreprocessor(clang::TU_Complete);
- const std::string dirs[] = {
- "/src",
- "/src/libstdcxx1/include",
- "/src/libstdcxx1/include/c++",
- "/src/libstdcxx1/include/c++/x86_64-w64-mingw32",
- "/src/libstdcxx2/include"
- };
- for (auto dir : dirs)
- {
- ci.getFileManager().getVirtualFile(dir + "/.", 0, 0);
- clang::DirectoryLookup inc(ci.getFileManager().getDirectory(dir), clang::SrcMgr::CharacteristicKind::C_System, false);
- ci.getPreprocessor().getHeaderSearchInfo().AddSearchPath(inc, true);
- }
- }
- void
- Scripter::initialize(const Script& _source)
- {
- bool module_is_valid = true;
- llvm::FunctionCreator lfc = LazyFunctionCreator(&module_is_valid, &app_proxy);
- auto file_buffer = ci.getFileManager().getBufferForFile(_source.get_name());
- auto mem_fid = ci.getSourceManager().createFileID(std::move(*file_buffer));
- ci.getSourceManager().setMainFileID(mem_fid);
- ci.getDiagnosticClient().BeginSourceFile(
- ci.getLangOpts(),
- &ci.getPreprocessor());
- LLVMLinkInMCJIT();
- llvm::InitializeNativeTarget();
- llvm::InitializeNativeTargetAsmPrinter();
- llvm::InitializeNativeTargetAsmParser();
- llvm::LLVMContext context;
- std::shared_ptr<clang::CodeGenerator>
- cg(clang::CreateLLVMCodeGen(
- ci.getDiagnostics(),
- _source.get_name(),
- ci.getHeaderSearchOpts(),
- ci.getPreprocessorOpts(),
- ci.getCodeGenOpts(),
- context));
- clang::IdentifierTable it(ci.getLangOpts());
- clang::SelectorTable st;
- clang::Builtin::Context ctx;
- ctx.InitializeTarget(ci.getTarget(), nullptr);
- ctx.initializeBuiltins(it, ci.getLangOpts());
- clang::ASTContext ast_context(
- ci.getLangOpts(),
- ci.getSourceManager(),
- it,
- st,
- ctx);
- ast_context.InitBuiltinTypes(ci.getTarget());
- bool haveclz = false;
- for (auto iter = it.begin(); iter != it.end(); ++iter) {
- if (iter->second->getName() == "__builtin_clz") {
- llvm::outs() << "We got __builtin_clz\n";
- haveclz = true;
- break;
- }
- }
- if (!haveclz) {
- llvm::outs() << "We don't got __builtin_clz\n";
- }
- if (ast_context.getBuiltinVaListDecl()) {
- llvm::outs() << "We got __builtin_va_list\n";
- }
- else {
- llvm::outs() << "We don't got __builtin_va_list\n";
- }
- llvm::outs().flush();
- cg->Initialize(ast_context);
- clang::ParseAST(
- ci.getPreprocessor(),
- cg.get(),
- // ci.getASTContext(),
- ast_context,
- false,
- clang::TU_Complete);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement