Is it possible to convert C++ code to C++/CX code via a plugin of clang?

Hello Guys,

I am developing a plugin of clang and hope it can convert some C++ functions to C++/CX wrapper classes for WinRT system. If so, it would do a lot of work automatically.

Now I have been somewhere. Using clang libraries, I could fetch the elements of C++ code for example, return type, function name, parameter list and others. Should I inherit “clang::Decl” to express C++/CX elements like Objective-C does?

I think if I want to output C++/CX code using clang, I should inherit some classes in CodeGen. Should I do this? Or is it possible to be done in a plugin?

Could you help me?

Thank you,
Jeffrey.

CC'ed to clang ML. You can post clang question on clang ML. :slight_smile:

It sounds like your goal is to take C++ code as an input and then to generate C++/CX. If so, you can do this with either a plugin or (better yet) with the tooling infrastructure. The various options are described here:

  http://clang.llvm.org/docs/Tooling.html

Your best bet would be to use Clang as a source-to-source translation from C++ to C++/CX. That way, you don't have to extend Clang to actually represent C++/CX. Rather, you just emit the C++/CX source code (as text) and can hand that off to a C++/CX compiler.

If your actual plan is to parse C++/CX in Clang, that cannot be done with a plugin or with tooling. You would need to write significant extensions to Clang's parser, AST, semantic analysis, and IR generation.

  - Doug

Hello Guys,

I am developing a plugin of clang and hope it can convert some C++ functions to C++/CX wrapper classes for WinRT system. If so, it would do a lot of work automatically.

Now I have been somewhere. Using clang libraries, I could fetch the elements of C++ code for example, return type, function name, parameter list and others. Should I inherit “clang::Decl” to express C++/CX elements like Objective-C does?

I think if I want to output C++/CX code using clang, I should inherit some classes in CodeGen. Should I do this? Or is it possible to be done in a plugin?

Could you help me?

Thank you,
Jeffrey.

Hello Wei-Ren,

Thanks for your tips and could you give me some ideas about this question?

I think I need to make a new AST to describe C++/CX code, then convert each node in C++ AST of clang, using “RecursiveASTVisitor”, to corresponding node of C++/CX’s AST. If so, I think the key is how to build the AST of C++/CX.

What’s your opinion?

Thank you.
Jeffrey.

Sorry, Doug. I'm a newcomer to compiler, so I don't really get your advices.

Did you mean I should print C++/CX code according to the C++ node on AST?
For example,

I am able to fetch class name of C++ through "Visit...", then I need to
check the name using "if (class_name == Class_Name_A) { printf
(source_file_ptr, "Cpp_CX_Class_Name_A\n"); }". Is this what you meant?

Could you please get me much more clear?

Much appreciated.
Jeffrey.