[cfe-users] Redirecting clang tooling errors
Hello, I am trying to redirect the output emitted when running a tool through clang::tooling::runToolOnCode() to a buffer or string instead of stderr (llvm::errs()). I'm using clangTooling from release 3.9. When looking at clangTooling code and following the execution flow, I have found the following: clang::tooling::runToolOnCode() calls clang::tooling::runToolOnCodeWithArgs() which calls clang::tooling::ToolInvocation::run() which contains the following : TextDiagnosticPrinter DiagnosticPrinter(llvm::errs(), &*DiagOpts); DiagnosticsEngine Diagnostics( IntrusiveRefCntPtr(new DiagnosticIDs()), &*DiagOpts, DiagConsumer ? DiagConsumer : &DiagnosticPrinter, false); So at this point I guess I'm stuck because everything is redirected to stderr… Did I miss something or is there really this limitation? I also thought of redirecting stderr to somewhere else but… I can't see how it will fit my needs as in the end I want to call clang::tooling::runToolOnCode() on different files in parallel, all of it in the same process ; so I'll get stderr mixed with output from several executions. The best solution would obviously being able to provide the DiagnosticConsumer but at the moment everything looks hardcoded. Best regards, L. Soltic ___ cfe-users mailing list cfe-users@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users
Re: [cfe-users] Redirecting clang tooling errors
Considering that there is no other viable possibility, for now I have gone with the following: using llvm::Twine; using llvm::SmallString; using llvm::IntrusiveRefCntPtr; using llvm::MemoryBuffer; using clang::FileManager; using clang::PCHContainerOperations; using clang::FileSystemOptions; using clang::tooling::ToolInvocation; using clang::tooling::FileContentMappings; static std::vector getSyntaxOnlyToolArgs(const Twine &ToolName, const std::vector &ExtraArgs, StringRef FileName) { std::vector Args; Args.push_back(ToolName.str()); Args.push_back("-fsyntax-only"); Args.insert(Args.end(), ExtraArgs.begin(), ExtraArgs.end()); Args.push_back(FileName.str()); return Args; } bool runToolOnCode(clang::FrontendAction *ToolAction, const Twine &Code, const Twine &FileName, clang::DiagnosticConsumer& diagConsumer) { const std::vector args; const Twine toolName = "clang-tool"; std::shared_ptr PCHContainerOps = std::make_shared(); const FileContentMappings virtualMappedFiles = FileContentMappings(); SmallString<16> fileNameStorage; StringRef fileNameRef = FileName.toNullTerminatedStringRef(fileNameStorage); IntrusiveRefCntPtr OverlayFileSystem = new clang::vfs::OverlayFileSystem(clang::vfs::getRealFileSystem()); IntrusiveRefCntPtr inMemoryFileSystem = new clang::vfs::InMemoryFileSystem; OverlayFileSystem->pushOverlay(inMemoryFileSystem); IntrusiveRefCntPtr files(new FileManager(FileSystemOptions(), OverlayFileSystem)); ToolInvocation invocation(getSyntaxOnlyToolArgs(toolName, args, fileNameRef), ToolAction, files.get(), std::move(PCHContainerOps)); invocation.setDiagnosticConsumer(&diagConsumer); SmallString<1024> codeStorage; inMemoryFileSystem->addFile(fileNameRef, 0, MemoryBuffer::getMemBuffer(Code.toNullTerminatedStringRef(codeStorage))); for (auto &filenameWithContent : virtualMappedFiles) { inMemoryFileSystem->addFile(filenameWithContent.first, 0, MemoryBuffer::getMemBuffer(filenameWithContent.second)); } return invocation.run(); } It is basically a copy & past of runToolOnCode() but with the added parameter for diagnostic consumer. In the end it was not too much code to duplicate thanks to ToolInvocation::setDiagnosticConsumer() already existing. Best regards, L. Soltic > Le 4 août 2016 à 20:55, Lucas Soltic via cfe-users > a écrit : > > Hello, > > I am trying to redirect the output emitted when running a tool through > clang::tooling::runToolOnCode() to a buffer or string instead of stderr > (llvm::errs()). I'm using clangTooling from release 3.9. > > When looking at clangTooling code and following the execution flow, I have > found the following: > clang::tooling::runToolOnCode() > calls clang::tooling::runToolOnCodeWithArgs() > which calls clang::tooling::ToolInvocation::run() > which contains the following : > TextDiagnosticPrinter DiagnosticPrinter(llvm::errs(), &*DiagOpts); > DiagnosticsEngine Diagnostics( > IntrusiveRefCntPtr(new DiagnosticIDs()), &*DiagOpts, > DiagConsumer ? DiagConsumer : &DiagnosticPrinter, false); > > So at this point I guess I'm stuck because everything is redirected to stderr… > Did I miss something or is there really this limitation? > > I also thought of redirecting stderr to somewhere else but… I can't see how > it will fit my needs as in the end I want to call > clang::tooling::runToolOnCode() on different files in parallel, all of it in > the same process ; so I'll get stderr mixed with output from several > executions. The best solution would obviously being able to provide the > DiagnosticConsumer but at the moment everything looks hardcoded. > > > Best regards, > L. Soltic > > ___ > cfe-users mailing list > cfe-users@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users ___ cfe-users mailing list cfe-users@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users
Re: [cfe-users] uniquely identifying names
I don't know which API you're using, but clang::NamedDecl::getQualifiedNameAsString seems to do what you want. > Le 30 août 2016 à 17:40, David Blaikie via cfe-users > a écrit : > > Do you want to identify the same entity across a valid program's various > source files? Across changes to that program? (what changes?) > > If you want to do the former, then producing the mangled name of the entity > is probably what you want. (some part of the ABI code in Clang could give you > that, I would assume - but not sure exactly where) > >> On Tue, Aug 30, 2016 at 2:33 AM folkert wrote: >> Maybe I could expand a name into its full name and use that. >> e.g.: >> >> namespace bla { class myclass { void mymethod() { } } } >> >> then the full name of mymethod would be bla::myclass::mymethod would be >> unique enough to me (including filename). >> Can I somehow get this out of it? >> >> On Fri, Aug 26, 2016 at 03:33:20PM +, David Blaikie wrote: >> > There's no structural identity of code in Clang that I know of - I know >> > someone's building a tool for doing structural similarity for things like >> > plagiarism detection (I think there are some patches on the clang mailing >> > list). >> > >> > But if you only need identity within a single process, the pointer value of >> > the pointer to any AST construct is a unique identity you can use. >> > >> > (line/file/column isn't sufficiently unique - you could have a file that is >> > included under different macro situations and each time it defines a >> > different function, but all those functions would appear to be defined on >> > the same line/file of that included file - or a macro that defines multiple >> > functions - both can be resolved by looking at the more complete location >> > information (including macro locations, etc)) >> > >> > On Fri, Aug 26, 2016 at 5:11 AM folkert via cfe-users < >> > cfe-users@lists.llvm.org> wrote: >> > >> > > Hi, >> > > >> > > The Sun java compiler allows you to (from java) walk the AST and >> > > investigate it. Each token is stored in an object. Each object has a >> > > hash() method which uniquely identifies it. >> > > >> > > Now I was wondering: can I do so with the LLVM tooling as well? I could >> > > of course if I want to identify e.g. a function name just pick the line- >> > > and column number and maybe include the function name itself as well but >> > > that would constantly change when lines are added and/or removed. >> > > >> > > Any suggestions? >> > > >> > > >> > > regards, >> > > >> > > Folkert van Heusden >> > > >> > > -- >> > > - >> > > Phone: +31-6-41278122, PGP-key: 1F28D8AE, www.vanheusden.com >> > > ___ >> > > cfe-users mailing list >> > > cfe-users@lists.llvm.org >> > > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users >> > > >> >> >> Folkert van Heusden >> >> -- >> Always wondered what the latency of your webserver is? Or how much more >> latency you get when you go through a proxy server/tor? The numbers >> tell the tale and with HTTPing you know them! >> http://www.vanheusden.com/httping/ >> --- >> Phone: +31-6-41278122, PGP-key: 1F28D8AE, www.vanheusden.com > ___ > cfe-users mailing list > cfe-users@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users ___ cfe-users mailing list cfe-users@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users