I'm writing a tool that uses clang CompilerInstance and ParseAST to parse and rewrite a source file. What I find quite annoying is that if include paths are missing then the tool outputs an error that it can not find some include file, however the AST is still being built and my tool works just fine. What I would like to do is tell clang to not report an error when an include file is missing and to just parse the AST and let me rewrite the code in just that file.
Is there an example that shows how to do this?
My code is based on the CIrewriter.cpp example from github.https://github.com/loarabia/Clang-tutorial/blob/master/CIrewriter.cpp
Related
Good afternoon. In the clang documentation, I found a way to generate and paste code. So far, I have not used this method for the plugin, but if I understand correctly, it is possible (correct if not right - thanks).
I would like to know if it is possible to change the code at the bytecode level in the plugin, i.e. insert new stmt(clang::Stmt and its derivatives) into existing ones and give them to the compiler?
Pasting code at the source code level (clang::Rewriter) changes the project's source files, so it adds extra work.
Thank you
I'm trying to move a cross-compiled CMake project to Clang Modules to see whether compile time reduction is worth it. However, it seems that Clang is generating lots of duplicate modules in it's ModuleCache.
I'd like to figure out why (maybe some CMake config, etc), so I'm trying to run clang -module-file-info on the generated module files.
However, clang's output is just empty whenever I provide a proper module file. Am I doing anything wrong? Is there anything special that I need to take care of?
The files all have a reasonable size (from a few kB to a few MB), look fine in a Hex editor (start with CPCH, have some recognizable strings, etc) and whenever I specify a wrong file (or a file compiled with a different version of clang) I get the appropriate errors.
I've tried with clang 7.0.1 as well as 8.0.0.
I also tried --verbose but that didn't show any problems either.
To answer my own question:
clang doesn't output the stats on the command line, it puts it into a file by default written in the current directory.
I'd like to convert a CMake-based C++ library to bazel.
As part of the current CMake project, I'm using a libclang-based code generator that parses C++ headers and generates C++ code from the parsed AST. In order to do that, I need the actual compiler flags used to build the cc_library the header is part of. The flags are passed to the code generation tool so it can use clang's preprocessor.
Is there any way I could access the compiler flags used to build a dependency from a skylark- or gen_rule rule? I'm particularly interested in the include paths and defines.
We're working on it. Well, not right now, but will soon. You might want to subscribe to the corresponding issue, and maybe describe your requirements there so we take them into account when designing the API.
What is the best way to get the emitted compilation warnings and errors in a structured format (e.g. XML file, or similar) when using clang?
I'm aware of the command line option --serialize-diagnostics, but the serialized data format is binary and I found no description how to decode it.
My other option would be to write a clang plugin that can emit the warnings and errors by itself into e.g. XML.
What other options I have? Text parsing is not an option for me, I'd need the structured data right from clang.
I'm currently porting a rather big project from C++ Builder 5 to the newest version, C++ Builder XE. It's my first experience with C++ Builder. I'm stuck with an error in a file, but I don't want to include this file anyway (it's code of a component not required anymore). I was not able to find out where and how this file is included, however. The compiler error does not give any hint at all apart from the error itself. How do you usually find out where a file is included?
The preprocessor is perfect for this. Right click on the cpp file which gives you the error in the project manager then choose "preprocess"
The output from this tells you every file and line number in the order they are processed. You can then search for the file in question, and the line above it is the file that included it.
This could conceivably be another header file as well, so it could be a long chain, but you can determine exactly where it comes from.
In the Project Options, enable the compiler's general messages. When the compiler encounters an error, you will be able to see the chain of includes that lead to the erroneous code.
If the files in question are rather sizable, a tool like Doxygen can be helpful in showing you the include dependencies (as well as call paths, etc.).
If it's just once or twice you'll have to do this, David Dean's suggestion of the preprocessor is golden.