Hi,<br><br>So I'm trying to take preprocessed source code (in the form
of an std::string) and compile it and have the resulting object code
also be outputted into string (bypassing the file system).<br><br>My current code:<br>
<br><br>CompilerInstance Clang;<br>TextDiagnosticBuffer DiagsBuffer;<br>CompilerInvocation Invocation;<br>Diagnostic Diags(&DiagsBuffer);<br><br>Clang.setDiagnostics(&Diags);<br>Clang.setDiagnosticClient(&<div id=":14q" class="ii gt">

DiagsBuffer);<br>
CompilerInvocation::CreateFromArgs(Invocation, (const char **)argAddresses.begin(),<br>                                                      (const char **)argAddresses.end(), Diags);<br>Clang.setInvocation(&Invocation);<br>


<br> <br>FrontendOptions FeOpts = Clang.getFrontendOpts();<br>FeOpts.ProgramAction = frontend::EmitObj;<br>std::vector<std::pair<FrontendOptions::InputKind, std::string> > opts;<br>std::pair<FrontendOptions::InputKind, std::string> p(FeOpts.IK_PreprocessedCXX, "source");<br>


opts.push_back(p);<br>FeOpts.Inputs = opts;<br> <br>Clang.createFileManager();<br>Clang.setTarget(TargetInfo::CreateTargetInfo(Clang.getDiagnostics(),<br>                                                                  Clang.getTargetOpts()));<br>


Clang.getTarget().setForcedLangOptions(Clang.getLangOpts());<br><br>// override the source file<br>llvm::MemoryBuffer* Buffer = llvm::MemoryBuffer::getMemBuffer(Source, "source");<br> <br>SourceManager SM(Diags);<br>


Clang.setSourceManager(&SM);<br>FileManager& FM = Clang.getFileManager();<br>std::string sourceName("source");<br>const FileEntry* fe = FM.getVirtualFile(sourceName, strlen(Buffer->getBufferStart()), time(NULL));<br>


SM.overrideFileContents(fe, Buffer);<br><br>Clang.createPreprocessor();<br>llvm::LLVMContext llvmc;<br>Clang.setLLVMContext(&llvmc);<br> <br>// set the output file<br>Clang.clearOutputFiles(false);<br>std::string objectCode;<br>


llvm::raw_string_ostream* OS = new llvm::raw_string_ostream(objectCode);<br>llvm::sys::Path Path = llvm::sys::Path::GetCurrentDirectory();<br>llvm::StringRef PathName(Path.getBasename());<br>Clang.addOutputFile(PathName, OS);<br>


 <br>// compile<br>EmitObjAction E;<br>E.BeginSourceFile(Clang, sourceName);<br>E.Execute();<br>E.EndSourceFile();<br><br><br>I get the following error in E.Execute():<br><br>FIXME: MCMachoStreamer:EmitFileDirective not implemented<br>


clang: MCMachOStreamer.cpp:241: virtual void<unnamed>::MCMachOStreamer::EmitSymbolAttribute(llvm::MCSymbol*, llvm::MCSymbolAttr): Assertion `0 && "Invalid symbol attribute for Mach-O!"' failed.<br>


<br>The backtrace looks like:<br>#0  0x00007ffff6c81a75 in *__GI_raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64<br>#1  0x00007ffff6c855c0 in *__GI_abort () at abort.c:92<br>#2  0x00007ffff6c7a941 in *__GI___assert_fail (assertion=0x1a5bb30 "0 && \"Invalid symbol attribute for Mach-O!\"", <br>


    file=<value optimized out>, line=241, <br>    function=0x1a5ca80 "virtual void<unnamed>::MCMachOStreamer::EmitSymbolAttribute(llvm::MCSymbol*, llvm::MCSymbolAttr)") at assert.c:81<br>#3  0x0000000001338a41 in EmitSymbolAttribute (this=0x2322230, Symbol=0x23240e0, Attribute=llvm::MCSA_ELF_TypeFunction)<br>


    at MCMachOStreamer.cpp:241<br>#4  0x0000000000fb8802 in llvm::AsmPrinter::EmitFunctionHeader (this=0x2322b00) at AsmPrinter.cpp:322<br>#5  0x0000000000d86fbe in llvm::X86AsmPrinter::runOnMachineFunction (this=0x2322b00, MF=...) at X86AsmPrinter.cpp:70<br>


#6  0x000000000103865d in llvm::MachineFunctionPass::runOnFunction (this=0x2322b00, F=...) at MachineFunctionPass.cpp:33<br>#7  0x00000000013f9a2b in llvm::FPPassManager::runOnFunction (this=0x23033c0, F=...) at PassManager.cpp:1418<br>


#8  0x00000000013f96f5 in llvm::FunctionPassManagerImpl::run (this=0x23025c0, F=...) at PassManager.cpp:1369<br>#9  0x00000000013f93a5 in llvm::FunctionPassManager::run (this=0x22edc70, F=...) at PassManager.cpp:1299<br>

#10 0x0000000000420a25 in EmitAssembly (this=0x22a4e20) at CodeGenAction.cpp:467<br>
#11 0x000000000041f512 in HandleTranslationUnit (this=0x22a4e20, C=...) at CodeGenAction.cpp:165<br>#12 0x00000000006a0db3 in clang::ParseAST (PP=..., Consumer=0x22a4e20, Ctx=..., PrintStats=false, <br>    CompleteTranslationUnit=true, CompletionConsumer=0x0) at ParseAST.cpp:119<br>


#13 0x0000000000441692 in clang::ASTFrontendAction::ExecuteAction (this=0x7ffff6246ac0) at FrontendAction.cpp:229<br>#14 0x00000000004412cd in clang::FrontendAction::Execute (this=0x7ffff6246ac0) at FrontendAction.cpp:155</div>