How to run a clang's AST using llvm - clang

I have using function ParserAST() to get a AST ,but I don't know how to display the ast on my console(i am using vs 2017). And how can i using llvm to run the ast and get the information about the var value.

Try clang -Xclang -ast-dump -fsyntax-only test.c, if want to print AST.
And,
You cannot run your own AST on llvm. Instead, see LLVM-JIT.

Related

Clang ast-dump missing several statements?

I am trying to do some analysis on Linux kernel source code using clang AST representation. But I found some statements in source are missing in clang AST.
The first picture is a snippet of the kernel source code. As we can see, there are 7 functions in the IfStmt.
Linux Source snippet
The second picture shows the result of clang -Xclang -ast-dump ~/mm/mmap.c, but there are only four functions. Three functions and four statements in yellow boxes are missing in AST representation. result of clang AST
I am running on Ubuntu 18.04, with clang9.0.0. Does anyone know what's going on?

frontend support for MLIR?

Is there any frontend that will generate MLIR (not LLVM) code currently? I am interested in parsing C/C++ or Java code in particular. Does clang support this now? This page doesn't list any at the moment.
As of Oct 2020, compiling C++ into CIL (C intermediate language) mlir dialect is not public yet. But they will be making it available "soon".
This was hinted on this year on LLVM developers meeting (http://llvm.org/devmtg/2020-09/program/) on the following talk:
CIL : Common MLIR Dialect for C/C++ and Fortran - P. NR; V. M; Ranjith; Srihari
In case people are not aware, as an alternative if you just want your C/C++ code in the mlir environment is to compile your program into LLVM with clang -S -fno-discard-value-names -emit-llvm and then later use mlir-translate --import-llvm to transform your .ll file into a .mlir file. But you do lose some higher level information and the opportunity for higher level optimizations.

Compiler: is implicit type conversion considered in parsing or semantic analysis?

In my understanding implicit conversion is done in semantic analysis, but clang AST command clang -Xclang -ast-dump -fsyntax-only file.cpp produces type conversion information in AST, like these two:
...
`- ImplicitCastExpr 0x7fdc27050558 <col:14> 'int' <LValueToRValue>
...
...
ImplicitCastExpr 0x7f878884c2d0 <col:19> 'unsigned int' <IntegralCast>
...
hence the question.
Implicit type conversion usually occurs in the semantic analysis(more specifically type checking) of a compiler but some can happen in the parsing to make a simpler AST (converting literals to their values directly and so on).
If you look specifcally at the command option you used we see that it means
-fsyntax-only
Run the preprocessor, parser and type checking stages.
https://clang.llvm.org/docs/CommandGuide/clang.html
so we see that we expect type information(which requires implicit conversion) to be outputted.
NOTE: I may be unclear, but type checking is just a stage of semantic analysis.

Clang AST dump doesn't show #defines

I'm dumping the AST of some headers like this:
clang -cc1 -ast-dump -fblocks header.h
However, any #defines on the header are not showing on the dump. Is there a way of adding them?
It's true, #defines are handled by the preprocessor, not the compiler. So you need a preprocessor parser stage. I know of two:
Boost Wave can preprocess the input for you, and/or give you hooks to trigger on macro definitions or uses.
The Clang tool pp-trace uses a Clang library that can do callbacks on many preprocessor events, including macro definitions.

Parsing an OCaml file with OCaml

I want to analysis OCaml files (.ml) using OCaml. I want to break the files into Abstract Syntax Trees for analysis. I have attempted to use camlp4 but have had no luck. Has anyone else successfully done this before? Is this the best way to parse an OCaml file?
(I assume you know basic parts of OCaml already: how to write OCaml code, how to link modules and libraries, how to write build scripts and so on. If you do not, learn them first.)
The best way is to use the genuine OCaml code parser used in OCaml compiler itself, since it is 100% compatible by definition.
CamlP4 also implements OCaml parser but it is slightly incompatible with the genuine parser and the parse tree is somewhat specialized for writing syntax extensions: not very good for any other kind of analysis.
You may want to parse .ml files with syntax extensions using P4. Even in this case, you should stick to the genuine parser: you can desugar the source code by P4 then send the result to your analyzer with the genuine parser.
To use OCaml compiler's parser, the easiest approach is to use compiler-libs.common OCamlFind package. It contains the parser and type checker of OCaml compiler.
Start from modifying driver/compile.ml of OCaml compiler source, it implements the major compilation phases: calling preprocessor, parse, typing then code generation. To parse .ml files you should modify (or simplify) Compile.implementation. For .mli files Compile.interface.
Good luck.
Couldn't you use the -dparsetree option to the ocaml compiler?
hello.ml:
let _ = print_endline "Hello AST"
Now compile it:
$ ocamlc -dparsetree hello.ml
Which results in:
[
structure_item (hello.ml[1,0+0]..[1,0+33])
Pstr_eval
expression (hello.ml[1,0+8]..[1,0+33])
Pexp_apply
expression (hello.ml[1,0+8]..[1,0+21])
Pexp_ident "print_endline" (hello.ml[1,0+8]..[1,0+21])
[
<label> ""
expression (hello.ml[1,0+22]..[1,0+33])
Pexp_constant Const_string("Hello AST",None)
]
]
See also this blog post on -ppx extensions which has some info on extension point syntax extensions (the new way of writing syntax extensions in OCaml 4.02). There is info there on various AST manipulation modules.

Resources