Changes in / [33218c6:e0a653d]


Ignore:
Files:
29 added
8 deleted
180 edited

Legend:

Unmodified
Added
Removed
  • configure

    r33218c6 re0a653d  
    34713471        case $host_cpu in
    34723472                i386)
    3473                         CFLAGS+=" -m32 "
    3474                         CXXFLAGS+=" -m32 "
    3475                         CFAFLAGS+=" -m32 "
    3476                         LDFLAGS+=" -m32 "
     3473                        CFLAGS+="-m32"
     3474                        CXXFLAGS+="-m32"
     3475                        CFAFLAGS+="-m32"
     3476                        LDFLAGS+="-m32"
    34773477                        ;;
    34783478                i686)
    3479                         CFLAGS+=" -m32 "
    3480                   CXXFLAGS+=" -m32 "
    3481                   CFAFLAGS+=" -m32 "
    3482                   LDFLAGS+=" -m32 "
     3479                        CFLAGS+="-m32"
     3480                        CXXFLAGS+="-m32"
     3481                        CFAFLAGS+="-m32"
     3482                        LDFLAGS+="-m32"
    34833483                        ;;
    34843484                x86_64)
    3485                         CFLAGS+=" -m64 "
    3486                         CXXFLAGS+=" -m64 "
    3487                         CFAFLAGS+=" -m64 "
    3488                         LDFLAGS+=" -m64 "
     3485                        CFLAGS+="-m64"
     3486                        CXXFLAGS+="-m64"
     3487                        CFAFLAGS+="-m64"
     3488                        LDFLAGS+="-m64"
    34893489                        ;;
    34903490        esac
  • configure.ac

    r33218c6 re0a653d  
    167167AC_SUBST([MACHINE_TYPE],[$host_cpu])
    168168
    169 if ! test "$host_cpu" = "$build_cpu"; then
     169if ! test "$host_cpu" = "$build_cpu"; then 
    170170        case $host_cpu in
    171171                i386)
    172                         CFLAGS+=" -m32 "
    173                         CXXFLAGS+=" -m32 "
    174                         CFAFLAGS+=" -m32 "
    175                         LDFLAGS+=" -m32 "
     172                        CFLAGS+="-m32"
     173                        CXXFLAGS+="-m32"
     174                        CFAFLAGS+="-m32"
     175                        LDFLAGS+="-m32"
    176176                        ;;
    177177                i686)
    178                         CFLAGS+=" -m32 "
    179                   CXXFLAGS+=" -m32 "
    180                   CFAFLAGS+=" -m32 "
    181                   LDFLAGS+=" -m32 "
     178                        CFLAGS+="-m32"
     179                        CXXFLAGS+="-m32"
     180                        CFAFLAGS+="-m32"
     181                        LDFLAGS+="-m32"
    182182                        ;;
    183183                x86_64)
    184                         CFLAGS+=" -m64 "
    185                         CXXFLAGS+=" -m64 "
    186                         CFAFLAGS+=" -m64 "
    187                         LDFLAGS+=" -m64 "
     184                        CFLAGS+="-m64"
     185                        CXXFLAGS+="-m64"
     186                        CFAFLAGS+="-m64"
     187                        LDFLAGS+="-m64"
    188188                        ;;
    189189        esac
  • doc/LaTeXmacros/common.tex

    r33218c6 re0a653d  
    1111%% Created On       : Sat Apr  9 10:06:17 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Mon Jul 17 10:21:17 2017
    14 %% Update Count     : 348
     13%% Last Modified On : Sun Jun 18 20:32:32 2017
     14%% Update Count     : 319
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    3636% Names used in the document.
    3737
    38 \newcommand{\CFAIcon}{\textsf{C}\raisebox{\depth}{\rotatebox{180}{\textsf{A}}}\xspace} % Cforall symbolic name
     38\newcommand{\CFAIcon}{\textrm{C}\raisebox{\depth}{\rotatebox{180}{\textsf{A}}}\xspace} % Cforall symbolic name
    3939\newcommand{\CFA}{\protect\CFAIcon} % safe for section/caption
    4040\newcommand{\CFL}{\textrm{Cforall}\xspace} % Cforall symbolic name
     
    5555\setlength{\parindentlnth}{\parindent}
    5656
    57 \newcommand{\LstKeywordStyle}[1]{{\lst@basicstyle{\lst@keywordstyle{#1}}}}
    58 \newcommand{\LstCommentStyle}[1]{{\lst@basicstyle{\lst@commentstyle{#1}}}}
    59 
    6057\newlength{\gcolumnposn}                                % temporary hack because lstlisting does not handle tabs correctly
    6158\newlength{\columnposn}
    6259\setlength{\gcolumnposn}{2.5in}
    6360\setlength{\columnposn}{\gcolumnposn}
    64 \newcommand{\C}[2][\@empty]{\ifx#1\@empty\else\global\setlength{\columnposn}{#1}\global\columnposn=\columnposn\fi\hfill\makebox[\textwidth-\columnposn][l]{\lst@basicstyle{\LstCommentStyle{#2}}}}
     61\newcommand{\C}[2][\@empty]{\ifx#1\@empty\else\global\setlength{\columnposn}{#1}\global\columnposn=\columnposn\fi\hfill\makebox[\textwidth-\columnposn][l]{\lst@commentstyle{#2}}}
    6562\newcommand{\CRT}{\global\columnposn=\gcolumnposn}
    6663
     
    134131
    135132% inline text and code index (cannot use ©)
    136 \newcommand{\Indexc}[2][\@empty]{\lstinline[#1]$#2$\index{#2@\lstinline[#1]$#2$}}
     133\newcommand{\Indexc}[1]{\lstinline$#1$\index{#1@\lstinline$#1$}}
    137134% code index (cannot use ©)
    138 \newcommand{\indexc}[2][\@empty]{\index{#2@\lstinline[#1]$#2$}}
     135\newcommand{\indexc}[1]{\index{#1@\lstinline$#1$}}
    139136
    140137% Denote newterms in particular font and index them without particular font and in lowercase, e.g., \newterm{abc}.
     
    234231basicstyle=\linespread{0.9}\sf,                                                 % reduce line spacing and use sanserif font
    235232stringstyle=\tt,                                                                                % use typewriter font
    236 tabsize=6,                                                                                              % N space tabbing
     233tabsize=4,                                                                                              % 4 space tabbing
    237234xleftmargin=\parindentlnth,                                                             % indent code to paragraph indentation
    238235extendedchars=true,                                                                             % allow ASCII characters in the range 128-255
  • doc/LaTeXmacros/lstlang.sty

    r33218c6 re0a653d  
    88%% Created On       : Sat May 13 16:34:42 2017
    99%% Last Modified By : Peter A. Buhr
    10 %% Last Modified On : Wed Jul 12 22:42:09 2017
    11 %% Update Count     : 12
     10%% Last Modified On : Thu Jun 22 07:40:31 2017
     11%% Update Count     : 10
    1212%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1313
     
    112112                finally, forall, ftype, _Generic, _Imaginary, inline, __label__, lvalue, _Noreturn, one_t,
    113113                otype, restrict, _Static_assert, throw, throwResume, trait, try, ttype, typeof, __typeof,
    114                 __typeof__, with, zero_t},
     114                __typeof__, zero_t},
    115115        morekeywords=[2]{
    116116                _Atomic, coroutine, is_coroutine, is_monitor, is_thread, monitor, mutex, nomutex,
     
    118118        moredirectives={defined,include_next}%
    119119}
    120 
    121 % C++ programming language
    122 \lstdefinelanguage{C++}[ANSI]{C++}{}
    123120
    124121% uC++ programming language, based on ANSI C++
  • doc/bibliography/cfa.bib

    r33218c6 re0a653d  
    22732273@manual{JavaScript,
    22742274    keywords    = {JavaScript},
    2275     contributer = {pabuhr@plg},
     2275    contributer = {pabuhr},
    22762276    title       = {ECMAScript 2015 Language Specification {JavaScript}},
    22772277    organization= {ECAM International},
     
    24462446@manual{Erlang,
    24472447    keywords    = {Erlang},
    2448     contributer = {pabuhr@plg},
     2448    contributer = {pabuhr},
    24492449    title       = {Erlang Reference Manual User's Guide, Vertion 7.0},
    24502450    organization= {Erlang/OTP System Documentation},
     
    27712771    publisher   = {ACM},
    27722772    address     = {New York, NY, USA},
    2773 }
    2774 
    2775 @article{Yang95,
    2776     keywords    = {software solutions, N-thread, mutual exclusions},
    2777     contributer = {pabuhr@plg},
    2778     author      = {Jae-Heon Yang and James H. Anderson},
    2779     title       = {A Fast, Scalable Mutual Exclusion Algorithm},
    2780     journal     = {Distributed Computing},
    2781     publisher   = {Springer-Verlag},
    2782     volume      = {9},
    2783     number      = {1},
    2784     year        = {1995},
    2785     pages       = {51-60},
    27862773}
    27872774
     
    50655052    contributer = {pabuhr@plg},
    50665053    author      = {Kathleen Jensen and Niklaus Wirth},
    5067     title       = {{P}ascal User Manual and Report, ISO Pascal Standard},
     5054    title       = {{P}ascal User Manual and Report},
    50685055    publisher   = {Springer--Verlag},
    5069     year        = 1991,
    5070     edition     = {4th},
    5071     note        = {Revised by Andrew B. Mickel and James F. Miner}
     5056    year        = 1985,
     5057    edition     = {3rd},
     5058    note        = {Revised by Andrew B. Mickel and James F. Miner, ISO Pascal Standard}
    50725059}
    50735060
  • doc/proposals/virtual.txt

    r33218c6 re0a653d  
    11Proposal for virtual functionality
    2 
    3 There are two types of virtual inheritance in this proposal, relaxed
    4 (implicit) and strict (explicit). Relaxed is the simpler case that uses the
    5 existing trait system with the addition of trait references and vtables.
    6 Strict adds some constraints and requires some additional notation but allows
    7 for down-casting.
    8 
    9 Relaxed Virtual Inheritance:
    102
    113Imagine the following code :
     
    2820void draw(line*);
    2921
    30 While all the members of this simple UI support drawing, creating a UI that
    31 easily supports both these UI requires some tedious boiler-plate code:
     22While all the members of this simple UI support drawing creating a UI that easily
     23supports both these UI requires some tedious boiler-plate code :
    3224
    3325enum type_t { text, line };
     
    4941}
    5042
    51 While this code will work as implemented, adding any new widgets or any new
    52 widget behaviors requires changing existing code to add the desired
    53 functionality. To ease this maintenance effort required CFA introduces the
    54 concept of trait references.
     43While this code will work as indented, adding any new widgets or any new widget behaviors
     44requires changing existing code to add the desired functionality. To ease this maintenance
     45effort required CFA introduces the concept of dynamic types, in a manner similar to C++.
    5546
    56 Using trait references to implement the above gives the following :
     47A simple usage of dynamic type with the previous example would look like :
    5748
    58 trait drawable objects[10];
     49drawable* objects[10];
    5950fill_objects(objects);
    6051
    6152while(running) {
    62       for(drawable object : objects) {
     53      for(drawable* object : objects) {
    6354            draw(object);
    6455      }
    6556}
    6657
    67 The keyword trait is optional (by the same rules as the struct keyword). This
    68 is not currently supported in CFA and the lookup is not possible to implement
    69 statically. Therefore we need to add a new feature to handle having dynamic
    70 lookups like this.
     58However, this is not currently do-able in the current CFA and furthermore is not
     59possible to implement statically. Therefore we need to add a new feature to handle
     60having dynamic types like this (That is types that are found dynamically not types
     61that change dynamically).
    7162
    72 What we really want to do is express the fact that calling draw() on a trait
    73 reference should find the underlying type of the given parameter and find how
    74 it implements the routine, as in the example with the enumeration and union.
     63C++ uses inheritance and virtual functions to find the
     64desired type dynamically. CFA takes inspiration from this solution.
    7565
    76 For instance specifying that the drawable trait reference looks up the type
    77 of the first argument to find the implementation would be :
     66What we really want to do is express the fact that calling draw() on a object
     67should find the dynamic type of the parameter before calling the routine, much like the
     68hand written example given above. We can express this by adding the virtual keyword on
     69the parameter of the constraints on our trait:
    7870
    7971trait drawable(otype T) {
     
    8173};
    8274
    83 This could be implied in simple cases like this one (single parameter on the
    84 trait and single generic parameter on the function). In more complex cases it
    85 would have to be explicitly given, or a strong convention would have to be
    86 enforced (e.g. implementation of trait functions is always drawn from the
    87 first polymorphic parameter).
     75This expresses the idea that drawable is similar to an abstract base class in C++ and
     76also gives meaning to trying to take a pointer of drawable. That is anything that can
     77be cast to a drawable pointer has the necessary information to call the draw routine on
     78that type. Before that drawable was only a abstract type while now it also points to a
     79piece of storage which specify which behavior the object will have at run time.
    8880
    89 Once a function in a trait has been marked as virtual it defines a new
    90 function that takes in that trait's reference and then dynamically calls the
    91 underlying type implementation. Hence a trait reference becomes a kind of
    92 abstract type, cannot be directly instantiated but can still be used.
     81This storage needs to be allocate somewhere. C++ just adds an invisible pointer at
     82the beginning of the struct but we can do something more explicit for users, actually
     83have a visible special field :
    9384
    94 One of the limitations of this design is that it does not support double
    95 dispatching, which concretely means traits cannot have routines with more than
    96 one virtual parameter. The program must have a single table to look up the
    97 function on. Using trait references with traits with more than one parameter
    98 is also restricted, initially forbidden, see extension.
     85struct text {
     86      char* text;
     87      vtable drawable;
     88};
    9989
    100 Extension: Multi-parameter Virtual Traits:
     90struct line{
     91      vtable drawable;
     92      vec2 start;
     93      vec2 end;
     94};
    10195
    102 This implementation can be extended to traits with multiple parameters if
    103 one is called out as being the virtual trait. For example :
     96With these semantics, adding a "vtable drawable" means that text pointers and line pointers are now
     97convertible to drawable pointers. This conversion will not necessarily be a type only change however, indeed,
     98the drawable pointer will point to the field "vtable drawable" not the head of the struct. However, since all
     99the types are known at compile time, converting pointers becomes a simple offset operations.
    104100
    105 trait iterator(otype T, dtype Item) {
    106         Maybe(Item) next(virtual T *);
     101The vtable field contains a pointer to a vtable which contains all the information needed for the caller
     102to find the function pointer of the desired behavior.
     103
     104One of the limitations of this design is that it does not support double dispatching, which
     105concretely means traits cannot have routines with more than one virtual parameter. This design
     106would have many ambiguities if it did support multiple virtual parameter. A futher limitation is
     107that traits over more than one type cannot have vtables meaningfully defined for them, as the
     108particular vtable to use would be a function of the other type(s) the trait is defined over.
     109
     110It is worth noting that the function pointers in these vtables are bound at object construction, rather than
     111function call-site, as in Cforall's existing polymorphic functions. As such, it is possible that two objects
     112with the same static type would have a different vtable (consider what happens if draw(line*) is overridden
     113between the definitions of two line objects). Given that the virtual drawable* erases static types though,
     114this should not be confusing in practice. A more distressing possibility is that of creating an object that
     115outlives the scope of one of the functions in its vtable. This is certainly a possible bug, but it is of a
     116type that C programmers are familiar with, and should be able to avoid by the usual methods.
     117
     118Extensibility.
     119
     120One of the obvious critics of this implementation is that it lacks extensibility for classes
     121that cannot be modified (ex: Linux C headers). However this solution can be extended to
     122allow more extensibility by adding "Fat pointers".
     123
     124Indeed, users could already "solve" this issue by writing their own fat pointers as such:
     125
     126trait MyContext(otype T) {
     127      void* get_stack(virtual T*)
     128};
     129
     130void* get_stack(ucontext_t *context);
     131
     132struct fat_ucontext_t {
     133      vtable MyContext;
     134      ucontext_t *context;
    107135}
    108136
    109 iterator(int) generators[10];
    110 
    111 Which creates a collection of iterators that produce integers, regardless of
    112 how those iterators are implemented. This may require a note that this trait
    113 is virtual on T and not Item, but noting it on the functions may be enough.
    114 
    115 
    116 Strict Virtual Inheritance:
    117 
    118 One powerful feature relaxed virtual does not support is the idea of down
    119 casting. Once something has been converted into a trait reference there is
    120 very little we can do to recover and of the type information, only the trait's
    121 required function implementations are kept.
    122 
    123 To allow down casting strict virtual requires that all traits and structures
    124 involved be organized into a tree. Each trait or struct must have a unique
    125 position on this tree (no multiple inheritance).
    126 
    127 This is declared as follows :
    128 
    129 trait error(otype T) virtual {
    130         const char * msg(T *);
     137//Tedious forwarding routine
     138void* get_stack(fat_ucontext_t *ptr) {
     139      return get_stack(ptr->context);
    131140}
    132141
    133 trait io_error(otype T) virtual error {
    134         FILE * src(T *);
    135 }
     142However, users would have to write all the virtual methods they want to override and make
     143them all simply forward to the existing method that takes the corresponding POCO(Plain Old C Object).
    136144
    137 struct eof_error virtual io_error {
    138         FILE * fd;
     145The alternative we propose is to use language level fat pointers :
     146
     147trait MyContext(otype T) {
     148      void* get_stack(virtual T*)
    139149};
    140150
    141 So the trait error is the head of a new tree and io_error is a child of it.
     151void* get_stack(ucontext_t *context);
    142152
    143 Also the parent trait is implicitly part of the assertions of the children,
    144 so all children implement the same operations as the parent. By the unique
    145 path down the tree, we can also uniquely order them so that a prefix of a
    146 child's vtable has the same format as its parent's.
     153//The type vptr(ucontext_t) all
     154vptr(ucontext_t) context;
    147155
    148 This gives us an important extra feature, runtime checking of the parent-child
    149 relationship with a C++ dynamic_cast like operation. Allowing checked
    150 conversions from trait references to more particular references, which works
    151 if the underlying type is, or is a child of, the new trait type.
     156These behave exactly as the previous example but all the forwarding routines are automatically generated.
    152157
    153 Extension: Multiple Parents
     158Bikeshedding.
    154159
    155 Although each trait/struct must have a unique position on each tree, it could
    156 have positions on multiple trees. All this requires is the ability to give
    157 multiple parents, as here :
     160It may be desirable to add fewer new keywords than discussed in this proposal; it is possible that "virtual"
     161could replace both "vtable" and "vptr" above with unambiguous contextual meaning. However, for purposes of
     162clarity in the design discussion it is beneficial to keep the keywords for separate concepts distinct.
    158163
    159 trait region(otype T) virtual drawable, collider;
    160 
    161 The restriction being, the parents must come from different trees. This
    162 object (and all of its children) can be cast to either tree. This is handled
    163 by generating a separate vtable for each tree the structure is in.
    164 
    165 Extension: Multi-parameter Strict Virtual
    166 
    167 If a trait has multiple parameters then one must be called out to be the one
    168 we generate separate vtables for, as in :
    169 
    170 trait example(otype T, otype U) virtual(T) ...
    171 
    172 This can generate a separate vtable for each U for which all the T+U
    173 implementations are provided. These are then separate nodes in the tree (or
    174 the root of different trees) as if each was created individually. Providing a
    175 single unique instance of these nodes would be the most difficult aspect of
    176 this extension, possibly intractable, though with sufficient hoisting and
    177 link-once duplication it may be possible.
    178 
    179 Example:
    180 
    181 trait argument(otype T) virtual {
    182         char short_name(virtual T *);
    183         bool is_set(virtual T *);
    184 };
    185 
    186 trait value_argument(otype T, otype U) virtual(T) argument {
    187         U get_value(virtual T *);
    188 };
    189 
    190 Extension: Structural Inheritance
    191 
    192 Currently traits must be the internal nodes and structs the leaf nodes.
    193 Structs could be made internal nodes as well, in which case the child structs
    194 would likely structurally inherit the fields of their parents.
    195 
    196 
    197 Storing the Virtual Lookup Table (vtable):
    198 
    199 We have so far been silent on how the vtable is created, stored and accessed.
    200 
    201 Creation happens at compile time. Function pointers are found by using the
    202 same best match rules as elsewhere (additional rules for defaults from the
    203 parent may or may not be required). For strict virtual this must happen at the
    204 global scope and forbidding static functions, to ensure that a single unique
    205 vtable is created. Similarly, there may have to be stricter matching rules
    206 for the functions that go into the vtable, possibly requiring an exact match.
    207 Relaxed virtual could relax both restrictions, if we allow different vtable
    208 at different conversion (struct to trait reference) sites. If it is allowed
    209 local functions being bound to a vtable could cause issues when they go out
    210 of scope, however this should follow the lifetime rules most C programs
    211 already follow implicitly.
    212 
    213 Most vtables should be stored statically, the only exception being some of
    214 the relaxed vtables that could have local function pointers. These may be able
    215 to be stack allocated. All vtables should be immutable and require no manual
    216 cleanup.
    217 
    218 Access has two main options:
    219 
    220 The first is through the use of fat pointers, or a tuple of pointers. When the
    221 object is converted to a trait reference, the pointers to its vtables are
    222 stored along side it.
    223 
    224 This allows for compatibility with existing structures (such as those imported
    225 from C) and is the default storage method unless a different one is given.
    226 
    227 The other is by inlining the vtable pointer as "intrusive vtables". This adds
    228 a field to the structure to the vtable. The trait reference then has a single
    229 pointer to this field, the vtable includes an offset to find the beginning of
    230 the structure again.
    231 
    232 This is used if you specify a vtable field in the structure. If given in the
    233 trait the vtable pointer in the trait reference can then become a single
    234 pointer to the vtable field and use that to recover the original object
    235 pointer as well as retrieve all operations.
    236 
    237 trait drawable(otype T) {
    238         vtable drawable;
    239 };
    240 
    241 struct line {
    242         vtable drawable;
    243         vec2 start;
    244         vec2 end;
    245 };
    246 
    247 This inline code allows trait references to be converted to plain pointers
    248 (although they still must be called specially). The vtable field may just be
    249 an opaque block of memory or it may allow user access to the vtable. If so
    250 then there should be some way to retrieve the type of the vtable, which will be
    251 autogenerated and often unique.
    252 
    253 
    254 Keyword Usage:
    255 
    256 It may be desirable to add fewer new keywords than discussed in this proposal.
    257 It is possible that "virtual" could replace both "vtable" above with
    258 unambiguous contextual meaning. However, for purposes of clarity in the design
    259 discussion it is beneficial to keep the keywords for separate concepts distinct.
    260 
    261 
    262 Trait References and Operations:
    263 
    264 sizeof(drawable) will return the size of the trait object itself. However :
    265 
    266 line a_line;
    267 drawable widget = a_line;
    268 sizeof(widget);
    269 
    270 Will instead return the sizeof the underlying object, although the trait must
    271 require that its implementation is sized for there to be a meaningful value
    272 to return. You may also get the size of the trait reference with
    273 
    274 sizeof(&widget);
    275 
    276 Calling free on a trait reference will free the memory for the object. It will
    277 leave the vtables alone, as those are (always?) statically allocated.
  • doc/user/EHMHierarchy.fig

    r33218c6 re0a653d  
    1 #FIG 3.2  Produced by xfig version 3.2.5c
     1#FIG 3.2  Produced by xfig version 3.2.5b
    22Landscape
    33Center
     
    19192 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
    2020        1 1 1.00 60.00 90.00
    21          1950 1425 2925 1200
     21         1950 1425 3000 1200
    22222 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
    2323        1 1 1.00 60.00 90.00
     
    2929        1 1 1.00 60.00 90.00
    3030         4950 1950 4950 1725
    31 4 1 0 50 -1 0 13 0.0000 2 135 225 1950 1650 IO\001
    32 4 1 0 50 -1 0 13 0.0000 2 135 915 4950 1650 Arithmetic\001
    33 4 1 0 50 -1 0 13 0.0000 2 150 330 1350 2100 File\001
    34 4 1 0 50 -1 0 13 0.0000 2 135 735 2550 2100 Network\001
    35 4 1 0 50 -1 0 13 0.0000 2 180 1215 3750 2100 DivideByZero\001
    36 4 1 0 50 -1 0 13 0.0000 2 150 810 4950 2100 Overflow\001
    37 4 1 0 50 -1 0 13 0.0000 2 150 915 6000 2100 Underflow\001
    38 4 1 0 50 -1 0 13 0.0000 2 180 855 3450 1200 Exception\001
     314 1 0 100 0 0 12 0.0000 0 135 195 1950 1650 IO\001
     324 1 0 100 0 0 12 0.0000 0 135 870 4950 1650 Arithmetic\001
     334 1 0 100 0 0 12 0.0000 0 135 315 1350 2100 File\001
     344 1 0 100 0 0 12 0.0000 0 135 690 2550 2100 Network\001
     354 1 0 100 0 0 12 0.0000 0 180 1170 3750 2100 DivideByZero\001
     364 1 0 100 0 0 12 0.0000 0 135 750 4950 2100 Overflow\001
     374 1 0 100 0 0 12 0.0000 0 135 855 6000 2100 Underflow\001
     384 1 0 100 0 0 12 0.0000 0 180 840 3450 1200 Exception\001
  • doc/user/Makefile

    r33218c6 re0a653d  
    11## Define the appropriate configuration variables.
    22
    3 TeXLIB = .:../LaTeXmacros:../bibliography/:
     3TeXLIB = .:../LaTeXmacros:../LaTeXmacros/listings:../LaTeXmacros/enumitem:../bibliography/:
    44LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error
    55BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex
  • doc/user/user.tex

    r33218c6 re0a653d  
    1111%% Created On       : Wed Apr  6 14:53:29 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Sat Jul 22 11:01:19 2017
    14 %% Update Count     : 2878
     13%% Last Modified On : Fri Jul  7 10:36:39 2017
     14%% Update Count     : 2547
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    5757\CFAStyle                                                                                               % use default CFA format-style
    5858
    59 \lstnewenvironment{C++}[1][]
    60 {\lstset{language=C++,moredelim=**[is][\protect\color{red}]{®}{®}#1}}
    61 {}
    62 
    6359% inline code ©...© (copyright symbol) emacs: C-q M-)
    6460% red highlighting ®...® (registered trademark symbol) emacs: C-q M-.
     
    141137
    142138\CFA{}\index{cforall@\CFA}\footnote{Pronounced ``\Index*{C-for-all}'', and written \CFA, CFA, or \CFL.} is a modern general-purpose programming-language, designed as an evolutionary step forward for the C programming language.
    143 The syntax of \CFA builds from C and should look immediately familiar to C/\Index*[C++]{\CC{}} programmers.
     139The syntax of the \CFA language builds from C, and should look immediately familiar to C/\Index*[C++]{\CC{}} programmers.
    144140% Any language feature that is not described here can be assumed to be using the standard \Celeven syntax.
    145 \CFA adds many modern programming-language features that directly lead to increased \emph{\Index{safety}} and \emph{\Index{productivity}}, while maintaining interoperability with existing C programs and achieving similar performance.
    146 Like C, \CFA is a statically typed, procedural (non-\Index{object-oriented}) language with a low-overhead runtime, meaning there is no global \Index{garbage-collection}, but \Index{regional garbage-collection}\index{garbage-collection!regional} is possible.
     141\CFA adds many modern programming-language features that directly lead to increased \emph{\Index{safety}} and \emph{\Index{productivity}}, while maintaining interoperability with existing C programs and achieving C performance.
     142Like C, \CFA is a statically typed, procedural language with a low-overhead runtime, meaning there is no global \Index{garbage-collection}, but \Index{regional garbage-collection}\index{garbage-collection!regional} is possible.
    147143The primary new features include parametric-polymorphic routines and types, exceptions, concurrency, and modules.
    148144
    149 One of the main design philosophies of \CFA is to ``\Index{describe not prescribe}'', which means \CFA tries to provide a pathway from low-level C programming to high-level \CFA programming, but it does not force programmers to ``do the right thing''.
    150 Programmers can cautiously add \CFA extensions to their C programs in any order and at any time to incrementally move towards safer, higher-level programming.
    151 A programmer is always free to reach back to C from \CFA, for any reason, and in many cases, new \CFA features can be locally switched back to there C counterpart.
    152 There is no notion or requirement for \emph{rewriting} a legacy C program in \CFA;
    153 instead, a programmer evolves a legacy program into \CFA by incrementally incorporating \CFA features.
    154 As well, new programs can be written in \CFA using a combination of C and \CFA features.
    155 
    156 \Index*[C++]{\CC{}} had a similar goal 30 years ago, allowing object-oriented programming to be incrementally added to C.
    157 However, \CC currently has the disadvantages of a strong object-oriented bias, multiple legacy design-choices that cannot be updated, and active divergence of the language model from C, all of which requires significant effort and training to incrementally add \CC to a C-based project.
     145One of the main design philosophies of \CFA is to ``describe not prescribe'', which means \CFA tries to provide a pathway from low-level C programming to high-level \CFA programming, but it does not force programmers to ``do the right thing''.
     146Programmers can cautiously add \CFA extensions to their C programs in any order and at any time to incrementally move towards safer, higher-level programming features.
     147A programmer is always free to reach back to C from \CFA for any reason, and in many cases, new \CFA features have a fallback to a C mechanism.
     148There is no notion or requirement for rewriting a legacy C program in \CFA;
     149instead, a programmer evolves an existing C program into \CFA by incrementally incorporating \CFA features.
     150New programs can be written in \CFA using a combination of C and \CFA features.
     151\Index*[C++]{\CC{}} had a similar goal 30 years ago, but currently has the disadvantages of multiple legacy design-choices that cannot be updated and active divergence of the language model from C, requiring significant effort and training to incrementally add \CC to a C-based project.
    158152In contrast, \CFA has 30 years of hindsight and a clean starting point.
    159153
     
    162156\begin{quote2}
    163157\begin{tabular}{@{}l@{\hspace{1.5em}}l@{\hspace{1.5em}}l@{}}
    164 \multicolumn{1}{c@{\hspace{1.5em}}}{\textbf{C}} & \multicolumn{1}{c}{\textbf{\CFA}}     & \multicolumn{1}{c}{\textbf{\CC}}      \\
    165 \begin{cfa}
     158\multicolumn{1}{c@{\hspace{1.5em}}}{\textbf{\CFA}}      & \multicolumn{1}{c}{\textbf{C}}        & \multicolumn{1}{c}{\textbf{\CC}}      \\
     159\begin{cfa}
     160#include <fstream>§\indexc{fstream}§
     161
     162int main( void ) {
     163        int x = 0, y = 1, z = 2;
     164        ®sout | x | y | z | endl;®
     165}
     166\end{cfa}
     167&
     168\begin{lstlisting}
    166169#include <stdio.h>§\indexc{stdio.h}§
    167170
     
    170173        ®printf( "%d %d %d\n", x, y, z );®
    171174}
    172 \end{cfa}
     175\end{lstlisting}
    173176&
    174 \begin{cfa}
    175 #include <fstream>§\indexc{fstream}§
    176 
    177 int main( void ) {
    178         int x = 0, y = 1, z = 2;
    179         ®sout | x | y | z | endl;®§\indexc{sout}§
    180 }
    181 \end{cfa}
    182 &
    183 \begin{cfa}
     177\begin{lstlisting}
    184178#include <iostream>§\indexc{iostream}§
    185179using namespace std;
     
    188182        ®cout<<x<<" "<<y<<" "<<z<<endl;®
    189183}
    190 \end{cfa}
     184\end{lstlisting}
    191185\end{tabular}
    192186\end{quote2}
    193187While the \CFA I/O looks similar to the \Index*[C++]{\CC{}} output style, there are important differences, such as automatic spacing between variables as in \Index*{Python} (see~\VRef{s:IOLibrary}).
    194188
    195 \subsection{Background}
    196 
    197189This document is a programmer reference-manual for the \CFA programming language.
    198190The manual covers the core features of the language and runtime-system, with simple examples illustrating syntax and semantics of each feature.
    199191The manual does not teach programming, i.e., how to combine the new constructs to build complex programs.
    200 A reader should already have an intermediate knowledge of control flow, data structures, and concurrency issues to understand the ideas presented, as well as some experience programming in C/\CC.
    201 Implementers should refer to the \CFA Programming Language Specification for details about the language syntax and semantics.
     192A reader should already have an intermediate knowledge of control flow, data structures, and concurrency issues to understand the ideas presented as well as some experience programming in C/\CC.
     193Implementers may refer to the \CFA Programming Language Specification for details about the language syntax and semantics.
    202194Changes to the syntax and additional features are expected to be included in later revisions.
    203195
     
    208200This installation base and the programmers producing it represent a massive software-engineering investment spanning decades and likely to continue for decades more.
    209201Even with all its problems, C continues to be popular because it allows writing software at virtually any level in a computer system without restriction.
    210 For system programming, where direct access to hardware, storage management, and real-time issues are a requirement, C is usually the only language of choice.
     202For system programming, where direct access to hardware and dealing with real-time issues is a requirement, C is usually the language of choice.
    211203The TIOBE index~\cite{TIOBE} for March 2016 showed the following programming-language popularity: \Index*{Java} 20.5\%, C 14.5\%, \Index*[C++]{\CC{}} 6.7\%, \Csharp 4.3\%, \Index*{Python} 4.3\%, where the next 50 languages are less than 3\% each with a long tail.
    212204As well, for 30 years, C has been the number 1 and 2 most popular programming language:
     
    224216\end{center}
    225217Hence, C is still an extremely important programming language, with double the usage of \Index*[C++]{\CC{}}; in many cases, \CC is often used solely as a better C.
    226 Love it or hate it, C has been an important and influential part of computer science for 40 years and its appeal is not diminishing.
    227 Unfortunately, C has many problems and omissions that make it an unacceptable programming language for modern needs.
    228 
    229 As stated, the goal of the \CFA project is to engineer modern language-features into C in an evolutionary rather than revolutionary way.
     218Love it or hate it, C has been an important and influential part of computer science for 40 years and sit appeal is not diminishing.
     219Unfortunately, C has too many problems and omissions to make it an acceptable programming language for modern needs.
     220
     221As stated, the goal of the \CFA project is to engineer modern language features into C in an evolutionary rather than revolutionary way.
    230222\CC~\cite{C++14,C++} is an example of a similar project;
    231 however, it largely extended the C language, and did not address most of C's existing problems.\footnote{%
     223however, it largely extended the language, and did not address many existing problems.\footnote{%
    232224Two important existing problems addressed were changing the type of character literals from ©int© to ©char© and enumerator from ©int© to the type of its enumerators.}
    233 \Index*{Fortran}~\cite{Fortran08}, \Index*{Ada}~\cite{Ada12}, and \Index*{Cobol}~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language-features (\eg objects, concurrency) are added and problems fixed within the framework of the existing language.
     225\Index*{Fortran}~\cite{Fortran08}, \Index*{Ada}~\cite{Ada12}, and \Index*{Cobol}~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features (\eg objects, concurrency) are added and problems fixed within the framework of the existing language.
    234226\Index*{Java}~\cite{Java8}, \Index*{Go}~\cite{Go}, \Index*{Rust}~\cite{Rust} and \Index*{D}~\cite{D} are examples of the revolutionary approach for modernizing C/\CC, resulting in a new language rather than an extension of the descendent.
    235 These languages have different syntax and semantics from C, do not interoperate directly with C, and are not systems languages because of restrictive memory-management or garbage collection.
     227These languages have different syntax and semantics from C, and do not interoperate directly with C, largely because of garbage collection.
    236228As a result, there is a significant learning curve to move to these languages, and C legacy-code must be rewritten.
    237 These costs can be prohibitive for many companies with a large software-base in C/\CC, and a significant number of programmers require retraining to the new programming language.
    238 
    239 The result of this project is a language that is largely backwards compatible with \Index*[C11]{\Celeven{}}~\cite{C11}, but fixes many of the well known C problems while containing modern language-features.
     229These costs can be prohibitive for many companies with a large software base in C/\CC, and a significant number of programmers requiring retraining to a new programming language.
     230
     231The result of this project is a language that is largely backwards compatible with \Index*[C11]{\Celeven{}}~\cite{C11}, but fixing some of the well known C problems and containing many modern language features.
    240232Without significant extension to the C programming language, it is becoming unable to cope with the needs of modern programming problems and programmers;
    241233as a result, it will fade into disuse.
    242234Considering the large body of existing C code and programmers, there is significant impetus to ensure C is transformed into a modern programming language.
    243 While \Index*[C11]{\Celeven{}} made a few simple extensions to the language, nothing was added to address existing problems in the language or to augment the language with modern language-features.
    244 While some may argue that modern language-features may make C complex and inefficient, it is clear a language without modern capabilities is insufficient for the advanced programming problems existing today.
     235While \Index*[C11]{\Celeven{}} made a few simple extensions to the language, nothing was added to address existing problems in the language or to augment the language with modern language features.
     236While some may argue that modern language features may make C complex and inefficient, it is clear a language without modern capabilities is insufficient for the advanced programming problems existing today.
    245237
    246238
    247239\section{History}
    248240
    249 The \CFA project started with \Index*{K-W C}~\cite{Buhr94a,Till89}, which extended C with new declaration syntax, multiple return values from routines, and advanced assignment capabilities using the notion of tuples.
     241The \CFA project started with \Index*{K-W C}~\cite{Buhr94a,Till89}, which extended C with new declaration syntax, multiple return values from routines, and extended assignment capabilities using the notion of tuples.
    250242(See~\cite{Werther96} for similar work in \Index*[C++]{\CC{}}.)
    251 The first \CFA implementation of these extensions was by Esteves~\cite{Esteves04}.
    252 
    253 The signature feature of \CFA is \emph{\Index{overload}able} \Index{parametric-polymorphic} functions~\cite{forceone:impl,Cormack90,Duggan96} with functions generalized using a ©forall© clause (giving the language its name):
     243A first \CFA implementation of these extensions was by Esteves~\cite{Esteves04}.
     244The signature feature of \CFA is parametric-polymorphic functions~\cite{forceone:impl,Cormack90,Duggan96} with functions generalized using a ©forall© clause (giving the language its name):
    254245\begin{lstlisting}
    255246®forall( otype T )® T identity( T val ) { return val; }
     
    257248\end{lstlisting}
    258249% extending the C type system with parametric polymorphism and overloading, as opposed to the \Index*[C++]{\CC{}} approach of object-oriented extensions.
    259 \CFA{}\hspace{1pt}'s polymorphism was originally formalized by Ditchfield~\cite{Ditchfield92}, and first implemented by Bilson~\cite{Bilson03}.
     250\CFA{}\hspace{1pt}'s polymorphism was originally formalized by Ditchfiled~\cite{Ditchfield92}, and first implemented by Bilson~\cite{Bilson03}.
    260251However, at that time, there was little interesting in extending C, so work did not continue.
    261 As the saying goes, ``\Index*{What goes around, comes around.}'', and there is now renewed interest in the C programming language because of legacy code-bases, so the \CFA project has been restarted.
     252As the saying goes, ``What goes around, comes around.'', and there is now renewed interest in the C programming language because of legacy code-bases, so the \CFA project has been restarted.
    262253
    263254
     
    266257
    267258\CFA is designed to integrate directly with existing C programs and libraries.
    268 The most important feature of \Index{interoperability} is using the same \Index{calling convention}s, so there is no complex interface or overhead to call existing C routines.
     259The most important feature of \Index{interoperability} is using the same \Index{calling convention}s, so there is no overhead to call existing C routines.
    269260This feature allows \CFA programmers to take advantage of the existing panoply of C libraries to access thousands of external software features.
    270261Language developers often state that adequate \Index{library support} takes more work than designing and implementing the language itself.
    271262Fortunately, \CFA, like \Index*[C++]{\CC{}}, starts with immediate access to all exiting C libraries, and in many cases, can easily wrap library routines with simpler and safer interfaces, at very low cost.
    272 Hence, \CFA begins by leveraging the large repository of C libraries, and than allows programmers to incrementally augment their C programs with modern \Index{backward-compatible} features.
     263Hence, \CFA begins by leveraging the large repository of C libraries with little cost.
    273264
    274265\begin{comment}
     
    313304\end{comment}
    314305
    315 However, it is necessary to differentiate between C and \CFA code because of name \Index{overload}ing, as for \CC.
     306However, it is necessary to differentiate between C and \CFA code because of name overloading, as for \CC.
    316307For example, the C math-library provides the following routines for computing the absolute value of the basic types: ©abs©, ©labs©, ©llabs©, ©fabs©, ©fabsf©, ©fabsl©, ©cabsf©, ©cabs©, and ©cabsl©.
    317 Whereas, \CFA wraps each of these routines into ones with the overloaded name ©abs©:
     308Whereas, \CFA wraps each of these routines into ones with the common name ©abs©:
    318309\begin{cfa}
    319310char abs( char );
    320 ®extern "C" {® int abs( int ); ®}®              §\C{// use default C routine for int}§
     311®extern "C" {®
     312int abs( int );                                                 §\C{// use default C routine for int}§
     313®}® // extern "C"
    321314long int abs( long int );
    322315long long int abs( long long int );
     
    333326Hence, there is the same need as in \CC, to know if a name is a C or \CFA name, so it can be correctly formed.
    334327There is no way around this problem, other than C's approach of creating unique names for each pairing of operation and type.
    335 
    336 This example strongly illustrates a core idea in \CFA: \emph{the \Index{power of a name}}.
     328This example strongly illustrates a core idea in \CFA: \emph{the power of a name}.
    337329The name ``©abs©'' evokes the notion of absolute value, and many mathematical types provide the notion of absolute value.
    338 Hence, knowing the name ©abs© is sufficient to apply it to any type where it is applicable.
    339 The time savings and safety of using one name uniformly versus $N$ unique names cannot be underestimated.
    340 
    341 
    342 \section[Compiling a CFA Program]{Compiling a \CFA Program}
    343 
    344 The command ©cfa© is used to compile a \CFA program and is based on the \Index{GNU} \Indexc{gcc} command, \eg:
    345 \begin{cfa}
    346 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA{}§-files [ assembler/loader-files ]
     330Hence, knowing the name ©abs© should be sufficient to apply it to any type where it is applicable.
     331The time savings and safety of using one name uniformly versus $N$ unique names should not be underestimated.
     332
     333
     334\section[Compiling CFA Program]{Compiling \CFA Program}
     335
     336The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, \eg:
     337\begin{cfa}
     338cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ]
    347339\end{cfa}
    348340\CFA programs having the following ©gcc© flags turned on:
     
    352344The 1999 C standard plus GNU extensions.
    353345\item
    354 \Indexc[deletekeywords=inline]{-fgnu89-inline}\index{compilation option!-fgnu89-inline@{\lstinline[deletekeywords=inline]$-fgnu89-inline$}}
     346{\lstset{deletekeywords={inline}}
     347\Indexc{-fgnu89-inline}\index{compilation option!-fgnu89-inline@{©-fgnu89-inline©}}
    355348Use the traditional GNU semantics for inline routines in C99 mode, which allows inline routines in header files.
     349}%
    356350\end{description}
    357351The following new \CFA options are available:
     
    360354\Indexc{-CFA}\index{compilation option!-CFA@©-CFA©}
    361355Only the C preprocessor and the \CFA translator steps are performed and the transformed program is written to standard output, which makes it possible to examine the code generated by the \CFA translator.
    362 The generated code starts with the standard \CFA \Index{prelude}.
     356The generated code started with the standard \CFA prelude.
    363357
    364358\item
    365359\Indexc{-debug}\index{compilation option!-debug@©-debug©}
    366360The program is linked with the debugging version of the runtime system.
    367 The debug version performs runtime checks to help during the debugging phase of a \CFA program, but can substantially slow program execution.
     361The debug version performs runtime checks to help during the debugging phase of a \CFA program, but substantially slows the execution of the program.
    368362The runtime checks should only be removed after the program is completely debugged.
    369363\textbf{This option is the default.}
     
    372366\Indexc{-nodebug}\index{compilation option!-nodebug@©-nodebug©}
    373367The program is linked with the non-debugging version of the runtime system, so the execution of the program is faster.
    374 \Emph{However, no runtime checks or ©assert©s are performed so errors usually result in abnormal program behaviour or termination.}
     368\Emph{However, no runtime checks or ©assert©s are performed so errors usually result in abnormal program termination.}
    375369
    376370\item
     
    392386\textbf{This option is the default.}
    393387
    394 \begin{comment}
    395388\item
    396389\Indexc{-no-include-stdhdr}\index{compilation option!-no-include-stdhdr@©-no-include-stdhdr©}
    397390Do not supply ©extern "C"© wrappers for \Celeven standard include files (see~\VRef{s:StandardHeaders}).
    398391\textbf{This option is \emph{not} the default.}
    399 \end{comment}
    400392\end{description}
    401393
     
    418410\item
    419411\Indexc{__CFA__}\index{preprocessor variables!__CFA__@©__CFA__©},
    420 \Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©}, and
     412\Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©} and
    421413\Indexc{__cforall}\index{preprocessor variables!__cforall@©__cforall©}
    422414are always available during preprocessing and have no value.
    423415\end{description}
    424416These preprocessor variables allow conditional compilation of programs that must work differently in these situations.
    425 For example, to toggle between C and \CFA extensions, use the following:
     417For example, to toggle between C and \CFA extensions, using the following:
    426418\begin{cfa}
    427419#ifndef __CFORALL__
     
    434426
    435427
    436 \section{Constant Underscores}
    437 
    438 Numeric constants are extended to allow \Index{underscore}s\index{constant!underscore}, \eg:
     428\section{Constants Underscores}
     429
     430Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, \eg:
    439431\begin{cfa}
    4404322®_®147®_®483®_®648;                                    §\C{// decimal constant}§
     
    449441L®_®§"\texttt{\textbackslash{x}}§®_®§\texttt{ff}§®_®§\texttt{ee}"§;     §\C{// wide character constant}§
    450442\end{cfa}
    451 The rules for placement of underscores are:
    452 \begin{enumerate}[topsep=5pt,itemsep=5pt,parsep=0pt]
     443The rules for placement of underscores is as follows:
     444\begin{enumerate}
    453445\item
    454446A sequence of underscores is disallowed, \eg ©12__34© is invalid.
     
    471463\label{s:BackquoteIdentifiers}
    472464
    473 \CFA introduces several new keywords (see \VRef{s:CFAKeywords}) that can clash with existing C variable-names in legacy code.
    474 Keyword clashes are accommodated by syntactic transformations using the \CFA backquote escape-mechanism:
     465\CFA accommodates keyword clashes with existing C variable-names by syntactic transformations using the \CFA backquote escape-mechanism:
    475466\begin{cfa}
    476467int ®`®otype®`® = 3;                    §\C{// make keyword an identifier}§
    477468double ®`®forall®`® = 3.5;
    478469\end{cfa}
    479 
    480470Existing C programs with keyword clashes can be converted by enclosing keyword identifiers in backquotes, and eventually the identifier name can be changed to a non-keyword name.
    481 \VRef[Figure]{f:HeaderFileInterposition} shows how clashes in existing C header-files (see~\VRef{s:StandardHeaders}) can be handled using preprocessor \newterm{interposition}: ©#include_next© and ©-I filename©.
    482 Several common C header-files with keyword clashes are fixed in the standard \CFA header-library, so there is a seamless programming-experience.
     471\VRef[Figure]{f:InterpositionHeaderFile} shows how clashes in C header files (see~\VRef{s:StandardHeaders}) can be handled using preprocessor \newterm{interposition}: ©#include_next© and ©-I filename©:
    483472
    484473\begin{figure}
    485474\begin{cfa}
    486 // include file uses the CFA keyword "with".
    487 #if ! defined( with )                   §\C{// nesting ?}§
    488 #define with ®`®with®`®                 §\C{// make keyword an identifier}§
     475// include file uses the CFA keyword "otype".
     476#if ! defined( otype )                  §\C{// nesting ?}§
     477#define otype ®`®otype®`®               §\C{// make keyword an identifier}§
    489478#define __CFA_BFD_H__
    490 #endif
    491 
    492 ®#include_next <bfdlink.h>              §\C{// must have internal check for multiple expansion}§
    493 ®
    494 #if defined( with ) && defined( __CFA_BFD_H__ ) §\C{// reset only if set}§
    495 #undef with
     479#endif // ! otype
     480
     481#®include_next® <bfd.h>                 §\C{// must have internal check for multiple expansion}§
     482
     483#if defined( otype ) && defined( __CFA_BFD_H__ )        §\C{// reset only if set}§
     484#undef otype
    496485#undef __CFA_BFD_H__
    497 #endif
    498 \end{cfa}
    499 \caption{Header-File Interposition}
    500 \label{f:HeaderFileInterposition}
     486#endif // otype && __CFA_BFD_H__
     487\end{cfa}
     488\caption{Interposition of Header File}
     489\label{f:InterpositionHeaderFile}
    501490\end{figure}
    502491
    503492
    504 \section{\texorpdfstring{Labelled \LstKeywordStyle{continue} / \LstKeywordStyle{break}}{Labelled continue / break}}
     493\section{Labelled Continue/Break}
    505494
    506495While C provides ©continue© and ©break© statements for altering control flow, both are restricted to one level of nesting for a particular control structure.
    507496Unfortunately, this restriction forces programmers to use \Indexc{goto} to achieve the equivalent control-flow for more than one level of nesting.
    508 To prevent having to switch to the ©goto©, \CFA extends the \Indexc{continue}\index{continue@\lstinline $continue$!labelled}\index{labelled!continue@©continue©} and \Indexc{break}\index{break@\lstinline $break$!labelled}\index{labelled!break@©break©} with a target label to support static multi-level exit\index{multi-level exit}\index{static multi-level exit}~\cite{Buhr85}, as in Java.
     497To prevent having to switch to the ©goto©, \CFA extends the \Indexc{continue}\index{continue@\lstinline $continue$!labelled}\index{labelled!continue@©continue©} and \Indexc{break}\index{break@\lstinline $break$!labelled}\index{labelled!break@©break©} with a target label to support static multi-level exit\index{multi-level exit}\index{static multi-level exit}~\cite{Buhr85,Java}.
    509498For both ©continue© and ©break©, the target label must be directly associated with a ©for©, ©while© or ©do© statement;
    510499for ©break©, the target label can also be associated with a ©switch©, ©if© or compound (©{}©) statement.
     
    523512                        ®LF:® for ( ... ) {
    524513                                ®LW:® while ( ... ) {
    525                                         ... break ®LC®; ...             // terminate compound
    526                                         ... break ®LS®; ...             // terminate switch
    527                                         ... break ®LIF®; ...    // terminate if
    528                                         ... continue ®LF;® ...  // resume loop
    529                                         ... break ®LF®; ...             // terminate loop
    530                                         ... continue ®LW®; ...  // resume loop
    531                                         ... break ®LW®; ...             // terminate loop
     514                                        ... break ®LC®; ...                     // terminate compound
     515                                        ... break ®LS®; ...                     // terminate switch
     516                                        ... break ®LIF®; ...                    // terminate if
     517                                        ... continue ®LF;® ...   // resume loop
     518                                        ... break ®LF®; ...                     // terminate loop
     519                                        ... continue ®LW®; ...   // resume loop
     520                                        ... break ®LW®; ...               // terminate loop
    532521                                } // while
    533522                        } // for
    534523                } else {
    535                         ... break ®LIF®; ...                    // terminate if
     524                        ... break ®LIF®; ...                                     // terminate if
    536525                } // if
    537526        } // switch
     
    575564                          LF: for ( ;; ) {
    576565                                  LW: while ( 1 ) {
    577                                                 break LC;               // terminate compound
    578                                                 break LS;               // terminate switch
    579                                                 break LIF;              // terminate if
    580                                                 continue LF;    // resume loop
    581                                                 break LF;               // terminate loop
    582                                                 continue LW;    // resume loop
    583                                                 break LW;               // terminate loop
     566                                                break LC;                       // terminate compound
     567                                                break LS;                       // terminate switch
     568                                                break LIF;                      // terminate if
     569                                                continue LF;     // resume loop
     570                                                break LF;                       // terminate loop
     571                                                continue LW;     // resume loop
     572                                                break LW;                 // terminate loop
    584573                                        } // while
    585574                                } // for
    586575                        } else {
    587                                 break LIF;                              // terminate if
     576                                break LIF;                                      // terminate if
    588577                        } // if
    589578                } // switch
     
    624613\item
    625614They cannot branch into a control structure.
    626 This restriction prevents missing declarations and/or initializations at the start of a control structure resulting in undefined behaviour.
     615This restriction prevents missing initialization at the start of a control structure resulting in undefined behaviour.
    627616\end{itemize}
    628617The advantage of the labelled ©continue©/©break© is allowing static multi-level exits without having to use the ©goto© statement, and tying control flow to the target control structure rather than an arbitrary point in a program.
    629 Furthermore, the location of the label at the \emph{beginning} of the target control structure informs the reader (\Index{eye candy}) that complex control-flow is occurring in the body of the control structure.
     618Furthermore, the location of the label at the \emph{beginning} of the target control structure informs the reader that complex control-flow is occurring in the body of the control structure.
    630619With ©goto©, the label is at the end of the control structure, which fails to convey this important clue early enough to the reader.
    631620Finally, using an explicit target for the transfer instead of an implicit target allows new constructs to be added or removed without affecting existing constructs.
     
    633622
    634623
    635 \section{\texorpdfstring{\LstKeywordStyle{switch} Statement}{switch Statement}}
     624\section{Switch Statement}
    636625
    637626C allows a number of questionable forms for the ©switch© statement:
     
    674663        ®// open input file
    675664®} else if ( argc == 2 ) {
    676         ®// open input file (duplicate)
     665        ®// open input file
    677666
    678667®} else {
     
    687676\begin{cfa}
    688677switch ( i ) {
    689   ®case 1: case 3: case 5:®     // odd values
    690         // odd action
     678  case 1: case 3: case 5:       // odd values
     679        // same action
    691680        break;
    692   ®case 2: case 4: case 6:®     // even values
    693         // even action
     681  case 2: case 4: case 6:       // even values
     682        // same action
    694683        break;
    695684}
     
    697686However, this situation is handled in other languages without fall-through by allowing a list of case values.
    698687While fall-through itself is not a problem, the problem occurs when fall-through is the default, as this semantics is unintuitive to many programmers and is different from virtually all other programming languages with a ©switch© statement.
    699 Hence, default fall-through semantics results in a large number of programming errors as programmers often \emph{forget} the ©break© statement at the end of a ©case© clause, resulting in inadvertent fall-through.
     688Hence, default fall-through semantics results in a large number of programming errors as programmers often forget the ©break© statement at the end of a ©case© clause, resulting in inadvertent fall-through.
    700689
    701690\item
     
    719708The problem with this usage is branching into control structures, which is known to cause both comprehension and technical difficulties.
    720709The comprehension problem occurs from the inability to determine how control reaches a particular point due to the number of branches leading to it.
    721 The technical problem results from the inability to ensure declaration and initialization of variables when blocks are not entered at the beginning.
    722 There are no positive arguments for this kind of control flow, and therefore, there is a strong impetus to eliminate it.
     710The technical problem results from the inability to ensure allocation and initialization of variables when blocks are not entered at the beginning.
     711Often transferring into a block can bypass variable declaration and/or its initialization, which results in subsequent errors.
     712There are virtually no positive arguments for this kind of control flow, and therefore, there is a strong impetus to eliminate it.
    723713Nevertheless, C does have an idiom where this capability is used, known as ``\Index*{Duff's device}''~\cite{Duff83}:
    724714\begin{cfa}
     
    780770and there is only a medium amount of fall-through from one ©case© clause to the next, and most of these result from a list of case values executing common code, rather than a sequence of case actions that compound.
    781771\end{itemize}
    782 These observations put into perspective the \CFA changes to the ©switch©.
     772These observations help to put the \CFA changes to the ©switch© into perspective.
    783773\begin{enumerate}
    784774\item
     
    801791  case 7:
    802792        ...
    803         ®break®                                         §\C{// redundant explicit end of switch}§
     793        ®break®                                         §\C{// explicit end of switch}§
    804794  default:
    805795        j = 3;
     
    807797\end{cfa}
    808798Like the ©switch© statement, the ©choose© statement retains the fall-through semantics for a list of ©case© clauses;
    809 An implicit ©break© is applied only at the end of the \emph{statements} following a ©case© clause.
    810 An explicit ©fallthru© is retained because it is a C-idiom most C programmers expect, and its absence might discourage programmers from using the ©choose© statement.
     799the implicit ©break© is applied only at the end of the \emph{statements} following a ©case© clause.
     800The explicit ©fallthru© is retained because it is a C-idiom most C programmers expect, and its absence might discourage programmers from using the ©choose© statement.
    811801As well, allowing an explicit ©break© from the ©choose© is a carry over from the ©switch© statement, and expected by C programmers.
    812802\item
     
    837827
    838828
    839 \section{\texorpdfstring{\LstKeywordStyle{case} Clause}{case Clause}}
     829\section{Case Clause}
    840830
    841831C restricts the ©case© clause of a ©switch© statement to a single value.
     
    913903
    914904
    915 \section{\texorpdfstring{\LstKeywordStyle{with} Clause / Statement}{with Clause / Statement}}
    916 \label{s:WithClauseStatement}
    917 
    918 In \Index{object-oriented} programming, there is an implicit first parameter, often names \textbf{©self©} or \textbf{©this©}, which is elided.
    919 \begin{C++}
    920 class C {
    921         int i, j;
    922         int mem() {              ®// implicit "this" parameter
    923 ®               i = 1;          ®// this->i
    924 ®               j = 3;          ®// this->j
    925 ®       }
    926 }
    927 \end{C++}
    928 Since CFA is non-object-oriented, the equivalent object-oriented program looks like:
    929 \begin{cfa}
    930 struct S { int i, j; };
    931 int mem( S &this ) {    // explicit "this" parameter
    932         ®this.®i = 1;                     // "this" is not elided
    933         ®this.®j = 2;
    934 }
    935 \end{cfa}
    936 but it is cumbersome having to write "©this.©" many times in a member.
    937 
    938 \CFA provides a ©with© clause/statement (see Pascal~\cite[\S~4.F]{Pascal}) to elided the "©this.©" by opening a scope containing field identifiers, changing the qualified fields into variables and giving an opportunity for optimizing qualified references.
    939 \begin{cfa}
    940 int mem( S &this ) ®with this® {        // with clause
    941         i = 1;                  ®// this.i
    942 ®       j = 2;                  ®// this.j
    943 ®}
    944 \end{cfa}
    945 which extends to multiple routine parameters:
    946 \begin{cfa}
    947 struct T { double m, n; };
    948 int mem2( S &this1, T &this2 ) ®with this1, this2® {
    949         i = 1; j = 2;
    950         m = 1.0; n = 2.0;
    951 }
    952 \end{cfa}
    953 
    954 The statement form is used within a block:
    955 \begin{cfa}
    956 int foo() {
    957         struct S1 { ... } s1;
    958         struct S2 { ... } s2;
    959         ®with s1® {                     // with statement
    960                 // access fields of s1 without qualification
    961                 ®with s2® {  // nesting
    962                         // access fields of s1 and s2 without qualification
    963                 }
    964         }
    965         ®with s1, s2® {
    966                 // access unambiguous fields of s1 and s2 without qualification
    967         }
    968 }
    969 \end{cfa}
    970 
    971 When opening multiple structures, fields with the same name and type are ambiguous and must be fully qualified.
    972 For fields with the same name but different type, context/cast can be used to disambiguate.
    973 \begin{cfa}
    974 struct S { int i; int j; double m; } a, c;
    975 struct T { int i; int k; int m } b, c;
    976 ®with a, b® {
    977         j + k;                                          §\C{// unambiguous, unique names define unique types}§
    978         i;                                                      §\C{// ambiguous, same name and type}§
    979         a.i + b.i;                                      §\C{// unambiguous, qualification defines unique names}§
    980         m;                                                      §\C{// ambiguous, same name and no context to define unique type}§
    981         m = 5.0;                                        §\C{// unambiguous, same name and context defines unique type}§
    982         m = 1;                                          §\C{// unambiguous, same name and context defines unique type}§
    983 }
    984 ®with c® { ... }                                §\C{// ambiguous, same name and no context}§
    985 ®with (S)c® { ... }                             §\C{// unambiguous, same name and cast defines unique type}§
    986 \end{cfa}
    987 
    988 
    989905\section{Exception Handling}
    990 \label{s:ExceptionHandling}
    991906
    992907Exception handling provides two mechanism: change of control flow from a raise to a handler, and communication from the raise to the handler.
    993 Transfer of control can be local, within a routine, or non-local, among routines.
    994 Non-local transfer can cause stack unwinding, i.e., non-local routine termination, depending on the kind of raise.
    995 \begin{cfa}
    996 exception_t E {};                               §\C{// exception type}§
     908\begin{cfa}
     909exception void h( int i );
     910exception int h( int i, double d );
     911
    997912void f(...) {
    998         ... throw E{}; ...                      §\C{// termination}§
    999         ... throwResume E{}; ...        §\C{// resumption}§
    1000 }
     913        ... throw h( 3 );
     914        ... i = resume h( 3, 5.1 );
     915}
     916
    1001917try {
    1002918        f(...);
    1003 } catch( E e : §boolean-predicate§ ) {                  §\C{// termination handler}§
    1004         // recover and continue
    1005 } catchResume( E e : §boolean-predicate§ ) {    §\C{// resumption handler}§
    1006         // repair and return
     919} catch h( int w ) {
     920        // reset
     921} resume h( int p, double x ) {
     922        return 17;  // recover
    1007923} finally {
    1008         // always executed
    1009 }
    1010 \end{cfa}
    1011 The kind of raise and handler match: ©throw© with ©catch© and ©throwResume© with ©catchResume©.
    1012 Then the exception type must match along with any additonal predicate must be true.
    1013 The ©catch© and ©catchResume© handlers may appear in any oder.
    1014 However, the ©finally© clause must appear at the end of the ©try© statement.
     924}
     925\end{cfa}
     926So the type raised would be the mangled name of the exception prototype and that name would be matched at the handler clauses by comparing the strings.
     927The arguments for the call would have to be packed in a message and unpacked at handler clause and then a call made to the handler.
    1015928
    1016929
     
    12231136
    12241137
    1225 \section{Exponentiation Operator}
    1226 
    1227 C, \CC, and Java (and many other programming languages) have no exponentiation operator\index{exponentiation!operator}\index{operator!exponentiation}, \ie $x^y$, and instead use a routine, like \Indexc{pow}, to perform the exponentiation operation.
    1228 \CFA extends the basic operators with the exponentiation operator ©?\?©\index{?\\?@\lstinline$?\?$} and ©?\=?©\index{?\\=?@\lstinline$?\=?$}, as in, ©x \ y© and ©x \= y©, which means $x^y$ and $x \leftarrow x^y$.
    1229 The priority of the exponentiation operator is between the cast and multiplicative operators, so that ©w * (int)x \ (int)y * z© is parenthesized as ©((w * (((int)x) \ ((int)y))) * z)©.
    1230 
    1231 As for \Index{division}, there are exponentiation operators for integral and floating-point types, including the builtin \Index{complex} types.
    1232 Unsigned integral exponentiation\index{exponentiation!unsigned integral} is performed with repeated multiplication (or shifting if the base is 2).
    1233 Signed integral exponentiation\index{exponentiation!signed integral} is performed with repeated multiplication (or shifting if the base is 2), but yields a floating-point result because $b^{-e}=1/b^e$.
    1234 Hence, it is important to designate exponent integral-constants as unsigned or signed: ©3 \ 3u© return an integral result, while ©3 \ 3© returns a floating-point result.
    1235 Floating-point exponentiation\index{exponentiation!floating point} is performed using \Index{logarithm}s\index{exponentiation!logarithm}, so the base cannot be negative.
    1236 \begin{cfa}
    1237 sout | 2 ®\® 8u | 4 ®\® 3u | -4 ®\® 3u | 4 ®\® -3 | -4 ®\® -3 | 4.0 ®\® 2.1 | (1.0f+2.0fi) ®\® (3.0f+2.0fi) | endl;
    1238 256 64 -64 0.015625 -0.015625 18.3791736799526 0.264715-1.1922i
    1239 \end{cfa}
    1240 Parenthesis are necessary for the complex constants or the expresion is parsed as ©1.0f+(2.0fi \ 3.0f)+2.0fi©.
    1241 The exponentiation operator is available for all the basic types, but for user-defined types, only the integral-computation versions are available.
    1242 For returning an integral value, the user type ©T© must define multiplication, ©*©, and one, ©1©;
    1243 for returning a floating-point value, an additional divide of type ©T© into a ©double© returning a ©double© (©double ?/?( double, T )©) is necessary for negative exponents.
    1244 
    1245 
    1246 \section{Pointer / Reference}
     1138\section{Pointer/Reference}
    12471139
    12481140C provides a \newterm{pointer type};
     
    12521144An integer constant expression with the value 0, or such an expression cast to type ©void *©, is called a \newterm{null-pointer constant}.\footnote{
    12531145One way to conceptualize the null pointer is that no variable is placed at this address, so the null-pointer address can be used to denote an uninitialized pointer/reference object;
    1254 \ie the null pointer is guaranteed to compare unequal to a pointer to any object or routine.
    1255 In general, a value with special meaning among a set of values is called a \emph{\Index{sentinel value}}, \eg ©-1© as a return code value.}
     1146\ie the null pointer is guaranteed to compare unequal to a pointer to any object or routine.}
    12561147An address is \newterm{sound}, if it points to a valid memory location in scope, \ie within the program's execution-environment and has not been freed.
    12571148Dereferencing an \newterm{unsound} address, including the null pointer, is \Index{undefined}, often resulting in a \Index{memory fault}.
     
    12881179\hline
    12891180\begin{cfa}
    1290 lda             r1,100  // load address of x
    1291 ld               r2,(r1)          // load value of x
    1292 lda             r3,104  // load address of y
    1293 st               r2,(r3)          // store x into y
     1181lda             r1,100                  // load address of x
     1182ld               r2,(r1)                  // load value of x
     1183lda             r3,104                  // load address of y
     1184st               r2,(r3)                  // store x into y
    12941185\end{cfa}
    12951186&
    12961187\begin{cfa}
    12971188
    1298 ld              r2,(100)        // load value of x
    1299 
    1300 st              r2,(104)        // store x into y
     1189ld              r2,(100)                // load value of x
     1190
     1191st              r2,(104)                // store x into y
    13011192\end{cfa}
    13021193\end{tabular}
     
    15941485
    15951486\item
    1596 lvalue to reference conversion: \lstinline[deletekeywords=lvalue]$lvalue-type cv1 T$ converts to ©cv2 T &©, which allows implicitly converting variables to references.
     1487lvalue to reference conversion: \lstinline[deletekeywords={lvalue}]@lvalue-type cv1 T@ converts to ©cv2 T &©, which allows implicitly converting variables to references.
    15971488\begin{cfa}
    15981489int x, &r = ®x®, f( int & p ); // lvalue variable (int) convert to reference (int &)
     
    27032594\begin{cfa}[belowskip=0pt]
    27042595char store[®sepSize®];                                          §\C{// sepSize is the maximum separator size}§
    2705 strcpy( store, sepGet( sout ) );                          §\C{// copy current separator}§
    2706 sepSet( sout, "_" );                                            §\C{// change separator to underscore}§
     2596strcpy( store, sepGet( sout ) );
     2597sepSet( sout, "_" );
    27072598sout | 1 | 2 | 3 | endl;
    27082599\end{cfa}
     
    27112602\end{cfa}
    27122603\begin{cfa}[belowskip=0pt]
    2713 sepSet( sout, store );                                          §\C{// change separator back to original}§
     2604sepSet( sout, store );
    27142605sout | 1 | 2 | 3 | endl;
    27152606\end{cfa}
     
    32683159\Indexc{gcc} provides ©typeof© to declare a secondary variable from a primary variable.
    32693160\CFA also relies heavily on the specification of the left-hand side of assignment for type inferencing, so in many cases it is crucial to specify the type of the left-hand side to select the correct type of the right-hand expression.
    3270 Only for overloaded routines \emph{with the same return type} is variable type-inferencing possible.
     3161Only for overloaded routines with the same return type is variable type-inferencing possible.
    32713162Finally, ©auto© presents the programming problem of tracking down a type when the type is actually needed.
    32723163For example, given
     
    53675258
    53685259
    5369 \section{\texorpdfstring{\CFA Keywords}{Cforall Keywords}}
     5260\section{\CFA Keywords}
    53705261\label{s:CFAKeywords}
    53715262
    5372 \CFA introduces the following new keywords.
    5373 
    53745263\begin{quote2}
    5375 \begin{tabular}{lllll}
     5264\begin{tabular}{llll}
    53765265\begin{tabular}{@{}l@{}}
    5377 ©_At©                   \\
     5266©_AT©                   \\
    53785267©catch©                 \\
    53795268©catchResume©   \\
    53805269©choose©                \\
    53815270©coroutine©             \\
     5271©disable©               \\
    53825272\end{tabular}
    53835273&
    53845274\begin{tabular}{@{}l@{}}
    5385 ©disable©               \\
    53865275©dtype©                 \\
    53875276©enable©                \\
    53885277©fallthrough©   \\
    53895278©fallthru©              \\
     5279©finally©               \\
     5280©forall©                \\
    53905281\end{tabular}
    53915282&
    53925283\begin{tabular}{@{}l@{}}
    5393 ©finally©               \\
    5394 ©forall©                \\
    53955284©ftype©                 \\
    53965285©lvalue©                \\
    53975286©monitor©               \\
     5287©mutex©                 \\
     5288©one_t©                 \\
     5289©otype©                 \\
    53985290\end{tabular}
    53995291&
    54005292\begin{tabular}{@{}l@{}}
    5401 ©mutex©                 \\
    5402 ©one_t©                 \\
    5403 ©otype©                 \\
    54045293©throw©                 \\
    54055294©throwResume©   \\
    5406 \end{tabular}
    5407 &
    5408 \begin{tabular}{@{}l@{}}
    54095295©trait©                 \\
    54105296©try©                   \\
    54115297©ttype©                 \\
    5412 ©with©                  \\
    54135298©zero_t©                \\
    54145299\end{tabular}
     
    54455330g( p1, p2 ) int p1, p2;                 §\C{// int g( int p1, int p2 );}§
    54465331\end{cfa}
    5447 \CFA continues to support K\&R routine definitions:
     5332\CFA supports K\&R routine definitions:
    54485333\begin{cfa}
    54495334f( a, b, c )                                    §\C{// default int return}§
     
    55865471\Celeven prescribes the following standard header-files~\cite[\S~7.1.2]{C11} and \CFA adds to this list:
    55875472\begin{quote2}
    5588 \begin{tabular}{@{}lllll|l@{}}
    5589 \multicolumn{5}{c|}{C11} & \multicolumn{1}{c}{\CFA}             \\
     5473\lstset{deletekeywords={float}}
     5474\begin{tabular}{@{}llll|l@{}}
     5475\multicolumn{4}{c|}{C11} & \multicolumn{1}{c}{\CFA}             \\
    55905476\hline
    55915477\begin{tabular}{@{}l@{}}
     
    55955481\Indexc{errno.h}                \\
    55965482\Indexc{fenv.h}                 \\
    5597 \Indexc[deletekeywords=float]{float.h} \\
     5483\Indexc{float.h}                \\
     5484\Indexc{inttypes.h}             \\
     5485\Indexc{iso646.h}               \\
    55985486\end{tabular}
    55995487&
    56005488\begin{tabular}{@{}l@{}}
    5601 \Indexc{inttypes.h}             \\
    5602 \Indexc{iso646.h}               \\
    56035489\Indexc{limits.h}               \\
    56045490\Indexc{locale.h}               \\
    56055491\Indexc{math.h}                 \\
    56065492\Indexc{setjmp.h}               \\
    5607 \end{tabular}
    5608 &
    5609 \begin{tabular}{@{}l@{}}
    56105493\Indexc{signal.h}               \\
    56115494\Indexc{stdalign.h}             \\
    56125495\Indexc{stdarg.h}               \\
    56135496\Indexc{stdatomic.h}    \\
    5614 \Indexc{stdbool.h}              \\
    5615 \Indexc{stddef.h}               \\
    56165497\end{tabular}
    56175498&
    56185499\begin{tabular}{@{}l@{}}
     5500\Indexc{stdbool.h}              \\
     5501\Indexc{stddef.h}               \\
    56195502\Indexc{stdint.h}               \\
    56205503\Indexc{stdio.h}                \\
     
    56325515\Indexc{wctype.h}               \\
    56335516                                                \\
     5517                                                \\
     5518                                                \\
    56345519\end{tabular}
    56355520&
     
    56375522\Indexc{unistd.h}               \\
    56385523\Indexc{gmp.h}                  \\
     5524                                                \\
     5525                                                \\
    56395526                                                \\
    56405527                                                \\
     
    56765563The table shows allocation routines supporting different combinations of storage-management capabilities:
    56775564\begin{center}
    5678 \begin{tabular}{@{}r|r|l|l|l|l@{}}
    5679 \multicolumn{1}{c}{}&           & \multicolumn{1}{c|}{fill}     & resize        & alignment     & array \\
     5565\begin{tabular}{@{}lr|l|l|l|l@{}}
     5566                &                                       & \multicolumn{1}{c|}{fill}     & resize        & alignment     & array \\
    56805567\hline
    56815568C               & ©malloc©                      & no                    & no            & no            & no    \\
     
    56845571                & ©memalign©            & no                    & no            & yes           & no    \\
    56855572                & ©posix_memalign©      & no                    & no            & yes           & no    \\
    5686 \hline
    56875573C11             & ©aligned_alloc©       & no                    & no            & yes           & no    \\
    5688 \hline
    56895574\CFA    & ©alloc©                       & no/copy/yes   & no/yes        & no            & yes   \\
    56905575                & ©align_alloc©         & no/yes                & no            & yes           & yes   \\
  • src/CodeGen/CodeGenerator.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:16:21 2017
    13 // Update Count     : 53
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thu Jun  8 15:48:00 2017
     13// Update Count     : 52
    1414//
    1515
    16 #pragma once
     16#ifndef CODEGENV_H
     17#define CODEGENV_H
    1718
    1819#include <list>                   // for list
     
    165166} // namespace CodeGen
    166167
     168#endif // CODEGENV_H
     169
    167170// Local Variables: //
    168171// tab-width: 4 //
  • src/CodeGen/FixMain.h

    r33218c6 re0a653d  
    99// Author           : Thierry Delisle
    1010// Created On       : Thr Jan 12 14:11:09 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:16:59 2017
    13 // Update Count     : 1
     11// Last Modified By :
     12// Last Modified On :
     13// Update Count     : 0
    1414//
    1515
    16 #pragma once
     16#ifndef FIXMAIN_H
     17#define FIXMAIN_H
    1718
    1819#include <iosfwd>
     
    4344        };
    4445};
     46
     47#endif //FIXMAIN_H
  • src/CodeGen/FixNames.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:17:33 2017
    13 // Update Count     : 3
     12// Last Modified On : Mon May 18 23:37:32 2015
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef FIXNAMES_H
     17#define FIXNAMES_H
    1718
    1819#include <list>  // for list
     
    2526} // namespace CodeGen
    2627
     28#endif // FIXNAMES_H
     29
    2730// Local Variables: //
    2831// tab-width: 4 //
  • src/CodeGen/GenType.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:17:23 2017
    13 // Update Count     : 2
     12// Last Modified On : Mon May 18 23:38:53 2015
     13// Update Count     : 1
    1414//
    1515
    16 #pragma once
     16#ifndef _GENTYPE_H
     17#define _GENTYPE_H
    1718
    1819#include <string>  // for string
     
    2526} // namespace CodeGen
    2627
     28#endif // _GENTYPE_H
     29
    2730// Local Variables: //
    2831// tab-width: 4 //
  • src/CodeGen/Generate.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:16:35 2017
    13 // Update Count     : 2
     12// Last Modified On : Mon May 18 23:39:51 2015
     13// Update Count     : 1
    1414//
    1515
    16 #pragma once
     16#ifndef GENERATE_H
     17#define GENERATE_H
    1718
    1819#include <iostream>  // for ostream
     
    3031} // namespace CodeGen
    3132
     33#endif // GENERATE_H
     34
    3235// Local Variables: //
    3336// tab-width: 4 //
  • src/CodeGen/OperatorTable.cc

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 15 17:12:22 2017
    13 // Update Count     : 15
     12// Last Modified On : Tue Dec 13 14:33:05 2016
     13// Update Count     : 10
    1414//
    1515
     
    3535                        {       "++?",          "++",   "_operator_preincr",                    OT_PREFIXASSIGN         },
    3636                        {       "--?",          "--",   "_operator_predecr",                    OT_PREFIXASSIGN         },
    37                         {       "?\\?",         "\\",   "_operator_exponential",                OT_INFIX                        },
    3837                        {       "?*?",          "*",    "_operator_multiply",                   OT_INFIX                        },
    3938                        {       "?/?",          "/",    "_operator_divide",                             OT_INFIX                        },
     
    5352                        {       "?|?",          "|",    "_operator_bitor",                              OT_INFIX                        },
    5453                        {       "?=?",          "=",    "_operator_assign",                             OT_INFIXASSIGN          },
    55                         {       "?\\=?",        "\\=",  "_operator_expassign",                  OT_INFIXASSIGN          },
    5654                        {       "?*=?",         "*=",   "_operator_multassign",                 OT_INFIXASSIGN          },
    5755                        {       "?/=?",         "/=",   "_operator_divassign",                  OT_INFIXASSIGN          },
  • src/CodeGen/OperatorTable.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:17:11 2017
    13 // Update Count     : 6
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jun 24 16:17:57 2015
     13// Update Count     : 5
    1414//
    1515
    16 #pragma once
     16#ifndef _OPERATORTABLE_H
     17#define _OPERATORTABLE_H
    1718
    1819#include <string>
     
    4445} // namespace CodeGen
    4546
     47#endif // _OPERATORTABLE_H
     48
    4649// Local Variables: //
    4750// tab-width: 4 //
  • src/CodeTools/DeclStats.h

    r33218c6 re0a653d  
    99// Author           : Aaron Moss
    1010// Created On       : Wed Jan 31 16:40:00 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:17:56 2017
    13 // Update Count     : 2
     11// Last Modified By : Aaron Moss
     12// Last Modified On : Wed Jan 31 16:40:00 2016
     13// Update Count     : 1
    1414//
    1515
    16 #pragma once
     16#ifndef DECLSTATS_H
     17#define DECLSTATS_H
    1718
    1819#include <list>  // for list
     
    2728}  // namespace CodeTools
    2829
     30#endif // DECLSTATS_H
     31
    2932// Local Variables: //
    3033// tab-width: 4 //
  • src/CodeTools/TrackLoc.h

    r33218c6 re0a653d  
    99// Author           : Andrew Beach
    1010// Created On       : Tues May 2 15:40:00 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:17:44 2017
    13 // Update Count     : 1
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed May 3 14:42:00 2017
     13// Update Count     : 0
    1414//
    1515
    16 #pragma once
     16#ifndef TRACKLOC_H
     17#define TRACKLOC_H
    1718
    1819#include <cstddef>   // for size_t
     
    3031}  // namespace CodeTools
    3132
     33#endif // TRACKLOC_H
     34
    3235// Local Variables: //
    3336// tab-width: 4 //
  • src/Common/CompilerError.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:18:07 2017
    13 // Update Count     : 4
     12// Last Modified On : Thu Aug 18 23:41:30 2016
     13// Update Count     : 3
    1414//
    1515
    16 #pragma once
     16#ifndef COMPILER_ERROR_H
     17#define COMPILER_ERROR_H
    1718
    1819#include <string>
     
    3031};
    3132
     33#endif // COMPILER_ERROR_H
     34
    3235// Local Variables: //
    3336// tab-width: 4 //
  • src/Common/ScopedMap.h

    r33218c6 re0a653d  
    99// Author           : Aaron B. Moss
    1010// Created On       : Wed Dec 2 11:37:00 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:18:24 2017
    13 // Update Count     : 2
    14 //
    15 
    16 #pragma once
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Wed Dec 2 11:37:00 2015
     13// Update Count     : 1
     14//
     15
     16#ifndef _SCOPEDMAP_H
     17#define _SCOPEDMAP_H
    1718
    1819#include <cassert>
     
    304305};
    305306
     307#endif // _SCOPEDMAP_H
     308
    306309// Local Variables: //
    307310// tab-width: 4 //
  • src/Common/SemanticError.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:18:59 2017
    13 // Update Count     : 6
     12// Last Modified On : Sat Sep 24 15:13:42 2016
     13// Update Count     : 5
    1414//
    1515
    16 #pragma once
     16#ifndef SEMANTICERROR_H
     17#define SEMANTICERROR_H
    1718
    1819#include <exception>  // for exception
     
    6162}
    6263
     64#endif // SEMANTICERROR_H
     65
    6366// Local Variables: //
    6467// tab-width: 4 //
  • src/Common/UnimplementedError.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:18:35 2017
    13 // Update Count     : 2
     12// Last Modified On : Tue May 19 07:23:08 2015
     13// Update Count     : 1
    1414//
    1515
    16 #pragma once
     16#ifndef _UNIMPLEMENTEDERROR_H
     17#define _UNIMPLEMENTEDERROR_H
    1718
    1819#include <string>
     
    3031};
    3132
     33#endif // _UNIMPLEMENTEDERROR_H
     34
    3235// Local Variables: //
    3336// tab-width: 4 //
  • src/Common/UniqueName.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:18:45 2017
    13 // Update Count     : 2
     12// Last Modified On : Tue May 19 07:24:20 2015
     13// Update Count     : 1
    1414//
    1515
    16 #pragma once
     16#ifndef UNIQUENAME_H
     17#define UNIQUENAME_H
    1718
    1819#include <string>
     
    2728};
    2829
     30#endif // UNIQUENAME_H
     31
    2932// Local Variables: //
    3033// tab-width: 4 //
  • src/Common/VectorMap.h

    r33218c6 re0a653d  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // VectorMap.h --
     7// ScopedMap.h --
    88//
    99// Author           : Aaron B. Moss
    1010// Created On       : Wed Feb  1 16:55:00 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:19:29 2017
    13 // Update Count     : 2
    14 //
    15 
    16 #pragma once
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Wed Feb  1 16:55:00 2017
     13// Update Count     : 1
     14//
     15
     16#ifndef _VECTORMAP_H
     17#define _VECTORMAP_H
    1718
    1819#include <iterator>
     
    244245}
    245246
     247#endif // _VECTORMAP_H
     248
    246249// Local Variables: //
    247250// tab-width: 4 //
  • src/Common/utility.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:19:13 2017
    13 // Update Count     : 33
    14 //
    15 
    16 #pragma once
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri May 5 11:03:00 2017
     13// Update Count     : 32
     14//
     15
     16#ifndef _UTILITY_H
     17#define _UTILITY_H
    1718
    1819#include <cctype>
     
    375376}
    376377
     378#endif // _UTILITY_H
     379
    377380// Local Variables: //
    378381// tab-width: 4 //
  • src/Concurrency/Keywords.cc

    r33218c6 re0a653d  
     1//                              -*- Mode: CPP -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    1112// Last Modified By :
    1213// Last Modified On :
    13 // Update Count     : 5
     14// Update Count     : 3
    1415//
    1516
     
    548549        }
    549550};
    550 
    551 // Local Variables: //
    552 // mode: c //
    553 // tab-width: 4 //
    554 // End: //
  • src/Concurrency/Keywords.h

    r33218c6 re0a653d  
     1//                              -*- Mode: CPP -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    1112// Last Modified By :
    1213// Last Modified On :
    13 // Update Count     : 1
     14// Update Count     : 0
    1415//
    1516
    16 #pragma once
     17#ifndef KEYWORDS_H
     18#define KEYWORDS_H
    1719
    1820#include <list>  // for list
     
    2628};
    2729
    28 // Local Variables: //
    29 // tab-width: 4 //
    30 // mode: c++ //
    31 // compile-command: "make install" //
    32 // End: //
     30#endif //KEYWORDS_H
  • src/ControlStruct/ExceptTranslate.cc

    r33218c6 re0a653d  
    1010// Created On       : Wed Jun 14 16:49:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Tus Jul 18 10:09:00 2017
    13 // Update Count     : 4
     12// Last Modified On : Wed Jul 12 15:07:00 2017
     13// Update Count     : 3
    1414//
    1515
     
    5050                        LinkageSpec::Cforall,
    5151                        /*bitfieldWidth*/ NULL,
    52                         new BasicType( noQualifiers, BasicType::SignedInt ),
     52                        new BasicType( emptyQualifiers, BasicType::SignedInt ),
    5353                        /*init*/ NULL
    5454                        );
     
    5959                        /*bitfieldWidth*/ NULL,
    6060                        new PointerType(
    61                                 noQualifiers,
    62                                 new BasicType( noQualifiers, BasicType::SignedInt )
     61                                emptyQualifiers,
     62                                new BasicType( emptyQualifiers, BasicType::SignedInt )
    6363                                ),
    6464                        /*init*/ NULL
     
    6969                        LinkageSpec::Cforall,
    7070                        /*bitfieldWidth*/ NULL,
    71                         new BasicType(noQualifiers, BasicType::Bool),
     71                        new BasicType(emptyQualifiers, BasicType::Bool),
    7272                        /*init*/ NULL
    7373                        );
     
    7878                        NULL,
    7979                        new PointerType(
    80                                 noQualifiers,
     80                                emptyQualifiers,
    8181                                new VoidType(
    82                                         noQualifiers
     82                                        emptyQualifiers
    8383                                        ),
    8484                                std::list<Attribute *>{new Attribute("unused")}
     
    143143                        LinkageSpec::Cforall,
    144144                        NULL,
    145                         new BasicType( noQualifiers, BasicType::SignedInt ),
     145                        new BasicType( emptyQualifiers, BasicType::SignedInt ),
    146146                        new SingleInit( throwStmt->get_expr() )
    147147                        );
     
    444444                        nullptr,
    445445                        new StructInstType(
    446                                 noQualifiers,
     446                                emptyQualifiers,
    447447                                hook_decl
    448448                                ),
  • src/ControlStruct/ExceptTranslate.h

    r33218c6 re0a653d  
    99// Author           : Andrew Beach
    1010// Created On       : Tus Jun 06 10:13:00 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:19:23 2017
    13 // Update Count     : 4
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Jun 30 10:20:00 2017
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef EXCEPT_TRANSLATE_H
     17#define EXCEPT_TRANSLATE_H
    1718
    1819#include <list>
     
    2122namespace ControlStruct {
    2223        void translateEHM( std::list< Declaration *> & translationUnit );
    23         // Converts exception handling structures into their underlying C code.  Translation does use the exception
    24         // handling header, make sure it is visible wherever translation occurs.
     24        /* Converts exception handling structures into their underlying C code.
     25         * Translation does use the exception handling header, make sure it is
     26         * visible wherever translation occurs.
     27         */
    2528}
    2629
    27 // Local Variables: //
    28 // tab-width: 4 //
    29 // mode: c++ //
    30 // compile-command: "make install" //
    31 // End: //
     30#endif // EXCEPT_TRANSLATE_H
  • src/ControlStruct/ForExprMutator.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:17:08 2017
    13 // Update Count     : 4
     12// Last Modified On : Mon Jan 25 21:22:13 2016
     13// Update Count     : 3
    1414//
    1515
    16 #pragma once
     16#ifndef FOR_MUTATOR_H
     17#define FOR_MUTATOR_H
    1718
    1819#include "SynTree/Mutator.h"
     
    2627} // namespace ControlStruct
    2728
     29#endif // CHOOSE_MUTATOR_H
     30
    2831// Local Variables: //
    2932// tab-width: 4 //
  • src/ControlStruct/LabelFixer.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:17:24 2017
    13 // Update Count     : 34
     12// Last Modified On : Tue Jul 12 17:36:16 2016
     13// Update Count     : 33
    1414//
    1515
    16 #pragma once
     16#ifndef LABEL_FIXER_H
     17#define LABEL_FIXER_H
    1718
    1819#include "Common/utility.h"
     
    8283} // namespace ControlStruct
    8384
     85#endif // LABEL_FIXER_H
     86
    8487// Local Variables: //
    8588// tab-width: 4 //
  • src/ControlStruct/LabelGenerator.h

    r33218c6 re0a653d  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:20:14 2017
    13 // Update Count     : 6
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jun 03 14:16:26 2015
     13// Update Count     : 5
    1414//
    1515
    16 #pragma once
     16#ifndef LABEL_GENERATOR_H
     17#define LABEL_GENERATOR_H
    1718
    1819#include "SynTree/SynTree.h"
     
    3435} // namespace ControlStruct
    3536
     37#endif // LABEL_GENERATOR_H
     38
    3639// Local Variables: //
    3740// tab-width: 4 //
  • src/ControlStruct/MLEMutator.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:19:59 2017
    13 // Update Count     : 35
     12// Last Modified On : Tue Jul 12 17:37:01 2016
     13// Update Count     : 34
    1414//
    1515
    16 #pragma once
     16#ifndef MLE_MUTATOR_H
     17#define MLE_MUTATOR_H
    1718
    1819#include <map>
     
    8889} // namespace ControlStruct
    8990
     91#endif // MLE_MUTATOR_H
     92
    9093// Local Variables: //
    9194// tab-width: 4 //
  • src/ControlStruct/Mutate.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:17:59 2017
    13 // Update Count     : 3
     12// Last Modified On : Tue May 19 15:31:20 2015
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef CTRLS_MUTATE_H
     17#define CTRLS_MUTATE_H
    1718
    1819#include <list>
     
    2627} // namespace ControlStruct
    2728
     29#endif // CTRLS_MUTATE_H
     30
    2831// Local Variables: //
    2932// tab-width: 4 //
  • src/GenPoly/Box.cc

    r33218c6 re0a653d  
    202202                };
    203203
    204                 /// Replaces initialization of polymorphic values with alloca, declaration of dtype/ftype with appropriate void expression, sizeof expressions of polymorphic types with the proper variable, and strips fields from generic struct declarations.
     204                /// Replaces initialization of polymorphic values with alloca, declaration of dtype/ftype with appropriate void expression, and sizeof expressions of polymorphic types with the proper variable
    205205                class Pass3 final : public PolyMutator {
    206206                  public:
     
    210210                        using PolyMutator::mutate;
    211211                        virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override;
    212                         virtual Declaration *mutate( StructDecl *structDecl ) override;
    213                         virtual Declaration *mutate( UnionDecl *unionDecl ) override;
    214212                        virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override;
    215213                        virtual TypedefDecl *mutate( TypedefDecl *objectDecl ) override;
     
    18701868                }
    18711869
    1872                 /// Strips the members from a generic aggregate
    1873                 void stripGenericMembers(AggregateDecl* decl) {
    1874                         if ( ! decl->get_parameters().empty() ) decl->get_members().clear();
    1875                 }
    1876 
    1877                 Declaration *Pass3::mutate( StructDecl *structDecl ) {
    1878                         stripGenericMembers( structDecl );
    1879                         return structDecl;
    1880                 }
    1881                
    1882                 Declaration *Pass3::mutate( UnionDecl *unionDecl ) {
    1883                         stripGenericMembers( unionDecl );
    1884                         return unionDecl;
    1885                 }
    1886 
    18871870                TypeDecl * Pass3::mutate( TypeDecl *typeDecl ) {
    18881871//   Initializer *init = 0;
  • src/GenPoly/Box.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:23:52 2017
    13 // Update Count     : 6
     12// Last Modified On : Thu Nov 19 17:24:01 2015
     13// Update Count     : 5
    1414//
    1515
    16 #pragma once
     16#ifndef _BOX_H
     17#define _BOX_H
    1718
    1819#include <list>
     
    2425} // namespace GenPoly
    2526
     27#endif // _BOX_H
     28
    2629// Local Variables: //
    2730// tab-width: 4 //
  • src/GenPoly/CopyParams.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:23:09 2017
    13 // Update Count     : 2
     12// Last Modified On : Tue May 19 07:34:25 2015
     13// Update Count     : 1
    1414//
    1515
    16 #pragma once
     16#ifndef _COPYPARAMS_H
     17#define _COPYPARAMS_H
    1718
    1819#include "SynTree/SynTree.h"
     
    2324} // namespace GenPoly
    2425
     26#endif // _COPYPARAMS_H
     27
    2528// Local Variables: //
    2629// tab-width: 4 //
  • src/GenPoly/DeclMutator.h

    r33218c6 re0a653d  
    1010// Created On       : Fri Nov 27 14:44:00 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:21:12 2017
    13 // Update Count     : 4
     12// Last Modified On : Tue Jul 12 17:39:01 2016
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef _DECLMUTATOR_H
     17#define _DECLMUTATOR_H
    1718
    1819#include <list>
     
    2627        /// Mutates a list of declarations, providing a means of adding new declarations into the list
    2728        class DeclMutator : public Mutator {
    28           public:
     29        public:
    2930                typedef Mutator Parent;
    3031
     
    4950                /// Called on exit from a scope; overriders should call this as a super-class call
    5051                virtual void doEndScope();
    51           protected:
     52        protected:
    5253                /// Mutate a statement that forms its own scope
    5354                Statement* mutateStatement( Statement *stmt );
     
    5859                /// Add a declaration to the list to be added after the current position
    5960                void addDeclarationAfter( Declaration* decl );
    60           private:
     61        private:
    6162                /// A stack of declarations to add before the current declaration or statement
    6263                std::vector< std::list< Declaration* > > declsToAdd;
     
    6667} // namespace
    6768
     69#endif // _DECLMUTATOR_H
     70
    6871// Local Variables: //
    6972// tab-width: 4 //
  • src/GenPoly/ErasableScopedMap.h

    r33218c6 re0a653d  
    99// Author           : Aaron B. Moss
    1010// Created On       : Wed Dec 2 11:37:00 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:23:24 2017
    13 // Update Count     : 2
    14 //
    15 
    16 #pragma once
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Wed Dec 2 11:37:00 2015
     13// Update Count     : 1
     14//
     15
     16#ifndef _ERASABLESCOPEDMAP_H
     17#define _ERASABLESCOPEDMAP_H
    1718
    1819#include <cassert>
     
    277278} // namespace GenPoly
    278279
     280#endif // _ERASABLESCOPEDMAP_H
     281
    279282// Local Variables: //
    280283// tab-width: 4 //
  • src/GenPoly/FindFunction.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:23:36 2017
    13 // Update Count     : 2
     12// Last Modified On : Tue May 19 07:36:35 2015
     13// Update Count     : 1
    1414//
    1515
    16 #pragma once
     16#ifndef FINDFUNCTION_H
     17#define FINDFUNCTION_H
    1718
    1819#include "SynTree/SynTree.h"
     
    2829} // namespace GenPoly
    2930
     31#endif // FINDFUNCTION_H
     32
    3033// Local Variables: //
    3134// tab-width: 4 //
  • src/GenPoly/GenPoly.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:22:57 2017
    13 // Update Count     : 7
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Tue Nov 24 15:24:38 2015
     13// Update Count     : 6
    1414//
    1515
    16 #pragma once
     16#ifndef GENPOLY_H
     17#define GENPOLY_H
    1718
    1819#include <string>
     
    110111} // namespace GenPoly
    111112
     113#endif // GENPOLY_H
     114
    112115// Local Variables: //
    113116// tab-width: 4 //
  • src/GenPoly/InstantiateGeneric.h

    r33218c6 re0a653d  
    99// Author           : Aaron B. Moss
    1010// Created On       : Thu Aug 04 18:33:00 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:22:42 2017
    13 // Update Count     : 2
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Thu Aug 04 18:33:00 2016
     13// Update Count     : 1
    1414//
    1515
    16 #pragma once
     16#ifndef _INSTANTIATEGENERIC_H
     17#define _INSTANTIATEGENERIC_H
    1718
    1819#include "SynTree/SynTree.h"
     
    2526} // namespace GenPoly
    2627
     28#endif // _INSTANTIATEGENERIC_H
     29
    2730// Local Variables: //
    2831// tab-width: 4 //
  • src/GenPoly/Lvalue.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:21:59 2017
    13 // Update Count     : 2
     12// Last Modified On : Tue May 19 07:42:09 2015
     13// Update Count     : 1
    1414//
    1515
    16 #pragma once
     16#ifndef _LVALUE_H
     17#define _LVALUE_H
    1718
    1819#include <list>
     
    2526} // namespace GenPoly
    2627
     28#endif // _LVALUE_H
     29
    2730// Local Variables: //
    2831// tab-width: 4 //
  • src/GenPoly/PolyMutator.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:20:31 2017
    13 // Update Count     : 7
     12// Last Modified On : Tue Jul 12 17:39:41 2016
     13// Update Count     : 6
    1414//
    1515
    16 #pragma once
     16#ifndef _POLYMUTATOR_H
     17#define _POLYMUTATOR_H
    1718
    1819#include <map>
     
    6566} // namespace
    6667
     68#endif // _POLYMUTATOR_H
     69
    6770// Local Variables: //
    6871// tab-width: 4 //
  • src/GenPoly/ScopedSet.h

    r33218c6 re0a653d  
    99// Author           : Aaron B. Moss
    1010// Created On       : Thu Dec 3 11:51:00 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:22:17 2017
    13 // Update Count     : 2
    14 //
    15 
    16 #pragma once
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Thu Dec 3 11:51:00 2015
     13// Update Count     : 1
     14//
     15
     16#ifndef _SCOPEDSET_H
     17#define _SCOPEDSET_H
    1718
    1819#include <iterator>
     
    246247} // namespace GenPoly
    247248
     249#endif // _SCOPEDSET_H
     250
    248251// Local Variables: //
    249252// tab-width: 4 //
  • src/GenPoly/ScrubTyVars.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:21:47 2017
    13 // Update Count     : 2
     12// Last Modified On : Tue May 19 07:48:14 2015
     13// Update Count     : 1
    1414//
    1515
    16 #pragma once
     16#ifndef _SCRUBTYVARS_H
     17#define _SCRUBTYVARS_H
    1718
    1819#include <string>
     
    9495} // namespace GenPoly
    9596
     97#endif // _SCRUBTYVARS_H
     98
    9699// Local Variables: //
    97100// tab-width: 4 //
  • src/GenPoly/Specialize.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:22:31 2017
    13 // Update Count     : 2
     12// Last Modified On : Tue May 19 07:53:58 2015
     13// Update Count     : 1
    1414//
    1515
    16 #pragma once
     16#ifndef _SPECIALIZE_H
     17#define _SPECIALIZE_H
    1718
    1819#include <list>
     
    2526} // namespace GenPoly
    2627
     28#endif // _SPECIALIZE_H
     29
    2730// Local Variables: //
    2831// tab-width: 4 //
  • src/InitTweak/FixGlobalInit.h

    r33218c6 re0a653d  
    99// Author           : Rob Schluntz
    1010// Created On       : Mon May 04 15:14:56 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:30:54 2017
    13 // Update Count     : 3
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Fri May 06 16:07:47 2016
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef FIX_GLOBAL_INIT_H
     17#define FIX_GLOBAL_INIT_H
    1718
    1819#include <string>
     
    3334} // namespace
    3435
     36#endif // GENPOLY_POLYMUTATOR_H
     37
    3538// Local Variables: //
    3639// tab-width: 4 //
  • src/InitTweak/FixInit.h

    r33218c6 re0a653d  
    99// Author           : Rob Schluntz
    1010// Created On       : Wed Jan 13 16:29:30 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:31:06 2017
    13 // Update Count     : 6
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Fri May 13 11:27:52 2016
     13// Update Count     : 5
    1414//
    1515
    16 #pragma once
     16#ifndef FIX_INIT_H
     17#define FIX_INIT_H
    1718
    1819#include <string>
     
    2930} // namespace
    3031
     32#endif // GENPOLY_POLYMUTATOR_H
     33
    3134// Local Variables: //
    3235// tab-width: 4 //
  • src/InitTweak/GenInit.h

    r33218c6 re0a653d  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:31:19 2017
    13 // Update Count     : 4
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Fri May 13 11:27:19 2016
     13// Update Count     : 3
    1414//
    1515
    16 #pragma once
     16#ifndef GEN_INIT_H
     17#define GEN_INIT_H
    1718
    1819#include <string>
     
    3435} // namespace
    3536
     37#endif // INITTWEAK_GENINIT_H
     38
    3639// Local Variables: //
    3740// tab-width: 4 //
  • src/InitTweak/InitTweak.h

    r33218c6 re0a653d  
    99// Author           : Rob Schluntz
    1010// Created On       : Fri May 13 11:26:36 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:30:33 2017
    13 // Update Count     : 4
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Fri May 13 11:35:36 2016
     13// Update Count     : 3
    1414//
    1515
    16 #pragma once
     16#ifndef INIT_TWEAK_H
     17#define INIT_TWEAK_H
    1718
    1819#include <string>
     
    115116} // namespace
    116117
     118#endif // INITTWEAK_GENINIT_H
     119
    117120// Local Variables: //
    118121// tab-width: 4 //
  • src/MakeLibCfa.h

    r33218c6 re0a653d  
    1010// Created On       : Sat May 16 10:42:14 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:31:35 2017
    13 // Update Count     : 2
     12// Last Modified On : Sat May 16 10:43:29 2015
     13// Update Count     : 1
    1414//
    1515
    16 #pragma once
     16#ifndef LIBCFA_MAKELIBCFA_H
     17#define LIBCFA_MAKELIBCFA_H
    1718
    1819#include <list>  // for list
     
    2425} // namespace LibCfa
    2526
     27#endif // LIBCFA_MAKELIBCFA_H
     28
    2629// Local Variables: //
    2730// tab-width: 4 //
  • src/Makefile.in

    r33218c6 re0a653d  
    216216        SymTab/driver_cfa_cpp-TypeEquality.$(OBJEXT) \
    217217        SymTab/driver_cfa_cpp-Autogen.$(OBJEXT) \
    218         SymTab/driver_cfa_cpp-TreeStruct.$(OBJEXT) \
    219218        SynTree/driver_cfa_cpp-Type.$(OBJEXT) \
    220219        SynTree/driver_cfa_cpp-VoidType.$(OBJEXT) \
     
    515514        SymTab/Indexer.cc SymTab/Mangler.cc SymTab/Validate.cc \
    516515        SymTab/FixFunction.cc SymTab/ImplementationType.cc \
    517         SymTab/TypeEquality.cc SymTab/Autogen.cc SymTab/TreeStruct.cc \
    518         SynTree/Type.cc SynTree/VoidType.cc SynTree/BasicType.cc \
     516        SymTab/TypeEquality.cc SymTab/Autogen.cc SynTree/Type.cc \
     517        SynTree/VoidType.cc SynTree/BasicType.cc \
    519518        SynTree/PointerType.cc SynTree/ArrayType.cc \
    520519        SynTree/FunctionType.cc SynTree/ReferenceToType.cc \
     
    849848SymTab/driver_cfa_cpp-Autogen.$(OBJEXT): SymTab/$(am__dirstamp) \
    850849        SymTab/$(DEPDIR)/$(am__dirstamp)
    851 SymTab/driver_cfa_cpp-TreeStruct.$(OBJEXT): SymTab/$(am__dirstamp) \
    852         SymTab/$(DEPDIR)/$(am__dirstamp)
    853850SynTree/$(am__dirstamp):
    854851        @$(MKDIR_P) SynTree
     
    10361033@AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Indexer.Po@am__quote@
    10371034@AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Mangler.Po@am__quote@
    1038 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Po@am__quote@
    10391035@AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-TypeEquality.Po@am__quote@
    10401036@AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Validate.Po@am__quote@
     
    20882084@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    20892085@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-Autogen.obj `if test -f 'SymTab/Autogen.cc'; then $(CYGPATH_W) 'SymTab/Autogen.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/Autogen.cc'; fi`
    2090 
    2091 SymTab/driver_cfa_cpp-TreeStruct.o: SymTab/TreeStruct.cc
    2092 @am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-TreeStruct.o -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo -c -o SymTab/driver_cfa_cpp-TreeStruct.o `test -f 'SymTab/TreeStruct.cc' || echo '$(srcdir)/'`SymTab/TreeStruct.cc
    2093 @am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Po
    2094 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='SymTab/TreeStruct.cc' object='SymTab/driver_cfa_cpp-TreeStruct.o' libtool=no @AMDEPBACKSLASH@
    2095 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    2096 @am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-TreeStruct.o `test -f 'SymTab/TreeStruct.cc' || echo '$(srcdir)/'`SymTab/TreeStruct.cc
    2097 
    2098 SymTab/driver_cfa_cpp-TreeStruct.obj: SymTab/TreeStruct.cc
    2099 @am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-TreeStruct.obj -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo -c -o SymTab/driver_cfa_cpp-TreeStruct.obj `if test -f 'SymTab/TreeStruct.cc'; then $(CYGPATH_W) 'SymTab/TreeStruct.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/TreeStruct.cc'; fi`
    2100 @am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Po
    2101 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='SymTab/TreeStruct.cc' object='SymTab/driver_cfa_cpp-TreeStruct.obj' libtool=no @AMDEPBACKSLASH@
    2102 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    2103 @am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-TreeStruct.obj `if test -f 'SymTab/TreeStruct.cc'; then $(CYGPATH_W) 'SymTab/TreeStruct.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/TreeStruct.cc'; fi`
    21042086
    21052087SynTree/driver_cfa_cpp-Type.o: SynTree/Type.cc
  • src/Parser/DeclarationNode.cc

    r33218c6 re0a653d  
    1010// Created On       : Sat May 16 12:34:05 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Jul 14 16:55:00 2017
    13 // Update Count     : 1020
     12// Last Modified On : Wed Jun 28 15:27:00 2017
     13// Update Count     : 1019
    1414//
    1515
     
    253253        newnode->type->aggregate.fields = fields;
    254254        newnode->type->aggregate.body = body;
    255         newnode->type->aggregate.tagged = false;
    256         newnode->type->aggregate.parent = nullptr;
    257255        return newnode;
    258256} // DeclarationNode::newAggregate
     
    275273        return newnode;
    276274} // DeclarationNode::newEnumConstant
    277 
    278 DeclarationNode * DeclarationNode::newTreeStruct( Aggregate kind, const string * name, const string * parent, ExpressionNode * actuals, DeclarationNode * fields, bool body ) {
    279         assert( name );
    280         DeclarationNode * newnode = new DeclarationNode;
    281         newnode->type = new TypeData( TypeData::Aggregate );
    282         newnode->type->aggregate.kind = kind;
    283         newnode->type->aggregate.name = name;
    284         newnode->type->aggregate.actuals = actuals;
    285         newnode->type->aggregate.fields = fields;
    286         newnode->type->aggregate.body = body;
    287         newnode->type->aggregate.tagged = true;
    288         newnode->type->aggregate.parent = parent;
    289         return newnode;
    290 } // DeclarationNode::newTreeStruct
    291275
    292276DeclarationNode * DeclarationNode::newName( string * name ) {
  • src/Parser/ExpressionNode.cc

    r33218c6 re0a653d  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:17:07 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Tus Jul 18 10:08:00 2017
    13 // Update Count     : 550
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Wed Jun 28 21:08:15 2017
     13// Update Count     : 542
    1414//
    1515
     
    4646// type.
    4747
    48 Type::Qualifiers noQualifiers;                          // no qualifiers on constants
     48Type::Qualifiers emptyQualifiers;                               // no qualifiers on constants
    4949
    5050static inline bool checkU( char c ) { return c == 'u' || c == 'U'; }
     
    118118        } // if
    119119
    120         Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][size] ), str, v ) );
     120        Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[Unsigned][size] ), str, v ) );
    121121        delete &str;                                                                            // created by lex
    122122        return ret;
     
    153153        } // if
    154154
    155         Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[complx][size] ), str, v ) );
     155        Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[complx][size] ), str, v ) );
    156156        delete &str;                                                                            // created by lex
    157157        return ret;
     
    159159
    160160Expression *build_constantChar( const std::string & str ) {
    161         Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) );
     161        Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) );
    162162        delete &str;                                                                            // created by lex
    163163        return ret;
     
    166166ConstantExpr *build_constantStr( const std::string & str ) {
    167167        // string should probably be a primitive type
    168         ArrayType *at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),
     168        ArrayType *at = new ArrayType( emptyQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),
    169169                                                                   new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ),  // +1 for '\0' and -2 for '"'
    170170                                                                   false, false );
     
    176176
    177177Expression *build_constantZeroOne( const std::string & str ) {
    178         Expression * ret = new ConstantExpr( Constant( str == "0" ? (Type *)new ZeroType( noQualifiers ) : (Type*)new OneType( noQualifiers ), str,
     178        Expression * ret = new ConstantExpr( Constant( str == "0" ? (Type *)new ZeroType( emptyQualifiers ) : (Type*)new OneType( emptyQualifiers ), str,
    179179                                                                                                   str == "0" ? (unsigned long long int)0 : (unsigned long long int)1 ) );
    180180        delete &str;                                                                            // created by lex
     
    231231}
    232232
    233 // Must harmonize with OperKinds.
    234233static const char *OperName[] = {
    235234        // diadic
    236         "SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?\\?", "?*?", "?/?", "?%?", "||", "&&",
     235        "SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?*?", "?/?", "?%?", "||", "&&",
    237236        "?|?", "?&?", "?^?", "Cast", "?<<?", "?>>?", "?<?", "?>?", "?<=?", "?>=?", "?==?", "?!=?",
    238         "?=?", "?@=?", "?\\=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?",
     237        "?=?", "?@=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?",
    239238        "?[?]", "...",
    240239        // monadic
  • src/Parser/LinkageSpec.h

    r33218c6 re0a653d  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:24:28 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:32:16 2017
    13 // Update Count     : 14
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Jul  7 11:03:00 2017
     13// Update Count     : 13
    1414//
    1515
    16 #pragma once
     16#ifndef LINKAGESPEC_H
     17#define LINKAGESPEC_H
    1718
    1819#include <string>
     
    7778};
    7879
     80#endif // LINKAGESPEC_H
     81
    7982// Local Variables: //
    8083// tab-width: 4 //
  • src/Parser/ParseNode.h

    r33218c6 re0a653d  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:28:16 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:32:30 2017
    13 // Update Count     : 786
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Mon Jun 12 13:00:00 2017
     13// Update Count     : 779
    1414//
    1515
    16 #pragma once
     16#ifndef PARSENODE_H
     17#define PARSENODE_H
    1718
    1819#include <string>
     
    140141};
    141142
    142 // Must harmonize with OperName.
    143143enum class OperKinds {
    144144        // diadic
    145         SizeOf, AlignOf, OffsetOf, Plus, Minus, Exp, Mul, Div, Mod, Or, And,
     145        SizeOf, AlignOf, OffsetOf, Plus, Minus, Mul, Div, Mod, Or, And,
    146146        BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq,
    147         Assign, AtAssn, ExpAssn, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn,
     147        Assign, AtAssn, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn,
    148148        Index, Range,
    149149        // monadic
     
    248248        static DeclarationNode * newAsmStmt( StatementNode * stmt ); // gcc external asm statement
    249249
    250         // Perhaps this would best fold into newAggragate.
    251         static DeclarationNode * newTreeStruct( Aggregate kind, const std::string * name, const std::string * parent, ExpressionNode * actuals, DeclarationNode * fields, bool body );
    252 
    253250        DeclarationNode();
    254251        ~DeclarationNode();
     
    335332
    336333        static UniqueName anonymous;
    337 
    338         // Temp to test TreeStruct
    339         const std::string * parent_name;
    340334}; // DeclarationNode
    341335
     
    449443std::ostream & operator<<( std::ostream & out, const ParseNode * node );
    450444
     445#endif // PARSENODE_H
     446
    451447// Local Variables: //
    452448// tab-width: 4 //
  • src/Parser/ParserTypes.h

    r33218c6 re0a653d  
    1010// Created On       : Sat Sep 22 08:58:10 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:33:28 2017
    13 // Update Count     : 350
     12// Last Modified On : Wed Jun 28 22:10:17 2017
     13// Update Count     : 349
    1414//
    1515
    16 #pragma once
     16#ifndef PARSER_HH
     17#define PARSER_HH
    1718
    1819int yylex();
     
    4142}; // Token
    4243
     44#endif // PARSER_HH
     45
    4346// Local Variables: //
    4447// tab-width: 4 //
  • src/Parser/TypeData.cc

    r33218c6 re0a653d  
    1010// Created On       : Sat May 16 15:12:51 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Tus Jul 18 10:10:00 2017
    13 // Update Count     : 566
     12// Last Modified On : Wed Jun 28 15:28:00 2017
     13// Update Count     : 564
    1414//
    1515
     
    6363                aggregate.fields = nullptr;
    6464                aggregate.body = false;
    65                 aggregate.tagged = false;
    66                 aggregate.parent = nullptr;
    6765                break;
    6866          case AggregateInst:
     
    123121                delete aggregate.actuals;
    124122                delete aggregate.fields;
    125                 delete aggregate.parent;
    126123                // delete aggregate;
    127124                break;
     
    195192                newtype->aggregate.kind = aggregate.kind;
    196193                newtype->aggregate.body = aggregate.body;
    197                 newtype->aggregate.tagged = aggregate.tagged;
    198                 newtype->aggregate.parent = aggregate.parent ? new string( *aggregate.parent ) : nullptr;
    199194                break;
    200195          case AggregateInst:
     
    454449          case TypeData::Builtin:
    455450                if(td->builtintype == DeclarationNode::Zero) {
    456                         return new ZeroType( noQualifiers );
     451                        return new ZeroType( emptyQualifiers );
    457452                }
    458453                else if(td->builtintype == DeclarationNode::One) {
    459                         return new OneType( noQualifiers );
     454                        return new OneType( emptyQualifiers );
    460455                }
    461456                else {
     
    624619        switch ( td->aggregate.kind ) {
    625620          case DeclarationNode::Struct:
    626                 if ( td->aggregate.tagged ) {
    627                         at = new StructDecl( *td->aggregate.name, td->aggregate.parent, attributes, linkage );
    628                         buildForall( td->aggregate.params, at->get_parameters() );
    629                         break;
    630                 }
    631621          case DeclarationNode::Coroutine:
    632622          case DeclarationNode::Monitor:
  • src/Parser/TypeData.h

    r33218c6 re0a653d  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 15:18:36 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:32:47 2017
    13 // Update Count     : 188
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jun 28 15:29:00 2017
     13// Update Count     : 186
    1414//
    1515
    16 #pragma once
     16#ifndef TYPEDATA_H
     17#define TYPEDATA_H
    1718
    1819#include "ParseNode.h"
     
    3031                DeclarationNode * fields;
    3132                bool body;
    32 
    33                 bool tagged;
    34                 const std::string * parent;
    3533        };
    3634
     
    115113void buildKRFunction( const TypeData::Function_t & function );
    116114
     115#endif // TYPEDATA_H
     116
    117117// Local Variables: //
    118118// tab-width: 4 //
  • src/Parser/TypedefTable.h

    r33218c6 re0a653d  
    1010// Created On       : Sat May 16 15:24:36 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:33:14 2017
    13 // Update Count     : 34
     12// Last Modified On : Wed Jun 28 21:56:34 2017
     13// Update Count     : 33
    1414//
    1515
    16 #pragma once
     16#ifndef TYPEDEFTABLE_H
     17#define TYPEDEFTABLE_H
    1718
    1819#include <map>
     
    9091};
    9192
     93#endif // TYPEDEFTABLE_H
     94
    9295// Local Variables: //
    9396// tab-width: 4 //
  • src/Parser/lex.ll

    r33218c6 re0a653d  
    1010 * Created On       : Sat Sep 22 08:58:10 2001
    1111 * Last Modified By : Peter A. Buhr
    12  * Last Modified On : Mon Jul 24 08:27:23 2017
    13  * Update Count     : 545
     12 * Last Modified On : Tue Jul 11 21:30:51 2017
     13 * Update Count     : 534
    1414 */
    1515
     
    125125op_unary {op_unary_only}|{op_unary_binary}|{op_unary_pre_post}
    126126
    127 op_binary_only "/"|"%"|"\\"|"^"|"&"|"|"|"<"|">"|"="|"=="|"!="|"<<"|">>"|"<="|">="|"+="|"-="|"*="|"/="|"%="|"\\="|"&="|"|="|"^="|"<<="|">>="
     127op_binary_only "/"|"%"|"^"|"&"|"|"|"<"|">"|"="|"=="|"!="|"<<"|">>"|"<="|">="|"+="|"-="|"*="|"/="|"%="|"&="|"|="|"^="|"<<="|">>="
    128128op_binary_over {op_unary_binary}|{op_binary_only}
    129129                                // op_binary_not_over "?"|"->"|"."|"&&"|"||"|"@="
     
    136136
    137137%%
    138                                 /* line directives */
     138                                   /* line directives */
    139139^{h_white}*"#"{h_white}*[0-9]+{h_white}*["][^"\n]+["].*"\n" {
    140140        /* " stop highlighting */
     
    232232int                             { KEYWORD_RETURN(INT); }
    233233__int128                { KEYWORD_RETURN(INT); }                                // GCC
    234 __int128_t              { KEYWORD_RETURN(INT); }                                // GCC
    235234__label__               { KEYWORD_RETURN(LABEL); }                              // GCC
    236235long                    { KEYWORD_RETURN(LONG); }
     
    267266__typeof                { KEYWORD_RETURN(TYPEOF); }                             // GCC
    268267__typeof__              { KEYWORD_RETURN(TYPEOF); }                             // GCC
    269 __uint128_t             { KEYWORD_RETURN(INT); }                                // GCC
    270268union                   { KEYWORD_RETURN(UNION); }
    271269unsigned                { KEYWORD_RETURN(UNSIGNED); }
    272270__builtin_va_list { KEYWORD_RETURN(VALIST); }                   // GCC
    273 virtual                 { KEYWORD_RETURN(VIRTUAL); }                    // CFA
    274271void                    { KEYWORD_RETURN(VOID); }
    275272volatile                { KEYWORD_RETURN(VOLATILE); }
     
    277274__volatile__    { KEYWORD_RETURN(VOLATILE); }                   // GCC
    278275while                   { KEYWORD_RETURN(WHILE); }
    279 with                    { KEYWORD_RETURN(WITH); }                               // CFA
    280276zero_t                  { NUMERIC_RETURN(ZERO_T); }                             // CFA
    281277
     
    340336"-"                             { ASCIIOP_RETURN(); }
    341337"*"                             { ASCIIOP_RETURN(); }
    342 "\\"                    { ASCIIOP_RETURN(); }                                   // CFA, exponentiation
    343338"/"                             { ASCIIOP_RETURN(); }
    344339"%"                             { ASCIIOP_RETURN(); }
     
    365360"+="                    { NAMEDOP_RETURN(PLUSassign); }
    366361"-="                    { NAMEDOP_RETURN(MINUSassign); }
    367 "\\="                   { NAMEDOP_RETURN(EXPassign); }                  // CFA, exponentiation
    368362"*="                    { NAMEDOP_RETURN(MULTassign); }
    369363"/="                    { NAMEDOP_RETURN(DIVassign); }
  • src/Parser/parser.yy

    r33218c6 re0a653d  
    99// Author           : Peter A. Buhr
    1010// Created On       : Sat Sep  1 20:22:55 2001
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Jul 24 09:01:14 2017
    13 // Update Count     : 2463
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tus Jul 11 13:39:00 2017
     13// Update Count     : 2416
    1414//
    1515
     
    118118%token RESTRICT                                                                                 // C99
    119119%token ATOMIC                                                                                   // C11
    120 %token FORALL LVALUE MUTEX VIRTUAL                                              // CFA
    121 %token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED
     120%token FORALL LVALUE MUTEX                                                              // CFA
     121%token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED ZERO_T ONE_T
     122%token VALIST                                                                                   // GCC
    122123%token BOOL COMPLEX IMAGINARY                                                   // C99
    123 %token ZERO_T ONE_T                                                                             // CFA
    124 %token VALIST                                                                                   // GCC
    125124%token TYPEOF LABEL                                                                             // GCC
    126125%token ENUM STRUCT UNION
     
    130129%token ATTRIBUTE EXTENSION                                                              // GCC
    131130%token IF ELSE SWITCH CASE DEFAULT DO WHILE FOR BREAK CONTINUE GOTO RETURN
    132 %token CHOOSE DISABLE ENABLE FALLTHRU TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT WITH   // CFA
     131%token CHOOSE DISABLE ENABLE FALLTHRU TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT        // CFA
    133132%token ASM                                                                                              // C99, extension ISO/IEC 9899:1999 Section J.5.10(1)
    134133%token ALIGNAS ALIGNOF GENERIC STATICASSERT                             // C11
     
    152151%token ELLIPSIS                                                                                 // ...
    153152
    154 %token EXPassign        MULTassign      DIVassign       MODassign       // \=   *=      /=      %=
     153%token MULTassign       DIVassign       MODassign                               // *=   /=      %=/
    155154%token PLUSassign       MINUSassign                                                     // +=   -=
    156155%token LSassign         RSassign                                                        // <<=  >>=
     
    169168%type<op> ptrref_operator                               unary_operator                          assignment_operator
    170169%type<en> primary_expression                    postfix_expression                      unary_expression
    171 %type<en> cast_expression                               exponential_expression          multiplicative_expression       additive_expression
    172 %type<en> shift_expression                              relational_expression           equality_expression
    173 %type<en> AND_expression                                exclusive_OR_expression         inclusive_OR_expression
    174 %type<en> logical_AND_expression                logical_OR_expression
    175 %type<en> conditional_expression                constant_expression                     assignment_expression           assignment_expression_opt
     170%type<en> cast_expression                               multiplicative_expression       additive_expression                     shift_expression
     171%type<en> relational_expression                 equality_expression                     AND_expression                          exclusive_OR_expression
     172%type<en> inclusive_OR_expression               logical_AND_expression          logical_OR_expression           conditional_expression
     173%type<en> constant_expression                   assignment_expression           assignment_expression_opt
    176174%type<en> comma_expression                              comma_expression_opt
    177 %type<en> argument_expression_list              argument_expression                     default_initialize_opt
     175%type<en> argument_expression_list              argument_expression                     assignment_opt
    178176%type<fctl> for_control_expression
    179177%type<en> subrange
     
    186184// statements
    187185%type<sn> labeled_statement                             compound_statement                      expression_statement            selection_statement
    188 %type<sn> iteration_statement                   jump_statement
    189 %type<sn> with_statement                                exception_statement                     asm_statement
     186%type<sn> iteration_statement                   jump_statement                          exception_statement                     asm_statement
    190187%type<sn> fall_through_opt                              fall_through
    191188%type<sn> statement                                             statement_list
    192189%type<sn> block_item_list                               block_item
    193 %type<sn> with_clause_opt
     190%type<sn> case_clause
    194191%type<en> case_value
    195 %type<sn> case_clause                                   case_value_list                         case_label                                      case_label_list
     192%type<sn> case_value_list                               case_label                                      case_label_list
    196193%type<sn> switch_clause_list_opt                switch_clause_list                      choose_clause_list_opt          choose_clause_list
    197194%type<sn> /* handler_list */                    handler_clause                          finally_clause
     
    571568        | '(' type_no_function ')' cast_expression
    572569                { $$ = new ExpressionNode( build_cast( $2, $4 ) ); }
    573                 // VIRTUAL cannot be opt because of look ahead issues
    574         | '(' VIRTUAL ')' cast_expression
    575                 { $$ = new ExpressionNode( build_cast( nullptr, $4 ) ); }
    576         | '(' VIRTUAL type_no_function ')' cast_expression
    577                 { $$ = new ExpressionNode( build_cast( $3, $5 ) ); }
    578570//      | '(' type_no_function ')' tuple
    579571//              { $$ = new ExpressionNode( build_cast( $2, $4 ) ); }
    580572        ;
    581573
    582 exponential_expression:
     574multiplicative_expression:
    583575        cast_expression
    584         | exponential_expression '\\' cast_expression
    585                 { $$ = new ExpressionNode( build_binary_val( OperKinds::Exp, $1, $3 ) ); }
    586         ;
    587 
    588 multiplicative_expression:
    589         exponential_expression
    590         | multiplicative_expression '*' exponential_expression
     576        | multiplicative_expression '*' cast_expression
    591577                { $$ = new ExpressionNode( build_binary_val( OperKinds::Mul, $1, $3 ) ); }
    592         | multiplicative_expression '/' exponential_expression
     578        | multiplicative_expression '/' cast_expression
    593579                { $$ = new ExpressionNode( build_binary_val( OperKinds::Div, $1, $3 ) ); }
    594         | multiplicative_expression '%' exponential_expression
     580        | multiplicative_expression '%' cast_expression
    595581                { $$ = new ExpressionNode( build_binary_val( OperKinds::Mod, $1, $3 ) ); }
    596582        ;
     
    691677        '='                                                                                     { $$ = OperKinds::Assign; }
    692678        | ATassign                                                                      { $$ = OperKinds::AtAssn; }
    693         | EXPassign                                                                     { $$ = OperKinds::ExpAssn; }
    694679        | MULTassign                                                            { $$ = OperKinds::MulAssn; }
    695680        | DIVassign                                                                     { $$ = OperKinds::DivAssn; }
     
    744729        | iteration_statement
    745730        | jump_statement
    746         | with_statement
    747731        | exception_statement
    748732        | asm_statement
     
    952936        ;
    953937
    954 with_statement:
    955         WITH '(' tuple_expression_list ')' compound_statement
    956                 { $$ = (StatementNode *)0; }                                    // FIX ME
    957         ;
    958 
    959938exception_statement:
    960939        TRY compound_statement handler_clause
     
    986965                { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, nullptr, new ExpressionNode( build_constantInteger( *$6 ) ), $9 ) ) ); }
    987966
    988         | handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop
    989                 { $$ = new StatementNode( build_catch( $1, $5, nullptr, $9 ) ); }
    990         | handler_clause handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop
    991                 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $6, nullptr, $10 ) ) ); }
    992         ;
    993 
    994 handler_predicate_opt:
    995         //empty
    996         | ';' conditional_expression
     967        | handler_key '(' push push exception_declaration pop ')' compound_statement pop
     968                { $$ = new StatementNode( build_catch( $1, $5, nullptr, $8 ) ); }
     969        | handler_clause handler_key '(' push push exception_declaration pop ')' compound_statement pop
     970                { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $6, nullptr, $9 ) ) ); }
    997971        ;
    998972
     
    15211495        | IMAGINARY                                                                                     // C99
    15221496                { $$ = DeclarationNode::newComplexType( DeclarationNode::Imaginary ); }
     1497        | VALIST                                                                                        // GCC, __builtin_va_list
     1498                { $$ = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); }
    15231499        | ZERO_T
    15241500                { $$ = DeclarationNode::newBuiltinType( DeclarationNode::Zero ); }
    15251501        | ONE_T
    15261502                { $$ = DeclarationNode::newBuiltinType( DeclarationNode::One ); }
    1527         | VALIST                                                                                        // GCC, __builtin_va_list
    1528                 { $$ = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); }
    15291503        ;
    15301504
     
    16861660        | aggregate_key attribute_list_opt typegen_name         // CFA
    16871661                { $$ = $3->addQualifiers( $2 ); }
    1688 
    1689 // Temp, testing TreeStruct
    1690     | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name
    1691         {
    1692             typedefTable.makeTypedef( *$4 );            // create typedef
    1693             if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $
    1694             forall = false;                             // reset
    1695         }
    1696       '{' field_declaration_list '}'
    1697         {
    1698             $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct,
    1699                 $4, nullptr, nullptr, $7, true )->addQualifiers( $3 );
    1700         }
    1701     | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name TYPEDEFname
    1702         {
    1703             typedefTable.makeTypedef( *$4 );            // create typedef
    1704             if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $
    1705             forall = false;                             // reset
    1706         }
    1707       '{' field_declaration_list '}'
    1708         {
    1709             $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct,
    1710                 $4, $5, nullptr, $8, true )->addQualifiers( $3 );
    1711         }
    17121662        ;
    17131663
     
    18881838cfa_parameter_declaration:                                                              // CFA, new & old style parameter declaration
    18891839        parameter_declaration
    1890         | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name default_initialize_opt
     1840        | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name assignment_opt
    18911841                { $$ = $1->addName( $2 ); }
    1892         | cfa_abstract_tuple identifier_or_type_name default_initialize_opt
     1842        | cfa_abstract_tuple identifier_or_type_name assignment_opt
    18931843                // To obtain LR(1), these rules must be duplicated here (see cfa_abstract_declarator).
    18941844                { $$ = $1->addName( $2 ); }
    1895         | type_qualifier_list cfa_abstract_tuple identifier_or_type_name default_initialize_opt
     1845        | type_qualifier_list cfa_abstract_tuple identifier_or_type_name assignment_opt
    18961846                { $$ = $2->addName( $3 )->addQualifiers( $1 ); }
    18971847        | cfa_function_specifier
     
    19101860parameter_declaration:
    19111861                // No SUE declaration in parameter list.
    1912         declaration_specifier_nobody identifier_parameter_declarator default_initialize_opt
     1862        declaration_specifier_nobody identifier_parameter_declarator assignment_opt
    19131863                {
    19141864                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    19151865                        $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr );
    19161866                }
    1917         | declaration_specifier_nobody type_parameter_redeclarator default_initialize_opt
     1867        | declaration_specifier_nobody type_parameter_redeclarator assignment_opt
    19181868                {
    19191869                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    19231873
    19241874abstract_parameter_declaration:
    1925         declaration_specifier_nobody default_initialize_opt
     1875        declaration_specifier_nobody assignment_opt
    19261876                { $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); }
    1927         | declaration_specifier_nobody abstract_parameter_declarator default_initialize_opt
     1877        | declaration_specifier_nobody abstract_parameter_declarator assignment_opt
    19281878                { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
    19291879        ;
     
    22622212        ;
    22632213
    2264 with_clause_opt:
    2265         // empty
    2266                 { $$ = (StatementNode *)0; }                                    // FIX ME
    2267         | WITH '(' tuple_expression_list ')'
    2268                 { $$ = (StatementNode *)0; }                                    // FIX ME
    2269         ;
    2270 
    22712214function_definition:
    2272         cfa_function_declaration with_clause_opt compound_statement     // CFA
     2215        cfa_function_declaration compound_statement                     // CFA
    22732216                {
    22742217                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22752218                        typedefTable.leaveScope();
    2276                         $$ = $1->addFunctionBody( $3 );
    2277                 }
    2278         | declaration_specifier function_declarator with_clause_opt compound_statement
     2219                        $$ = $1->addFunctionBody( $2 );
     2220                }
     2221        | declaration_specifier function_declarator compound_statement
    22792222                {
    22802223                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22812224                        typedefTable.leaveScope();
    2282                         $$ = $2->addFunctionBody( $4 )->addType( $1 );
    2283                 }
    2284         | type_qualifier_list function_declarator with_clause_opt compound_statement
     2225                        $$ = $2->addFunctionBody( $3 )->addType( $1 );
     2226                }
     2227        | type_qualifier_list function_declarator compound_statement
    22852228                {
    22862229                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22872230                        typedefTable.leaveScope();
    2288                         $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 );
    2289                 }
    2290         | declaration_qualifier_list function_declarator with_clause_opt compound_statement
     2231                        $$ = $2->addFunctionBody( $3 )->addQualifiers( $1 );
     2232                }
     2233        | declaration_qualifier_list function_declarator compound_statement
    22912234                {
    22922235                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22932236                        typedefTable.leaveScope();
    2294                         $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 );
    2295                 }
    2296         | declaration_qualifier_list type_qualifier_list function_declarator with_clause_opt compound_statement
     2237                        $$ = $2->addFunctionBody( $3 )->addQualifiers( $1 );
     2238                }
     2239        | declaration_qualifier_list type_qualifier_list function_declarator compound_statement
    22972240                {
    22982241                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22992242                        typedefTable.leaveScope();
    2300                         $$ = $3->addFunctionBody( $5 )->addQualifiers( $2 )->addQualifiers( $1 );
     2243                        $$ = $3->addFunctionBody( $4 )->addQualifiers( $2 )->addQualifiers( $1 );
    23012244                }
    23022245
    23032246                // Old-style K&R function definition, OBSOLESCENT (see 4)
    2304         | declaration_specifier KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
     2247        | declaration_specifier KR_function_declarator push KR_declaration_list_opt compound_statement
    23052248                {
    23062249                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    23072250                        typedefTable.leaveScope();
    2308                         $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addType( $1 );
    2309                 }
    2310         | type_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
     2251                        $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addType( $1 );
     2252                }
     2253        | type_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement
    23112254                {
    23122255                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    23132256                        typedefTable.leaveScope();
    2314                         $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addQualifiers( $1 );
     2257                        $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addQualifiers( $1 );
    23152258                }
    23162259
    23172260                // Old-style K&R function definition with "implicit int" type_specifier, OBSOLESCENT (see 4)
    2318         | declaration_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
     2261        | declaration_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement
    23192262                {
    23202263                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    23212264                        typedefTable.leaveScope();
    2322                         $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addQualifiers( $1 );
    2323                 }
    2324         | declaration_qualifier_list type_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
     2265                        $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addQualifiers( $1 );
     2266                }
     2267        | declaration_qualifier_list type_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement
    23252268                {
    23262269                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    23272270                        typedefTable.leaveScope();
    2328                         $$ = $3->addOldDeclList( $5 )->addFunctionBody( $7 )->addQualifiers( $2 )->addQualifiers( $1 );
     2271                        $$ = $3->addOldDeclList( $5 )->addFunctionBody( $6 )->addQualifiers( $2 )->addQualifiers( $1 );
    23292272                }
    23302273        ;
     
    30883031        ;
    30893032
    3090 default_initialize_opt:
     3033assignment_opt:
    30913034        // empty
    30923035                { $$ = nullptr; }
  • src/Parser/parserutility.cc

    r33218c6 re0a653d  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 15:30:39 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Tus Jul 18 10:12:00 2017
    13 // Update Count     : 8
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Wed Jun 28 22:11:32 2017
     13// Update Count     : 7
    1414//
    1515
     
    2626        UntypedExpr *comparison = new UntypedExpr( new NameExpr( "?!=?" ) );
    2727        comparison->get_args().push_back( orig );
    28         comparison->get_args().push_back( new ConstantExpr( Constant( new ZeroType( noQualifiers ), "0", (unsigned long long int)0 ) ) );
     28        comparison->get_args().push_back( new ConstantExpr( Constant( new ZeroType( emptyQualifiers ), "0", (unsigned long long int)0 ) ) );
    2929        return new CastExpr( comparison, new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );
    3030}
  • src/Parser/parserutility.h

    r33218c6 re0a653d  
    1010// Created On       : Sat May 16 15:31:46 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:32:58 2017
    13 // Update Count     : 4
     12// Last Modified On : Wed Jun 28 22:11:40 2017
     13// Update Count     : 3
    1414//
    1515
    16 #pragma once
     16#ifndef PARSEUTILITY_H
     17#define PARSEUTILITY_H
    1718
    1819#include "SynTree/SynTree.h"
    1920
    2021Expression *notZeroExpr( Expression *orig );
     22
     23#endif // PARSEUTILITY_H
    2124
    2225// Local Variables: //
  • src/ResolvExpr/Alternative.h

    r33218c6 re0a653d  
    1010// Created On       : Sat May 16 23:45:43 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:36:36 2017
    13 // Update Count     : 3
     12// Last Modified On : Sat May 16 23:54:39 2015
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef ALTERNATIVE_H
     17#define ALTERNATIVE_H
    1718
    1819#include <list>
     
    4647} // namespace ResolvExpr
    4748
     49#endif // ALTERNATIVE_H
     50
    4851// Local Variables: //
    4952// tab-width: 4 //
  • src/ResolvExpr/AlternativeFinder.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sat May 16 23:56:12 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:35:32 2017
    13 // Update Count     : 3
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Tue Apr 19 11:44:53 2016
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef ALTERNATIVEFINDER_H
     17#define ALTERNATIVEFINDER_H
    1718
    1819#include <set>
     
    131132} // namespace ResolvExpr
    132133
     134#endif // ALTERNATIVEFINDER_H
     135
    133136// Local Variables: //
    134137// tab-width: 4 //
  • src/ResolvExpr/AlternativePrinter.h

    r33218c6 re0a653d  
    1010// Created On       : Sun May 17 06:55:43 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:37:09 2017
    13 // Update Count     : 4
     12// Last Modified On : Sun May 17 06:57:12 2015
     13// Update Count     : 3
    1414//
    1515
    16 #pragma once
     16#ifndef ALTERNATIVEPRINTER_H
     17#define ALTERNATIVEPRINTER_H
    1718
    1819#include <iostream>
     
    3334} // namespace ResolvExpr
    3435
     36#endif // ALTERNATIVEPRINTER_H
     37
    3538// Local Variables: //
    3639// tab-width: 4 //
  • src/ResolvExpr/ConversionCost.h

    r33218c6 re0a653d  
    1010// Created On       : Sun May 17 09:37:28 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:38:24 2017
    13 // Update Count     : 4
     12// Last Modified On : Wed Mar  2 17:35:56 2016
     13// Update Count     : 3
    1414//
    1515
    16 #pragma once
     16#ifndef CONVERSIONCOST_H
     17#define CONVERSIONCOST_H
    1718
    1819#include "SynTree/Visitor.h"
     
    5051} // namespace ResolvExpr
    5152
     53#endif // CONVERSIONCOST_H */
     54
    5255// Local Variables: //
    5356// tab-width: 4 //
  • src/ResolvExpr/Cost.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 09:39:50 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:35:55 2017
    13 // Update Count     : 5
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jul 22 16:43:10 2015
     13// Update Count     : 4
    1414//
    1515
    16 #pragma once
     16#ifndef COST_H
     17#define COST_H
    1718
    1819#include <iostream>
     
    113114} // namespace ResolvExpr
    114115
     116#endif // COST_H
     117
    115118// Local Variables: //
    116119// tab-width: 4 //
  • src/ResolvExpr/CurrentObject.h

    r33218c6 re0a653d  
    99// Author           : Rob Schluntz
    1010// Created On       : Thu Jun  8 11:07:25 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:36:48 2017
    13 // Update Count     : 3
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Thu Jun  8 11:07:41 2017
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef CURRENT_OBJECT_H
     17#define CURRENT_OBJECT_H
    1718
    1819#include <stack>
     
    4950} // namespace ResolvExpr
    5051
     52#endif // CURRENT_OBJECT_H
     53
    5154// Local Variables: //
    5255// tab-width: 4 //
  • src/ResolvExpr/FindOpenVars.h

    r33218c6 re0a653d  
    1010// Created On       : Sun May 17 09:46:04 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:35:18 2017
    13 // Update Count     : 3
     12// Last Modified On : Sun May 17 09:47:20 2015
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef FINDOPENVARS_H
     17#define FINDOPENVARS_H
    1718
    1819#include "Unify.h"
     
    2425} // namespace ResolvExpr
    2526
     27#endif // FINDOPENVARS_H
     28
    2629// Local Variables: //
    2730// tab-width: 4 //
  • src/ResolvExpr/RenameVars.h

    r33218c6 re0a653d  
    1010// Created On       : Sun May 17 12:10:28 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:33:54 2017
    13 // Update Count     : 4
     12// Last Modified On : Wed Mar  2 17:36:39 2016
     13// Update Count     : 3
    1414//
    1515
    16 #pragma once
     16#ifndef RESOLVEXPR_RENAMEVARS_H
     17#define RESOLVEXPR_RENAMEVARS_H
    1718
    1819#include <list>
     
    5556} // namespace ResolvExpr
    5657
     58#endif // RENAMEVARS_H
     59
    5760// Local Variables: //
    5861// tab-width: 4 //
  • src/ResolvExpr/ResolveTypeof.h

    r33218c6 re0a653d  
    1010// Created On       : Sun May 17 12:14:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:38:35 2017
    13 // Update Count     : 3
     12// Last Modified On : Sun May 17 12:16:29 2015
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef RESOLVETYPEOF_H
     17#define RESOLVETYPEOF_H
    1718
    1819#include "SynTree/SynTree.h"
     
    2324} // namespace ResolvExpr
    2425
     26#endif // RESOLVETYPEOF_H
     27
    2528// Local Variables: //
    2629// tab-width: 4 //
  • src/ResolvExpr/Resolver.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 12:18:34 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:36:57 2017
    13 // Update Count     : 3
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Thu Apr 14 15:06:53 2016
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef RESOLVER_H
     17#define RESOLVER_H
    1718
    1819#include "SynTree/SynTree.h"
     
    2829} // namespace ResolvExpr
    2930
     31#endif // RESOLVER_H
     32
    3033// Local Variables: //
    3134// tab-width: 4 //
  • src/ResolvExpr/TypeEnvironment.h

    r33218c6 re0a653d  
    1010// Created On       : Sun May 17 12:24:58 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:35:45 2017
    13 // Update Count     : 3
     12// Last Modified On : Sun May 17 12:26:52 2015
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef TYPEENVIRONMENT_H
     17#define TYPEENVIRONMENT_H
    1718
    1819#include <string>
     
    9899} // namespace ResolvExpr
    99100
     101#endif // TYPEENVIRONMENT_H */
     102
    100103// Local Variables: //
    101104// tab-width: 4 //
  • src/ResolvExpr/TypeMap.h

    r33218c6 re0a653d  
    99// Author           : Aaron B. Moss
    1010// Created On       : Fri Feb 19 13:55:00 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:37:19 2017
    13 // Update Count     : 2
    14 //
    15 
    16 #pragma once
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Fri Feb 19 13:55:00 2016
     13// Update Count     : 1
     14//
     15
     16#ifndef _TYPEMAP_H
     17#define _TYPEMAP_H
    1718
    1819#include <map>
     
    203204}  // namespace ResolvExpr
    204205
     206#endif // _TYPEMAP_H
     207
    205208// Local Variables: //
    206209// tab-width: 4 //
  • src/ResolvExpr/Unify.h

    r33218c6 re0a653d  
    1010// Created On       : Sun May 17 13:09:04 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 23:09:34 2017
    13 // Update Count     : 3
     12// Last Modified On : Sun May 17 13:10:34 2015
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef UNIFY_H
     17#define UNIFY_H
    1718
    1819#include <map>
     
    7172} // namespace ResolvExpr
    7273
     74#endif // UNIFY_H
     75
    7376// Local Variables: //
    7477// tab-width: 4 //
  • src/ResolvExpr/typeops.h

    r33218c6 re0a653d  
    1010// Created On       : Sun May 17 07:28:22 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:36:18 2017
    13 // Update Count     : 3
     12// Last Modified On : Sun May 17 07:33:11 2015
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef TYPEOPS_H
     17#define TYPEOPS_H
    1718
    1819#include "SynTree/SynTree.h"
     
    156157} // namespace ResolvExpr
    157158
     159#endif // TYPEOPS_H
     160
    158161// Local Variables: //
    159162// tab-width: 4 //
  • src/SymTab/Autogen.cc

    r33218c6 re0a653d  
    1010// Created On       : Thu Mar 03 15:45:56 2016
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Jul 14 16:41:00 2017
    13 // Update Count     : 62
     12// Last Modified On : Wed Jun 28 15:30:00 2017
     13// Update Count     : 61
    1414//
    1515#include "Autogen.h"
     
    407407        void makeStructFunctions( StructDecl *aggregateDecl, StructInstType *refType, unsigned int functionNesting, std::list< Declaration * > & declsToAdd, const std::vector< FuncData > & data ) {
    408408                // Builtins do not use autogeneration.
    409                 if ( aggregateDecl->get_linkage() == LinkageSpec::BuiltinCFA ||
     409                if ( aggregateDecl->get_linkage() == LinkageSpec::Builtin ||
    410410                         aggregateDecl->get_linkage() == LinkageSpec::BuiltinC ) {
    411411                        return;
  • src/SymTab/Autogen.h

    r33218c6 re0a653d  
    1010// Created On       : Sun May 17 21:53:34 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:50:25 2017
    13 // Update Count     : 15
     12// Last Modified On : Wed Jun 21 17:25:26 2017
     13// Update Count     : 14
    1414//
    1515
    16 #pragma once
     16#ifndef AUTOGEN_H
     17#define AUTOGEN_H
    1718
    1819#include <cassert>                // for assert
     
    182183        }
    183184} // namespace SymTab
    184 
    185 // Local Variables: //
    186 // tab-width: 4 //
    187 // mode: c++ //
    188 // compile-command: "make install" //
    189 // End: //
    190 
     185#endif // AUTOGEN_H
  • src/SymTab/FixFunction.h

    r33218c6 re0a653d  
    1010// Created On       : Sun May 17 17:02:08 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:45:55 2017
    13 // Update Count     : 4
     12// Last Modified On : Wed Mar  2 17:34:06 2016
     13// Update Count     : 3
    1414//
    1515
    16 #pragma once
     16#ifndef FIXFUNCTION_H
     17#define FIXFUNCTION_H
    1718
    1819#include "SynTree/Mutator.h"  // for Mutator
     
    4950} // namespace SymTab
    5051
     52#endif // FIXFUNCTION_H
     53
    5154// Local Variables: //
    5255// tab-width: 4 //
  • src/SymTab/ImplementationType.h

    r33218c6 re0a653d  
    1010// Created On       : Sun May 17 21:35:41 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:46:19 2017
    13 // Update Count     : 3
     12// Last Modified On : Sun May 17 21:37:15 2015
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef IMPLEMENTATIONTYPE_H
     17#define IMPLEMENTATIONTYPE_H
    1718
    1819class Type;
     
    3132} // namespace SymTab
    3233
     34#endif // IMPLEMENTATIONTYPE_H
     35
    3336// Local Variables: //
    3437// tab-width: 4 //
  • src/SymTab/Indexer.h

    r33218c6 re0a653d  
    1010// Created On       : Sun May 17 21:38:55 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:46:34 2017
    13 // Update Count     : 7
     12// Last Modified On : Wed Mar  2 17:34:14 2016
     13// Update Count     : 6
    1414//
    1515
    16 #pragma once
     16#ifndef INDEXER_H
     17#define INDEXER_H
    1718
    1819#include <iosfwd>             // for ostream
     
    147148} // namespace SymTab
    148149
     150#endif // INDEXER_H
     151
    149152// Local Variables: //
    150153// tab-width: 4 //
  • src/SymTab/Mangler.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 21:44:03 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:45:30 2017
    13 // Update Count     : 15
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Aug 19 15:48:46 2015
     13// Update Count     : 14
    1414//
    1515
    16 #pragma once
     16#ifndef MANGLER_H
     17#define MANGLER_H
    1718
    1819#include <map>                // for map, map<>::value_compare
     
    8081} // SymTab
    8182
     83#endif // MANGLER_H
     84
    8285// Local Variables: //
    8386// tab-width: 4 //
  • src/SymTab/Validate.h

    r33218c6 re0a653d  
    1111// Created On       : Sun May 17 21:53:34 2015
    1212// Last Modified By : Peter A. Buhr
    13 // Last Modified On : Sat Jul 22 09:46:07 2017
    14 // Update Count     : 4
     13// Last Modified On : Tue May 19 16:49:43 2015
     14// Update Count     : 3
    1515//
    1616
    17 #pragma once
     17#ifndef VALIDATE_H
     18#define VALIDATE_H
    1819
    1920#include <list>  // for list
     
    3031} // namespace SymTab
    3132
     33#endif // VALIDATE_H
     34
    3235// Local Variables: //
    3336// tab-width: 4 //
  • src/SymTab/module.mk

    r33218c6 re0a653d  
    1010## Author           : Richard C. Bilson
    1111## Created On       : Mon Jun  1 17:49:17 2015
    12 ## Last Modified By : Andrew Beach
    13 ## Last Modified On : Wed Jul 12 13:06:00 2017
    14 ## Update Count     : 3
     12## Last Modified By : Rob Schluntz
     13## Last Modified On : Tue Jul 07 16:22:23 2015
     14## Update Count     : 2
    1515###############################################################################
    1616
     
    2121       SymTab/ImplementationType.cc \
    2222       SymTab/TypeEquality.cc \
    23        SymTab/Autogen.cc \
    24        SymTab/TreeStruct.cc
     23       SymTab/Autogen.cc
  • src/SynTree/AddStmtVisitor.h

    r33218c6 re0a653d  
    1010// Created On       : Wed Jun 22 12:05:48 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:51:08 2017
    13 // Update Count     : 9
     12// Last Modified On : Tue Jul 12 17:50:32 2016
     13// Update Count     : 8
    1414//
    1515
    16 #pragma once
     16#ifndef ADD_STATEMENT_VISITOR_H
     17#define ADD_STATEMENT_VISITOR_H
    1718
    1819#include <list>
     
    4142};
    4243
    43 // Local Variables: //
    44 // tab-width: 4 //
    45 // mode: c++ //
    46 // compile-command: "make install" //
    47 // End: //
     44#endif // ADD_STATEMENT_VISITOR_H
  • src/SynTree/Attribute.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:54:14 2017
    13 // Update Count     : 39
     12// Last Modified On : Wed Jan 18 16:27:11 2017
     13// Update Count     : 38
    1414//
    1515
    16 #pragma once
     16#ifndef GCC_ATTRIBUTE_H
     17#define GCC_ATTRIBUTE_H
    1718
    1819#include "SynTree.h"
     
    4142const std::list< Attribute * > noAttributes;
    4243
     44#endif
     45
    4346// Local Variables: //
    4447// tab-width: 4 //
  • src/SynTree/BaseSyntaxNode.h

    r33218c6 re0a653d  
    1414//
    1515
    16 #pragma once
     16#ifndef BASE_SYNTAX_NODE_H
     17#define BASE_SYNTAX_NODE_H
    1718
    1819#include "Common/utility.h"
     
    2829};
    2930
     31#endif // BASE_SYNTAX_NODE_H
     32
    3033// Local Variables: //
    3134// tab-width: 4 //
  • src/SynTree/Constant.cc

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Jul 14 14:50:00 2017
    13 // Update Count     : 29
     12// Last Modified On : Thr Jun 22 10:11:00 2017
     13// Update Count     : 28
    1414//
    1515
     
    4646}
    4747
    48 Constant Constant::null( Type * ptrtype ) {
    49         if ( nullptr == ptrtype ) {
    50                 ptrtype = new PointerType(
    51                         Type::Qualifiers(),
    52                         new VoidType( Type::Qualifiers() )
    53                         );
    54         }
    55 
    56         return Constant( ptrtype, "0", (unsigned long long int)0 );
    57 }
    58 
    5948unsigned long long Constant::get_ival() const {
    6049        assertf( safe_dynamic_cast<BasicType*>(type)->isInteger(), "Attempt to retrieve ival from non-integer constant." );
  • src/SynTree/Constant.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:54:46 2017
    13 // Update Count     : 17
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thr Jun 22 10:13:00 2017
     13// Update Count     : 15
    1414//
    1515
    16 #pragma once
     16#ifndef CONSTANT_H
     17#define CONSTANT_H
    1718
    1819#include "SynTree.h"
     
    4344        static Constant from_double( double d );
    4445
    45         /// generates a null pointer value for the given type. void * if omitted.
    46         static Constant null( Type * ptrtype = nullptr );
    47 
    4846        virtual void accept( Visitor & v ) { v.visit( this ); }
    4947        virtual Constant * acceptMutator( Mutator & m ) { return m.mutate( this ); }
     
    6058};
    6159
     60#endif // CONSTANT_H
     61
    6262// Local Variables: //
    6363// tab-width: 4 //
  • src/SynTree/Declaration.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:52:59 2017
    13 // Update Count     : 124
    14 //
    15 
    16 #pragma once
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tus Jun 27 15:31:00 2017
     13// Update Count     : 122
     14//
     15
     16#ifndef DECLARATION_H
     17#define DECLARATION_H
    1718
    1819#include <string>
     
    265266        typedef AggregateDecl Parent;
    266267  public:
    267         StructDecl( const std::string &name, DeclarationNode::Aggregate kind = DeclarationNode::Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( kind ), tagged( false ), parent_name( "" ) {}
    268         StructDecl( const std::string &name, const std::string *parent, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( DeclarationNode::Struct ), tagged( true ), parent_name( parent ? *parent : "" ) {}
     268        StructDecl( const std::string &name, DeclarationNode::Aggregate kind = DeclarationNode::Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( kind ) {}
    269269        StructDecl( const StructDecl &other ) : Parent( other ) {}
    270270
     
    273273        bool is_thread() { return kind == DeclarationNode::Thread; }
    274274
    275         // Tagged/Tree Structure Excetion
    276         bool get_tagged() { return tagged; }
    277         void set_tagged( bool newValue ) { tagged = newValue; }
    278         bool has_parent() { return parent_name != ""; }
    279         std::string get_parentName() { return parent_name; }
    280 
    281275        virtual StructDecl *clone() const { return new StructDecl( *this ); }
    282276        virtual void accept( Visitor &v ) { v.visit( this ); }
     
    285279        DeclarationNode::Aggregate kind;
    286280        virtual std::string typeString() const;
    287 
    288         bool tagged;
    289         std::string parent_name;
    290281};
    291282
     
    351342std::ostream & operator<<( std::ostream & out, const Declaration * decl );
    352343std::ostream & operator<<( std::ostream & os, const TypeDecl::Data & data );
     344
     345#endif // DECLARATION_H
    353346
    354347// Local Variables: //
  • src/SynTree/Expression.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:53:16 2017
    13 // Update Count     : 42
     12// Last Modified On : Thu Mar 30 16:44:00 2017
     13// Update Count     : 41
    1414//
    1515
    16 #pragma once
     16#ifndef EXPRESSION_H
     17#define EXPRESSION_H
    1718
    1819#include <map>
     
    797798std::ostream & operator<<( std::ostream & out, const Expression * expr );
    798799
     800#endif // EXPRESSION_H
     801
    799802// Local Variables: //
    800803// tab-width: 4 //
  • src/SynTree/Initializer.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:52:02 2017
    13 // Update Count     : 21
     12// Last Modified On : Thu Mar 23 16:12:42 2017
     13// Update Count     : 20
    1414//
    1515
    16 #pragma once
     16#ifndef INITIALIZER_H
     17#define INITIALIZER_H
    1718
    1819#include <cassert>
     
    140141std::ostream & operator<<( std::ostream & out, const Designation * des );
    141142
     143#endif // INITIALIZER_H
     144
    142145// Local Variables: //
    143146// tab-width: 4 //
  • src/SynTree/Label.h

    r33218c6 re0a653d  
    1010// Created On       : Wed Jun 8 12:53:12 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:52:44 2017
    13 // Update Count     : 3
     12// Last Modified On : Sun Aug  7 14:44:29 2016
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef LABEL_H
     17#define LABEL_H
    1718
    1819#include <string>
     
    5051static const std::list< Label > noLabels;
    5152
     53#endif // LABEL_H
     54
    5255// Local Variables: //
    5356// tab-width: 4 //
  • src/SynTree/Mutator.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:51:30 2017
    13 // Update Count     : 15
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thu Jun  8 15:45:00 2017
     13// Update Count     : 14
    1414//
    1515#include <cassert>
     
    1818#include "Common/SemanticError.h"
    1919
    20 #pragma once
     20#ifndef MUTATOR_H
     21#define MUTATOR_H
    2122
    2223class Mutator {
     
    149150}
    150151
     152#endif // MUTATOR_H
     153
    151154// Local Variables: //
    152155// tab-width: 4 //
  • src/SynTree/Statement.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:54:32 2017
    13 // Update Count     : 68
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Mon Jun 12 13:35:00 2017
     13// Update Count     : 67
    1414//
    1515
    16 #pragma once
     16#ifndef STATEMENT_H
     17#define STATEMENT_H
    1718
    1819#include "BaseSyntaxNode.h"
     
    427428std::ostream & operator<<( std::ostream & out, const Statement * statement );
    428429
     430#endif // STATEMENT_H
     431
    429432// Local Variables: //
    430433// tab-width: 4 //
  • src/SynTree/SynTree.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:51:46 2017
    13 // Update Count     : 10
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thu Jun  8 17:00:00 2017
     13// Update Count     : 9
    1414//
    1515
    16 #pragma once
     16#ifndef SYNTREE_H
     17#define SYNTREE_H
    1718
    1819#include <string>
     
    134135class Attribute;
    135136
     137#endif // SYNTREE_H
     138
    136139// Local Variables: //
    137140// tab-width: 4 //
  • src/SynTree/Type.h

    r33218c6 re0a653d  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:53:29 2017
    13 // Update Count     : 151
     12// Last Modified On : Thu Mar 23 16:16:36 2017
     13// Update Count     : 149
    1414//
    1515
    16 #pragma once
     16#ifndef TYPE_H
     17#define TYPE_H
    1718
    1819#include "BaseSyntaxNode.h"
     
    171172};
    172173
    173 extern Type::Qualifiers noQualifiers;                           // no qualifiers on constants
     174extern Type::Qualifiers emptyQualifiers;                                // no qualifiers on constants
    174175
    175176class VoidType : public Type {
     
    601602std::ostream & operator<<( std::ostream & out, const Type * type );
    602603
     604#endif // TYPE_H
     605
    603606// Local Variables: //
    604607// tab-width: 4 //
  • src/SynTree/TypeSubstitution.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:52:24 2017
    13 // Update Count     : 3
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Fri Apr 29 15:00:20 2016
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef TYPESUBSTITUTION_H
     17#define TYPESUBSTITUTION_H
    1718
    1819#include <map>
     
    179180std::ostream & operator<<( std::ostream & out, const TypeSubstitution & sub );
    180181
     182#endif // TYPESUBSTITUTION_H
     183
    181184// Local Variables: //
    182185// tab-width: 4 //
  • src/SynTree/VarExprReplacer.h

    r33218c6 re0a653d  
    99// Author           : Rob Schluntz
    1010// Created On       : Wed Jan 13 16:29:30 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:53:41 2017
    13 // Update Count     : 6
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Fri May 13 11:27:52 2016
     13// Update Count     : 5
    1414//
    1515
    16 #pragma once
     16#ifndef VAR_EXPR_REPLACER_H
     17#define VAR_EXPR_REPLACER_H
    1718
    1819#include <map>
     
    3435};
    3536
     37#endif // VAR_EXPR_REPLACER_H
     38
    3639// Local Variables: //
    3740// tab-width: 4 //
  • src/SynTree/Visitor.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:54:04 2017
    13 // Update Count     : 12
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thr Jun 08 15:45:00 2017
     13// Update Count     : 11
    1414//
    1515
    16 #pragma once
     16#ifndef VISITOR_H
     17#define VISITOR_H
    1718
    1819#include "SynTree.h"
     
    173174}
    174175
     176#endif // VISITOR_H
     177
    175178// Local Variables: //
    176179// tab-width: 4 //
  • src/Tuples/Explode.h

    r33218c6 re0a653d  
    99// Author           : Rob Schluntz
    1010// Created On       : Wed Nov 9 13:12:24 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:55:16 2017
    13 // Update Count     : 3
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Nov 9 13:20:24 2016
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef _EXPLODE_H_
     17#define _EXPLODE_H_
    1718
    1819#include "ResolvExpr/AlternativeFinder.h"
     
    9495} // namespace Tuples
    9596
     97#endif // _TUPLE_ASSIGNMENT_H_
     98
    9699// Local Variables: //
    97100// tab-width: 4 //
  • src/Tuples/Tuples.h

    r33218c6 re0a653d  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:55:00 2017
    13 // Update Count     : 16
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Nov 9 13:17:58 2016
     13// Update Count     : 15
    1414//
    1515
    16 #pragma once
     16#ifndef _TUPLES_H_
     17#define _TUPLES_H_
    1718
    1819#include <string>
     
    4849} // namespace Tuples
    4950
     51#endif // _TUPLE_ASSIGNMENT_H_
     52
    5053// Local Variables: //
    5154// tab-width: 4 //
  • src/benchmark/create_pthrd.c

    r33218c6 re0a653d  
    1414                n = atoi(argv[1]);
    1515        }
    16         printf("create %lu pthreads ... ", n);
     16        printf("%lu\n", n);
    1717
    1818        for (size_t i = 0; i < n; i++) {
    19                 pthread_t thread;
    20                 if (pthread_create(&thread, NULL, foo, NULL) < 0) {
    21                         perror( "failure" );
     19                pthread_attr_t attr;
     20                if (pthread_attr_init(&attr) < 0) {
    2221                        return 1;
    2322                }
    24 
    25                 if (pthread_join( thread, NULL) < 0) {
    26                         perror( "failure" );
     23                if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) < 0) {
     24                        return 1;
     25                }
     26                pthread_t thread;
     27                if (pthread_create(&thread, &attr, foo, NULL) < 0) {
    2728                        return 1;
    2829                }
    2930        }
    30         printf("finish\n");
     31        pthread_exit(NULL);
     32        return 0;
    3133}
  • src/driver/cfa.cc

    r33218c6 re0a653d  
    1010// Created On       : Tue Aug 20 13:44:49 2002
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 15:54:45 2017
    13 // Update Count     : 156
     12// Last Modified On : Fri Jan 20 14:38:45 2017
     13// Update Count     : 155
    1414//
    1515
     
    7676        bool cpp_flag = false;                                                          // -E or -M flag, preprocessor only
    7777        bool std_flag = false;                                                          // -std= flag
     78        bool noincstd_flag = false;                                                     // -no-include-stdhdr= flag
    7879        bool debugging __attribute(( unused )) = false;         // -g flag
    7980
     
    133134                        } else if ( arg == "-nohelp" ) {
    134135                                help = false;                                                   // strip the nohelp flag
     136                        } else if ( arg == "-no-include-stdhdr" ) {
     137                                noincstd_flag = true;                                   // strip the no-include-stdhdr flag
    135138                        } else if ( arg == "-compiler" ) {
    136139                                // use the user specified compiler
     
    231234        args[nargs] = "-I" CFA_INCDIR;
    232235        nargs += 1;
    233         args[nargs] = "-I" CFA_INCDIR "/stdhdr";
    234         nargs += 1;
     236        if ( ! noincstd_flag ) {                                                        // do not use during build
     237                args[nargs] = "-I" CFA_INCDIR "/stdhdr";
     238                nargs += 1;
     239        } // if
    235240        args[nargs] = "-I" CFA_INCDIR "/concurrency";
    236241        nargs += 1;
  • src/libcfa/Makefile.am

    r33218c6 re0a653d  
    1010## Author           : Peter A. Buhr
    1111## Created On       : Sun May 31 08:54:01 2015
    12 ## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Thu Jul 20 23:09:34 2017
    14 ## Update Count     : 220
     12## Last Modified By : Andrew Beach
     13## Last Modified On : Wed Jun 28 15:36:00 2017
     14## Update Count     : 215
    1515###############################################################################
    1616
     
    3939
    4040AM_CCASFLAGS = @CFA_FLAGS@
    41 CFLAGS = -quiet -I${abs_top_srcdir}/src/libcfa/stdhdr -XCFA -t -B${abs_top_srcdir}/src/driver ${EXTRA_FLAGS}
     41CFLAGS = -quiet -no-include-stdhdr -XCFA -t -B${abs_top_srcdir}/src/driver ${EXTRA_FLAGS}
    4242CC = ${abs_top_srcdir}/src/driver/cfa
    4343
    44 headers = fstream iostream iterator limits rational stdlib \
     44headers = assert fstream iostream iterator limits math rational stdlib \
    4545          containers/maybe containers/pair containers/result containers/vector
    4646
     
    5151
    5252libobjs = ${headers:=.o}
    53 libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} \
    54          assert.c exception.c typeobject.c
     53libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} exception.c
    5554
    5655# not all platforms support concurrency, add option do disable it
     
    6968        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
    7069
    71 libcfa_a-typeobject.o : typeobject.c
    72         ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
    73 
    7470concurrency/libcfa_d_a-invoke.o : concurrency/invoke.c
    7571        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    7672
    7773libcfa_d_a-exception.o : exception.c
    78         ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    79 
    80 libcfa_d_a-typeobject.o : typeobject.c
    8174        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    8275
     
    9184
    9285cfa_includedir = $(CFA_INCDIR)
    93 nobase_cfa_include_HEADERS = ${headers} ${stdhdr} math gmp concurrency/invoke.h
     86nobase_cfa_include_HEADERS = ${headers} ${stdhdr} gmp concurrency/invoke.h
    9487
    9588CLEANFILES = libcfa-prelude.c
  • src/libcfa/Makefile.in

    r33218c6 re0a653d  
    149149libcfa_d_a_LIBADD =
    150150am__libcfa_d_a_SOURCES_DIST = libcfa-prelude.c interpose.c \
    151         libhdr/libdebug.c fstream.c iostream.c iterator.c limits.c \
    152         rational.c stdlib.c containers/maybe.c containers/pair.c \
    153         containers/result.c containers/vector.c \
     151        libhdr/libdebug.c assert.c fstream.c iostream.c iterator.c \
     152        limits.c math.c rational.c stdlib.c containers/maybe.c \
     153        containers/pair.c containers/result.c containers/vector.c \
    154154        concurrency/coroutine.c concurrency/thread.c \
    155         concurrency/kernel.c concurrency/monitor.c assert.c \
    156         exception.c typeobject.c \
     155        concurrency/kernel.c concurrency/monitor.c exception.c \
    157156        concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/alarm.c \
    158157        concurrency/invoke.c concurrency/preemption.c
     
    162161@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_d_a-kernel.$(OBJEXT) \
    163162@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_d_a-monitor.$(OBJEXT)
    164 am__objects_2 = libcfa_d_a-fstream.$(OBJEXT) \
    165         libcfa_d_a-iostream.$(OBJEXT) libcfa_d_a-iterator.$(OBJEXT) \
    166         libcfa_d_a-limits.$(OBJEXT) libcfa_d_a-rational.$(OBJEXT) \
     163am__objects_2 = libcfa_d_a-assert.$(OBJEXT) \
     164        libcfa_d_a-fstream.$(OBJEXT) libcfa_d_a-iostream.$(OBJEXT) \
     165        libcfa_d_a-iterator.$(OBJEXT) libcfa_d_a-limits.$(OBJEXT) \
     166        libcfa_d_a-math.$(OBJEXT) libcfa_d_a-rational.$(OBJEXT) \
    167167        libcfa_d_a-stdlib.$(OBJEXT) \
    168168        containers/libcfa_d_a-maybe.$(OBJEXT) \
     
    177177        libcfa_d_a-interpose.$(OBJEXT) \
    178178        libhdr/libcfa_d_a-libdebug.$(OBJEXT) $(am__objects_2) \
    179         libcfa_d_a-assert.$(OBJEXT) libcfa_d_a-exception.$(OBJEXT) \
    180         libcfa_d_a-typeobject.$(OBJEXT) $(am__objects_3)
     179        libcfa_d_a-exception.$(OBJEXT) $(am__objects_3)
    181180am_libcfa_d_a_OBJECTS = $(am__objects_4)
    182181libcfa_d_a_OBJECTS = $(am_libcfa_d_a_OBJECTS)
     
    184183libcfa_a_LIBADD =
    185184am__libcfa_a_SOURCES_DIST = libcfa-prelude.c interpose.c \
    186         libhdr/libdebug.c fstream.c iostream.c iterator.c limits.c \
    187         rational.c stdlib.c containers/maybe.c containers/pair.c \
    188         containers/result.c containers/vector.c \
     185        libhdr/libdebug.c assert.c fstream.c iostream.c iterator.c \
     186        limits.c math.c rational.c stdlib.c containers/maybe.c \
     187        containers/pair.c containers/result.c containers/vector.c \
    189188        concurrency/coroutine.c concurrency/thread.c \
    190         concurrency/kernel.c concurrency/monitor.c assert.c \
    191         exception.c typeobject.c \
     189        concurrency/kernel.c concurrency/monitor.c exception.c \
    192190        concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/alarm.c \
    193191        concurrency/invoke.c concurrency/preemption.c
     
    196194@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_a-kernel.$(OBJEXT) \
    197195@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_a-monitor.$(OBJEXT)
    198 am__objects_6 = libcfa_a-fstream.$(OBJEXT) libcfa_a-iostream.$(OBJEXT) \
    199         libcfa_a-iterator.$(OBJEXT) libcfa_a-limits.$(OBJEXT) \
     196am__objects_6 = libcfa_a-assert.$(OBJEXT) libcfa_a-fstream.$(OBJEXT) \
     197        libcfa_a-iostream.$(OBJEXT) libcfa_a-iterator.$(OBJEXT) \
     198        libcfa_a-limits.$(OBJEXT) libcfa_a-math.$(OBJEXT) \
    200199        libcfa_a-rational.$(OBJEXT) libcfa_a-stdlib.$(OBJEXT) \
    201200        containers/libcfa_a-maybe.$(OBJEXT) \
     
    210209        libcfa_a-interpose.$(OBJEXT) \
    211210        libhdr/libcfa_a-libdebug.$(OBJEXT) $(am__objects_6) \
    212         libcfa_a-assert.$(OBJEXT) libcfa_a-exception.$(OBJEXT) \
    213         libcfa_a-typeobject.$(OBJEXT) $(am__objects_7)
     211        libcfa_a-exception.$(OBJEXT) $(am__objects_7)
    214212am_libcfa_a_OBJECTS = $(am__objects_8)
    215213libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS)
     
    260258    *) (install-info --version) >/dev/null 2>&1;; \
    261259  esac
    262 am__nobase_cfa_include_HEADERS_DIST = fstream iostream iterator limits \
    263         rational stdlib containers/maybe containers/pair \
     260am__nobase_cfa_include_HEADERS_DIST = assert fstream iostream iterator \
     261        limits math rational stdlib containers/maybe containers/pair \
    264262        containers/result containers/vector concurrency/coroutine \
    265263        concurrency/thread concurrency/kernel concurrency/monitor \
    266         ${shell echo stdhdr/*} math gmp concurrency/invoke.h
     264        ${shell echo stdhdr/*} gmp concurrency/invoke.h
    267265HEADERS = $(nobase_cfa_include_HEADERS)
    268266am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
     
    308306CFA_NAME = @CFA_NAME@
    309307CFA_PREFIX = @CFA_PREFIX@
    310 CFLAGS = -quiet -I${abs_top_srcdir}/src/libcfa/stdhdr -XCFA -t -B${abs_top_srcdir}/src/driver ${EXTRA_FLAGS}
     308CFLAGS = -quiet -no-include-stdhdr -XCFA -t -B${abs_top_srcdir}/src/driver ${EXTRA_FLAGS}
    311309CPP = @CPP@
    312310CPPFLAGS = @CPPFLAGS@
     
    414412EXTRA_FLAGS = -g -Wall -Werror -Wno-unused-function -I${abs_top_srcdir}/src/libcfa/libhdr -imacros libcfa-prelude.c @CFA_FLAGS@
    415413AM_CCASFLAGS = @CFA_FLAGS@
    416 headers = fstream iostream iterator limits rational stdlib \
     414headers = assert fstream iostream iterator limits math rational stdlib \
    417415        containers/maybe containers/pair containers/result \
    418416        containers/vector $(am__append_3)
    419417libobjs = ${headers:=.o}
    420418libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} \
    421         assert.c exception.c typeobject.c $(am__append_4)
     419        exception.c $(am__append_4)
    422420libcfa_a_SOURCES = ${libsrc}
    423421libcfa_a_CFLAGS = -nodebug -O2
     
    426424stdhdr = ${shell echo stdhdr/*}
    427425cfa_includedir = $(CFA_INCDIR)
    428 nobase_cfa_include_HEADERS = ${headers} ${stdhdr} math gmp concurrency/invoke.h
     426nobase_cfa_include_HEADERS = ${headers} ${stdhdr} gmp concurrency/invoke.h
    429427CLEANFILES = libcfa-prelude.c
    430428all: all-am
     
    592590@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-libcfa-prelude.Po@am__quote@
    593591@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-limits.Po@am__quote@
     592@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-math.Po@am__quote@
    594593@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-rational.Po@am__quote@
    595594@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-stdlib.Po@am__quote@
    596 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-typeobject.Po@am__quote@
    597595@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-assert.Po@am__quote@
    598596@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-exception.Po@am__quote@
     
    603601@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-libcfa-prelude.Po@am__quote@
    604602@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-limits.Po@am__quote@
     603@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-math.Po@am__quote@
    605604@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-rational.Po@am__quote@
    606605@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-stdlib.Po@am__quote@
    607 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-typeobject.Po@am__quote@
    608606@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/CtxSwitch-@MACHINE_TYPE@.Po@am__quote@
    609607@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-alarm.Po@am__quote@
     
    699697@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libhdr/libcfa_d_a-libdebug.obj `if test -f 'libhdr/libdebug.c'; then $(CYGPATH_W) 'libhdr/libdebug.c'; else $(CYGPATH_W) '$(srcdir)/libhdr/libdebug.c'; fi`
    700698
     699libcfa_d_a-assert.o: assert.c
     700@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-assert.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-assert.Tpo -c -o libcfa_d_a-assert.o `test -f 'assert.c' || echo '$(srcdir)/'`assert.c
     701@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-assert.Tpo $(DEPDIR)/libcfa_d_a-assert.Po
     702@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='assert.c' object='libcfa_d_a-assert.o' libtool=no @AMDEPBACKSLASH@
     703@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     704@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-assert.o `test -f 'assert.c' || echo '$(srcdir)/'`assert.c
     705
     706libcfa_d_a-assert.obj: assert.c
     707@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-assert.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-assert.Tpo -c -o libcfa_d_a-assert.obj `if test -f 'assert.c'; then $(CYGPATH_W) 'assert.c'; else $(CYGPATH_W) '$(srcdir)/assert.c'; fi`
     708@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-assert.Tpo $(DEPDIR)/libcfa_d_a-assert.Po
     709@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='assert.c' object='libcfa_d_a-assert.obj' libtool=no @AMDEPBACKSLASH@
     710@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     711@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-assert.obj `if test -f 'assert.c'; then $(CYGPATH_W) 'assert.c'; else $(CYGPATH_W) '$(srcdir)/assert.c'; fi`
     712
    701713libcfa_d_a-fstream.o: fstream.c
    702714@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-fstream.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-fstream.Tpo -c -o libcfa_d_a-fstream.o `test -f 'fstream.c' || echo '$(srcdir)/'`fstream.c
     
    755767@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-limits.obj `if test -f 'limits.c'; then $(CYGPATH_W) 'limits.c'; else $(CYGPATH_W) '$(srcdir)/limits.c'; fi`
    756768
     769libcfa_d_a-math.o: math.c
     770@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-math.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-math.Tpo -c -o libcfa_d_a-math.o `test -f 'math.c' || echo '$(srcdir)/'`math.c
     771@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-math.Tpo $(DEPDIR)/libcfa_d_a-math.Po
     772@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='math.c' object='libcfa_d_a-math.o' libtool=no @AMDEPBACKSLASH@
     773@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     774@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-math.o `test -f 'math.c' || echo '$(srcdir)/'`math.c
     775
     776libcfa_d_a-math.obj: math.c
     777@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-math.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-math.Tpo -c -o libcfa_d_a-math.obj `if test -f 'math.c'; then $(CYGPATH_W) 'math.c'; else $(CYGPATH_W) '$(srcdir)/math.c'; fi`
     778@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-math.Tpo $(DEPDIR)/libcfa_d_a-math.Po
     779@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='math.c' object='libcfa_d_a-math.obj' libtool=no @AMDEPBACKSLASH@
     780@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     781@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-math.obj `if test -f 'math.c'; then $(CYGPATH_W) 'math.c'; else $(CYGPATH_W) '$(srcdir)/math.c'; fi`
     782
    757783libcfa_d_a-rational.o: rational.c
    758784@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-rational.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-rational.Tpo -c -o libcfa_d_a-rational.o `test -f 'rational.c' || echo '$(srcdir)/'`rational.c
     
    895921@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
    896922
    897 libcfa_d_a-assert.o: assert.c
    898 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-assert.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-assert.Tpo -c -o libcfa_d_a-assert.o `test -f 'assert.c' || echo '$(srcdir)/'`assert.c
    899 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-assert.Tpo $(DEPDIR)/libcfa_d_a-assert.Po
    900 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='assert.c' object='libcfa_d_a-assert.o' libtool=no @AMDEPBACKSLASH@
    901 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    902 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-assert.o `test -f 'assert.c' || echo '$(srcdir)/'`assert.c
    903 
    904 libcfa_d_a-assert.obj: assert.c
    905 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-assert.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-assert.Tpo -c -o libcfa_d_a-assert.obj `if test -f 'assert.c'; then $(CYGPATH_W) 'assert.c'; else $(CYGPATH_W) '$(srcdir)/assert.c'; fi`
    906 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-assert.Tpo $(DEPDIR)/libcfa_d_a-assert.Po
    907 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='assert.c' object='libcfa_d_a-assert.obj' libtool=no @AMDEPBACKSLASH@
    908 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    909 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-assert.obj `if test -f 'assert.c'; then $(CYGPATH_W) 'assert.c'; else $(CYGPATH_W) '$(srcdir)/assert.c'; fi`
    910 
    911923libcfa_d_a-exception.obj: exception.c
    912924@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-exception.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-exception.Tpo -c -o libcfa_d_a-exception.obj `if test -f 'exception.c'; then $(CYGPATH_W) 'exception.c'; else $(CYGPATH_W) '$(srcdir)/exception.c'; fi`
     
    916928@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-exception.obj `if test -f 'exception.c'; then $(CYGPATH_W) 'exception.c'; else $(CYGPATH_W) '$(srcdir)/exception.c'; fi`
    917929
    918 libcfa_d_a-typeobject.obj: typeobject.c
    919 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-typeobject.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-typeobject.Tpo -c -o libcfa_d_a-typeobject.obj `if test -f 'typeobject.c'; then $(CYGPATH_W) 'typeobject.c'; else $(CYGPATH_W) '$(srcdir)/typeobject.c'; fi`
    920 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-typeobject.Tpo $(DEPDIR)/libcfa_d_a-typeobject.Po
    921 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='typeobject.c' object='libcfa_d_a-typeobject.obj' libtool=no @AMDEPBACKSLASH@
    922 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    923 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-typeobject.obj `if test -f 'typeobject.c'; then $(CYGPATH_W) 'typeobject.c'; else $(CYGPATH_W) '$(srcdir)/typeobject.c'; fi`
    924 
    925930concurrency/libcfa_d_a-alarm.o: concurrency/alarm.c
    926931@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-alarm.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-alarm.Tpo -c -o concurrency/libcfa_d_a-alarm.o `test -f 'concurrency/alarm.c' || echo '$(srcdir)/'`concurrency/alarm.c
     
    993998@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libhdr/libcfa_a-libdebug.obj `if test -f 'libhdr/libdebug.c'; then $(CYGPATH_W) 'libhdr/libdebug.c'; else $(CYGPATH_W) '$(srcdir)/libhdr/libdebug.c'; fi`
    994999
     1000libcfa_a-assert.o: assert.c
     1001@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-assert.o -MD -MP -MF $(DEPDIR)/libcfa_a-assert.Tpo -c -o libcfa_a-assert.o `test -f 'assert.c' || echo '$(srcdir)/'`assert.c
     1002@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-assert.Tpo $(DEPDIR)/libcfa_a-assert.Po
     1003@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='assert.c' object='libcfa_a-assert.o' libtool=no @AMDEPBACKSLASH@
     1004@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1005@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-assert.o `test -f 'assert.c' || echo '$(srcdir)/'`assert.c
     1006
     1007libcfa_a-assert.obj: assert.c
     1008@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-assert.obj -MD -MP -MF $(DEPDIR)/libcfa_a-assert.Tpo -c -o libcfa_a-assert.obj `if test -f 'assert.c'; then $(CYGPATH_W) 'assert.c'; else $(CYGPATH_W) '$(srcdir)/assert.c'; fi`
     1009@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-assert.Tpo $(DEPDIR)/libcfa_a-assert.Po
     1010@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='assert.c' object='libcfa_a-assert.obj' libtool=no @AMDEPBACKSLASH@
     1011@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1012@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-assert.obj `if test -f 'assert.c'; then $(CYGPATH_W) 'assert.c'; else $(CYGPATH_W) '$(srcdir)/assert.c'; fi`
     1013
    9951014libcfa_a-fstream.o: fstream.c
    9961015@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-fstream.o -MD -MP -MF $(DEPDIR)/libcfa_a-fstream.Tpo -c -o libcfa_a-fstream.o `test -f 'fstream.c' || echo '$(srcdir)/'`fstream.c
     
    10491068@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-limits.obj `if test -f 'limits.c'; then $(CYGPATH_W) 'limits.c'; else $(CYGPATH_W) '$(srcdir)/limits.c'; fi`
    10501069
     1070libcfa_a-math.o: math.c
     1071@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-math.o -MD -MP -MF $(DEPDIR)/libcfa_a-math.Tpo -c -o libcfa_a-math.o `test -f 'math.c' || echo '$(srcdir)/'`math.c
     1072@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-math.Tpo $(DEPDIR)/libcfa_a-math.Po
     1073@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='math.c' object='libcfa_a-math.o' libtool=no @AMDEPBACKSLASH@
     1074@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1075@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-math.o `test -f 'math.c' || echo '$(srcdir)/'`math.c
     1076
     1077libcfa_a-math.obj: math.c
     1078@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-math.obj -MD -MP -MF $(DEPDIR)/libcfa_a-math.Tpo -c -o libcfa_a-math.obj `if test -f 'math.c'; then $(CYGPATH_W) 'math.c'; else $(CYGPATH_W) '$(srcdir)/math.c'; fi`
     1079@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-math.Tpo $(DEPDIR)/libcfa_a-math.Po
     1080@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='math.c' object='libcfa_a-math.obj' libtool=no @AMDEPBACKSLASH@
     1081@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1082@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-math.obj `if test -f 'math.c'; then $(CYGPATH_W) 'math.c'; else $(CYGPATH_W) '$(srcdir)/math.c'; fi`
     1083
    10511084libcfa_a-rational.o: rational.c
    10521085@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-rational.o -MD -MP -MF $(DEPDIR)/libcfa_a-rational.Tpo -c -o libcfa_a-rational.o `test -f 'rational.c' || echo '$(srcdir)/'`rational.c
     
    11891222@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
    11901223
    1191 libcfa_a-assert.o: assert.c
    1192 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-assert.o -MD -MP -MF $(DEPDIR)/libcfa_a-assert.Tpo -c -o libcfa_a-assert.o `test -f 'assert.c' || echo '$(srcdir)/'`assert.c
    1193 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-assert.Tpo $(DEPDIR)/libcfa_a-assert.Po
    1194 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='assert.c' object='libcfa_a-assert.o' libtool=no @AMDEPBACKSLASH@
    1195 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1196 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-assert.o `test -f 'assert.c' || echo '$(srcdir)/'`assert.c
    1197 
    1198 libcfa_a-assert.obj: assert.c
    1199 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-assert.obj -MD -MP -MF $(DEPDIR)/libcfa_a-assert.Tpo -c -o libcfa_a-assert.obj `if test -f 'assert.c'; then $(CYGPATH_W) 'assert.c'; else $(CYGPATH_W) '$(srcdir)/assert.c'; fi`
    1200 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-assert.Tpo $(DEPDIR)/libcfa_a-assert.Po
    1201 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='assert.c' object='libcfa_a-assert.obj' libtool=no @AMDEPBACKSLASH@
    1202 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1203 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-assert.obj `if test -f 'assert.c'; then $(CYGPATH_W) 'assert.c'; else $(CYGPATH_W) '$(srcdir)/assert.c'; fi`
    1204 
    12051224libcfa_a-exception.obj: exception.c
    12061225@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-exception.obj -MD -MP -MF $(DEPDIR)/libcfa_a-exception.Tpo -c -o libcfa_a-exception.obj `if test -f 'exception.c'; then $(CYGPATH_W) 'exception.c'; else $(CYGPATH_W) '$(srcdir)/exception.c'; fi`
     
    12091228@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    12101229@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-exception.obj `if test -f 'exception.c'; then $(CYGPATH_W) 'exception.c'; else $(CYGPATH_W) '$(srcdir)/exception.c'; fi`
    1211 
    1212 libcfa_a-typeobject.obj: typeobject.c
    1213 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-typeobject.obj -MD -MP -MF $(DEPDIR)/libcfa_a-typeobject.Tpo -c -o libcfa_a-typeobject.obj `if test -f 'typeobject.c'; then $(CYGPATH_W) 'typeobject.c'; else $(CYGPATH_W) '$(srcdir)/typeobject.c'; fi`
    1214 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-typeobject.Tpo $(DEPDIR)/libcfa_a-typeobject.Po
    1215 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='typeobject.c' object='libcfa_a-typeobject.obj' libtool=no @AMDEPBACKSLASH@
    1216 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1217 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-typeobject.obj `if test -f 'typeobject.c'; then $(CYGPATH_W) 'typeobject.c'; else $(CYGPATH_W) '$(srcdir)/typeobject.c'; fi`
    12181230
    12191231concurrency/libcfa_a-alarm.o: concurrency/alarm.c
     
    15091521        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
    15101522
    1511 libcfa_a-typeobject.o : typeobject.c
    1512         ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
    1513 
    15141523concurrency/libcfa_d_a-invoke.o : concurrency/invoke.c
    15151524        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    15161525
    15171526libcfa_d_a-exception.o : exception.c
    1518         ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    1519 
    1520 libcfa_d_a-typeobject.o : typeobject.c
    15211527        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    15221528
  • src/libcfa/assert.c

    r33218c6 re0a653d  
    99// Author           : Thierry Delisle
    1010// Created On       : Mon Nov 28 12:27:26 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 15:10:26 2017
    13 // Update Count     : 2
     11// Last Modified By : Thierry Delisle
     12// Last Modified On : Mon Nov 28 12:27:26 2016
     13// Update Count     : 0
    1414//
    1515
    16 #include <assert.h>
    17 #include <stdarg.h>                                                             // varargs
    18 #include <stdio.h>                                                              // fprintf
     16#include "assert"
     17#include "stdlib"                                                                               // abort
     18
    1919#include "libhdr/libdebug.h"
    2020
    2121extern "C" {
     22        #include <stdarg.h>                                                             // varargs
     23        #include <stdio.h>                                                              // fprintf
     24
    2225        extern const char * __progname;                                         // global name of running executable (argv[0])
    2326
     
    4447                abort();
    4548        }
     49
    4650}
    4751
  • src/libcfa/concurrency/CtxSwitch-i386.S

    r33218c6 re0a653d  
     1//                               -*- Mode: Asm -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Tue Dec 6 12:27:26 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:29:25 2017
    13 // Update Count     : 1
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : Tue Dec 6 12:27:26 2016
     14// Update Count     : 0
    1415//
    1516// This  library is free  software; you  can redistribute  it and/or  modify it
     
    9899
    99100// Local Variables: //
    100 // mode: c //
    101 // tab-width: 4 //
     101// compile-command: "make install" //
    102102// End: //
  • src/libcfa/concurrency/CtxSwitch-x86_64.S

    r33218c6 re0a653d  
     1//                               -*- Mode: Asm -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Mon Nov 28 12:27:26 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:28:11 2017
    13 // Update Count     : 1
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : Mon Nov 28 12:27:26 2016
     14// Update Count     : 0
    1415//
    1516// This  library is free  software; you  can redistribute  it and/or  modify it
  • src/libcfa/concurrency/alarm.c

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Fri Jun 2 11:31:25 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:35:18 2017
    13 // Update Count     : 1
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
     
    3031
    3132//=============================================================================================
    32 // time type
    33 //=============================================================================================
    34 
    35 #define one_second         1_000_000_000ul
    36 #define one_milisecond         1_000_000ul
    37 #define one_microsecond            1_000ul
    38 #define one_nanosecond                 1ul
    39 
    40 __cfa_time_t zero_time = { 0 };
    41 
    42 void ?{}( __cfa_time_t * this ) { this->val = 0; }
    43 void ?{}( __cfa_time_t * this, zero_t zero ) { this->val = 0; }
    44 
    45 void ?{}( itimerval * this, __cfa_time_t * alarm ) {
    46         this->it_value.tv_sec = alarm->val / one_second;                        // seconds
    47         this->it_value.tv_usec = max( (alarm->val % one_second) / one_microsecond, 1000 ); // microseconds
    48         this->it_interval.tv_sec = 0;
    49         this->it_interval.tv_usec = 0;
    50 }
    51 
    52 
    53 void ?{}( __cfa_time_t * this, timespec * curr ) {
    54         uint64_t secs  = curr->tv_sec;
    55         uint64_t nsecs = curr->tv_nsec;
    56         this->val = (secs * one_second) + nsecs;
    57 }
    58 
    59 __cfa_time_t ?=?( __cfa_time_t * this, zero_t rhs ) {
    60         this->val = 0;
    61         return *this;
    62 }
    63 
    64 __cfa_time_t from_s ( uint64_t val ) { __cfa_time_t ret; ret.val = val * 1_000_000_000ul; return ret; }
    65 __cfa_time_t from_ms( uint64_t val ) { __cfa_time_t ret; ret.val = val *     1_000_000ul; return ret; }
    66 __cfa_time_t from_us( uint64_t val ) { __cfa_time_t ret; ret.val = val *         1_000ul; return ret; }
    67 __cfa_time_t from_ns( uint64_t val ) { __cfa_time_t ret; ret.val = val *             1ul; return ret; }
    68 
    69 //=============================================================================================
    7033// Clock logic
    7134//=============================================================================================
     
    7437        timespec curr;
    7538        clock_gettime( CLOCK_REALTIME, &curr );
    76         return (__cfa_time_t){ &curr };
     39        __cfa_time_t curr_time = ((__cfa_time_t)curr.tv_sec * TIMEGRAN) + curr.tv_nsec;
     40        // LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Kernel : current time is %lu\n", curr_time );
     41        return curr_time;
    7742}
    7843
    7944void __kernel_set_timer( __cfa_time_t alarm ) {
    80         itimerval val = { &alarm };
     45        LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Kernel : set timer to %lu\n", (__cfa_time_t)alarm );
     46        itimerval val;
     47        val.it_value.tv_sec = alarm / TIMEGRAN;                 // seconds
     48        val.it_value.tv_usec = (alarm % TIMEGRAN) / ( TIMEGRAN / 1_000_000L ); // microseconds
     49        val.it_interval.tv_sec = 0;
     50        val.it_interval.tv_usec = 0;
    8151        setitimer( ITIMER_REAL, &val, NULL );
    8252}
     
    8656//=============================================================================================
    8757
    88 void ?{}( alarm_node_t * this, thread_desc * thrd, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time ) {
     58void ?{}( alarm_node_t * this, thread_desc * thrd, __cfa_time_t alarm = 0, __cfa_time_t period = 0 ) {
    8959        this->thrd = thrd;
    9060        this->alarm = alarm;
     
    9565}
    9666
    97 void ?{}( alarm_node_t * this, processor   * proc, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time ) {
     67void ?{}( alarm_node_t * this, processor   * proc, __cfa_time_t alarm = 0, __cfa_time_t period = 0 ) {
    9868        this->proc = proc;
    9969        this->alarm = alarm;
     
    183153
    184154void register_self( alarm_node_t * this ) {
    185         alarm_list_t * alarms = &event_kernel->alarms;
     155        disable_interrupts();
     156        verify( !systemProcessor->pending_alarm );
     157        lock( &systemProcessor->alarm_lock DEBUG_CTX2 );
     158        {
     159                verify( validate( &systemProcessor->alarms ) );
     160                bool first = !systemProcessor->alarms.head;
    186161
    187         disable_interrupts();
    188         lock( &event_kernel->lock DEBUG_CTX2 );
    189         {
    190                 verify( validate( alarms ) );
    191                 bool first = !alarms->head;
    192 
    193                 insert( alarms, this );
     162                insert( &systemProcessor->alarms, this );
     163                if( systemProcessor->pending_alarm ) {
     164                        tick_preemption();
     165                }
    194166                if( first ) {
    195                         __kernel_set_timer( alarms->head->alarm - __kernel_get_time() );
     167                        __kernel_set_timer( systemProcessor->alarms.head->alarm - __kernel_get_time() );
    196168                }
    197169        }
    198         unlock( &event_kernel->lock );
     170        unlock( &systemProcessor->alarm_lock );
    199171        this->set = true;
    200172        enable_interrupts( DEBUG_CTX );
     
    202174
    203175void unregister_self( alarm_node_t * this ) {
     176        // LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Kernel : unregister %p start\n", this );
    204177        disable_interrupts();
    205         lock( &event_kernel->lock DEBUG_CTX2 );
     178        lock( &systemProcessor->alarm_lock DEBUG_CTX2 );
    206179        {
    207                 verify( validate( &event_kernel->alarms ) );
    208                 remove( &event_kernel->alarms, this );
     180                verify( validate( &systemProcessor->alarms ) );
     181                remove( &systemProcessor->alarms, this );
    209182        }
    210         unlock( &event_kernel->lock );
     183        unlock( &systemProcessor->alarm_lock );
    211184        enable_interrupts( DEBUG_CTX );
    212185        this->set = false;
     186        // LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Kernel : unregister %p end\n", this );
    213187}
    214 
    215 // Local Variables: //
    216 // mode: c //
    217 // tab-width: 4 //
    218 // End: //
  • src/libcfa/concurrency/alarm.h

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Fri Jun 2 11:31:25 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:59:27 2017
    13 // Update Count     : 3
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
    16 #pragma once
     17#ifndef ALARM_H
     18#define ALARM_H
    1719
    1820#include <stdbool.h>
    19 #include <stdint.h>
    2021
    21 #include <assert.h>
     22#include "assert"
     23
     24typedef unsigned long int __cfa_time_t;
    2225
    2326struct thread_desc;
    2427struct processor;
    2528
    26 struct timespec;
    27 struct itimerval;
    28 
    29 //=============================================================================================
    30 // time type
    31 //=============================================================================================
    32 
    33 struct __cfa_time_t {
    34         uint64_t val;
    35 };
    36 
    37 // ctors
    38 void ?{}( __cfa_time_t * this );
    39 void ?{}( __cfa_time_t * this, zero_t zero );
    40 void ?{}( __cfa_time_t * this, timespec * curr );
    41 void ?{}( itimerval * this, __cfa_time_t * alarm );
    42 
    43 __cfa_time_t ?=?( __cfa_time_t * this, zero_t rhs );
    44 
    45 // logical ops
    46 static inline bool ?==?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val == rhs.val; }
    47 static inline bool ?!=?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val != rhs.val; }
    48 static inline bool ?>? ( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val >  rhs.val; }
    49 static inline bool ?<? ( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val <  rhs.val; }
    50 static inline bool ?>=?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val >= rhs.val; }
    51 static inline bool ?<=?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val <= rhs.val; }
    52 
    53 static inline bool ?==?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val == rhs; }
    54 static inline bool ?!=?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val != rhs; }
    55 static inline bool ?>? ( __cfa_time_t lhs, zero_t rhs ) { return lhs.val >  rhs; }
    56 static inline bool ?<? ( __cfa_time_t lhs, zero_t rhs ) { return lhs.val <  rhs; }
    57 static inline bool ?>=?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val >= rhs; }
    58 static inline bool ?<=?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val <= rhs; }
    59 
    60 // addition/substract
    61 static inline __cfa_time_t ?+?( __cfa_time_t lhs, __cfa_time_t rhs ) {
    62         __cfa_time_t ret;
    63         ret.val = lhs.val + rhs.val;
    64         return ret;
    65 }
    66 
    67 static inline __cfa_time_t ?-?( __cfa_time_t lhs, __cfa_time_t rhs ) {
    68         __cfa_time_t ret;
    69         ret.val = lhs.val - rhs.val;
    70         return ret;
    71 }
    72 
    73 __cfa_time_t from_s ( uint64_t );
    74 __cfa_time_t from_ms( uint64_t );
    75 __cfa_time_t from_us( uint64_t );
    76 __cfa_time_t from_ns( uint64_t );
    77 
    78 extern __cfa_time_t zero_time;
    79 
    8029//=============================================================================================
    8130// Clock logic
    8231//=============================================================================================
     32
     33#define TIMEGRAN 1_000_000_000L                         // nanosecond granularity, except for timeval
    8334
    8435__cfa_time_t __kernel_get_time();
     
    10556typedef alarm_node_t ** __alarm_it_t;
    10657
    107 void ?{}( alarm_node_t * this, thread_desc * thrd, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time );
    108 void ?{}( alarm_node_t * this, processor   * proc, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time );
     58void ?{}( alarm_node_t * this, thread_desc * thrd, __cfa_time_t alarm = 0, __cfa_time_t period = 0 );
     59void ?{}( alarm_node_t * this, processor   * proc, __cfa_time_t alarm = 0, __cfa_time_t period = 0 );
    10960void ^?{}( alarm_node_t * this );
    11061
     
    12576void unregister_self( alarm_node_t * this );
    12677
     78#endif
     79
    12780// Local Variables: //
    128 // mode: c //
     81// mode: CFA //
    12982// tab-width: 6 //
    13083// End: //
  • src/libcfa/concurrency/coroutine

    r33218c6 re0a653d  
    1010// Author           : Thierry Delisle
    1111// Created On       : Mon Nov 28 12:27:26 2016
    12 // Last Modified By : Peter A. Buhr
    13 // Last Modified On : Sat Jul 22 09:57:17 2017
    14 // Update Count     : 2
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : Mon Nov 28 12:27:26 2016
     14// Update Count     : 0
    1515//
    1616
    17 #pragma once
     17#ifndef COROUTINES_H
     18#define COROUTINES_H
    1819
    19 #include <assert.h>
     20#include "assert"
    2021#include "invoke.h"
    2122
     
    6263
    6364// Get current coroutine
    64 extern thread_local coroutine_desc * volatile this_coroutine;
     65extern volatile thread_local coroutine_desc * this_coroutine;
    6566
    6667// Private wrappers for context switch and stack creation
     
    128129}
    129130
     131#endif //COROUTINES_H
     132
    130133// Local Variables: //
    131134// mode: c //
  • src/libcfa/concurrency/coroutine.c

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Mon Nov 28 12:27:26 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:34:57 2017
    13 // Update Count     : 1
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : Mon Nov 28 12:27:26 2016
     14// Update Count     : 0
    1415//
    1516
     
    2526}
    2627
    27 #include "kernel_private.h"
     28#include "kernel"
     29#include "libhdr.h"
    2830
    2931#define __CFA_INVOKE_PRIVATE__
    3032#include "invoke.h"
    3133
     34extern volatile thread_local processor * this_processor;
    3235
    3336//-----------------------------------------------------------------------------
  • src/libcfa/concurrency/invoke.c

    r33218c6 re0a653d  
     1//                              -*- Mode: C -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Tue Jan 17 12:27:26 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:28:33 2017
    13 // Update Count     : 1
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
     
    141142#endif
    142143}
    143 
    144 // Local Variables: //
    145 // mode: c //
    146 // tab-width: 4 //
    147 // End: //
  • src/libcfa/concurrency/invoke.h

    r33218c6 re0a653d  
     1//                              -*- Mode: C -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Tue Jan 17 12:27:26 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:28:56 2017
    13 // Update Count     : 1
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
     
    129130}
    130131#endif
    131 
    132 // Local Variables: //
    133 // mode: c //
    134 // tab-width: 4 //
    135 // End: //
  • src/libcfa/concurrency/kernel

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Tue Jan 17 12:27:26 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:58:39 2017
    13 // Update Count     : 2
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
    16 #pragma once
     17#ifndef KERNEL_H
     18#define KERNEL_H
    1719
    1820#include <stdbool.h>
     
    2628//-----------------------------------------------------------------------------
    2729// Locks
    28 void lock      ( spinlock * DEBUG_CTX_PARAM2 );       // Lock the spinlock, spin if already acquired
    29 void lock_yield( spinlock * DEBUG_CTX_PARAM2 );       // Lock the spinlock, yield repeatedly if already acquired
    30 bool try_lock  ( spinlock * DEBUG_CTX_PARAM2 );       // Lock the spinlock, return false if already acquired
    31 void unlock    ( spinlock * );                        // Unlock the spinlock
     30bool try_lock  ( spinlock * DEBUG_CTX_PARAM2 );
     31void lock      ( spinlock * DEBUG_CTX_PARAM2 );
     32void lock_yield( spinlock * DEBUG_CTX_PARAM2 );
     33void unlock    ( spinlock * );
    3234
    3335struct semaphore {
     
    4648// Cluster
    4749struct cluster {
    48         spinlock ready_queue_lock;                      // Ready queue locks
    49         __thread_queue_t ready_queue;                   // Ready queue for threads
    50         unsigned long long int preemption;              // Preemption rate on this cluster
     50        __thread_queue_t ready_queue;
     51        spinlock lock;
    5152};
    5253
     
    7576static inline void ^?{}(FinishAction * this) {}
    7677
    77 // Processor
    78 // Wrapper around kernel threads
    7978struct processor {
    80         // Main state
    81         struct processorCtx_t * runner;                 // Coroutine ctx who does keeps the state of the processor
    82         cluster * cltr;                                 // Cluster from which to get threads
    83         pthread_t kernel_thread;                        // Handle to pthreads
     79        struct processorCtx_t * runner;
     80        cluster * cltr;
     81        pthread_t kernel_thread;
    8482
    85         // Termination
    86         volatile bool do_terminate;                     // Set to true to notify the processor should terminate
    87         semaphore terminated;                           // Termination synchronisation
     83        semaphore terminated;
     84        volatile bool is_terminated;
    8885
    89         // RunThread data
    90         struct FinishAction finish;                     // Action to do after a thread is ran
     86        struct FinishAction finish;
    9187
    92         // Preemption data
    93         struct alarm_node_t * preemption_alarm;         // Node which is added in the discrete event simulaiton
    94         bool pending_preemption;                        // If true, a preemption was triggered in an unsafe region, the processor must preempt as soon as possible
     88        struct alarm_node_t * preemption_alarm;
     89        unsigned int preemption;
    9590
    96 #ifdef __CFA_DEBUG__
    97         char * last_enable;                             // Last function to enable preemption on this processor
    98 #endif
     91        bool pending_preemption;
     92
     93        char * last_enable;
    9994};
    10095
     
    10398void ^?{}(processor * this);
    10499
     100#endif //KERNEL_H
     101
    105102// Local Variables: //
    106 // mode: c //
    107 // tab-width: 4 //
     103// mode: CFA //
     104// tab-width: 6 //
    108105// End: //
  • src/libcfa/concurrency/kernel.c

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Tue Jan 17 12:27:26 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:33:18 2017
    13 // Update Count     : 2
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
     
    4142//-----------------------------------------------------------------------------
    4243// Kernel storage
    43 KERNEL_STORAGE(cluster,           mainCluster);
    44 KERNEL_STORAGE(processor,         mainProcessor);
    45 KERNEL_STORAGE(processorCtx_t,    mainProcessorCtx);
    46 KERNEL_STORAGE(thread_desc,       mainThread);
     44#define KERNEL_STORAGE(T,X) static char X##Storage[sizeof(T)]
     45
     46KERNEL_STORAGE(processorCtx_t, systemProcessorCtx);
     47KERNEL_STORAGE(cluster, systemCluster);
     48KERNEL_STORAGE(system_proc_t, systemProcessor);
     49KERNEL_STORAGE(thread_desc, mainThread);
    4750KERNEL_STORAGE(machine_context_t, mainThreadCtx);
    4851
    49 cluster *     mainCluster;
    50 processor *   mainProcessor;
     52cluster * systemCluster;
     53system_proc_t * systemProcessor;
    5154thread_desc * mainThread;
    5255
     
    5457// Global state
    5558
    56 thread_local coroutine_desc * volatile this_coroutine;
    57 thread_local thread_desc *    volatile this_thread;
    58 thread_local processor *      volatile this_processor;
    59 
    60 volatile thread_local bool preemption_in_progress = 0;
     59volatile thread_local processor * this_processor;
     60volatile thread_local coroutine_desc * this_coroutine;
     61volatile thread_local thread_desc * this_thread;
    6162volatile thread_local unsigned short disable_preempt_count = 1;
    6263
     
    8384
    8485        this->limit = (void *)(((intptr_t)this->base) - this->size);
    85         this->context = &storage_mainThreadCtx;
     86        this->context = &mainThreadCtxStorage;
    8687        this->top = this->base;
    8788}
     
    123124
    124125void ?{}(processor * this) {
    125         this{ mainCluster };
     126        this{ systemCluster };
    126127}
    127128
     
    129130        this->cltr = cltr;
    130131        (&this->terminated){ 0 };
    131         this->do_terminate = false;
     132        this->is_terminated = false;
    132133        this->preemption_alarm = NULL;
     134        this->preemption = default_preemption();
    133135        this->pending_preemption = false;
    134136
     
    139141        this->cltr = cltr;
    140142        (&this->terminated){ 0 };
    141         this->do_terminate = false;
     143        this->is_terminated = false;
    142144        this->preemption_alarm = NULL;
     145        this->preemption = default_preemption();
    143146        this->pending_preemption = false;
    144147        this->kernel_thread = pthread_self();
    145148
    146149        this->runner = runner;
    147         LIB_DEBUG_PRINT_SAFE("Kernel : constructing main processor context %p\n", runner);
     150        LIB_DEBUG_PRINT_SAFE("Kernel : constructing system processor context %p\n", runner);
    148151        runner{ this };
    149152}
    150153
     154LIB_DEBUG_DO( bool validate( alarm_list_t * this ); )
     155
     156void ?{}(system_proc_t * this, cluster * cltr, processorCtx_t * runner) {
     157        (&this->alarms){};
     158        (&this->alarm_lock){};
     159        this->pending_alarm = false;
     160
     161        (&this->proc){ cltr, runner };
     162
     163        verify( validate( &this->alarms ) );
     164}
     165
    151166void ^?{}(processor * this) {
    152         if( ! this->do_terminate ) {
     167        if( ! this->is_terminated ) {
    153168                LIB_DEBUG_PRINT_SAFE("Kernel : core %p signaling termination\n", this);
    154                 this->do_terminate = true;
     169                this->is_terminated = true;
    155170                P( &this->terminated );
    156171                pthread_join( this->kernel_thread, NULL );
     
    160175void ?{}(cluster * this) {
    161176        ( &this->ready_queue ){};
    162         ( &this->ready_queue_lock ){};
    163 
    164         this->preemption = default_preemption();
     177        ( &this->lock ){};
    165178}
    166179
     
    185198
    186199                thread_desc * readyThread = NULL;
    187                 for( unsigned int spin_count = 0; ! this->do_terminate; spin_count++ )
     200                for( unsigned int spin_count = 0; ! this->is_terminated; spin_count++ )
    188201                {
    189202                        readyThread = nextThread( this->cltr );
     
    329342        verifyf( thrd->next == NULL, "Expected null got %p", thrd->next );
    330343
    331         lock(   &this_processor->cltr->ready_queue_lock DEBUG_CTX2 );
    332         append( &this_processor->cltr->ready_queue, thrd );
    333         unlock( &this_processor->cltr->ready_queue_lock );
     344        lock( &systemProcessor->proc.cltr->lock DEBUG_CTX2 );
     345        append( &systemProcessor->proc.cltr->ready_queue, thrd );
     346        unlock( &systemProcessor->proc.cltr->lock );
    334347
    335348        verify( disable_preempt_count > 0 );
     
    338351thread_desc * nextThread(cluster * this) {
    339352        verify( disable_preempt_count > 0 );
    340         lock( &this->ready_queue_lock DEBUG_CTX2 );
     353        lock( &this->lock DEBUG_CTX2 );
    341354        thread_desc * head = pop_head( &this->ready_queue );
    342         unlock( &this->ready_queue_lock );
     355        unlock( &this->lock );
    343356        verify( disable_preempt_count > 0 );
    344357        return head;
     
    438451        // Start by initializing the main thread
    439452        // SKULLDUGGERY: the mainThread steals the process main thread
    440         // which will then be scheduled by the mainProcessor normally
    441         mainThread = (thread_desc *)&storage_mainThread;
     453        // which will then be scheduled by the systemProcessor normally
     454        mainThread = (thread_desc *)&mainThreadStorage;
    442455        current_stack_info_t info;
    443456        mainThread{ &info };
     
    445458        LIB_DEBUG_PRINT_SAFE("Kernel : Main thread ready\n");
    446459
    447         // Initialize the main cluster
    448         mainCluster = (cluster *)&storage_mainCluster;
    449         mainCluster{};
    450 
    451         LIB_DEBUG_PRINT_SAFE("Kernel : main cluster ready\n");
    452 
    453         // Initialize the main processor and the main processor ctx
     460        // Initialize the system cluster
     461        systemCluster = (cluster *)&systemClusterStorage;
     462        systemCluster{};
     463
     464        LIB_DEBUG_PRINT_SAFE("Kernel : System cluster ready\n");
     465
     466        // Initialize the system processor and the system processor ctx
    454467        // (the coroutine that contains the processing control flow)
    455         mainProcessor = (processor *)&storage_mainProcessor;
    456         mainProcessor{ mainCluster, (processorCtx_t *)&storage_mainProcessorCtx };
     468        systemProcessor = (system_proc_t *)&systemProcessorStorage;
     469        systemProcessor{ systemCluster, (processorCtx_t *)&systemProcessorCtxStorage };
     470
     471        // Add the main thread to the ready queue
     472        // once resume is called on systemProcessor->runner the mainThread needs to be scheduled like any normal thread
     473        ScheduleThread(mainThread);
    457474
    458475        //initialize the global state variables
    459         this_processor = mainProcessor;
     476        this_processor = &systemProcessor->proc;
    460477        this_thread = mainThread;
    461478        this_coroutine = &mainThread->cor;
     479        disable_preempt_count = 1;
    462480
    463481        // Enable preemption
    464482        kernel_start_preemption();
    465483
    466         // Add the main thread to the ready queue
    467         // once resume is called on mainProcessor->runner the mainThread needs to be scheduled like any normal thread
    468         ScheduleThread(mainThread);
    469 
    470         // SKULLDUGGERY: Force a context switch to the main processor to set the main thread's context to the current UNIX
     484        // SKULLDUGGERY: Force a context switch to the system processor to set the main thread's context to the current UNIX
    471485        // context. Hence, the main thread does not begin through CtxInvokeThread, like all other threads. The trick here is that
    472486        // mainThread is on the ready queue when this call is made.
    473         resume( mainProcessor->runner );
     487        resume( systemProcessor->proc.runner );
    474488
    475489
     
    486500        disable_interrupts();
    487501
    488         // SKULLDUGGERY: Notify the mainProcessor it needs to terminates.
     502        // SKULLDUGGERY: Notify the systemProcessor it needs to terminates.
    489503        // When its coroutine terminates, it return control to the mainThread
    490504        // which is currently here
    491         mainProcessor->do_terminate = true;
     505        systemProcessor->proc.is_terminated = true;
    492506        suspend();
    493507
     
    497511        kernel_stop_preemption();
    498512
    499         // Destroy the main processor and its context in reverse order of construction
     513        // Destroy the system processor and its context in reverse order of construction
    500514        // These were manually constructed so we need manually destroy them
    501         ^(mainProcessor->runner){};
    502         ^(mainProcessor){};
     515        ^(systemProcessor->proc.runner){};
     516        ^(systemProcessor){};
    503517
    504518        // Final step, destroy the main thread since it is no longer needed
     
    684698        return top;
    685699}
    686 
    687700// Local Variables: //
    688701// mode: c //
  • src/libcfa/concurrency/kernel_private.h

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Mon Feb 13 12:27:26 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:58:09 2017
    13 // Update Count     : 2
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
    16 #pragma once
     17#ifndef KERNEL_PRIVATE_H
     18#define KERNEL_PRIVATE_H
    1719
    1820#include "libhdr.h"
     
    2931extern "C" {
    3032        void disable_interrupts();
    31         void enable_interrupts_noPoll();
     33        void enable_interrupts_noRF();
    3234        void enable_interrupts( DEBUG_CTX_PARAM );
    3335}
     
    4345thread_desc * nextThread(cluster * this);
    4446
    45 //Block current thread and release/wake-up the following resources
    4647void BlockInternal(void);
    4748void BlockInternal(spinlock * lock);
     
    6465void spin(processor * this, unsigned int * spin_count);
    6566
    66 struct event_kernel_t {
     67struct system_proc_t {
     68        processor proc;
     69
    6770        alarm_list_t alarms;
    68         spinlock lock;
     71        spinlock alarm_lock;
     72
     73        bool pending_alarm;
    6974};
    7075
    71 extern event_kernel_t * event_kernel;
    72 
    73 extern thread_local coroutine_desc * volatile this_coroutine;
    74 extern thread_local thread_desc *    volatile this_thread;
    75 extern thread_local processor *      volatile this_processor;
    76 
    77 extern volatile thread_local bool preemption_in_progress;
     76extern cluster * systemCluster;
     77extern system_proc_t * systemProcessor;
     78extern volatile thread_local processor * this_processor;
     79extern volatile thread_local coroutine_desc * this_coroutine;
     80extern volatile thread_local thread_desc * this_thread;
    7881extern volatile thread_local unsigned short disable_preempt_count;
    7982
     
    8790extern void ThreadCtxSwitch(coroutine_desc * src, coroutine_desc * dst);
    8891
    89 //-----------------------------------------------------------------------------
    90 // Utils
    91 #define KERNEL_STORAGE(T,X) static char storage_##X[sizeof(T)]
     92#endif //KERNEL_PRIVATE_H
    9293
    9394// Local Variables: //
  • src/libcfa/concurrency/monitor

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Thd Feb 23 12:27:26 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:59:01 2017
    13 // Update Count     : 3
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
    16 #pragma once
     17#ifndef MONITOR_H
     18#define MONITOR_H
    1719
    1820#include <stddef.h>
    1921
    20 #include <assert.h>
     22#include "assert"
    2123#include "invoke.h"
    2224#include "stdlib"
     
    9799void __accept_internal( unsigned short count, __acceptable_t * acceptables, void (*func)(void) );
    98100
    99 // Local Variables: //
    100 // mode: c //
    101 // tab-width: 4 //
    102 // End: //
     101#endif //MONITOR_H
  • src/libcfa/concurrency/monitor.c

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Thd Feb 23 12:27:26 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:37:11 2017
    13 // Update Count     : 1
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
     
    527528        return head;
    528529}
    529 
    530 // Local Variables: //
    531 // mode: c //
    532 // tab-width: 4 //
    533 // End: //
  • src/libcfa/concurrency/preemption.c

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Mon Jun 5 14:20:42 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:36:05 2017
    13 // Update Count     : 2
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
     
    3334#endif
    3435
    35 //TODO move to defaults
    3636#define __CFA_DEFAULT_PREEMPTION__ 10000
    3737
    38 //TODO move to defaults
    3938__attribute__((weak)) unsigned int default_preemption() {
    4039        return __CFA_DEFAULT_PREEMPTION__;
    4140}
    4241
    43 // Short hands for signal context information
    4442#define __CFA_SIGCXT__ ucontext_t *
    4543#define __CFA_SIGPARMS__ __attribute__((unused)) int sig, __attribute__((unused)) siginfo_t *sfp, __attribute__((unused)) __CFA_SIGCXT__ cxt
    4644
    47 // FwdDeclarations : timeout handlers
    4845static void preempt( processor   * this );
    4946static void timeout( thread_desc * this );
    5047
    51 // FwdDeclarations : Signal handlers
    5248void sigHandler_ctxSwitch( __CFA_SIGPARMS__ );
     49void sigHandler_alarm    ( __CFA_SIGPARMS__ );
    5350void sigHandler_segv     ( __CFA_SIGPARMS__ );
    5451void sigHandler_abort    ( __CFA_SIGPARMS__ );
    5552
    56 // FwdDeclarations : sigaction wrapper
    5753static void __kernel_sigaction( int sig, void (*handler)(__CFA_SIGPARMS__), int flags );
    58 
    59 // FwdDeclarations : alarm thread main
    60 void * alarm_loop( __attribute__((unused)) void * args );
    61 
    62 // Machine specific register name
     54LIB_DEBUG_DO( bool validate( alarm_list_t * this ); )
     55
    6356#ifdef __x86_64__
    6457#define CFA_REG_IP REG_RIP
     
    6760#endif
    6861
    69 KERNEL_STORAGE(event_kernel_t, event_kernel);         // private storage for event kernel
    70 event_kernel_t * event_kernel;                        // kernel public handle to even kernel
    71 static pthread_t alarm_thread;                        // pthread handle to alarm thread
    72 
    73 void ?{}(event_kernel_t * this) {
    74         (&this->alarms){};
    75         (&this->lock){};
    76 }
    7762
    7863//=============================================================================================
     
    8065//=============================================================================================
    8166
    82 // Get next expired node
    83 static inline alarm_node_t * get_expired( alarm_list_t * alarms, __cfa_time_t currtime ) {
    84         if( !alarms->head ) return NULL;                          // If no alarms return null
    85         if( alarms->head->alarm >= currtime ) return NULL;        // If alarms head not expired return null
    86         return pop(alarms);                                       // Otherwise just pop head
    87 }
    88 
    89 // Tick one frame of the Discrete Event Simulation for alarms
    9067void tick_preemption() {
    91         alarm_node_t * node = NULL;                     // Used in the while loop but cannot be declared in the while condition
    92         alarm_list_t * alarms = &event_kernel->alarms;  // Local copy for ease of reading
    93         __cfa_time_t currtime = __kernel_get_time();    // Check current time once so we everything "happens at once"
    94 
    95         //Loop throught every thing expired
    96         while( node = get_expired( alarms, currtime ) ) {
    97 
    98                 // Check if this is a kernel
     68        // LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Ticking preemption\n" );
     69
     70        alarm_list_t * alarms = &systemProcessor->alarms;
     71        __cfa_time_t currtime = __kernel_get_time();
     72        while( alarms->head && alarms->head->alarm < currtime ) {
     73                alarm_node_t * node = pop(alarms);
     74                // LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Ticking %p\n", node );
     75
    9976                if( node->kernel_alarm ) {
    10077                        preempt( node->proc );
     
    10481                }
    10582
    106                 // Check if this is a periodic alarm
    107                 __cfa_time_t period = node->period;
    108                 if( period > 0 ) {
    109                         node->alarm = currtime + period;    // Alarm is periodic, add currtime to it (used cached current time)
    110                         insert( alarms, node );             // Reinsert the node for the next time it triggers
     83                verify( validate( alarms ) );
     84
     85                if( node->period > 0 ) {
     86                        node->alarm = currtime + node->period;
     87                        insert( alarms, node );
    11188                }
    11289                else {
    113                         node->set = false;                  // Node is one-shot, just mark it as not pending
    114                 }
    115         }
    116 
    117         // If there are still alarms pending, reset the timer
    118         if( alarms->head ) { __kernel_set_timer( alarms->head->alarm - currtime ); }
    119 }
    120 
    121 // Update the preemption of a processor and notify interested parties
     90                        node->set = false;
     91                }
     92        }
     93
     94        if( alarms->head ) {
     95                __kernel_set_timer( alarms->head->alarm - currtime );
     96        }
     97
     98        verify( validate( alarms ) );
     99        // LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Ticking preemption done\n" );
     100}
     101
    122102void update_preemption( processor * this, __cfa_time_t duration ) {
     103        LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Processor : %p updating preemption to %lu\n", this, duration );
     104
    123105        alarm_node_t * alarm = this->preemption_alarm;
     106        duration *= 1000;
    124107
    125108        // Alarms need to be enabled
     
    151134
    152135extern "C" {
    153         // Disable interrupts by incrementing the counter
    154136        void disable_interrupts() {
    155137                __attribute__((unused)) unsigned short new_val = __atomic_add_fetch_2( &disable_preempt_count, 1, __ATOMIC_SEQ_CST );
    156                 verify( new_val < 65_000u );              // If this triggers someone is disabling interrupts without enabling them
    157         }
    158 
    159         // Enable interrupts by decrementing the counter
    160         // If counter reaches 0, execute any pending CtxSwitch
     138                verify( new_val < (unsigned short)65_000 );
     139                verify( new_val != (unsigned short) 0 );
     140        }
     141
     142        void enable_interrupts_noRF() {
     143                __attribute__((unused)) unsigned short prev = __atomic_fetch_add_2( &disable_preempt_count, -1, __ATOMIC_SEQ_CST );
     144                verify( prev != (unsigned short) 0 );
     145        }
     146
    161147        void enable_interrupts( DEBUG_CTX_PARAM ) {
    162                 processor * proc   = this_processor;      // Cache the processor now since interrupts can start happening after the atomic add
    163                 thread_desc * thrd = this_thread;         // Cache the thread now since interrupts can start happening after the atomic add
    164 
     148                processor * proc   = this_processor;
     149                thread_desc * thrd = this_thread;
    165150                unsigned short prev = __atomic_fetch_add_2( &disable_preempt_count, -1, __ATOMIC_SEQ_CST );
    166                 verify( prev != 0u );                     // If this triggers someone is enabled already enabled interruptsverify( prev != 0u );
    167 
    168                 // Check if we need to prempt the thread because an interrupt was missed
     151                verify( prev != (unsigned short) 0 );
    169152                if( prev == 1 && proc->pending_preemption ) {
    170153                        proc->pending_preemption = false;
     
    172155                }
    173156
    174                 // For debugging purposes : keep track of the last person to enable the interrupts
    175157                LIB_DEBUG_DO( proc->last_enable = caller; )
    176158        }
    177 
    178         // Disable interrupts by incrementint the counter
    179         // Don't execute any pending CtxSwitch even if counter reaches 0
    180         void enable_interrupts_noPoll() {
    181                 __attribute__((unused)) unsigned short prev = __atomic_fetch_add_2( &disable_preempt_count, -1, __ATOMIC_SEQ_CST );
    182                 verify( prev != 0u );                     // If this triggers someone is enabled already enabled interrupts
    183         }
    184 }
    185 
    186 // sigprocmask wrapper : unblock a single signal
     159}
     160
    187161static inline void signal_unblock( int sig ) {
    188162        sigset_t mask;
     
    195169}
    196170
    197 // sigprocmask wrapper : block a single signal
    198171static inline void signal_block( int sig ) {
    199172        sigset_t mask;
     
    206179}
    207180
    208 // kill wrapper : signal a processor
     181static inline bool preemption_ready() {
     182        return disable_preempt_count == 0;
     183}
     184
     185static inline void defer_ctxSwitch() {
     186        this_processor->pending_preemption = true;
     187}
     188
     189static inline void defer_alarm() {
     190        systemProcessor->pending_alarm = true;
     191}
     192
    209193static void preempt( processor * this ) {
    210194        pthread_kill( this->kernel_thread, SIGUSR1 );
    211195}
    212196
    213 // reserved for future use
    214197static void timeout( thread_desc * this ) {
    215198        //TODO : implement waking threads
    216199}
    217200
    218 
    219 // Check if a CtxSwitch signal handler shoud defer
    220 // If true  : preemption is safe
    221 // If false : preemption is unsafe and marked as pending
    222 static inline bool preemption_ready() {
    223         bool ready = disable_preempt_count == 0 && !preemption_in_progress; // Check if preemption is safe
    224         this_processor->pending_preemption = !ready;                        // Adjust the pending flag accordingly
    225         return ready;
    226 }
    227 
    228201//=============================================================================================
    229202// Kernel Signal Startup/Shutdown logic
    230203//=============================================================================================
    231204
    232 // Startup routine to activate preemption
    233 // Called from kernel_startup
     205static pthread_t alarm_thread;
     206void * alarm_loop( __attribute__((unused)) void * args );
     207
    234208void kernel_start_preemption() {
    235209        LIB_DEBUG_PRINT_SAFE("Kernel : Starting preemption\n");
    236 
    237         // Start with preemption disabled until ready
    238         disable_preempt_count = 1;
    239 
    240         // Initialize the event kernel
    241         event_kernel = (event_kernel_t *)&storage_event_kernel;
    242         event_kernel{};
    243 
    244         // Setup proper signal handlers
    245         __kernel_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO );         // CtxSwitch handler
    246         // __kernel_sigaction( SIGSEGV, sigHandler_segv     , SA_SIGINFO );      // Failure handler
    247         // __kernel_sigaction( SIGBUS , sigHandler_segv     , SA_SIGINFO );      // Failure handler
     210        __kernel_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO );
     211        // __kernel_sigaction( SIGSEGV, sigHandler_segv     , SA_SIGINFO );
     212        // __kernel_sigaction( SIGBUS , sigHandler_segv     , SA_SIGINFO );
    248213
    249214        signal_block( SIGALRM );
     
    252217}
    253218
    254 // Shutdown routine to deactivate preemption
    255 // Called from kernel_shutdown
    256219void kernel_stop_preemption() {
    257         LIB_DEBUG_PRINT_SAFE("Kernel : Preemption stopping\n");
    258 
    259         // Block all signals since we are already shutting down
    260220        sigset_t mask;
    261221        sigfillset( &mask );
    262222        sigprocmask( SIG_BLOCK, &mask, NULL );
    263223
    264         // Notify the alarm thread of the shutdown
    265         sigval val = { 1 };
    266         pthread_sigqueue( alarm_thread, SIGALRM, val );
    267 
    268         // Wait for the preemption thread to finish
     224        pthread_kill( alarm_thread, SIGINT );
    269225        pthread_join( alarm_thread, NULL );
    270 
    271         // Preemption is now fully stopped
    272 
    273226        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption stopped\n");
    274227}
    275228
    276 // Raii ctor/dtor for the preemption_scope
    277 // Used by thread to control when they want to receive preemption signals
    278229void ?{}( preemption_scope * this, processor * proc ) {
    279         (&this->alarm){ proc, zero_time, zero_time };
     230        (&this->alarm){ proc };
    280231        this->proc = proc;
    281232        this->proc->preemption_alarm = &this->alarm;
    282 
    283         update_preemption( this->proc, from_us(this->proc->cltr->preemption) );
     233        update_preemption( this->proc, this->proc->preemption );
    284234}
    285235
     
    287237        disable_interrupts();
    288238
    289         update_preemption( this->proc, zero_time );
     239        update_preemption( this->proc, 0 );
    290240}
    291241
     
    294244//=============================================================================================
    295245
    296 // Context switch signal handler
    297 // Receives SIGUSR1 signal and causes the current thread to yield
    298246void sigHandler_ctxSwitch( __CFA_SIGPARMS__ ) {
    299247        LIB_DEBUG_DO( last_interrupt = (void *)(cxt->uc_mcontext.gregs[CFA_REG_IP]); )
    300 
    301         // Check if it is safe to preempt here
    302         if( !preemption_ready() ) { return; }
    303 
    304         preemption_in_progress = true;                      // Sync flag : prevent recursive calls to the signal handler
    305         signal_unblock( SIGUSR1 );                          // We are about to CtxSwitch out of the signal handler, let other handlers in
    306         preemption_in_progress = false;                     // Clear the in progress flag
    307 
    308         // Preemption can occur here
    309 
    310         BlockInternal( (thread_desc*)this_thread );         // Do the actual CtxSwitch
    311 }
    312 
    313 // Main of the alarm thread
    314 // Waits on SIGALRM and send SIGUSR1 to whom ever needs it
     248        if( preemption_ready() ) {
     249                signal_unblock( SIGUSR1 );
     250                BlockInternal( (thread_desc*)this_thread );
     251        }
     252        else {
     253                defer_ctxSwitch();
     254        }
     255}
     256
     257// void sigHandler_alarm( __CFA_SIGPARMS__ ) {
     258//      LIB_DEBUG_DO( last_interrupt = (void *)(cxt->uc_mcontext.gregs[CFA_REG_IP]); )
     259//      verify( this_processor == systemProcessor );
     260
     261//      if( try_lock( &systemProcessor->alarm_lock DEBUG_CTX2 ) ) {
     262//              tick_preemption();
     263//              systemProcessor->pending_alarm = false;
     264//              unlock( &systemProcessor->alarm_lock );
     265//      }
     266//      else {
     267//              defer_alarm();
     268//      }
     269
     270//      signal_unblock( SIGALRM );
     271
     272//      if( preemption_ready() && this_processor->pending_preemption ) {
     273
     274//              this_processor->pending_preemption = false;
     275//              BlockInternal( (thread_desc*)this_thread );
     276//      }
     277// }
     278
    315279void * alarm_loop( __attribute__((unused)) void * args ) {
    316         // Block sigalrms to control when they arrive
    317280        sigset_t mask;
    318281        sigemptyset( &mask );
    319282        sigaddset( &mask, SIGALRM );
     283        sigaddset( &mask, SIGUSR2 );
     284        sigaddset( &mask, SIGINT  );
    320285
    321286        if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) {
     
    323288        }
    324289
    325         // Main loop
    326290        while( true ) {
    327                 // Wait for a sigalrm
    328                 siginfo_t info;
    329                 int sig = sigwaitinfo( &mask, &info );
    330 
    331                 // If another signal arrived something went wrong
    332                 assertf(sig == SIGALRM, "Kernel Internal Error, sigwait: Unexpected signal %d (%d : %d)\n", sig, info.si_code, info.si_value.sival_int);
    333 
    334                 LIB_DEBUG_PRINT_SAFE("Kernel : Caught alarm from %d with %d\n", info.si_code, info.si_value.sival_int );
    335                 // Switch on the code (a.k.a. the sender) to
    336                 switch( info.si_code )
    337                 {
    338                 // Timers can apparently be marked as sent for the kernel
    339                 // In either case, tick preemption
    340                 case SI_TIMER:
    341                 case SI_KERNEL:
    342                         LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread tick\n");
    343                         lock( &event_kernel->lock DEBUG_CTX2 );
    344                         tick_preemption();
    345                         unlock( &event_kernel->lock );
    346                         break;
    347                 // Signal was not sent by the kernel but by an other thread
    348                 case SI_QUEUE:
    349                         // For now, other thread only signal the alarm thread to shut it down
    350                         // If this needs to change use info.si_value and handle the case here
    351                         goto EXIT;
    352                 }
    353         }
    354 
    355 EXIT:
    356         LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread stopping\n");
    357         return NULL;
    358 }
    359 
    360 // Sigaction wrapper : register an signal handler
     291                int sig;
     292                if( sigwait( &mask, &sig ) != 0  ) {
     293                        abortf( "internal error, sigwait" );
     294                }
     295
     296                switch( sig) {
     297                        case SIGALRM:
     298                                LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread tick\n");
     299                                lock( &systemProcessor->alarm_lock DEBUG_CTX2 );
     300                                tick_preemption();
     301                                unlock( &systemProcessor->alarm_lock );
     302                                break;
     303                        case SIGUSR2:
     304                                //TODO other actions
     305                                break;
     306                        case SIGINT:
     307                                LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread stopping\n");
     308                                return NULL;
     309                        default:
     310                                abortf( "internal error, sigwait returned sig %d", sig );
     311                                break;
     312                }
     313        }
     314}
     315
    361316static void __kernel_sigaction( int sig, void (*handler)(__CFA_SIGPARMS__), int flags ) {
    362317        struct sigaction act;
     
    374329}
    375330
    376 // Sigaction wrapper : restore default handler
     331typedef void (*sa_handler_t)(int);
     332
    377333static void __kernel_sigdefault( int sig ) {
    378334        struct sigaction act;
    379335
    380         act.sa_handler = SIG_DFL;
     336        // act.sa_handler = SIG_DFL;
    381337        act.sa_flags = 0;
    382338        sigemptyset( &act.sa_mask );
     
    486442//      raise( SIGABRT );
    487443// }
    488 
    489 // Local Variables: //
    490 // mode: c //
    491 // tab-width: 4 //
    492 // End: //
  • src/libcfa/concurrency/preemption.h

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Mon Jun 5 14:20:42 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:34:25 2017
    13 // Update Count     : 1
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
    16 #pragma once
     17#ifndef PREEMPTION_H
     18#define PREEMPTION_H
    1719
    1820#include "alarm.h"
     
    3335void ^?{}( preemption_scope * this );
    3436
    35 // Local Variables: //
    36 // mode: c //
    37 // tab-width: 4 //
    38 // End: //
     37#endif //PREEMPTION_H
  • src/libcfa/concurrency/thread

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Tue Jan 17 12:27:26 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:59:40 2017
    13 // Update Count     : 3
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
    16 #pragma once
     17#ifndef THREADS_H
     18#define THREADS_H
    1719
    18 #include <assert.h>
     20#include "assert"
    1921#include "invoke.h"
    2022
     
    5254}
    5355
    54 extern thread_local thread_desc * volatile this_thread;
     56extern volatile thread_local thread_desc * this_thread;
    5557
    5658forall( dtype T | is_thread(T) )
     
    8284void yield( unsigned times );
    8385
     86#endif //THREADS_H
     87
    8488// Local Variables: //
    8589// mode: c //
  • src/libcfa/concurrency/thread.c

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Tue Jan 17 12:27:26 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:34:46 2017
    13 // Update Count     : 1
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : --
     14// Update Count     : 0
    1415//
    1516
     
    8687
    8788void yield( void ) {
    88         BlockInternal( this_thread );
     89        BlockInternal( (thread_desc *)this_thread );
    8990}
    9091
  • src/libcfa/containers/maybe

    r33218c6 re0a653d  
    99// Author           : Andrew Beach
    1010// Created On       : Wed May 24 14:43:00 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 10:00:52 2017
    13 // Update Count     : 4
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Jun 16 15:42:00 2017
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16
     17#ifndef MAYBE_H
     18#define MAYBE_H
    1719
    1820#include <stdbool.h>
     
    6466void set_none(maybe(T) * this);
    6567
    66 // Local Variables: //
    67 // mode: c //
    68 // tab-width: 4 //
    69 // End: //
     68#endif // MAYBE_H
  • src/libcfa/containers/maybe.c

    r33218c6 re0a653d  
    99// Author           : Andrew Beach
    1010// Created On       : Wed May 24 15:40:00 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 15:23:50 2017
    13 // Update Count     : 2
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thr May 25 15:24:00 2017
     13// Update Count     : 1
    1414//
    1515
    1616#include <containers/maybe>
    17 #include <assert.h>
     17#include <assert>
    1818
    1919
  • src/libcfa/containers/pair

    r33218c6 re0a653d  
    99// Author           : Aaron Moss
    1010// Created On       : Wed Apr 12 15:32:00 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:59:53 2017
    13 // Update Count     : 2
     11// Last Modified By : Aaron Moss
     12// Last Modified On : Wed Apr 12 15:32:00 2017
     13// Update Count     : 1
    1414//
    1515
    16 #pragma once
     16#ifndef PAIR_H
     17#define PAIR_H
    1718
    1819forall(otype R, otype S) struct pair {
     
    4344int ?>=?(pair(R, S) p, pair(R, S) q);
    4445
     46#endif // PAIR_H
     47
    4548// Local Variables: //
    4649// mode: c //
  • src/libcfa/containers/result

    r33218c6 re0a653d  
    99// Author           : Andrew Beach
    1010// Created On       : Wed May 24 14:45:00 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 10:00:44 2017
    13 // Update Count     : 3
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Jun 16 15:41:00 2017
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16
     17#ifndef RESULT_H
     18#define RESULT_H
    1719
    1820#include <stdbool.h>
     
    7678void set_error(result(T, E) * this, E error);
    7779
    78 // Local Variables: //
    79 // mode: c //
    80 // tab-width: 4 //
    81 // End: //
     80#endif // RESULT_H
  • src/libcfa/containers/result.c

    r33218c6 re0a653d  
    99// Author           : Andrew Beach
    1010// Created On       : Wed May 24 15:40:00 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 15:23:58 2017
    13 // Update Count     : 2
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thr May 25 15:27:00 2017
     13// Update Count     : 1
    1414//
    1515
    1616#include <containers/result>
    17 #include <assert.h>
     17#include <assert>
    1818
    1919
  • src/libcfa/containers/vector

    r33218c6 re0a653d  
    1010// Created On       : Tue Jul  5 18:00:07 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 10:01:18 2017
    13 // Update Count     : 3
     12// Last Modified On : Tue Jul  5 18:01:35 2016
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef VECTOR_H
     17#define VECTOR_H
    1718
    1819extern "C" {
     
    165166// }
    166167
     168#endif // VECTOR_H
     169
    167170// Local Variables: //
    168171// mode: c //
  • src/libcfa/exception.h

    r33218c6 re0a653d  
    99// Author           : Andrew Beach
    1010// Created On       : Mon Jun 26 15:11:00 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:57:02 2017
    13 // Update Count     : 3
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tus Jul 11 16:31:00 2017
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef EXCEPTION_H
     17#define EXCEPTION_H
     18
    1719
    1820// Later to be a special structure type.
     
    5355}
    5456#endif
     57
     58#endif //EXCEPTION_H
  • src/libcfa/fstream.c

    r33218c6 re0a653d  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 15:20:49 2017
    13 // Update Count     : 252
     12// Last Modified On : Thu Jul  6 18:38:25 2017
     13// Update Count     : 251
    1414//
    1515
    1616#include "fstream"
    1717
     18extern "C" {
    1819#include <stdio.h>                                                                              // vfprintf, vfscanf
    1920#include <stdlib.h>                                                                             // exit
     
    2324#include <float.h>                                                                              // DBL_DIG, LDBL_DIG
    2425#include <complex.h>                                                                    // creal, cimag
    25 #include <assert.h>
     26}
     27#include "assert"
    2628
    2729#define IO_MSG "I/O error: "
  • src/libcfa/interpose.c

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Wed Mar 29 16:10:31 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:27:33 2017
    13 // Update Count     : 1
     12// Last Modified By :
     13// Last Modified On :
     14// Update Count     : 0
    1415//
    1516
     
    140141        }
    141142}
    142 
    143 // Local Variables: //
    144 // mode: c //
    145 // tab-width: 4 //
    146 // End: //
  • src/libcfa/interpose.h

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Wed Mar 29 15:56:41 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:33:02 2017
    13 // Update Count     : 2
     12// Last Modified By :
     13// Last Modified On :
     14// Update Count     : 0
    1415//
    1516
    16 #pragma once
     17#ifndef INTERPOSE_H
     18#define INTERPOSE_H
    1719
    1820void * interpose_symbol( const char* symbol, , const char *version );
     
    2123extern __typeof__( exit ) libc_abort __attribute__(( noreturn ));
    2224
    23 // Local Variables: //
    24 // mode: c //
    25 // tab-width: 4 //
    26 // End: //
     25#endif //INTERPOSE_H
  • src/libcfa/iostream.c

    r33218c6 re0a653d  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Jul 16 21:12:03 2017
    13 // Update Count     : 398
     12// Last Modified On : Thu Jul  6 18:14:17 2017
     13// Update Count     : 396
    1414//
    1515
     
    125125forall( dtype ostype | ostream( ostype ) )
    126126ostype * ?|?( ostype * os, float _Complex fc ) {
    127         if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    128         fmt( os, "%g%+gi", crealf( fc ), cimagf( fc ) );
     127        os | crealf( fc );
     128        _Bool temp = sepDisable( os );                                          // disable separators within complex value
     129        if ( cimagf( fc ) >= 0 ) os | '+';                                      // negative value prints '-'
     130        os | cimagf( fc ) | 'i';
     131        sepReset( os, temp );                                                           // reset separator
    129132        return os;
    130133} // ?|?
     
    132135forall( dtype ostype | ostream( ostype ) )
    133136ostype * ?|?( ostype * os, double _Complex dc ) {
    134         if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    135         fmt( os, "%.*lg%+.*lgi", DBL_DIG, creal( dc ), DBL_DIG, cimag( dc ) );
     137        os | creal( dc );
     138        _Bool temp = sepDisable( os );                                          // disable separators within complex value
     139        if ( cimag( dc ) >= 0 ) os | '+';                                       // negative value prints '-'
     140        os | cimag( dc ) | 'i';
     141        sepReset( os, temp );                                                           // reset separator
    136142        return os;
    137143} // ?|?
     
    139145forall( dtype ostype | ostream( ostype ) )
    140146ostype * ?|?( ostype * os, long double _Complex ldc ) {
    141         if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    142         fmt( os, "%.*Lg%+.*Lgi", LDBL_DIG, creall( ldc ), LDBL_DIG, cimagl( ldc ) );
     147        os | creall( ldc );
     148        _Bool temp = sepDisable( os );                                          // disable separators within complex value
     149        if ( cimagl( ldc ) >= 0 ) os | '+';                                     // negative value prints '-'
     150        os | cimagl( ldc ) | 'i';
     151        sepReset( os, temp );                                                           // reset separator
    143152        return os;
    144153} // ?|?
  • src/libcfa/libhdr.h

    r33218c6 re0a653d  
    99// Author           : Thierry Delisle
    1010// Created On       : Mon Nov 28 12:27:26 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:56:32 2017
    13 // Update Count     : 1
     11// Last Modified By : Thierry Delisle
     12// Last Modified On : Mon Nov 28 12:27:26 2016
     13// Update Count     : 0
    1414//
    1515
    16 #pragma once
     16#ifndef __LIB_HDR_H__
     17#define __LIB_HDR_H__
    1718
    1819#include "libalign.h"
     
    2021#include "libtools.h"
    2122
     23#endif //__LIB_HDR_H__
     24
    2225// Local Variables: //
    2326// mode: c //
  • src/libcfa/libhdr/libalign.h

    r33218c6 re0a653d  
     1//                              -*- Mode: C++ -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Mon Nov 28 12:27:26 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 23:05:35 2017
    13 // Update Count     : 2
     12// Last Modified By : Thierry Delisle
     13// Last Modified On : Mon Nov 28 12:27:26 2016
     14// Update Count     : 0
    1415//
    1516// This  library is free  software; you  can redistribute  it and/or  modify it
     
    2728//
    2829
    29 #pragma once
    3030
    31 #include <assert.h>
     31#ifndef __LIB_ALIGN_H__
     32#define __LIB_ALIGN_H__
     33
     34#include "assert"
    3235#include <stdbool.h>
    3336
     
    5861} // uCeiling
    5962
     63
     64#endif // __LIB_ALIGN_H__
     65
     66
    6067// Local Variables: //
    6168// compile-command: "make install" //
  • src/libcfa/libhdr/libdebug.h

    r33218c6 re0a653d  
    99// Author           : Thierry Delisle
    1010// Created On       : Mon Nov 28 12:27:26 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 10:02:24 2017
    13 // Update Count     : 1
     11// Last Modified By : Thierry Delisle
     12// Last Modified On : Mon Nov 28 12:27:26 2016
     13// Update Count     : 0
    1414//
    1515
    16 #pragma once
     16#ifndef __LIB_DEBUG_H__
     17#define __LIB_DEBUG_H__
    1718
    1819#ifdef __CFA_DEBUG__
     
    7778#endif
    7879
     80#endif //__LIB_DEBUG_H__
     81
    7982// Local Variables: //
    8083// mode: c //
  • src/libcfa/libhdr/libtools.h

    r33218c6 re0a653d  
    99// Author           : Thierry Delisle
    1010// Created On       : Mon Nov 28 12:27:26 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 10:02:10 2017
    13 // Update Count     : 1
     11// Last Modified By : Thierry Delisle
     12// Last Modified On : Mon Nov 28 12:27:26 2016
     13// Update Count     : 0
    1414//
    1515
    16 #pragma once
     16#ifndef __LIB_TOOLS_H__
     17#define __LIB_TOOLS_H__
    1718
    1819// void abortf( const char *fmt, ... ) {
     
    2930#endif
    3031
     32#endif //__LIB_TOOLS_H__
     33
    3134// Local Variables: //
    3235// mode: c //
  • src/libcfa/math

    r33218c6 re0a653d  
    1010// Created On       : Mon Apr 18 23:37:04 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 17:03:13 2017
    13 // Update Count     : 101
     12// Last Modified On : Fri Jul  7 09:34:15 2017
     13// Update Count     : 61
    1414//
    1515
    1616#pragma once
    1717
    18 #include <math.h>
    19 #include <complex.h>
    20 
    21 static inline float ?%?( float x, float y ) { return fmodf( x, y ); }
    22 static inline float fmod( float x, float y ) { return fmodf( x, y ); }
    23 static inline double ?%?( double x, double y ) { return fmod( x, y ); }
     18extern "C" {
     19#include <math.h>                                                                               // fpclassify, isfinite, isnormal, isnan, isinf
     20} // extern "C"
     21
     22float ?%?( float, float );
     23float fmod( float, float );
     24double ?%?( double, double );
    2425// extern "C" { double fmod( double, double ); }
    25 static inline long double ?%?( long double x, long double y ) { return fmodl( x, y ); }
    26 static inline long double fmod( long double x, long double y ) { return fmodl( x, y ); }
    27 
    28 static inline float remainder( float x, float y ) { return remainderf( x, y ); }
     26long double ?%?( long double, long double );
     27long double fmod( long double, long double );
     28
     29float remainder( float, float );
    2930// extern "C" { double remainder( double, double ); }
    30 static inline long double remainder( long double x, long double y ) { return remainderl( x, y ); }
    31 
    32 static inline float remquo( float x, float y, int * quo ) { return remquof( x, y, quo ); }
    33 // extern "C" { double remquo( double x, double y, int * quo ); }
    34 static inline long double remquo( long double x, long double y, int * quo ) { return remquol( x, y, quo ); }
    35 static inline [ int, float ] remquo( float x, float y ) { int quo; x = remquof( x, y, &quo ); return [ quo, x ]; }
    36 static inline [ int, double ] remquo( double x, double y ) { int quo; x = remquo( x, y, &quo ); return [ quo, x ]; }
    37 static inline [ int, long double ] remquo( long double x, long double y ) { int quo; x = remquol( x, y, &quo ); return [ quo, x ]; }
    38 
    39 // alternative name for remquo
    40 static inline float div( float x, float y, int * quo ) { return remquof( x, y, quo ); }
    41 static inline double div( double x, double y, int * quo ) { return remquo( x, y, quo ); }
    42 static inline long double div( long double x, long double y, int * quo ) { return remquol( x, y, quo ); }
    43 static inline [ int, float ] div( float x, float y ) { int quo; x = remquof( x, y, &quo ); return [ quo, x ]; }
    44 static inline [ int, double ] div( double x, double y ) { int quo; x = remquo( x, y, &quo ); return [ quo, x ]; }
    45 static inline [ int, long double ] div( long double x, long double y ) { int quo; x = remquol( x, y, &quo ); return [ quo, x ]; }
    46 
    47 static inline float fma( float x, float y, float z ) { return fmaf( x, y, z ); }
     31long double remainder( long double, long double );
     32
     33[ int, float ] remquo( float, float );
     34float remquo( float, float, int * );
     35[ int, double ] remquo( double, double );
     36// extern "C" { double remquo( double, double, int * ); }
     37[ int, long double ] remquo( long double, long double );
     38long double remquo( long double, long double, int * );
     39
     40[ int, float ] div( float, float );                                             // alternative name for remquo
     41float div( float, float, int * );
     42[ int, double ] div( double, double );
     43// extern "C" { double div( double, double, int * ); }
     44[ int, long double ] div( long double, long double );
     45long double div( long double, long double, int * );
     46
     47float fma( float, float, float );
    4848// extern "C" { double fma( double, double, double ); }
    49 static inline long double fma( long double x, long double y, long double z ) { return fmal( x, y, z ); }
    50 
    51 static inline float fdim( float x, float y ) { return fdimf( x, y ); }
     49long double fma( long double, long double, long double );
     50
     51float fdim( float, float );
    5252// extern "C" { double fdim( double, double ); }
    53 static inline long double fdim( long double x, long double y ) { return fdiml( x, y ); }
    54 
    55 static inline float nan( const char * tag ) { return nanf( tag ); }
     53long double fdim( long double, long double );
     54
     55float nan( const char * );
    5656// extern "C" { double nan( const char * ); }
    57 static inline long double nan( const char * tag ) { return nanl( tag ); }
     57long double nan( const char * );
    5858
    5959//---------------------- Exponential ----------------------
    6060
    61 static inline float exp( float x ) { return expf( x ); }
     61float exp( float );
    6262// extern "C" { double exp( double ); }
    63 static inline long double exp( long double x ) { return expl( x ); }
    64 static inline float _Complex exp( float _Complex x ) { return cexpf( x ); }
    65 static inline double _Complex exp( double _Complex x ) { return cexp( x ); }
    66 static inline long double _Complex exp( long double _Complex x ) { return cexpl( x ); }
    67 
    68 static inline float exp2( float x ) { return exp2f( x ); }
     63long double exp( long double );
     64float _Complex exp( float _Complex );
     65double _Complex exp( double _Complex );
     66long double _Complex exp( long double _Complex );
     67
     68float exp2( float );
    6969// extern "C" { double exp2( double ); }
    70 static inline long double exp2( long double x ) { return exp2l( x ); }
    71 //static inline float _Complex exp2( float _Complex x ) { return cexp2f( x ); }
    72 //static inline double _Complex exp2( double _Complex x ) { return cexp2( x ); }
    73 //static inline long double _Complex exp2( long double _Complex x ) { return cexp2l( x ); }
    74 
    75 static inline float expm1( float x ) { return expm1f( x ); }
     70long double exp2( long double );
     71// float _Complex exp2( float _Complex );
     72// double _Complex exp2( double _Complex );
     73// long double _Complex exp2( long double _Complex );
     74
     75float expm1( float );
    7676// extern "C" { double expm1( double ); }
    77 static inline long double expm1( long double x ) { return expm1l( x ); }
    78 
    79 static inline float pow( float x, float y ) { return powf( x, y ); }
     77long double expm1( long double );
     78
     79float log( float );
     80// extern "C" { double log( double ); }
     81long double log( long double );
     82float _Complex log( float _Complex );
     83double _Complex log( double _Complex );
     84long double _Complex log( long double _Complex );
     85
     86float log2( float );
     87// extern "C" { double log2( double ); }
     88long double log2( long double );
     89// float _Complex log2( float _Complex );
     90// double _Complex log2( double _Complex );
     91// long double _Complex log2( long double _Complex );
     92
     93float log10( float );
     94// extern "C" { double log10( double ); }
     95long double log10( long double );
     96// float _Complex log10( float _Complex );
     97// double _Complex log10( double _Complex );
     98// long double _Complex log10( long double _Complex );
     99
     100float log1p( float );
     101// extern "C" { double log1p( double ); }
     102long double log1p( long double );
     103
     104int ilogb( float );
     105// extern "C" { int ilogb( double ); }
     106int ilogb( long double );
     107
     108float logb( float );
     109// extern "C" { double logb( double ); }
     110long double logb( long double );
     111
     112//---------------------- Power ----------------------
     113
     114float sqrt( float );
     115// extern "C" { double sqrt( double ); }
     116long double sqrt( long double );
     117float _Complex sqrt( float _Complex );
     118double _Complex sqrt( double _Complex );
     119long double _Complex sqrt( long double _Complex );
     120
     121float cbrt( float );
     122// extern "C" { double cbrt( double ); }
     123long double cbrt( long double );
     124
     125float hypot( float, float );
     126// extern "C" { double hypot( double, double ); }
     127long double hypot( long double, long double );
     128
     129float pow( float, float );
    80130// extern "C" { double pow( double, double ); }
    81 static inline long double pow( long double x, long double y ) { return powl( x, y ); }
    82 static inline float _Complex pow( float _Complex x, float _Complex y ) { return cpowf( x, y ); }
    83 static inline double _Complex pow( double _Complex x, double _Complex y ) { return cpow( x, y ); }
    84 static inline long double _Complex pow( long double _Complex x, long double _Complex y ) { return cpowl( x, y ); }
    85 
    86 //---------------------- Logarithm ----------------------
    87 
    88 static inline float log( float x ) { return logf( x ); }
    89 // extern "C" { double log( double ); }
    90 static inline long double log( long double x ) { return logl( x ); }
    91 static inline float _Complex log( float _Complex x ) { return clogf( x ); }
    92 static inline double _Complex log( double _Complex x ) { return clog( x ); }
    93 static inline long double _Complex log( long double _Complex x ) { return clogl( x ); }
    94 
    95 static inline float log2( float x ) { return log2f( x ); }
    96 // extern "C" { double log2( double ); }
    97 static inline long double log2( long double x ) { return log2l( x ); }
    98 // static inline float _Complex log2( float _Complex x ) { return clog2f( x ); }
    99 // static inline double _Complex log2( double _Complex x ) { return clog2( x ); }
    100 // static inline long double _Complex log2( long double _Complex x ) { return clog2l( x ); }
    101 
    102 static inline float log10( float x ) { return log10f( x ); }
    103 // extern "C" { double log10( double ); }
    104 static inline long double log10( long double x ) { return log10l( x ); }
    105 // static inline float _Complex log10( float _Complex x ) { return clog10f( x ); }
    106 // static inline double _Complex log10( double _Complex x ) { return clog10( x ); }
    107 // static inline long double _Complex log10( long double _Complex x ) { return clog10l( x ); }
    108 
    109 static inline float log1p( float x ) { return log1pf( x ); }
    110 // extern "C" { double log1p( double ); }
    111 static inline long double log1p( long double x ) { return log1pl( x ); }
    112 
    113 static inline int ilogb( float x ) { return ilogbf( x ); }
    114 // extern "C" { int ilogb( double ); }
    115 static inline int ilogb( long double x ) { return ilogbl( x ); }
    116 
    117 static inline float logb( float x ) { return logbf( x ); }
    118 // extern "C" { double logb( double ); }
    119 static inline long double logb( long double x ) { return logbl( x ); }
    120 
    121 static inline float sqrt( float x ) { return sqrtf( x ); }
    122 // extern "C" { double sqrt( double ); }
    123 static inline long double sqrt( long double x ) { return sqrtl( x ); }
    124 static inline float _Complex sqrt( float _Complex x ) { return csqrtf( x ); }
    125 static inline double _Complex sqrt( double _Complex x ) { return csqrt( x ); }
    126 static inline long double _Complex sqrt( long double _Complex x ) { return csqrtl( x ); }
    127 
    128 static inline float cbrt( float x ) { return cbrtf( x ); }
    129 // extern "C" { double cbrt( double ); }
    130 static inline long double cbrt( long double x ) { return cbrtl( x ); }
    131 
    132 static inline float hypot( float x, float y ) { return hypotf( x, y ); }
    133 // extern "C" { double hypot( double, double ); }
    134 static inline long double hypot( long double x, long double y ) { return hypotl( x, y ); }
     131long double pow( long double, long double );
     132float _Complex pow( float _Complex, float _Complex );
     133double _Complex pow( double _Complex, double _Complex );
     134long double _Complex pow( long double _Complex, long double _Complex );
    135135
    136136//---------------------- Trigonometric ----------------------
    137137
    138 static inline float sin( float x ) { return sinf( x ); }
     138float sin( float );
    139139// extern "C" { double sin( double ); }
    140 static inline long double sin( long double x ) { return sinl( x ); }
    141 static inline float _Complex sin( float _Complex x ) { return csinf( x ); }
    142 static inline double _Complex sin( double _Complex x ) { return csin( x ); }
    143 static inline long double _Complex sin( long double _Complex x ) { return csinl( x ); }
    144 
    145 static inline float cos( float x ) { return cosf( x ); }
     140long double sin( long double );
     141float _Complex sin( float _Complex );
     142double _Complex sin( double _Complex );
     143long double _Complex sin( long double _Complex );
     144
     145float cos( float );
    146146// extern "C" { double cos( double ); }
    147 static inline long double cos( long double x ) { return cosl( x ); }
    148 static inline float _Complex cos( float _Complex x ) { return ccosf( x ); }
    149 static inline double _Complex cos( double _Complex x ) { return ccos( x ); }
    150 static inline long double _Complex cos( long double _Complex x ) { return ccosl( x ); }
    151 
    152 static inline float tan( float x ) { return tanf( x ); }
     147long double cos( long double );
     148float _Complex cos( float _Complex );
     149double _Complex cos( double _Complex );
     150long double _Complex cos( long double _Complex );
     151
     152float tan( float );
    153153// extern "C" { double tan( double ); }
    154 static inline long double tan( long double x ) { return tanl( x ); }
    155 static inline float _Complex tan( float _Complex x ) { return ctanf( x ); }
    156 static inline double _Complex tan( double _Complex x ) { return ctan( x ); }
    157 static inline long double _Complex tan( long double _Complex x ) { return ctanl( x ); }
    158 
    159 static inline float asin( float x ) { return asinf( x ); }
     154long double tan( long double );
     155float _Complex tan( float _Complex );
     156double _Complex tan( double _Complex );
     157long double _Complex tan( long double _Complex );
     158
     159float asin( float );
    160160// extern "C" { double asin( double ); }
    161 static inline long double asin( long double x ) { return asinl( x ); }
    162 static inline float _Complex asin( float _Complex x ) { return casinf( x ); }
    163 static inline double _Complex asin( double _Complex x ) { return casin( x ); }
    164 static inline long double _Complex asin( long double _Complex x ) { return casinl( x ); }
    165 
    166 static inline float acos( float x ) { return acosf( x ); }
     161long double asin( long double );
     162float _Complex asin( float _Complex );
     163double _Complex asin( double _Complex );
     164long double _Complex asin( long double _Complex );
     165
     166float acos( float );
    167167// extern "C" { double acos( double ); }
    168 static inline long double acos( long double x ) { return acosl( x ); }
    169 static inline float _Complex acos( float _Complex x ) { return cacosf( x ); }
    170 static inline double _Complex acos( double _Complex x ) { return cacos( x ); }
    171 static inline long double _Complex acos( long double _Complex x ) { return cacosl( x ); }
    172 
    173 static inline float atan( float x ) { return atanf( x ); }
     168long double acos( long double );
     169float _Complex acos( float _Complex );
     170double _Complex acos( double _Complex );
     171long double _Complex acos( long double _Complex );
     172
     173float atan( float );
    174174// extern "C" { double atan( double ); }
    175 static inline long double atan( long double x ) { return atanl( x ); }
    176 static inline float _Complex atan( float _Complex x ) { return catanf( x ); }
    177 static inline double _Complex atan( double _Complex x ) { return catan( x ); }
    178 static inline long double _Complex atan( long double _Complex x ) { return catanl( x ); }
    179 
    180 static inline float atan2( float x, float y ) { return atan2f( x, y ); }
     175long double atan( long double );
     176float _Complex atan( float _Complex );
     177double _Complex atan( double _Complex );
     178long double _Complex atan( long double _Complex );
     179
     180float atan2( float, float );
    181181// extern "C" { double atan2( double, double ); }
    182 static inline long double atan2( long double x, long double y ) { return atan2l( x, y ); }
    183 
    184 // alternative name for atan2
    185 static inline float atan( float x, float y ) { return atan2f( x, y ); }
    186 static inline double atan( double x, double y ) { return atan2( x, y ); }
    187 static inline long double atan( long double x, long double y ) { return atan2l( x, y ); }
     182long double atan2( long double, long double );
     183
     184float atan( float, float );                                                             // alternative name for atan2
     185double atan( double, double );
     186long double atan( long double, long double );
    188187
    189188//---------------------- Hyperbolic ----------------------
    190189
    191 static inline float sinh( float x ) { return sinhf( x ); }
     190float sinh( float );
    192191// extern "C" { double sinh( double ); }
    193 static inline long double sinh( long double x ) { return sinhl( x ); }
    194 static inline float _Complex sinh( float _Complex x ) { return csinhf( x ); }
    195 static inline double _Complex sinh( double _Complex x ) { return csinh( x ); }
    196 static inline long double _Complex sinh( long double _Complex x ) { return csinhl( x ); }
    197 
    198 static inline float cosh( float x ) { return coshf( x ); }
     192long double sinh( long double );
     193float _Complex sinh( float _Complex );
     194double _Complex sinh( double _Complex );
     195long double _Complex sinh( long double _Complex );
     196
     197float cosh( float );
    199198// extern "C" { double cosh( double ); }
    200 static inline long double cosh( long double x ) { return coshl( x ); }
    201 static inline float _Complex cosh( float _Complex x ) { return ccoshf( x ); }
    202 static inline double _Complex cosh( double _Complex x ) { return ccosh( x ); }
    203 static inline long double _Complex cosh( long double _Complex x ) { return ccoshl( x ); }
    204 
    205 static inline float tanh( float x ) { return tanhf( x ); }
     199long double cosh( long double );
     200float _Complex cosh( float _Complex );
     201double _Complex cosh( double _Complex );
     202long double _Complex cosh( long double _Complex );
     203
     204float tanh( float );
    206205// extern "C" { double tanh( double ); }
    207 static inline long double tanh( long double x ) { return tanhl( x ); }
    208 static inline float _Complex tanh( float _Complex x ) { return ctanhf( x ); }
    209 static inline double _Complex tanh( double _Complex x ) { return ctanh( x ); }
    210 static inline long double _Complex tanh( long double _Complex x ) { return ctanhl( x ); }
    211 
    212 static inline float asinh( float x ) { return asinhf( x ); }
     206long double tanh( long double );
     207float _Complex tanh( float _Complex );
     208double _Complex tanh( double _Complex );
     209long double _Complex tanh( long double _Complex );
     210
     211float asinh( float );
    213212// extern "C" { double asinh( double ); }
    214 static inline long double asinh( long double x ) { return asinhl( x ); }
    215 static inline float _Complex asinh( float _Complex x ) { return casinhf( x ); }
    216 static inline double _Complex asinh( double _Complex x ) { return casinh( x ); }
    217 static inline long double _Complex asinh( long double _Complex x ) { return casinhl( x ); }
    218 
    219 static inline float acosh( float x ) { return acoshf( x ); }
     213long double asinh( long double );
     214float _Complex asinh( float _Complex );
     215double _Complex asinh( double _Complex );
     216long double _Complex asinh( long double _Complex );
     217
     218float acosh( float );
    220219// extern "C" { double acosh( double ); }
    221 static inline long double acosh( long double x ) { return acoshl( x ); }
    222 static inline float _Complex acosh( float _Complex x ) { return cacoshf( x ); }
    223 static inline double _Complex acosh( double _Complex x ) { return cacosh( x ); }
    224 static inline long double _Complex acosh( long double _Complex x ) { return cacoshl( x ); }
    225 
    226 static inline float atanh( float x ) { return atanhf( x ); }
     220long double acosh( long double );
     221float _Complex acosh( float _Complex );
     222double _Complex acosh( double _Complex );
     223long double _Complex acosh( long double _Complex );
     224
     225float atanh( float );
    227226// extern "C" { double atanh( double ); }
    228 static inline long double atanh( long double x ) { return atanhl( x ); }
    229 static inline float _Complex atanh( float _Complex x ) { return catanhf( x ); }
    230 static inline double _Complex atanh( double _Complex x ) { return catanh( x ); }
    231 static inline long double _Complex atanh( long double _Complex x ) { return catanhl( x ); }
     227long double atanh( long double );
     228float _Complex atanh( float _Complex );
     229double _Complex atanh( double _Complex );
     230long double _Complex atanh( long double _Complex );
    232231
    233232//---------------------- Error / Gamma ----------------------
    234233
    235 static inline float erf( float x ) { return erff( x ); }
     234float erf( float );
    236235// extern "C" { double erf( double ); }
    237 static inline long double erf( long double x ) { return erfl( x ); }
     236long double erf( long double );
    238237// float _Complex erf( float _Complex );
    239238// double _Complex erf( double _Complex );
    240239// long double _Complex erf( long double _Complex );
    241240
    242 static inline float erfc( float x ) { return erfcf( x ); }
     241float erfc( float );
    243242// extern "C" { double erfc( double ); }
    244 static inline long double erfc( long double x ) { return erfcl( x ); }
     243long double erfc( long double );
    245244// float _Complex erfc( float _Complex );
    246245// double _Complex erfc( double _Complex );
    247246// long double _Complex erfc( long double _Complex );
    248247
    249 static inline float lgamma( float x ) { return lgammaf( x ); }
     248float lgamma( float );
    250249// extern "C" { double lgamma( double ); }
    251 static inline long double lgamma( long double x ) { return lgammal( x ); }
    252 static inline float lgamma( float x, int * sign ) { return lgammaf_r( x, sign ); }
    253 static inline double lgamma( double x, int * sign ) { return lgamma_r( x, sign ); }
    254 static inline long double lgamma( long double x, int * sign ) { return lgammal_r( x, sign ); }
    255 
    256 static inline float tgamma( float x ) { return tgammaf( x ); }
     250long double lgamma( long double );
     251float lgamma( float, int * );
     252double lgamma( double, int * );
     253long double lgamma( long double, int * );
     254
     255float tgamma( float );
    257256// extern "C" { double tgamma( double ); }
    258 static inline long double tgamma( long double x ) { return tgammal( x ); }
     257long double tgamma( long double );
    259258
    260259//---------------------- Nearest Integer ----------------------
    261260
    262 static inline float floor( float x ) { return floorf( x ); }
     261float floor( float );
    263262// extern "C" { double floor( double ); }
    264 static inline long double floor( long double x ) { return floorl( x ); }
    265 
    266 static inline float ceil( float x ) { return ceilf( x ); }
     263long double floor( long double );
     264
     265float ceil( float );
    267266// extern "C" { double ceil( double ); }
    268 static inline long double ceil( long double x ) { return ceill( x ); }
    269 
    270 static inline float trunc( float x ) { return truncf( x ); }
     267long double ceil( long double );
     268
     269float trunc( float );
    271270// extern "C" { double trunc( double ); }
    272 static inline long double trunc( long double x ) { return truncl( x ); }
    273 
    274 static inline float rint( float x ) { return rintf( x ); }
    275 // extern "C" { double rint( double x ); }
    276 static inline long double rint( long double x ) { return rintl( x ); }
    277 static inline long int rint( float x ) { return lrintf( x ); }
    278 static inline long int rint( double x ) { return lrint( x ); }
    279 static inline long int rint( long double x ) { return lrintl( x ); }
    280 static inline long long int rint( float x ) { return llrintf( x ); }
    281 static inline long long int rint( double x ) { return llrint( x ); }
    282 static inline long long int rint( long double x ) { return llrintl( x ); }
    283 
    284 static inline long int lrint( float x ) { return lrintf( x ); }
     271long double trunc( long double );
     272
     273float rint( float );
     274long double rint( long double );
     275long int rint( float );
     276long int rint( double );
     277long int rint( long double );
     278long long int rint( float );
     279long long int rint( double );
     280long long int rint( long double );
     281
     282long int lrint( float );
    285283// extern "C" { long int lrint( double ); }
    286 static inline long int lrint( long double x ) { return lrintl( x ); }
    287 static inline long long int llrint( float x ) { return llrintf( x ); }
     284long int lrint( long double );
     285long long int llrint( float );
    288286// extern "C" { long long int llrint( double ); }
    289 static inline long long int llrint( long double x ) { return llrintl( x ); }
    290 
    291 static inline float nearbyint( float x ) { return nearbyintf( x ); }
     287long long int llrint( long double );
     288
     289float nearbyint( float );
    292290// extern "C" { double nearbyint( double ); }
    293 static inline long double nearbyint( long double x ) { return nearbyintl( x ); }
    294 
    295 static inline float round( float x ) { return roundf( x ); }
    296 // extern "C" { double round( double x ); }
    297 static inline long double round( long double x ) { return roundl( x ); }
    298 static inline long int round( float x ) { return lroundf( x ); }
    299 static inline long int round( double x ) { return lround( x ); }
    300 static inline long int round( long double x ) { return lroundl( x ); }
    301 static inline long long int round( float x ) { return llroundf( x ); }
    302 static inline long long int round( double x ) { return llround( x ); }
    303 static inline long long int round( long double x ) { return llroundl( x ); }
    304 
    305 static inline long int lround( float x ) { return lroundf( x ); }
     291long double nearbyint( long double );
     292
     293float round( float );
     294long double round( long double );
     295long int round( float );
     296long int round( double );
     297long int round( long double );
     298long long int round( float );
     299long long int round( double );
     300long long int round( long double );
     301
     302long int lround( float );
    306303// extern "C" { long int lround( double ); }
    307 static inline long int lround( long double x ) { return lroundl( x ); }
    308 static inline long long int llround( float x ) { return llroundf( x ); }
     304long int lround( long double );
     305long long int llround( float );
    309306// extern "C" { long long int llround( double ); }
    310 static inline long long int llround( long double x ) { return llroundl( x ); }
     307long long int llround( long double );
    311308
    312309//---------------------- Manipulation ----------------------
    313310
    314 static inline float copysign( float x, float y ) { return copysignf( x, y ); }
     311float copysign( float, float );
    315312// extern "C" { double copysign( double, double ); }
    316 static inline long double copysign( long double x, long double y ) { return copysignl( x, y ); }
    317 
    318 static inline float frexp( float x, int * ip ) { return frexpf( x, ip ); }
     313long double copysign( long double, long double );
     314
     315float frexp( float, int * );
    319316// extern "C" { double frexp( double, int * ); }
    320 static inline long double frexp( long double x, int * ip ) { return frexpl( x, ip ); }
    321 
    322 static inline float ldexp( float x, int exp2 ) { return ldexpf( x, exp2 ); }
     317long double frexp( long double, int * );
     318
     319float ldexp( float, int );
    323320// extern "C" { double ldexp( double, int ); }
    324 static inline long double ldexp( long double x, int exp2 ) { return ldexpl( x, exp2 ); }
    325 
    326 static inline [ float, float ] modf( float x ) { float i; x = modff( x, &i ); return [ i, x ]; }
    327 static inline float modf( float x, float * i ) { return modff( x, i ); }
    328 static inline [ double, double ] modf( double x ) { double i; x = modf( x, &i ); return [ i, x ]; }
     321long double ldexp( long double, int );
     322
     323[ float, float ] modf( float );
     324float modf( float, float * );
     325[ double, double ] modf( double );
    329326// extern "C" { double modf( double, double * ); }
    330 static inline [ long double, long double ] modf( long double x ) { long double i; x = modfl( x, &i ); return [ i, x ]; }
    331 static inline long double modf( long double x, long double * i ) { return modfl( x, i ); }
    332 
    333 static inline float nextafter( float x, float y ) { return nextafterf( x, y ); }
     327[ long double, long double ] modf( long double );
     328long double modf( long double, long double * );
     329
     330float nextafter( float, float );
    334331// extern "C" { double nextafter( double, double ); }
    335 static inline long double nextafter( long double x, long double y ) { return nextafterl( x, y ); }
    336 
    337 static inline float nexttoward( float x, long double y ) { return nexttowardf( x, y ); }
     332long double nextafter( long double, long double );
     333
     334float nexttoward( float, long double );
    338335// extern "C" { double nexttoward( double, long double ); }
    339 static inline long double nexttoward( long double x, long double y ) { return nexttowardl( x, y ); }
    340 
    341 static inline float scalbn( float x, int exp ) { return scalbnf( x, exp ); }
     336long double nexttoward( long double, long double );
     337
     338float scalbn( float, int );
    342339// extern "C" { double scalbn( double, int ); }
    343 static inline long double scalbn( long double x, int exp ) { return scalbnl( x, exp ); }
    344 static inline float scalbn( float x, long int exp ) { return scalblnf( x, exp ); }
    345 static inline double scalbn( double x, long int exp ) { return scalbln( x, exp ); }
    346 static inline long double scalbn( long double x, long int exp ) { return scalblnl( x, exp ); }
    347 
    348 static inline float scalbln( float x, long int exp ) { return scalblnf( x, exp ); }
     340long double scalbn( long double, int );
     341
     342float scalbln( float, long int );
    349343// extern "C" { double scalbln( double, long int ); }
    350 static inline long double scalbln( long double x, long int exp ) { return scalblnl( x, exp ); }
     344long double scalbln( long double, long int );
    351345
    352346// Local Variables: //
  • src/libcfa/startup.h

    r33218c6 re0a653d  
     1//                              -*- Mode: CFA -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    910// Author           : Thierry Delisle
    1011// Created On       : Wed Mar 29 15:56:41 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 21:37:11 2017
    13 // Update Count     : 2
     12// Last Modified By :
     13// Last Modified On :
     14// Update Count     : 0
    1415//
    1516
    16 #pragma once
     17#ifndef STARTUP_H
     18#define STARTUP_H
    1719
    1820#if GCC_VERSION > 50000
     
    3234#endif
    3335
    34 // Local Variables: //
    35 // mode: c //
    36 // tab-width: 4 //
    37 // End: //
     36#endif //STARTUP_H
  • src/libcfa/stdhdr/assert.h

    r33218c6 re0a653d  
    1010// Created On       : Mon Jul  4 23:25:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 21:06:48 2017
    13 // Update Count     : 11
     12// Last Modified On : Tue Jul  5 20:34:23 2016
     13// Update Count     : 8
    1414//
    1515
     
    1818#endif //__CFORALL__
    1919
     20// has internal check for multiple expansion
    2021#include_next <assert.h>
    21 
    22 #ifdef NDEBUG
    23         #define assertf( expr, fmt, ... ) ((void)0)
    24 #else
    25         #define __STRINGIFY__(str) #str
    26         #define __VSTRINGIFY__(str) __STRINGIFY__(str)
    27         #define assertf(expr, fmt, ...) ((expr) ? ((void)0) : __assert_fail_f(__VSTRINGIFY__(expr), __FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, ## __VA_ARGS__ ))
    28         void __assert_fail_f( const char *assertion, const char *file, unsigned int line, const char *function, const char *fmt, ... ) __attribute__((noreturn));
    29 #endif
    3022
    3123#ifdef __CFORALL__
  • src/libcfa/stdhdr/gmp.h

    r33218c6 re0a653d  
     1//                               -*- Mode: C -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    1011// Created On       : Sun May 14 23:46:01 2017
    1112// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 18:10:52 2017
    13 // Update Count     : 4
     13// Last Modified On : Sun May 14 23:46:34 2017
     14// Update Count     : 1
    1415//
    1516
  • src/libcfa/stdlib

    r33218c6 re0a653d  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 14:32:37 2017
    13 // Update Count     : 220
     12// Last Modified On : Fri Jul  7 09:34:49 2017
     13// Update Count     : 219
    1414//
    1515
     
    1818//---------------------------------------
    1919
     20extern "C" {
    2021#ifndef EXIT_FAILURE
    2122#define EXIT_FAILURE    1                                                               // failing exit status
    2223#define EXIT_SUCCESS    0                                                               // successful exit status
    2324#endif // ! EXIT_FAILURE
     25} // extern "C"
    2426
    2527//---------------------------------------
  • src/libcfa/stdlib.c

    r33218c6 re0a653d  
    1010// Created On       : Thu Jan 28 17:10:29 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 16:01:40 2017
    13 // Update Count     : 282
     12// Last Modified On : Thu Jun  1 21:52:57 2017
     13// Update Count     : 280
    1414//
    1515
     
    1818//---------------------------------------
    1919
     20extern "C" {
    2021#define _XOPEN_SOURCE 600                                                               // posix_memalign, *rand48
    2122#include <stdlib.h>                                                                             // malloc, free, calloc, realloc, memalign, posix_memalign, bsearch
     
    2425#include <math.h>                                                                               // fabsf, fabs, fabsl
    2526#include <complex.h>                                                                    // _Complex_I
     27} // extern "C"
    2628
    2729// resize, non-array types
  • src/prelude/builtins.c

    r33218c6 re0a653d  
    1 //
    2 // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
    3 //
    4 // The contents of this file are covered under the licence agreement in the
    5 // file "LICENCE" distributed with Cforall.
    6 //
    7 // builtins.c --
    8 //
    9 // Author           : Peter A. Buhr
    10 // Created On       : Fri Jul 21 16:21:03 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 10:34:20 2017
    13 // Update Count     : 13
    14 //
    15 
    16 // exception implementation
    17 
    181typedef unsigned long long __cfaabi_exception_type_t;
    192
    203#include "../libcfa/exception.h"
    21 
    22 // exponentiation operator implementation
    23 
    24 extern "C" {
    25         float powf( float x, float y );
    26         double pow( double x, double y );
    27         long double powl( long double x, long double y );
    28         float _Complex cpowf( float _Complex x, _Complex float z );
    29         double _Complex cpow( double _Complex x, _Complex double z );
    30         long double _Complex cpowl( long double _Complex x, _Complex long double z );
    31 } // extern "C"
    32 
    33 static inline float ?\?( float x, float y ) { return powf( x, y ); }
    34 static inline double ?\?( double x, double y ) { return pow( x, y ); }
    35 static inline long double ?\?( long double x, long double y ) { return powl( x, y ); }
    36 static inline float _Complex ?\?( float _Complex x, _Complex float y ) { return cpowf(x, y ); }
    37 static inline double _Complex ?\?( double _Complex x, _Complex double y ) { return cpow( x, y ); }
    38 static inline long double _Complex ?\?( long double _Complex x, _Complex long double y ) { return cpowl( x, y ); }
    39 
    40 static inline long int ?\?( long int ep, unsigned long int y ) { // disallow negative exponent
    41         if ( y == 0 ) return 1;                                                         // base case
    42     if ( ep == 2 ) return ep << (y - 1);                                // special case, positive shifting only
    43     typeof( ep ) op = 1;                                                                // accumulate odd product
    44     for ( ; y > 1; y >>= 1 ) {                                                  // squaring exponentiation, O(log2 y)
    45                 if ( (y & 1) == 1 ) op *= ep;                                   // odd ?
    46                 ep *= ep;
    47         } // for
    48     return ep * op;
    49 } // ?\?
    50 
    51 // FIX ME, cannot resolve the "T op = 1".
    52 
    53 // static inline forall( otype T | { void ?{}( T * this, one_t ); T ?*?( T, T ); } )
    54 // T ?\?( T ep, unsigned long int y ) {
    55 //     if ( y == 0 ) return 1;
    56 //     T op = 1;
    57 //     for ( ; y > 1; y >>= 1 ) {                                                       // squaring exponentiation, O(log2 y)
    58 //              if ( (y & 1) == 1 ) op = op * ep;                               // odd ?
    59 //              ep = ep * ep;
    60 //     } // for
    61 //     return ep * op;
    62 // } // ?\?
    63 
    64 // unsigned computation may be faster and larger
    65 static inline unsigned long int ?\?( unsigned long int ep, unsigned long int y ) { // disallow negative exponent
    66         if ( y == 0 ) return 1;                                                         // base case
    67     if ( ep == 2 ) return ep << (y - 1);                                // special case, positive shifting only
    68     typeof( ep ) op = 1;                                                                // accumulate odd product
    69     for ( ; y > 1; y >>= 1 ) {                                                  // squaring exponentiation, O(log2 y)
    70                 if ( (y & 1) == 1 ) op *= ep;                                   // odd ?
    71                 ep *= ep;
    72         } // for
    73     return ep * op;
    74 } // ?\?
    75 
    76 static inline double ?\?( long int x, signed long int y ) {     // allow negative exponent
    77     if ( y >=  0 ) return (double)(x \ (unsigned long int)y);
    78     else return 1.0 / x \ (unsigned int)(-y);
    79 } // ?\?
    80 
    81 static inline forall( otype T | { void ?{}( T * this, one_t ); T ?*?( T, T ); double ?/?( double, T ); } )
    82 double ?\?( T x, signed long int y ) {
    83     if ( y >=  0 ) return (double)(x \ (unsigned long int)y);
    84     else return 1.0 / x \ (unsigned long int)(-y);
    85 } // ?\?
    86 
    87 static inline long int ?\=?( long int * x, unsigned long int y ) { *x = *x \ y; return *x; }
    88 static inline unsigned long int ?\=?( unsigned long int * x, unsigned long int y ) { *x = *x \ y; return *x; }
    89 static inline int ?\=?( int * x, unsigned long int y ) { *x = *x \ y; return *x; }
    90 static inline unsigned int ?\=?( unsigned int * x, unsigned long int y ) { *x = *x \ y; return *x; }
    91 
    92 // Local Variables: //
    93 // mode: c //
    94 // tab-width: 4 //
    95 // End: //
  • src/tests/.expect/32/math.txt

    r33218c6 re0a653d  
    99exp2:2 2 2
    1010expm1:1.71828 1.71828182845905 1.71828182845904524
    11 pow:1 1 1 0.273957+0.583701i 0.273957253830121+0.583700758758615i 0.273957253830121071+0.583700758758614628i
    12 16 256
    13 912673 256 64 -64 0.015625 -0.015625 18.3791736799526 0.264715-1.1922i
    1411log:0 0 0 0.346574+0.785398i 0.346573590279973+0.785398163397448i 0.346573590279972655+0.78539816339744831i
    1512log2:3 3 3
     
    2118cbrt:3 3 3
    2219hypot:1.41421 1.4142135623731 1.41421356237309505
     20pow:1 1 1 0.273957+0.583701i 0.273957253830121+0.583700758758615i 0.273957253830121071+0.583700758758614628i
    2321sin:0.841471 0.841470984807897 0.841470984807896507 1.29846+0.634964i 1.29845758141598+0.634963914784736i 1.29845758141597729+0.634963914784736108i
    2422cos:0.540302 0.54030230586814 0.540302305868139717 0.83373-0.988898i 0.833730025131149-0.988897705762865i 0.833730025131149049-0.988897705762865096i
  • src/tests/.expect/64/math.txt

    r33218c6 re0a653d  
    99exp2:2 2 2
    1010expm1:1.71828 1.71828182845905 1.71828182845904524
    11 pow:1 1 1 0.273957+0.583701i 0.273957253830121+0.583700758758615i 0.273957253830121071+0.583700758758614627i
    12 16 256
    13 912673 256 64 -64 0.015625 -0.015625 18.3791736799526 0.264715-1.1922i
    1411log:0 0 0 0.346574+0.785398i 0.346573590279973+0.785398163397448i 0.346573590279972655+0.78539816339744831i
    1512log2:3 3 3
     
    2118cbrt:3 3 3
    2219hypot:1.41421 1.4142135623731 1.41421356237309505
     20pow:1 1 1 0.273957+0.583701i 0.273957253830121+0.583700758758615i 0.273957253830121071+0.583700758758614628i
    2321sin:0.841471 0.841470984807897 0.841470984807896507 1.29846+0.634964i 1.29845758141598+0.634963914784736i 1.29845758141597729+0.634963914784736108i
    2422cos:0.540302 0.54030230586814 0.540302305868139717 0.83373-0.988898i 0.833730025131149-0.988897705762865i 0.833730025131149049-0.988897705762865096i
  • src/tests/alloc.c

    r33218c6 re0a653d  
    1010// Created On       : Wed Feb  3 07:56:22 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 16:01:10 2017
    13 // Update Count     : 318
     12// Last Modified On : Fri Jun  2 15:13:03 2017
     13// Update Count     : 316
    1414//
    1515
    16 #include <assert.h>
     16#include <assert>
     17extern "C" {
    1718#include <malloc.h>                                                                             // malloc_usable_size
    1819#include <stdint.h>                                                                             // uintptr_t
    1920#include <stdlib.h>                                                                             // posix_memalign
     21} // extern
    2022#include <fstream>
    2123#include <stdlib>                                                                               // access C malloc, realloc
  • src/tests/attributes.c

    r33218c6 re0a653d  
     1//                               -*- Mode: C -*-
    12//
    23// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
     
    1011// Created On       : Mon Feb  6 16:07:02 2017
    1112// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 23:05:52 2017
    13 // Update Count     : 3
     13// Last Modified On : Mon Feb  6 16:08:21 2017
     14// Update Count     : 2
    1415//
    1516
  • src/tests/avltree/avl-private.h

    r33218c6 re0a653d  
    1 #pragma once
     1#ifndef AVL_PRIVATE_H
    22#include "avl.h"
    33
     
    1414forall(otype K | Comparable(K), otype V)
    1515int height(tree(K, V) * t);
     16
     17#endif
  • src/tests/avltree/avl.h

    r33218c6 re0a653d  
    1 #pragma once
     1#ifndef AVL_TREE_H
     2#define AVL_TREE_H
    23
    34extern "C" {
     
    103104//     printTree(t, 0);
    104105// }
     106
     107
     108#endif
  • src/tests/gmp.c

    r33218c6 re0a653d  
    1010// Created On       : Tue Apr 19 08:55:51 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 13 16:35:01 2017
    13 // Update Count     : 541
     12// Last Modified On : Wed May 24 22:05:38 2017
     13// Update Count     : 540
    1414//
    1515
     
    9595// Local Variables: //
    9696// tab-width: 4 //
    97 // compile-command: "cfa gmp.c -lgmp" //
     97// compile-command: "cfa gmp.c -l gmp" //
    9898// End: //
  • src/tests/math.c

    r33218c6 re0a653d  
    1010// Created On       : Fri Apr 22 14:59:21 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 10:32:04 2017
    13 // Update Count     : 73
     12// Last Modified On : Wed May 24 13:04:33 2017
     13// Update Count     : 71
    1414//
    1515
     
    4646        sout | "exp2:" | exp2( 1.0F ) | exp2( 1.0D ) | exp2( 1.0L ) | endl;
    4747        sout | "expm1:" | expm1( 1.0F ) | expm1( 1.0D ) | expm1( 1.0L ) | endl;
    48         sout | "pow:" | pow( 1.0F, 1.0F ) | pow( 1.0D, 1.0D ) | pow( 1.0L, 1.0L ) | pow( 1.0F+1.0FI, 1.0F+1.0FI ) | pow( 1.0D+1.0DI, 1.0D+1.0DI ) | pow( 1.0DL+1.0LI, 1.0DL+1.0LI ) | endl;
    49 
    50         int b = 4;
    51         unsigned int e = 2;
    52     b \= e;
    53     sout | b | b \ e | endl;
    54     sout | 'a' \ 3u | 2 \ 8u | 4 \ 3u | -4 \ 3u | 4 \ -3 | -4 \ -3 | 4.0 \ 2.1 | (1.0f+2.0fi) \ (3.0f+2.0fi) | endl;
    55 
    56         //---------------------- Logarithm ----------------------
    57 
    5848        sout | "log:" | log( 1.0F ) | log( 1.0D ) | log( 1.0L ) | log( 1.0F+1.0FI ) | log( 1.0D+1.0DI ) | log( 1.0DL+1.0LI ) | endl;
    5949        sout | "log2:" | log2( 8.0F ) | log2( 8.0D ) | log2( 8.0L ) | endl;
     
    6353        sout | "logb:" | logb( 8.0F ) | logb( 8.0D ) | logb( 8.0L ) | endl;
    6454
     55        //---------------------- Power ----------------------
     56
    6557        sout | "sqrt:" | sqrt( 1.0F ) | sqrt( 1.0D ) | sqrt( 1.0L ) | sqrt( 1.0F+1.0FI ) | sqrt( 1.0D+1.0DI ) | sqrt( 1.0DL+1.0LI ) | endl;
    6658        sout | "cbrt:" | cbrt( 27.0F ) | cbrt( 27.0D ) | cbrt( 27.0L ) | endl;
    6759        sout | "hypot:" | hypot( 1.0F, -1.0F ) | hypot( 1.0D, -1.0D ) | hypot( 1.0L, -1.0L ) | endl;
     60        sout | "pow:" | pow( 1.0F, 1.0F ) | pow( 1.0D, 1.0D ) | pow( 1.0L, 1.0L ) | pow( 1.0F+1.0FI, 1.0F+1.0FI ) | pow( 1.0D+1.0DI, 1.0D+1.0DI ) | pow( 1.0DL+1.0LI, 1.0DL+1.0LI ) | endl;
    6861
    6962        //---------------------- Trigonometric ----------------------
  • src/tests/maybe.c

    r33218c6 re0a653d  
    99// Author           : Andrew Beach
    1010// Created On       : Thr May 25 16:02:00 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 15:24:07 2017
    13 // Update Count     : 1
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri May 16 15:43:00 2017
     13// Update Count     : 0
    1414//
    1515
    16 #include <assert.h>
     16#include <assert>
    1717#include <containers/maybe>
    1818
  • src/tests/preempt_longrun/Makefile.am

    r33218c6 re0a653d  
    1616
    1717repeats=10
    18 max_time=600
     18max_time=30
    1919preempt=1_000ul
    2020
     
    2525CC = @CFA_BINDIR@/@CFA_NAME@
    2626
    27 TESTS = block create disjoint enter enter3 processor stack wait yield
     27TESTS = barge block create disjoint enter enter3 processor stack wait yield
    2828
    2929.INTERMEDIATE: ${TESTS}
    3030
    3131all-local: ${TESTS:=.run}
    32 
    33 clean-local:
    34         rm -f ${TESTS}
    3532
    3633% : %.c ${CC}
  • src/tests/preempt_longrun/Makefile.in

    r33218c6 re0a653d  
    449449top_srcdir = @top_srcdir@
    450450repeats = 10
    451 max_time = 600
     451max_time = 30
    452452preempt = 1_000ul
    453453REPEAT = ${abs_top_srcdir}/tools/repeat -s
    454454BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -DPREEMPTION_RATE=${preempt}
    455 TESTS = block create disjoint enter enter3 processor stack wait yield
     455TESTS = barge block create disjoint enter enter3 processor stack wait yield
    456456all: all-am
    457457
     
    635635                TEST_LOGS="$$log_list"; \
    636636        exit $$?
     637barge.log: barge
     638        @p='barge'; \
     639        b='barge'; \
     640        $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
     641        --log-file $$b.log --trs-file $$b.trs \
     642        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
     643        "$$tst" $(AM_TESTS_FD_REDIRECT)
    637644block.log: block
    638645        @p='block'; \
     
    783790clean: clean-am
    784791
    785 clean-am: clean-generic clean-local mostlyclean-am
     792clean-am: clean-generic mostlyclean-am
    786793
    787794distclean: distclean-am
     
    850857
    851858.PHONY: all all-am all-local check check-TESTS check-am clean \
    852         clean-generic clean-local cscopelist-am ctags-am distclean \
     859        clean-generic cscopelist-am ctags-am distclean \
    853860        distclean-generic distdir dvi dvi-am html html-am info info-am \
    854861        install install-am install-data install-data-am install-dvi \
     
    868875all-local: ${TESTS:=.run}
    869876
    870 clean-local:
    871         rm -f ${TESTS}
    872 
    873877% : %.c ${CC}
    874878        ${AM_V_GEN}${CC} ${CFLAGS} ${<} -o ${@}
  • src/tests/preempt_longrun/create.c

    r33218c6 re0a653d  
    11#include <kernel>
    22#include <thread>
    3 
    4 static const unsigned long N = 2_000ul;
    53
    64#ifndef PREEMPTION_RATE
     
    1715
    1816int main(int argc, char* argv[]) {
    19         processor p;
    20         for(int i = 0; i < N; i++) {
     17        for(int i = 0; i < 10_000ul; i++) {
    2118                worker_t w[7];
    2219        }
  • src/tests/preempt_longrun/enter.c

    r33218c6 re0a653d  
    33#include <thread>
    44
     5#undef N
    56static const unsigned long N  = 70_000ul;
    67
  • src/tests/preempt_longrun/enter3.c

    r33218c6 re0a653d  
    33#include <thread>
    44
     5#undef N
    56static const unsigned long N  = 50_000ul;
    67
  • src/tests/preempt_longrun/processor.c

    r33218c6 re0a653d  
    11#include <kernel>
    22#include <thread>
    3 
    4 static const unsigned long N = 5_000ul;
    53
    64#ifndef PREEMPTION_RATE
     
    1715
    1816int main(int argc, char* argv[]) {
    19         for(int i = 0; i < N; i++) {
     17        for(int i = 0; i < 10_000ul; i++) {
    2018                processor p;
    2119        }
  • src/tests/preempt_longrun/yield.c

    r33218c6 re0a653d  
    11#include <kernel>
    22#include <thread>
    3 
    4 static const unsigned long N = 325_000ul;
    53
    64#ifndef PREEMPTION_RATE
     
    1513
    1614void main(worker_t * this) {
    17         for(int i = 0; i < N; i++) {
     15        for(int i = 0; i < 325_000ul; i++) {
    1816                yield();
    1917        }
  • src/tests/result.c

    r33218c6 re0a653d  
    99// Author           : Andrew Beach
    1010// Created On       : Thr May 25 16:50:00 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 15:24:12 2017
    13 // Update Count     : 1
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Jun 16 15:42:00 2017
     13// Update Count     : 0
    1414//
    1515
    16 #include <assert.h>
     16#include <assert>
    1717#include <containers/result>
    1818
  • src/tests/sched-int-barge.c

    r33218c6 re0a653d  
    55#include <thread>
    66
    7 static const unsigned long N = 50_000ul;
    8 
    9 #ifndef PREEMPTION_RATE
    10 #define PREEMPTION_RATE 10_000ul
    11 #endif
    12 
    13 unsigned int default_preemption() {
    14         return 0;
    15 }
    167enum state_t { WAIT, SIGNAL, BARGE };
    178
     
    1910
    2011monitor global_data_t {
    21         volatile bool done;
     12        bool done;
    2213        int counter;
    2314        state_t state;
     
    6051                c->do_wait2 = ((unsigned)rand48()) % (c->do_signal);
    6152
    62                 if(c->do_wait1 == c->do_wait2) sout | "Same" | endl;
     53                // if(c->do_wait1 == c->do_wait2) sout | "Same" | endl;
    6354        }
    6455
     
    8273        }
    8374
    84         if( c->counter >= N ) c->done = true;
     75        if( c->counter >= 100_000 ) c->done = true;
    8576        return !c->done;
    8677}
     
    9889}
    9990
    100 static thread_desc * volatile the_threads;
    101 
    10291int main(int argc, char* argv[]) {
    103         rand48seed(0);
    104         processor p;
    105         {
    106                 Threads t[17];
    107                 the_threads = (thread_desc*)t;
    108         }
     92        rand48seed(0);
     93        processor p;
     94        {
     95                Threads t[17];
     96        }
    10997}
  • src/tests/sched-int-block.c

    r33218c6 re0a653d  
    55#include <thread>
    66
    7 #include <time.h>
    8 
    9 static const unsigned long N = 5_000ul;
    10 
    11 #ifndef PREEMPTION_RATE
    12 #define PREEMPTION_RATE 10_000ul
     7#ifndef N
     8#define N 10_000
    139#endif
    14 
    15 unsigned int default_preemption() {
    16         return PREEMPTION_RATE;
    17 }
    1810
    1911enum state_t { WAITED, SIGNAL, BARGE };
     
    109101
    110102int main(int argc, char* argv[]) {
    111         rand48seed( time( NULL ) );
     103        rand48seed(0);
    112104        done = false;
    113105        processor p;
  • src/tests/sched-int-disjoint.c

    r33218c6 re0a653d  
    44#include <thread>
    55
    6 static const unsigned long N = 10_000ul;
    7 
    8 #ifndef PREEMPTION_RATE
    9 #define PREEMPTION_RATE 10_000ul
     6#ifndef N
     7#define N 10_000
    108#endif
    11 
    12 unsigned int default_preemption() {
    13         return PREEMPTION_RATE;
    14 }
    159
    1610enum state_t { WAIT, SIGNAL, BARGE };
  • src/tests/sched-int-wait.c

    r33218c6 re0a653d  
    55#include <thread>
    66
    7 static const unsigned long N = 10_000ul;
    8 
    9 #ifndef PREEMPTION_RATE
    10 #define PREEMPTION_RATE 10_000ul
     7#ifndef N
     8#define N 10_000
    119#endif
    12 
    13 unsigned int default_preemption() {
    14         return PREEMPTION_RATE;
    15 }
    1610
    1711monitor global_t {};
     
    120114int main(int argc, char* argv[]) {
    121115        waiter_left = 4;
    122         processor p[2];
     116        processor p;
    123117        sout | "Starting" | endl;
    124118        {
  • src/tests/test.py

    r33218c6 re0a653d  
    221221                if   retcode == TestResult.SUCCESS:     result_txt = "Done"
    222222                elif retcode == TestResult.TIMEOUT:     result_txt = "TIMEOUT"
    223                 else :                                          result_txt = "ERROR code %d" % retcode
     223                else :                                          result_txt = "ERROR"
    224224        else :
    225225                if   retcode == TestResult.SUCCESS:     result_txt = "PASSED"
    226226                elif retcode == TestResult.TIMEOUT:     result_txt = "TIMEOUT"
    227                 else :                                          result_txt = "FAILED with code %d" % retcode
     227                else :                                          result_txt = "FAILED"
    228228
    229229        #print result with error if needed
  • src/tests/vector/array.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Wed May 27 17:56:53 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 10:04:20 2017
    13 // Update Count     : 6
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Apr 27 17:26:04 2016
     13// Update Count     : 5
    1414//
    1515
    16 #pragma once
     16#ifndef ARRAY_H
     17#define ARRAY_H
    1718
    1819//#include <iterator>
     
    4445elt_type * end( array_type * array );
    4546
     47#endif // ARRAY_H
     48
    4649// Local Variables: //
    4750// tab-width: 4 //
  • src/tests/vector/vector_int.h

    r33218c6 re0a653d  
    99// Author           : Richard C. Bilson
    1010// Created On       : Wed May 27 17:56:53 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 10:04:02 2017
    13 // Update Count     : 4
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Apr 27 17:26:59 2016
     13// Update Count     : 2
    1414//
    1515
    16 #pragma once
     16#ifndef VECTOR_INT_H
     17#define VECTOR_INT_H
    1718
    1819// A flexible array, similar to a C++ vector, that holds integers and can be resized dynamically
     
    2526
    2627void ?{}( vector_int * );                                                               // allocate vector with default capacity
    27 void ?{}( vector_int *, int reserve );                                  // allocate vector with specified capacity
    28 void ?{}( vector_int * vec, vector_int other );                 // copy constructor
     28void ?{}( vector_int *, int reserve );          // allocate vector with specified capacity
     29void ?{}( vector_int * vec, vector_int other ); // copy constructor
    2930void ^?{}( vector_int * );                                                              // deallocate vector's storage
    3031
     
    3536
    3637lvalue int ?[?]( vector_int * vec, int index );                 // access to arbitrary element (does not resize)
    37 int last( vector_int * vec );                                                   // return last element
     38int last( vector_int * vec );                                                           // return last element
     39
     40#endif // VECTOR_INT_H
    3841
    3942// Local Variables: //
  • tools/cfa.nanorc

    r33218c6 re0a653d  
    88
    99# Types
    10 color green "\<(forall|trait|(o|d|f|t)type|mutex|_Bool|volatile|virtual)\>"
     10color green "\<(forall|otype|dtype|ftype|trait|mutex|_Bool|volatile)\>"
    1111color green "\<(float|double|bool|char|int|short|long|sizeof|enum|void|auto)\>"
    1212color green "\<(static|const|struct|union|typedef|extern|(un)?signed|inline)\>"
     
    1414
    1515# Declarations
    16 color brightgreen "\<(struct|union|typedef|trait|coroutine|monitor|thread)\>"
    17 color brightgreen "\<(with)\>"
     16color brightgreen "\<(struct|union|typedef|trait|coroutine|monitor)\>"
    1817
    1918# Control Flow Structures
  • tools/prettyprinter/ParserTypes.h

    r33218c6 re0a653d  
    1313// Created On       : Sun Dec 16 15:00:49 2001
    1414// Last Modified By : Peter A. Buhr
    15 // Last Modified On : Sat Jul 22 10:13:09 2017
    16 // Update Count     : 175
     15// Last Modified On : Wed Jun 28 22:59:27 2017
     16// Update Count     : 174
    1717//
    1818
    19 #pragma once
     19#ifndef __PARSER_HH__
     20#define __PARSER_HH__
    2021
    2122int yylex();
     
    2526#include "token.h"
    2627
     28#endif // __PARSER_HH__
     29
    2730// Local Variables: //
    2831// mode: c++ //
  • tools/prettyprinter/filter.h

    r33218c6 re0a653d  
    1010// Created On       : Tue Apr  9 22:31:18 2002
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 10:12:55 2017
    13 // Update Count     : 11
     12// Last Modified On : Thu Jun 29 08:28:32 2017
     13// Update Count     : 10
    1414//
    1515
    16 #pragma once
     16#ifndef __FILTER_H__
     17#define __FILTER_H__
    1718
    1819#include "ParserTypes.h"
     
    2728void HTML( Token * tree );
    2829
     30#endif // __FILTER_H__
     31
    2932// Local Variables: //
    3033// mode: c++ //
  • tools/prettyprinter/lex.ll

    r33218c6 re0a653d  
    1 /*
     1/*                               -*- Mode: C -*-
     2 *
    23 * Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
    34 *
     
    1011 * Created On       : Sat Dec 15 11:45:59 2001
    1112 * Last Modified By : Peter A. Buhr
    12  * Last Modified On : Fri Jul 21 23:06:16 2017
    13  * Update Count     : 254
     13 * Last Modified On : Wed Jun 28 22:57:17 2017
     14 * Update Count     : 253
    1415 */
    1516
  • tools/prettyprinter/test.y

    r33218c6 re0a653d  
    1515        ;
    1616
    17 rules1  :
    18         /* empty */
    19         {}
     17rules1  : /* empty */
    2018        | xxx
    2119          /* fred */ yyy
  • tools/prettyprinter/token.cc

    r33218c6 re0a653d  
     1//                              -*- Mode: C++ -*-
    12//
    2 // Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
    3 //
    4 // The contents of this file are covered under the licence agreement in the
    5 // file "LICENCE" distributed with Cforall.
     3// Copyright (C) Peter A. Buhr 2017
    64//
    75// Pretty Printer, Copyright (C) Richard C. Bilson and Rodolfo G. Esteves 2001
     
    1210// Created On       : Wed Jun 28 22:46:23 2017
    1311// Last Modified By : Peter A. Buhr
    14 // Last Modified On : Fri Jul 21 23:07:04 2017
    15 // Update Count     : 10
     12// Last Modified On : Thu Jun 29 09:33:49 2017
     13// Update Count     : 9
    1614//
    1715
  • tools/prettyprinter/token.h

    r33218c6 re0a653d  
    1010// Created On       : Wed Jun 28 22:47:58 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 10:12:42 2017
    13 // Update Count     : 6
     12// Last Modified On : Wed Jun 28 23:02:06 2017
     13// Update Count     : 5
    1414//
    1515
    16 #pragma once
     16#ifndef __TOKEN_H__
     17#define __TOKEN_H__
    1718
    1819struct Token {
     
    3435};
    3536
     37#endif // __TOKEN_H__
     38
    3639// Local Variables: //
    3740// tab-width: 4 //
Note: See TracChangeset for help on using the changeset viewer.