[cfe-dev] default include paths in the frontend

Argyrios Kyrtzidis akyrtzi at gmail.com
Sun Nov 13 00:38:48 PST 2011


Isn't this what "createInvocationFromCommandLine" in Frontend/Utils.h does ?

-Argyrios

On Nov 12, 2011, at 1:49 AM, Chandler Carruth wrote:

> On Sat, Nov 12, 2011 at 1:23 AM, Sven Verdoolaege <skimo-cfe at kotnet.org> wrote:
> Let's assume I want to avoid a subprocess.
> Maybe there is no need, but that's how I'm doing it now.
> 
> Entirely reasonable...
> 
> > I can sketch out the code to do this if it helps
> 
> If it's not too much trouble for you, then I would appreciate
> such a sketch.  It may also help others.
> 
> It looks something like the following. I've editted this down heavily from some real code we've used, but I've not even compiled it (as you can tell) so its very pseudo-code-ish... lemme know if you need something more concrete, but hopefully this is enough to get you started:
> 
> /// \brief Retrieves the clang CC1 specific flags out of the compilation's jobs.
> /// Returns NULL on error.
> static const clang::driver::ArgStringList *GetCC1Arguments(
>     clang::DiagnosticsEngine *Diagnostics,
>     clang::driver::Compilation *Compilation) {
>   // We expect to get back exactly one Command job, if we didn't something
>   // failed. Extract that job from the Compilation.
>   const clang::driver::JobList &Jobs = Compilation->getJobs();
>   if (Jobs.size() != 1 || !isa<clang::driver::Command>(*Jobs.begin())) {
>     // diagnose this...
>     return NULL;
>   }
> 
>   // The one job we find should be to invoke clang again.
>   const clang::driver::Command *Cmd = cast<clang::driver::Command>(*Jobs.begin());
>   if (llvm::StringRef(Cmd->getCreator().getName()) != "clang") {
>     // diagnose this...
>     return NULL;
>   }
> 
>   return &Cmd->getArguments();
> }
> 
> const std::vector<char*> Argv = ...; // get this from somewhere...
> const char *const BinaryName = Argv[0];
> DiagnosticOptions DefaultDiagnosticOptions;
> TextDiagnosticPrinter DiagnosticPrinter(
>     llvm::errs(), DefaultDiagnosticOptions);
> DiagnosticsEngine Diagnostics(llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs>(
>     new DiagnosticIDs()), &DiagnosticPrinter, false);
> 
> clang::driver::Driver Driver(..., Diagnostics);
> const llvm::OwningPtr<clang::driver::Compilation> Compilation(
>     Driver.BuildCompilation(llvm::ArrayRef<const char*>(
>         &Argv[0], Argv.size() - 1)));
> const clang::driver::ArgStringList *const CC1Args = GetCC1Arguments(
>     &Diagnostics, Compilation.get());
> if (CC1Args == NULL) {
>   return false;
> }
> llvm::OwningPtr<clang::CompilerInvocation> Invocation(
>     new clang::CompilerInvocation);
>   clang::CompilerInvocation::CreateFromArgs(
>       *Invocation, CC1Args->data() + 1, CC1Args->data() + CC1Args->size(),
>       Diagnostics);
>   Invocation->getFrontendOpts().DisableFree = false;
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20111113/aa479697/attachment.html>


More information about the cfe-dev mailing list