[cfe-dev] default include paths in the frontend

Chandler Carruth chandlerc at google.com
Sun Nov 13 01:17:52 PST 2011


On Sun, Nov 13, 2011 at 12:38 AM, Argyrios Kyrtzidis <akyrtzi at gmail.com>wrote:

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

Aha! I vaguely remember we cribbed this from somewhere, but had forgotten
where. We should probably extend that to fix up the InstalledDir in the
driver...


>
> -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/f0e283d0/attachment.html>


More information about the cfe-dev mailing list