head 1.1;
branch 1.1.1;
access;
symbols
netbsd-11-0-RC4:1.1.1.2
netbsd-11-0-RC3:1.1.1.2
netbsd-11-0-RC2:1.1.1.2
netbsd-11-0-RC1:1.1.1.2
perseant-exfatfs-base-20250801:1.1.1.2
netbsd-11:1.1.1.2.0.10
netbsd-11-base:1.1.1.2
netbsd-10-1-RELEASE:1.1.1.2
perseant-exfatfs-base-20240630:1.1.1.2
perseant-exfatfs:1.1.1.2.0.8
perseant-exfatfs-base:1.1.1.2
netbsd-8-3-RELEASE:1.1.1.1
netbsd-9-4-RELEASE:1.1.1.1
netbsd-10-0-RELEASE:1.1.1.2
netbsd-10-0-RC6:1.1.1.2
netbsd-10-0-RC5:1.1.1.2
netbsd-10-0-RC4:1.1.1.2
netbsd-10-0-RC3:1.1.1.2
netbsd-10-0-RC2:1.1.1.2
netbsd-10-0-RC1:1.1.1.2
netbsd-10:1.1.1.2.0.6
netbsd-10-base:1.1.1.2
netbsd-9-3-RELEASE:1.1.1.1
cjep_sun2x:1.1.1.2.0.4
cjep_sun2x-base:1.1.1.2
cjep_staticlib_x-base1:1.1.1.2
netbsd-9-2-RELEASE:1.1.1.1
cjep_staticlib_x:1.1.1.2.0.2
cjep_staticlib_x-base:1.1.1.2
netbsd-9-1-RELEASE:1.1.1.1
phil-wifi-20200421:1.1.1.2
phil-wifi-20200411:1.1.1.2
phil-wifi-20200406:1.1.1.2
netbsd-8-2-RELEASE:1.1.1.1
netbsd-9-0-RELEASE:1.1.1.1
netbsd-9-0-RC2:1.1.1.1
netbsd-9-0-RC1:1.1.1.1
netbsd-9:1.1.1.1.0.32
netbsd-9-base:1.1.1.1
phil-wifi-20190609:1.1.1.1
netbsd-8-1-RELEASE:1.1.1.1
netbsd-8-1-RC1:1.1.1.1
pgoyette-compat-merge-20190127:1.1.1.1
pgoyette-compat-20190127:1.1.1.1
pgoyette-compat-20190118:1.1.1.1
pgoyette-compat-1226:1.1.1.1
pgoyette-compat-1126:1.1.1.1
pgoyette-compat-1020:1.1.1.1
pgoyette-compat-0930:1.1.1.1
pgoyette-compat-0906:1.1.1.1
netbsd-7-2-RELEASE:1.1.1.1
pgoyette-compat-0728:1.1.1.1
clang-337282:1.1.1.1
netbsd-8-0-RELEASE:1.1.1.1
phil-wifi:1.1.1.1.0.30
phil-wifi-base:1.1.1.1
pgoyette-compat-0625:1.1.1.1
netbsd-8-0-RC2:1.1.1.1
pgoyette-compat-0521:1.1.1.1
pgoyette-compat-0502:1.1.1.1
pgoyette-compat-0422:1.1.1.1
netbsd-8-0-RC1:1.1.1.1
pgoyette-compat-0415:1.1.1.1
pgoyette-compat-0407:1.1.1.1
pgoyette-compat-0330:1.1.1.1
pgoyette-compat-0322:1.1.1.1
pgoyette-compat-0315:1.1.1.1
netbsd-7-1-2-RELEASE:1.1.1.1
pgoyette-compat:1.1.1.1.0.28
pgoyette-compat-base:1.1.1.1
netbsd-7-1-1-RELEASE:1.1.1.1
clang-319952:1.1.1.1
matt-nb8-mediatek:1.1.1.1.0.26
matt-nb8-mediatek-base:1.1.1.1
clang-309604:1.1.1.1
perseant-stdc-iso10646:1.1.1.1.0.24
perseant-stdc-iso10646-base:1.1.1.1
netbsd-8:1.1.1.1.0.22
netbsd-8-base:1.1.1.1
prg-localcount2-base3:1.1.1.1
prg-localcount2-base2:1.1.1.1
prg-localcount2-base1:1.1.1.1
prg-localcount2:1.1.1.1.0.20
prg-localcount2-base:1.1.1.1
pgoyette-localcount-20170426:1.1.1.1
bouyer-socketcan-base1:1.1.1.1
pgoyette-localcount-20170320:1.1.1.1
netbsd-7-1:1.1.1.1.0.18
netbsd-7-1-RELEASE:1.1.1.1
netbsd-7-1-RC2:1.1.1.1
clang-294123:1.1.1.1
netbsd-7-nhusb-base-20170116:1.1.1.1
bouyer-socketcan:1.1.1.1.0.16
bouyer-socketcan-base:1.1.1.1
clang-291444:1.1.1.1
pgoyette-localcount-20170107:1.1.1.1
netbsd-7-1-RC1:1.1.1.1
pgoyette-localcount-20161104:1.1.1.1
netbsd-7-0-2-RELEASE:1.1.1.1
localcount-20160914:1.1.1.1
netbsd-7-nhusb:1.1.1.1.0.14
netbsd-7-nhusb-base:1.1.1.1
clang-280599:1.1.1.1
pgoyette-localcount-20160806:1.1.1.1
pgoyette-localcount-20160726:1.1.1.1
pgoyette-localcount:1.1.1.1.0.12
pgoyette-localcount-base:1.1.1.1
netbsd-7-0-1-RELEASE:1.1.1.1
clang-261930:1.1.1.1
netbsd-7-0:1.1.1.1.0.10
netbsd-7-0-RELEASE:1.1.1.1
netbsd-7-0-RC3:1.1.1.1
netbsd-7-0-RC2:1.1.1.1
netbsd-7-0-RC1:1.1.1.1
clang-237755:1.1.1.1
clang-232565:1.1.1.1
clang-227398:1.1.1.1
tls-maxphys-base:1.1.1.1
tls-maxphys:1.1.1.1.0.8
netbsd-7:1.1.1.1.0.6
netbsd-7-base:1.1.1.1
clang-215315:1.1.1.1
clang-209886:1.1.1.1
yamt-pagecache:1.1.1.1.0.4
yamt-pagecache-base9:1.1.1.1
tls-earlyentropy:1.1.1.1.0.2
tls-earlyentropy-base:1.1.1.1
riastradh-xf86-video-intel-2-7-1-pre-2-21-15:1.1.1.1
riastradh-drm2-base3:1.1.1.1
clang-202566:1.1.1.1
clang-201163:1.1.1.1
clang-199312:1.1.1.1
clang-198450:1.1.1.1
clang-196603:1.1.1.1
clang-195771:1.1.1.1
LLVM:1.1.1;
locks; strict;
comment @# @;
1.1
date 2013.11.28.14.14.47; author joerg; state Exp;
branches
1.1.1.1;
next ;
commitid ow8OybrawrB1f3fx;
1.1.1.1
date 2013.11.28.14.14.47; author joerg; state Exp;
branches
1.1.1.1.4.1
1.1.1.1.8.1
1.1.1.1.30.1;
next 1.1.1.2;
commitid ow8OybrawrB1f3fx;
1.1.1.2
date 2019.11.13.22.19.10; author joerg; state dead;
branches;
next ;
commitid QD8YATxuNG34YJKB;
1.1.1.1.4.1
date 2013.11.28.14.14.47; author yamt; state dead;
branches;
next 1.1.1.1.4.2;
commitid WSrDtL5nYAUyiyBx;
1.1.1.1.4.2
date 2014.05.22.16.18.19; author yamt; state Exp;
branches;
next ;
commitid WSrDtL5nYAUyiyBx;
1.1.1.1.8.1
date 2013.11.28.14.14.47; author tls; state dead;
branches;
next 1.1.1.1.8.2;
commitid jTnpym9Qu0o4R1Nx;
1.1.1.1.8.2
date 2014.08.19.23.47.19; author tls; state Exp;
branches;
next ;
commitid jTnpym9Qu0o4R1Nx;
1.1.1.1.30.1
date 2020.04.13.07.46.20; author martin; state dead;
branches;
next ;
commitid X01YhRUPVUDaec4C;
desc
@@
1.1
log
@Initial revision
@
text
@=============================
Introduction to the Clang AST
=============================
This document gives a gentle introduction to the mysteries of the Clang
AST. It is targeted at developers who either want to contribute to
Clang, or use tools that work based on Clang's AST, like the AST
matchers.
.. raw:: html
`Slides `_
Introduction
============
Clang's AST is different from ASTs produced by some other compilers in
that it closely resembles both the written C++ code and the C++
standard. For example, parenthesis expressions and compile time
constants are available in an unreduced form in the AST. This makes
Clang's AST a good fit for refactoring tools.
Documentation for all Clang AST nodes is available via the generated
`Doxygen `_. The doxygen online
documentation is also indexed by your favorite search engine, which will
make a search for clang and the AST node's class name usually turn up
the doxygen of the class you're looking for (for example, search for:
clang ParenExpr).
Examining the AST
=================
A good way to familarize yourself with the Clang AST is to actually look
at it on some simple example code. Clang has a builtin AST-dump mode,
which can be enabled with the flag ``-ast-dump``.
Let's look at a simple example AST:
::
$ cat test.cc
int f(int x) {
int result = (x / 42);
return result;
}
# Clang by default is a frontend for many tools; -Xclang is used to pass
# options directly to the C++ frontend.
$ clang -Xclang -ast-dump -fsyntax-only test.cc
TranslationUnitDecl 0x5aea0d0 <>
... cutting out internal declarations of clang ...
`-FunctionDecl 0x5aeab50 f 'int (int)'
|-ParmVarDecl 0x5aeaa90 x 'int'
`-CompoundStmt 0x5aead88
|-DeclStmt 0x5aead10
| `-VarDecl 0x5aeac10 result 'int'
| `-ParenExpr 0x5aeacf0 'int'
| `-BinaryOperator 0x5aeacc8 'int' '/'
| |-ImplicitCastExpr 0x5aeacb0 'int'
| | `-DeclRefExpr 0x5aeac68 'int' lvalue ParmVar 0x5aeaa90 'x' 'int'
| `-IntegerLiteral 0x5aeac90 'int' 42
`-ReturnStmt 0x5aead68
`-ImplicitCastExpr 0x5aead50 'int'
`-DeclRefExpr 0x5aead28 'int' lvalue Var 0x5aeac10 'result' 'int'
The toplevel declaration in
a translation unit is always the `translation unit
declaration `_.
In this example, our first user written declaration is the `function
declaration `_
of "``f``". The body of "``f``" is a `compound
statement `_,
whose child nodes are a `declaration
statement `_
that declares our result variable, and the `return
statement `_.
AST Context
===========
All information about the AST for a translation unit is bundled up in
the class
`ASTContext `_.
It allows traversal of the whole translation unit starting from
`getTranslationUnitDecl `_,
or to access Clang's `table of
identifiers `_
for the parsed translation unit.
AST Nodes
=========
Clang's AST nodes are modeled on a class hierarchy that does not have a
common ancestor. Instead, there are multiple larger hierarchies for
basic node types like
`Decl `_ and
`Stmt `_. Many
important AST nodes derive from
`Type `_,
`Decl `_,
`DeclContext `_
or `Stmt `_, with
some classes deriving from both Decl and DeclContext.
There are also a multitude of nodes in the AST that are not part of a
larger hierarchy, and are only reachable from specific other nodes, like
`CXXBaseSpecifier `_.
Thus, to traverse the full AST, one starts from the
`TranslationUnitDecl `_
and then recursively traverses everything that can be reached from that
node - this information has to be encoded for each specific node type.
This algorithm is encoded in the
`RecursiveASTVisitor `_.
See the `RecursiveASTVisitor
tutorial `_.
The two most basic nodes in the Clang AST are statements
(`Stmt `_) and
declarations
(`Decl `_). Note
that expressions
(`Expr `_) are
also statements in Clang's AST.
@
1.1.1.1
log
@Import Clang 3.4rc1 r195771.
@
text
@@
1.1.1.1.30.1
log
@Mostly merge changes from HEAD upto 20200411
@
text
@@
1.1.1.2
log
@Mark old LLVM instance as dead.
@
text
@@
1.1.1.1.8.1
log
@file IntroductionToTheClangAST.rst was added on branch tls-maxphys on 2014-08-19 23:47:19 +0000
@
text
@d1 126
@
1.1.1.1.8.2
log
@Rebase to HEAD as of a few days ago.
@
text
@a0 126
=============================
Introduction to the Clang AST
=============================
This document gives a gentle introduction to the mysteries of the Clang
AST. It is targeted at developers who either want to contribute to
Clang, or use tools that work based on Clang's AST, like the AST
matchers.
.. raw:: html
`Slides `_
Introduction
============
Clang's AST is different from ASTs produced by some other compilers in
that it closely resembles both the written C++ code and the C++
standard. For example, parenthesis expressions and compile time
constants are available in an unreduced form in the AST. This makes
Clang's AST a good fit for refactoring tools.
Documentation for all Clang AST nodes is available via the generated
`Doxygen `_. The doxygen online
documentation is also indexed by your favorite search engine, which will
make a search for clang and the AST node's class name usually turn up
the doxygen of the class you're looking for (for example, search for:
clang ParenExpr).
Examining the AST
=================
A good way to familarize yourself with the Clang AST is to actually look
at it on some simple example code. Clang has a builtin AST-dump mode,
which can be enabled with the flag ``-ast-dump``.
Let's look at a simple example AST:
::
$ cat test.cc
int f(int x) {
int result = (x / 42);
return result;
}
# Clang by default is a frontend for many tools; -Xclang is used to pass
# options directly to the C++ frontend.
$ clang -Xclang -ast-dump -fsyntax-only test.cc
TranslationUnitDecl 0x5aea0d0 <>
... cutting out internal declarations of clang ...
`-FunctionDecl 0x5aeab50 f 'int (int)'
|-ParmVarDecl 0x5aeaa90 x 'int'
`-CompoundStmt 0x5aead88
|-DeclStmt 0x5aead10
| `-VarDecl 0x5aeac10 result 'int'
| `-ParenExpr 0x5aeacf0 'int'
| `-BinaryOperator 0x5aeacc8 'int' '/'
| |-ImplicitCastExpr 0x5aeacb0 'int'
| | `-DeclRefExpr 0x5aeac68 'int' lvalue ParmVar 0x5aeaa90 'x' 'int'
| `-IntegerLiteral 0x5aeac90 'int' 42
`-ReturnStmt 0x5aead68
`-ImplicitCastExpr 0x5aead50 'int'
`-DeclRefExpr 0x5aead28 'int' lvalue Var 0x5aeac10 'result' 'int'
The toplevel declaration in
a translation unit is always the `translation unit
declaration `_.
In this example, our first user written declaration is the `function
declaration `_
of "``f``". The body of "``f``" is a `compound
statement `_,
whose child nodes are a `declaration
statement `_
that declares our result variable, and the `return
statement `_.
AST Context
===========
All information about the AST for a translation unit is bundled up in
the class
`ASTContext `_.
It allows traversal of the whole translation unit starting from
`getTranslationUnitDecl `_,
or to access Clang's `table of
identifiers `_
for the parsed translation unit.
AST Nodes
=========
Clang's AST nodes are modeled on a class hierarchy that does not have a
common ancestor. Instead, there are multiple larger hierarchies for
basic node types like
`Decl `_ and
`Stmt `_. Many
important AST nodes derive from
`Type `_,
`Decl `_,
`DeclContext `_
or `Stmt `_, with
some classes deriving from both Decl and DeclContext.
There are also a multitude of nodes in the AST that are not part of a
larger hierarchy, and are only reachable from specific other nodes, like
`CXXBaseSpecifier `_.
Thus, to traverse the full AST, one starts from the
`TranslationUnitDecl `_
and then recursively traverses everything that can be reached from that
node - this information has to be encoded for each specific node type.
This algorithm is encoded in the
`RecursiveASTVisitor `_.
See the `RecursiveASTVisitor
tutorial `_.
The two most basic nodes in the Clang AST are statements
(`Stmt `_) and
declarations
(`Decl `_). Note
that expressions
(`Expr `_) are
also statements in Clang's AST.
@
1.1.1.1.4.1
log
@file IntroductionToTheClangAST.rst was added on branch yamt-pagecache on 2014-05-22 16:18:19 +0000
@
text
@d1 126
@
1.1.1.1.4.2
log
@sync with head.
for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.
this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
@
text
@a0 126
=============================
Introduction to the Clang AST
=============================
This document gives a gentle introduction to the mysteries of the Clang
AST. It is targeted at developers who either want to contribute to
Clang, or use tools that work based on Clang's AST, like the AST
matchers.
.. raw:: html
`Slides `_
Introduction
============
Clang's AST is different from ASTs produced by some other compilers in
that it closely resembles both the written C++ code and the C++
standard. For example, parenthesis expressions and compile time
constants are available in an unreduced form in the AST. This makes
Clang's AST a good fit for refactoring tools.
Documentation for all Clang AST nodes is available via the generated
`Doxygen `_. The doxygen online
documentation is also indexed by your favorite search engine, which will
make a search for clang and the AST node's class name usually turn up
the doxygen of the class you're looking for (for example, search for:
clang ParenExpr).
Examining the AST
=================
A good way to familarize yourself with the Clang AST is to actually look
at it on some simple example code. Clang has a builtin AST-dump mode,
which can be enabled with the flag ``-ast-dump``.
Let's look at a simple example AST:
::
$ cat test.cc
int f(int x) {
int result = (x / 42);
return result;
}
# Clang by default is a frontend for many tools; -Xclang is used to pass
# options directly to the C++ frontend.
$ clang -Xclang -ast-dump -fsyntax-only test.cc
TranslationUnitDecl 0x5aea0d0 <>
... cutting out internal declarations of clang ...
`-FunctionDecl 0x5aeab50 f 'int (int)'
|-ParmVarDecl 0x5aeaa90 x 'int'
`-CompoundStmt 0x5aead88
|-DeclStmt 0x5aead10
| `-VarDecl 0x5aeac10 result 'int'
| `-ParenExpr 0x5aeacf0 'int'
| `-BinaryOperator 0x5aeacc8 'int' '/'
| |-ImplicitCastExpr 0x5aeacb0 'int'
| | `-DeclRefExpr 0x5aeac68 'int' lvalue ParmVar 0x5aeaa90 'x' 'int'
| `-IntegerLiteral 0x5aeac90 'int' 42
`-ReturnStmt 0x5aead68
`-ImplicitCastExpr 0x5aead50 'int'
`-DeclRefExpr 0x5aead28 'int' lvalue Var 0x5aeac10 'result' 'int'
The toplevel declaration in
a translation unit is always the `translation unit
declaration `_.
In this example, our first user written declaration is the `function
declaration `_
of "``f``". The body of "``f``" is a `compound
statement `_,
whose child nodes are a `declaration
statement `_
that declares our result variable, and the `return
statement `_.
AST Context
===========
All information about the AST for a translation unit is bundled up in
the class
`ASTContext `_.
It allows traversal of the whole translation unit starting from
`getTranslationUnitDecl `_,
or to access Clang's `table of
identifiers `_
for the parsed translation unit.
AST Nodes
=========
Clang's AST nodes are modeled on a class hierarchy that does not have a
common ancestor. Instead, there are multiple larger hierarchies for
basic node types like
`Decl `_ and
`Stmt `_. Many
important AST nodes derive from
`Type `_,
`Decl `_,
`DeclContext `_
or `Stmt `_, with
some classes deriving from both Decl and DeclContext.
There are also a multitude of nodes in the AST that are not part of a
larger hierarchy, and are only reachable from specific other nodes, like
`CXXBaseSpecifier `_.
Thus, to traverse the full AST, one starts from the
`TranslationUnitDecl `_
and then recursively traverses everything that can be reached from that
node - this information has to be encoded for each specific node type.
This algorithm is encoded in the
`RecursiveASTVisitor `_.
See the `RecursiveASTVisitor
tutorial `_.
The two most basic nodes in the Clang AST are statements
(`Stmt `_) and
declarations
(`Decl `_). Note
that expressions
(`Expr `_) are
also statements in Clang's AST.
@