[cfe-dev] Parsing C++ and creating a module
David Kretzmer via cfe-dev
cfe-dev at lists.llvm.org
Mon Sep 7 11:05:19 PDT 2015
(I previously posted this on cfe-users but I'm not sure that was the
right place.)
Hello,
I'm trying to create a C++ interpreter. Some time ago I wrote some code
which, if I remember correctly, was working correctly.
----------------------------------------
// Setup compiler
auto context = &llvm::getGlobalContext();
clang::CompilerInstance compiler;
compiler.createDiagnostics();
auto target_options = std::make_shared<clang::TargetOptions>();
target_options->Triple = llvm::sys::getDefaultTargetTriple();
compiler.setTarget(clang::TargetInfo::CreateTargetInfo(compiler.getDiag
nostics(), target_options));
compiler.createFileManager();
compiler.createSourceManager(compiler.getFileManager());
compiler.createPreprocessor(clang::TU_Complete);
compiler.createASTContext();
compiler.createSema(clang::TU_Complete, nullptr);
// Set input and generate code
auto src_buffer = llvm::MemoryBuffer::getMemBuffer("int i = 0;");
clang::FrontendInputFile input{src_buffer.get(),
clang::InputKind::IK_CXX};
std::unique_ptr<clang::CompilerInvocation> cinvoke{new
clang::CompilerInvocation()};
cinvoke->getFrontendOpts().Inputs.push_back(input);
cinvoke->getTargetOpts().Triple = llvm::sys::getProcessTriple();
compiler.setInvocation(cinvoke.release());
std::unique_ptr<clang::CodeGenAction> codegen_action(new
clang::EmitLLVMOnlyAction(context));
if(!compiler.ExecuteAction(*codegen_action))
std::cerr << "Executing codegen action failed" << std::endl;
----------------------------------------
Now, with clang 3.6, I get a segmentation fault and the following backt
race:
#0 0x000000000124e727 in
llvm::StringMapImpl::LookupBucketFor(llvm::StringRef) ()
#1 0x0000000001047c2d in
clang::PragmaNamespace::AddPragma(clang::PragmaHandler*) ()
#2 0x000000000104ae94 in
clang::Preprocessor::AddPragmaHandler(llvm::StringRef,
clang::PragmaHandler*) ()
#3 0x0000000000a5fa35 in clang::Parser::initializePragmaHandlers() ()
#4 0x0000000000a00aa0 in clang::Parser::Parser(clang::Preprocessor&,
clang::Sema&, bool) ()
#5 0x00000000009f5518 in clang::ParseAST(clang::Sema&, bool, bool) ()
#6 0x000000000069c476 in clang::FrontendAction::Execute() ()
#7 0x0000000000675e59 in
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) ()
#8 0x000000000066d8c5 in main () at
/home/david/Entwicklung/spielwiese/main.cpp:219
Any ideas? Did I forget to initialize something?
Thanks,
David
More information about the cfe-dev
mailing list