[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