If Cilk Plus generation (flag -fcilkplus) is enabled, all the Cilk Plus code is transformed into equivalent C and C++ functions. Majority of this transformation occurs toward the end of the parsing and right before the gimplification pass.
These are the major components to the Cilk Plus language extension:
ARRAY_NOTATION_REF
tree using the function
c_parser_array_notation
. During the end of parsing, we check the entire
function to see if there are any array notation specific code (using the
function contains_array_notation_expr
). If this function returns
true, then we expand them using either expand_array_notation_exprs
or
build_array_notation_expr
. For the cases where array notations are
inside conditions, they are transformed using the function
fix_conditional_array_notations
. The C language-specific routines are
located in c/c-array-notation.c and the equivalent C++ routines are in
the file cp/cp-array-notation.c. Common routines such as functions to
initialize built-in functions are stored in array-notation-common.c.
_Cilk_spawn
:
The _Cilk_spawn
keyword is parsed and the function it contains is marked
as a spawning function. The spawning function is called the spawner. At
the end of the parsing phase, appropriate built-in functions are
added to the spawner that are defined in the Cilk runtime. The appropriate
locations of these functions, and the internal structures are detailed in
cilk_init_builtins
in the file cilk-common.c. The pointers to
Cilk functions and fields of internal structures are described
in cilk.h. The built-in functions are described in
cilk-builtins.def.
During gimplification, a new "spawn-helper" function is created.
The spawned function is replaced with a spawn helper function in the spawner.
The spawned function-call is moved into the spawn helper. The main function
that does these transformations is gimplify_cilk_spawn
in
c-family/cilk.c. In the spawn-helper, the gimplification function
gimplify_call_expr
, inserts a function call __cilkrts_detach
.
This function is expanded by builtin_expand_cilk_detach
located in
c-family/cilk.c.
_Cilk_sync
:
_Cilk_sync
is parsed like a keyword. During gimplification,
the function gimplify_cilk_sync
in c-family/cilk.c, will replace
this keyword with a set of functions that are stored in the Cilk runtime.
One of the internal functions inserted during gimplification,
__cilkrts_pop_frame
must be expanded by the compiler and is
done by builtin_expand_cilk_pop_frame
in cilk-common.c.
Documentation about Cilk Plus and language specification is provided under the "Learn" section in http://www.cilkplus.org/. It is worth mentioning that the current implementation follows ABI 1.1.