[cfe-users] Redirecting clang tooling errors

2016-08-04 Thread Lucas Soltic via cfe-users
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

2016-08-06 Thread Lucas Soltic via cfe-users
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

2016-08-30 Thread Lucas Soltic via cfe-users
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