<div dir="ltr">Hello Pedro,<div><br></div><div>I was able to embed the builtin headers using vritual files as follow.</div><div><br></div><div>Right now, I have two vectors to hold the filename and its content.</div><div><br></div><div><div>  std::vector<std::string> clang_headers_name;</div><div>  std::vector<std::string> clang_headers_content;</div></div><div><br></div><div>For some reason I couldn't get working using one std::vector<std::pair<std::string, std::string> > (neither using a map), but I didn't dig it further to understand why.<br></div><div><br></div><div>So, the two vectors are filled with the header's name and content, attached is the method I use to embed them. It isn't an ideal solution but it works. I created a small script that (more or less) automatically converts all the builtin headers to strings. If you want it, just let me know.</div><div><br></div><div>After both vectors are filled, I simply do (bold):</div><div><br></div><div><div>  clang::tooling::FixedCompilationDatabase Compilations("./", compiler_string);</div><div><br></div><div>  std::vector<std::string> sources;</div><div>  sources.push_back("/esbmc_intrinsics.h");</div><div>  sources.push_back(path);</div><div><br></div><div>  clang::tooling::ClangTool Tool(Compilations, sources);</div><div>  Tool.mapVirtualFile("/esbmc_intrinsics.h", intrinsics);</div><div><br></div><div><b>  for(auto it = clang_headers_name.begin(), it1 = clang_headers_content.begin();</b></div><div><b>      (it != clang_headers_name.end()) && (it1 != clang_headers_content.end());</b></div><div><b>      ++it, ++it1)</b></div><div><b>    Tool.mapVirtualFile(*it, *it1);</b></div></div><div><br></div><div>  Tool.buildASTs(ASTs);<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">As soon as clang 3.8 is released, we'll open source our project that uses this code, so it'll be easier to understand how it's done. I hope this helps for now.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Also, You will need clang 3.8, as this doesn't work on clang 3.7. </div><div class="gmail_extra"><br></div><div class="gmail_extra">Cheers,</div><div class="gmail_extra"><br><div class="gmail_quote">2016-02-26 15:08 GMT+00:00 Jacob Carlborg via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span>On 2016-02-26 14:06, Pedro Delgado Perez via cfe-dev wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Sorry about the format of the previous message. I write it again here.<br>
<br>
<br>
Sorry, Jacob, no idea on how to use your solution in my code. Manuel,<br>
nothing is written in your message I think...<br>
My code is something like this:<br>
<br>
static cl::OptionCategory MyToolCategory("My tool options");<br>
<br>
  int main(int argc, const char **argv) {<br>
    CommonOptionsParser OptionsParser(argc, argv, MyToolCategory);<br>
    ClangTool Tool(OptionsParser.getCompilations(),<br>
    OptionsParser.getSourcePathList());<br>
    return Tool.run(newFrontendActionFactory<SyntaxOnlyAction>().get());<br>
}<br>
<br>
What I was doing by the moment is to process argv before creating the<br>
object OptionsParser and then include internal Clang headers, but I<br>
guess I can't do that when using Json compilation database. Could you<br>
help me with that? Otherwise, is there a way to ship in the executable<br>
all the necessary headers so that the user does not require to have<br>
clang installed?<br>
</blockquote>
<br></span>
I haven't used the C++ interface, only the C interface. But look at the original post in the thread I linked to [1]. There it seems like "mapVirtualFile" in clang::tooling::ClangTool is used to add a virtual header file. See also the last post by "Mikhail Ramalho". You need to add the path where the virtual file is located as an include path.<br>
<br>
[1] <a href="http://clang-developers.42468.n3.nabble.com/Builtin-headers-td4049705.html" rel="noreferrer" target="_blank">http://clang-developers.42468.n3.nabble.com/Builtin-headers-td4049705.html</a><div><div><br>
<br>
-- <br>
/Jacob Carlborg<br>
<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div><div dir="ltr"><div><br></div><div>Mikhail Ramalho.</div></div></div>
</div></div>