Changeset 30763fd for libcfa


Ignore:
Timestamp:
Nov 26, 2019, 3:20:30 PM (4 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
d4f1521
Parents:
7768b8d (diff), 58e280f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' into relaxed_ready

Location:
libcfa
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • libcfa/prelude/builtins.c

    r7768b8d r30763fd  
    1010// Created On       : Fri Jul 21 16:21:03 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Jun 25 18:06:52 2019
    13 // Update Count     : 97
     12// Last Modified On : Thu Nov 21 16:31:39 2019
     13// Update Count     : 101
    1414//
    1515
     
    6969
    7070// universal typed pointer constant
    71 // Compiler issue: there is a problem with anonymous types that do not have a size.
    72 static inline forall( dtype DT | sized(DT) ) DT * intptr( uintptr_t addr ) { return (DT *)addr; }
     71static inline forall( dtype DT ) DT * intptr( uintptr_t addr ) { return (DT *)addr; }
    7372
    7473// exponentiation operator implementation
  • libcfa/prelude/sync-builtins.cf

    r7768b8d r30763fd  
    11char __sync_fetch_and_add(volatile char *, char,...);
    2 char __sync_fetch_and_add_1(volatile char *, char,...);
    32signed char __sync_fetch_and_add(volatile signed char *, signed char,...);
    4 signed char __sync_fetch_and_add_1(volatile signed char *, signed char,...);
    53unsigned char __sync_fetch_and_add(volatile unsigned char *, unsigned char,...);
    6 unsigned char __sync_fetch_and_add_1(volatile unsigned char *, unsigned char,...);
    74signed short __sync_fetch_and_add(volatile signed short *, signed short,...);
    8 signed short __sync_fetch_and_add_2(volatile signed short *, signed short,...);
    95unsigned short __sync_fetch_and_add(volatile unsigned short *, unsigned short,...);
    10 unsigned short __sync_fetch_and_add_2(volatile unsigned short *, unsigned short,...);
    116signed int __sync_fetch_and_add(volatile signed int *, signed int,...);
    12 signed int __sync_fetch_and_add_4(volatile signed int *, signed int,...);
    137unsigned int __sync_fetch_and_add(volatile unsigned int *, unsigned int,...);
    14 unsigned int __sync_fetch_and_add_4(volatile unsigned int *, unsigned int,...);
     8signed long int __sync_fetch_and_add(volatile signed long int *, signed long int,...);
     9unsigned long int __sync_fetch_and_add(volatile unsigned long int *, unsigned long int,...);
    1510signed long long int __sync_fetch_and_add(volatile signed long long int *, signed long long int,...);
    16 signed long long int __sync_fetch_and_add_8(volatile signed long long int *, signed long long int,...);
    1711unsigned long long int __sync_fetch_and_add(volatile unsigned long long int *, unsigned long long int,...);
    18 unsigned long long int __sync_fetch_and_add_8(volatile unsigned long long int *, unsigned long long int,...);
    1912#if defined(__SIZEOF_INT128__)
    2013signed __int128 __sync_fetch_and_add(volatile signed __int128 *, signed __int128,...);
    21 signed __int128 __sync_fetch_and_add_16(volatile signed __int128 *, signed __int128,...);
    2214unsigned __int128 __sync_fetch_and_add(volatile unsigned __int128 *, unsigned __int128,...);
    23 unsigned __int128 __sync_fetch_and_add_16(volatile unsigned __int128 *, unsigned __int128,...);
    2415#endif
    2516
    2617char __sync_fetch_and_sub(volatile char *, char,...);
    27 char __sync_fetch_and_sub_1(volatile char *, char,...);
    2818signed char __sync_fetch_and_sub(volatile signed char *, signed char,...);
    29 signed char __sync_fetch_and_sub_1(volatile signed char *, signed char,...);
    3019unsigned char __sync_fetch_and_sub(volatile unsigned char *, unsigned char,...);
    31 unsigned char __sync_fetch_and_sub_1(volatile unsigned char *, unsigned char,...);
    3220signed short __sync_fetch_and_sub(volatile signed short *, signed short,...);
    33 signed short __sync_fetch_and_sub_2(volatile signed short *, signed short,...);
    3421unsigned short __sync_fetch_and_sub(volatile unsigned short *, unsigned short,...);
    35 unsigned short __sync_fetch_and_sub_2(volatile unsigned short *, unsigned short,...);
    3622signed int __sync_fetch_and_sub(volatile signed int *, signed int,...);
    37 signed int __sync_fetch_and_sub_4(volatile signed int *, signed int,...);
    3823unsigned int __sync_fetch_and_sub(volatile unsigned int *, unsigned int,...);
    39 unsigned int __sync_fetch_and_sub_4(volatile unsigned int *, unsigned int,...);
     24signed long int __sync_fetch_and_sub(volatile signed long int *, signed long int,...);
     25unsigned long int __sync_fetch_and_sub(volatile unsigned long int *, unsigned long int,...);
    4026signed long long int __sync_fetch_and_sub(volatile signed long long int *, signed long long int,...);
    41 signed long long int __sync_fetch_and_sub_8(volatile signed long long int *, signed long long int,...);
    4227unsigned long long int __sync_fetch_and_sub(volatile unsigned long long int *, unsigned long long int,...);
    43 unsigned long long int __sync_fetch_and_sub_8(volatile unsigned long long int *, unsigned long long int,...);
    4428#if defined(__SIZEOF_INT128__)
    4529signed __int128 __sync_fetch_and_sub(volatile signed __int128 *, signed __int128,...);
    46 signed __int128 __sync_fetch_and_sub_16(volatile signed __int128 *, signed __int128,...);
    4730unsigned __int128 __sync_fetch_and_sub(volatile unsigned __int128 *, unsigned __int128,...);
    48 unsigned __int128 __sync_fetch_and_sub_16(volatile unsigned __int128 *, unsigned __int128,...);
    4931#endif
    5032
    5133char __sync_fetch_and_or(volatile char *, char,...);
    52 char __sync_fetch_and_or_1(volatile char *, char,...);
    5334signed char __sync_fetch_and_or(volatile signed char *, signed char,...);
    54 signed char __sync_fetch_and_or_1(volatile signed char *, signed char,...);
    5535unsigned char __sync_fetch_and_or(volatile unsigned char *, unsigned char,...);
    56 unsigned char __sync_fetch_and_or_1(volatile unsigned char *, unsigned char,...);
    5736signed short __sync_fetch_and_or(volatile signed short *, signed short,...);
    58 signed short __sync_fetch_and_or_2(volatile signed short *, signed short,...);
    5937unsigned short __sync_fetch_and_or(volatile unsigned short *, unsigned short,...);
    60 unsigned short __sync_fetch_and_or_2(volatile unsigned short *, unsigned short,...);
    6138signed int __sync_fetch_and_or(volatile signed int *, signed int,...);
    62 signed int __sync_fetch_and_or_4(volatile signed int *, signed int,...);
    6339unsigned int __sync_fetch_and_or(volatile unsigned int *, unsigned int,...);
    64 unsigned int __sync_fetch_and_or_4(volatile unsigned int *, unsigned int,...);
     40signed long int __sync_fetch_and_or(volatile signed long int *, signed long int,...);
     41unsigned long int __sync_fetch_and_or(volatile unsigned long int *, unsigned long int,...);
    6542signed long long int __sync_fetch_and_or(volatile signed long long int *, signed long long int,...);
    66 signed long long int __sync_fetch_and_or_8(volatile signed long long int *, signed long long int,...);
    6743unsigned long long int __sync_fetch_and_or(volatile unsigned long long int *, unsigned long long int,...);
    68 unsigned long long int __sync_fetch_and_or_8(volatile unsigned long long int *, unsigned long long int,...);
    6944#if defined(__SIZEOF_INT128__)
    7045signed __int128 __sync_fetch_and_or(volatile signed __int128 *, signed __int128,...);
    71 signed __int128 __sync_fetch_and_or_16(volatile signed __int128 *, signed __int128,...);
    7246unsigned __int128 __sync_fetch_and_or(volatile unsigned __int128 *, unsigned __int128,...);
    73 unsigned __int128 __sync_fetch_and_or_16(volatile unsigned __int128 *, unsigned __int128,...);
    7447#endif
    7548
    7649char __sync_fetch_and_and(volatile char *, char,...);
    77 char __sync_fetch_and_and_1(volatile char *, char,...);
    7850signed char __sync_fetch_and_and(volatile signed char *, signed char,...);
    79 signed char __sync_fetch_and_and_1(volatile signed char *, signed char,...);
    8051unsigned char __sync_fetch_and_and(volatile unsigned char *, unsigned char,...);
    81 unsigned char __sync_fetch_and_and_1(volatile unsigned char *, unsigned char,...);
    8252signed short __sync_fetch_and_and(volatile signed short *, signed short,...);
    83 signed short __sync_fetch_and_and_2(volatile signed short *, signed short,...);
    8453unsigned short __sync_fetch_and_and(volatile unsigned short *, unsigned short,...);
    85 unsigned short __sync_fetch_and_and_2(volatile unsigned short *, unsigned short,...);
    8654signed int __sync_fetch_and_and(volatile signed int *, signed int,...);
    87 signed int __sync_fetch_and_and_4(volatile signed int *, signed int,...);
    8855unsigned int __sync_fetch_and_and(volatile unsigned int *, unsigned int,...);
    89 unsigned int __sync_fetch_and_and_4(volatile unsigned int *, unsigned int,...);
     56signed long int __sync_fetch_and_and(volatile signed long int *, signed long int,...);
     57unsigned long int __sync_fetch_and_and(volatile unsigned long int *, unsigned long int,...);
    9058signed long long int __sync_fetch_and_and(volatile signed long long int *, signed long long int,...);
    91 signed long long int __sync_fetch_and_and_8(volatile signed long long int *, signed long long int,...);
    9259unsigned long long int __sync_fetch_and_and(volatile unsigned long long int *, unsigned long long int,...);
    93 unsigned long long int __sync_fetch_and_and_8(volatile unsigned long long int *, unsigned long long int,...);
    9460#if defined(__SIZEOF_INT128__)
    9561signed __int128 __sync_fetch_and_and(volatile signed __int128 *, signed __int128,...);
    96 signed __int128 __sync_fetch_and_and_16(volatile signed __int128 *, signed __int128,...);
    9762unsigned __int128 __sync_fetch_and_and(volatile unsigned __int128 *, unsigned __int128,...);
    98 unsigned __int128 __sync_fetch_and_and_16(volatile unsigned __int128 *, unsigned __int128,...);
    9963#endif
    10064
    10165char __sync_fetch_and_xor(volatile char *, char,...);
    102 char __sync_fetch_and_xor_1(volatile char *, char,...);
    10366signed char __sync_fetch_and_xor(volatile signed char *, signed char,...);
    104 signed char __sync_fetch_and_xor_1(volatile signed char *, signed char,...);
    10567unsigned char __sync_fetch_and_xor(volatile unsigned char *, unsigned char,...);
    106 unsigned char __sync_fetch_and_xor_1(volatile unsigned char *, unsigned char,...);
    10768signed short __sync_fetch_and_xor(volatile signed short *, signed short,...);
    108 signed short __sync_fetch_and_xor_2(volatile signed short *, signed short,...);
    10969unsigned short __sync_fetch_and_xor(volatile unsigned short *, unsigned short,...);
    110 unsigned short __sync_fetch_and_xor_2(volatile unsigned short *, unsigned short,...);
    11170signed int __sync_fetch_and_xor(volatile signed int *, signed int,...);
    112 signed int __sync_fetch_and_xor_4(volatile signed int *, signed int,...);
    11371unsigned int __sync_fetch_and_xor(volatile unsigned int *, unsigned int,...);
    114 unsigned int __sync_fetch_and_xor_4(volatile unsigned int *, unsigned int,...);
     72signed long int __sync_fetch_and_xor(volatile signed long int *, signed long int,...);
     73unsigned long int __sync_fetch_and_xor(volatile unsigned long int *, unsigned long int,...);
    11574signed long long int __sync_fetch_and_xor(volatile signed long long int *, signed long long int,...);
    116 signed long long int __sync_fetch_and_xor_8(volatile signed long long int *, signed long long int,...);
    11775unsigned long long int __sync_fetch_and_xor(volatile unsigned long long int *, unsigned long long int,...);
    118 unsigned long long int __sync_fetch_and_xor_8(volatile unsigned long long int *, unsigned long long int,...);
    11976#if defined(__SIZEOF_INT128__)
    12077signed __int128 __sync_fetch_and_xor(volatile signed __int128 *, signed __int128,...);
    121 signed __int128 __sync_fetch_and_xor_16(volatile signed __int128 *, signed __int128,...);
    12278unsigned __int128 __sync_fetch_and_xor(volatile unsigned __int128 *, unsigned __int128,...);
    123 unsigned __int128 __sync_fetch_and_xor_16(volatile unsigned __int128 *, unsigned __int128,...);
    12479#endif
    12580
    12681char __sync_fetch_and_nand(volatile char *, char,...);
    127 char __sync_fetch_and_nand_1(volatile char *, char,...);
    12882signed char __sync_fetch_and_nand(volatile signed char *, signed char,...);
    129 signed char __sync_fetch_and_nand_1(volatile signed char *, signed char,...);
    13083unsigned char __sync_fetch_and_nand(volatile unsigned char *, unsigned char,...);
    131 unsigned char __sync_fetch_and_nand_1(volatile unsigned char *, unsigned char,...);
    13284signed short __sync_fetch_and_nand(volatile signed short *, signed short,...);
    133 signed short __sync_fetch_and_nand_2(volatile signed short *, signed short,...);
    13485unsigned short __sync_fetch_and_nand(volatile unsigned short *, unsigned short,...);
    135 unsigned short __sync_fetch_and_nand_2(volatile unsigned short *, unsigned short,...);
    13686signed int __sync_fetch_and_nand(volatile signed int *, signed int,...);
    137 signed int __sync_fetch_and_nand_4(volatile signed int *, signed int,...);
    13887unsigned int __sync_fetch_and_nand(volatile unsigned int *, unsigned int,...);
    139 unsigned int __sync_fetch_and_nand_4(volatile unsigned int *, unsigned int,...);
     88signed long int __sync_fetch_and_nand(volatile signed long int *, signed long int,...);
     89unsigned long int __sync_fetch_and_nand(volatile unsigned long int *, unsigned long int,...);
    14090signed long long int __sync_fetch_and_nand(volatile signed long long int *, signed long long int,...);
    141 signed long long int __sync_fetch_and_nand_8(volatile signed long long int *, signed long long int,...);
    14291unsigned long long int __sync_fetch_and_nand(volatile unsigned long long int *, unsigned long long int,...);
    143 unsigned long long int __sync_fetch_and_nand_8(volatile unsigned long long int *, unsigned long long int,...);
    14492#if defined(__SIZEOF_INT128__)
    14593signed __int128 __sync_fetch_and_nand(volatile signed __int128 *, signed __int128,...);
    146 signed __int128 __sync_fetch_and_nand_16(volatile signed __int128 *, signed __int128,...);
    14794unsigned __int128 __sync_fetch_and_nand(volatile unsigned __int128 *, unsigned __int128,...);
    148 unsigned __int128 __sync_fetch_and_nand_16(volatile unsigned __int128 *, unsigned __int128,...);
    14995#endif
    15096
    15197char __sync_add_and_fetch(volatile char *, char,...);
    152 char __sync_add_and_fetch_1(volatile char *, char,...);
    15398signed char __sync_add_and_fetch(volatile signed char *, signed char,...);
    154 signed char __sync_add_and_fetch_1(volatile signed char *, signed char,...);
    15599unsigned char __sync_add_and_fetch(volatile unsigned char *, unsigned char,...);
    156 unsigned char __sync_add_and_fetch_1(volatile unsigned char *, unsigned char,...);
    157100signed short __sync_add_and_fetch(volatile signed short *, signed short,...);
    158 signed short __sync_add_and_fetch_2(volatile signed short *, signed short,...);
    159101unsigned short __sync_add_and_fetch(volatile unsigned short *, unsigned short,...);
    160 unsigned short __sync_add_and_fetch_2(volatile unsigned short *, unsigned short,...);
    161102signed int __sync_add_and_fetch(volatile signed int *, signed int,...);
    162 signed int __sync_add_and_fetch_4(volatile signed int *, signed int,...);
    163103signed int __sync_add_and_fetch(volatile signed int *, signed int,...);
    164 signed int __sync_add_and_fetch_4(volatile signed int *, signed int,...);
     104signed long int __sync_add_and_fetch(volatile signed long int *, signed long int,...);
     105unsigned long int __sync_add_and_fetch(volatile unsigned long int *, unsigned long int,...);
    165106signed long long int __sync_add_and_fetch(volatile signed long long int *, signed long long int,...);
    166 signed long long int __sync_add_and_fetch_8(volatile signed long long int *, signed long long int,...);
    167107unsigned long long int __sync_add_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
    168 unsigned long long int __sync_add_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
    169108#if defined(__SIZEOF_INT128__)
    170109signed __int128 __sync_add_and_fetch(volatile signed __int128 *, signed __int128,...);
    171 signed __int128 __sync_add_and_fetch_16(volatile signed __int128 *, signed __int128,...);
    172110unsigned __int128 __sync_add_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
    173 unsigned __int128 __sync_add_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
    174111#endif
    175112
    176113char __sync_sub_and_fetch(volatile char *, char,...);
    177 char __sync_sub_and_fetch_1(volatile char *, char,...);
    178114signed char __sync_sub_and_fetch(volatile signed char *, signed char,...);
    179 signed char __sync_sub_and_fetch_1(volatile signed char *, signed char,...);
    180115unsigned char __sync_sub_and_fetch(volatile unsigned char *, unsigned char,...);
    181 unsigned char __sync_sub_and_fetch_1(volatile unsigned char *, unsigned char,...);
    182116signed short __sync_sub_and_fetch(volatile signed short *, signed short,...);
    183 signed short __sync_sub_and_fetch_2(volatile signed short *, signed short,...);
    184117unsigned short __sync_sub_and_fetch(volatile unsigned short *, unsigned short,...);
    185 unsigned short __sync_sub_and_fetch_2(volatile unsigned short *, unsigned short,...);
    186118signed int __sync_sub_and_fetch(volatile signed int *, signed int,...);
    187 signed int __sync_sub_and_fetch_4(volatile signed int *, signed int,...);
    188119unsigned int __sync_sub_and_fetch(volatile unsigned int *, unsigned int,...);
    189 unsigned int __sync_sub_and_fetch_4(volatile unsigned int *, unsigned int,...);
     120signed long int __sync_sub_and_fetch(volatile signed long int *, signed long int,...);
     121unsigned long int __sync_sub_and_fetch(volatile unsigned long int *, unsigned long int,...);
    190122signed long long int __sync_sub_and_fetch(volatile signed long long int *, signed long long int,...);
    191 signed long long int __sync_sub_and_fetch_8(volatile signed long long int *, signed long long int,...);
    192123unsigned long long int __sync_sub_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
    193 unsigned long long int __sync_sub_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
    194124#if defined(__SIZEOF_INT128__)
    195125signed __int128 __sync_sub_and_fetch(volatile signed __int128 *, signed __int128,...);
    196 signed __int128 __sync_sub_and_fetch_16(volatile signed __int128 *, signed __int128,...);
    197126unsigned __int128 __sync_sub_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
    198 unsigned __int128 __sync_sub_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
    199127#endif
    200128
    201129char __sync_or_and_fetch(volatile char *, char,...);
    202 char __sync_or_and_fetch_1(volatile char *, char,...);
    203130signed char __sync_or_and_fetch(volatile signed char *, signed char,...);
    204 signed char __sync_or_and_fetch_1(volatile signed char *, signed char,...);
    205131unsigned char __sync_or_and_fetch(volatile unsigned char *, unsigned char,...);
    206 unsigned char __sync_or_and_fetch_1(volatile unsigned char *, unsigned char,...);
    207132signed short __sync_or_and_fetch(volatile signed short *, signed short,...);
    208 signed short __sync_or_and_fetch_2(volatile signed short *, signed short,...);
    209133unsigned short __sync_or_and_fetch(volatile unsigned short *, unsigned short,...);
    210 unsigned short __sync_or_and_fetch_2(volatile unsigned short *, unsigned short,...);
    211134signed int __sync_or_and_fetch(volatile signed int *, signed int,...);
    212 signed int __sync_or_and_fetch_4(volatile signed int *, signed int,...);
    213135unsigned int __sync_or_and_fetch(volatile unsigned int *, unsigned int,...);
    214 unsigned int __sync_or_and_fetch_4(volatile unsigned int *, unsigned int,...);
     136signed long int __sync_or_and_fetch(volatile signed long int *, signed long int,...);
     137unsigned long int __sync_or_and_fetch(volatile unsigned long int *, unsigned long int,...);
    215138signed long long int __sync_or_and_fetch(volatile signed long long int *, signed long long int,...);
    216 signed long long int __sync_or_and_fetch_8(volatile signed long long int *, signed long long int,...);
    217139unsigned long long int __sync_or_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
    218 unsigned long long int __sync_or_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
    219140#if defined(__SIZEOF_INT128__)
    220141signed __int128 __sync_or_and_fetch(volatile signed __int128 *, signed __int128,...);
    221 signed __int128 __sync_or_and_fetch_16(volatile signed __int128 *, signed __int128,...);
    222142unsigned __int128 __sync_or_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
    223 unsigned __int128 __sync_or_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
    224143#endif
    225144
    226145char __sync_and_and_fetch(volatile char *, char,...);
    227 char __sync_and_and_fetch_1(volatile char *, char,...);
    228146signed char __sync_and_and_fetch(volatile signed char *, signed char,...);
    229 signed char __sync_and_and_fetch_1(volatile signed char *, signed char,...);
    230147unsigned char __sync_and_and_fetch(volatile unsigned char *, unsigned char,...);
    231 unsigned char __sync_and_and_fetch_1(volatile unsigned char *, unsigned char,...);
    232148signed short __sync_and_and_fetch(volatile signed short *, signed short,...);
    233 signed short __sync_and_and_fetch_2(volatile signed short *, signed short,...);
    234149unsigned short __sync_and_and_fetch(volatile unsigned short *, unsigned short,...);
    235 unsigned short __sync_and_and_fetch_2(volatile unsigned short *, unsigned short,...);
    236150signed int __sync_and_and_fetch(volatile signed int *, signed int,...);
    237 signed int __sync_and_and_fetch_4(volatile signed int *, signed int,...);
    238151unsigned int __sync_and_and_fetch(volatile unsigned int *, unsigned int,...);
    239 unsigned int __sync_and_and_fetch_4(volatile unsigned int *, unsigned int,...);
     152signed long int __sync_and_and_fetch(volatile signed long int *, signed long int,...);
     153unsigned long int __sync_and_and_fetch(volatile unsigned long int *, unsigned long int,...);
    240154signed long long int __sync_and_and_fetch(volatile signed long long int *, signed long long int,...);
    241 signed long long int __sync_and_and_fetch_8(volatile signed long long int *, signed long long int,...);
    242155unsigned long long int __sync_and_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
    243 unsigned long long int __sync_and_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
    244156#if defined(__SIZEOF_INT128__)
    245157signed __int128 __sync_and_and_fetch(volatile signed __int128 *, signed __int128,...);
    246 signed __int128 __sync_and_and_fetch_16(volatile signed __int128 *, signed __int128,...);
    247158unsigned __int128 __sync_and_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
    248 unsigned __int128 __sync_and_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
    249159#endif
    250160
    251161char __sync_xor_and_fetch(volatile char *, char,...);
    252 char __sync_xor_and_fetch_1(volatile char *, char,...);
    253162signed char __sync_xor_and_fetch(volatile signed char *, signed char,...);
    254 signed char __sync_xor_and_fetch_1(volatile signed char *, signed char,...);
    255163unsigned char __sync_xor_and_fetch(volatile unsigned char *, unsigned char,...);
    256 unsigned char __sync_xor_and_fetch_1(volatile unsigned char *, unsigned char,...);
    257164signed short __sync_xor_and_fetch(volatile signed short *, signed short,...);
    258 signed short __sync_xor_and_fetch_2(volatile signed short *, signed short,...);
    259165unsigned short __sync_xor_and_fetch(volatile unsigned short *, unsigned short,...);
    260 unsigned short __sync_xor_and_fetch_2(volatile unsigned short *, unsigned short,...);
    261166signed int __sync_xor_and_fetch(volatile signed int *, signed int,...);
    262 signed int __sync_xor_and_fetch_4(volatile signed int *, signed int,...);
    263167unsigned int __sync_xor_and_fetch(volatile unsigned int *, unsigned int,...);
    264 unsigned int __sync_xor_and_fetch_4(volatile unsigned int *, unsigned int,...);
     168signed long int __sync_xor_and_fetch(volatile signed long int *, signed long int,...);
     169unsigned long int __sync_xor_and_fetch(volatile unsigned long int *, unsigned long int,...);
    265170signed long long int __sync_xor_and_fetch(volatile signed long long int *, signed long long int,...);
    266 signed long long int __sync_xor_and_fetch_8(volatile signed long long int *, signed long long int,...);
    267171unsigned long long int __sync_xor_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
    268 unsigned long long int __sync_xor_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
    269172#if defined(__SIZEOF_INT128__)
    270173signed __int128 __sync_xor_and_fetch(volatile signed __int128 *, signed __int128,...);
    271 signed __int128 __sync_xor_and_fetch_16(volatile signed __int128 *, signed __int128,...);
    272174unsigned __int128 __sync_xor_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
    273 unsigned __int128 __sync_xor_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
    274175#endif
    275176
    276177char __sync_nand_and_fetch(volatile char *, char,...);
    277 char __sync_nand_and_fetch_1(volatile char *, char,...);
    278178signed char __sync_nand_and_fetch(volatile signed char *, signed char,...);
    279 signed char __sync_nand_and_fetch_1(volatile signed char *, signed char,...);
    280179unsigned char __sync_nand_and_fetch(volatile unsigned char *, unsigned char,...);
    281 unsigned char __sync_nand_and_fetch_1(volatile unsigned char *, unsigned char,...);
    282180signed short __sync_nand_and_fetch(volatile signed short *, signed short,...);
    283 signed short __sync_nand_and_fetch_2(volatile signed short *, signed short,...);
    284181unsigned short __sync_nand_and_fetch(volatile unsigned short *, unsigned short,...);
    285 unsigned short __sync_nand_and_fetch_2(volatile unsigned short *, unsigned short,...);
    286182signed int __sync_nand_and_fetch(volatile signed int *, signed int,...);
    287 signed int __sync_nand_and_fetch_4(volatile signed int *, signed int,...);
    288183unsigned int __sync_nand_and_fetch(volatile unsigned int *, unsigned int,...);
    289 unsigned int __sync_nand_and_fetch_4(volatile unsigned int *, unsigned int,...);
     184signed long int __sync_nand_and_fetch(volatile signed long int *, signed long int,...);
     185unsigned long int __sync_nand_and_fetch(volatile unsigned long int *, unsigned long int,...);
    290186signed long long int __sync_nand_and_fetch(volatile signed long long int *, signed long long int,...);
    291 signed long long int __sync_nand_and_fetch_8(volatile signed long long int *, signed long long int,...);
    292187unsigned long long int __sync_nand_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
    293 unsigned long long int __sync_nand_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
    294188#if defined(__SIZEOF_INT128__)
    295189signed __int128 __sync_nand_and_fetch(volatile signed __int128 *, signed __int128,...);
    296 signed __int128 __sync_nand_and_fetch_16(volatile signed __int128 *, signed __int128,...);
    297190unsigned __int128 __sync_nand_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
    298 unsigned __int128 __sync_nand_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
    299191#endif
    300192
    301193_Bool __sync_bool_compare_and_swap(volatile char *, char, char,...);
    302 _Bool __sync_bool_compare_and_swap_1(volatile char *, char, char,...);
    303194_Bool __sync_bool_compare_and_swap(volatile signed char *, signed char, signed char,...);
    304 _Bool __sync_bool_compare_and_swap_1(volatile signed char *, signed char, signed char,...);
    305195_Bool __sync_bool_compare_and_swap(volatile unsigned char *, unsigned char, unsigned char,...);
    306 _Bool __sync_bool_compare_and_swap_1(volatile unsigned char *, unsigned char, unsigned char,...);
    307196_Bool __sync_bool_compare_and_swap(volatile short *, signed short, signed short,...);
    308 _Bool __sync_bool_compare_and_swap_2(volatile short *, signed short, signed short,...);
    309197_Bool __sync_bool_compare_and_swap(volatile short *, unsigned short, unsigned short,...);
    310 _Bool __sync_bool_compare_and_swap_2(volatile short *, unsigned short, unsigned short,...);
    311198_Bool __sync_bool_compare_and_swap(volatile signed int *, signed int, signed int,...);
    312 _Bool __sync_bool_compare_and_swap_4(volatile signed int *, signed int, signed int,...);
    313199_Bool __sync_bool_compare_and_swap(volatile unsigned int *, unsigned int, unsigned int,...);
    314 _Bool __sync_bool_compare_and_swap_4(volatile unsigned int *, unsigned int, unsigned int,...);
     200_Bool __sync_bool_compare_and_swap(volatile signed long int *, signed long int, signed long int,...);
     201_Bool __sync_bool_compare_and_swap(volatile unsigned long int *, unsigned long int, unsigned long int,...);
    315202_Bool __sync_bool_compare_and_swap(volatile signed long long int *, signed long long int, signed long long int,...);
    316 _Bool __sync_bool_compare_and_swap_8(volatile signed long long int *, signed long long int, signed long long int,...);
    317203_Bool __sync_bool_compare_and_swap(volatile unsigned long long int *, unsigned long long int, unsigned long long int,...);
    318 _Bool __sync_bool_compare_and_swap_8(volatile unsigned long long int *, unsigned long long int, unsigned long long int,...);
    319204#if defined(__SIZEOF_INT128__)
    320205_Bool __sync_bool_compare_and_swap(volatile signed __int128 *, signed __int128, signed __int128,...);
    321 _Bool __sync_bool_compare_and_swap_16(volatile signed __int128 *, signed __int128, signed __int128,...);
    322206_Bool __sync_bool_compare_and_swap(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...);
    323 _Bool __sync_bool_compare_and_swap_16(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...);
    324207#endif
    325208forall(dtype T) _Bool __sync_bool_compare_and_swap(T * volatile *, T *, T*, ...);
    326209
    327210char __sync_val_compare_and_swap(volatile char *, char, char,...);
    328 char __sync_val_compare_and_swap_1(volatile char *, char, char,...);
    329211signed char __sync_val_compare_and_swap(volatile signed char *, signed char, signed char,...);
    330 signed char __sync_val_compare_and_swap_1(volatile signed char *, signed char, signed char,...);
    331212unsigned char __sync_val_compare_and_swap(volatile unsigned char *, unsigned char, unsigned char,...);
    332 unsigned char __sync_val_compare_and_swap_1(volatile unsigned char *, unsigned char, unsigned char,...);
    333213signed short __sync_val_compare_and_swap(volatile signed short *, signed short, signed short,...);
    334 signed short __sync_val_compare_and_swap_2(volatile signed short *, signed short, signed short,...);
    335214unsigned short __sync_val_compare_and_swap(volatile unsigned short *, unsigned short, unsigned short,...);
    336 unsigned short __sync_val_compare_and_swap_2(volatile unsigned short *, unsigned short, unsigned short,...);
    337215signed int __sync_val_compare_and_swap(volatile signed int *, signed int, signed int,...);
    338 signed int __sync_val_compare_and_swap_4(volatile signed int *, signed int, signed int,...);
    339216unsigned int __sync_val_compare_and_swap(volatile unsigned int *, unsigned int, unsigned int,...);
    340 unsigned int __sync_val_compare_and_swap_4(volatile unsigned int *, unsigned int, unsigned int,...);
     217signed long int __sync_val_compare_and_swap(volatile signed long int *, signed long int, signed long int,...);
     218unsigned long int __sync_val_compare_and_swap(volatile unsigned long int *, unsigned long int, unsigned long int,...);
    341219signed long long int __sync_val_compare_and_swap(volatile signed long long int *, signed long long int, signed long long int,...);
    342 signed long long int __sync_val_compare_and_swap_8(volatile signed long long int *, signed long long int, signed long long int,...);
    343220unsigned long long int __sync_val_compare_and_swap(volatile unsigned long long int *, unsigned long long int, unsigned long long int,...);
    344 unsigned long long int __sync_val_compare_and_swap_8(volatile unsigned long long int *, unsigned long long int, unsigned long long int,...);
    345221#if defined(__SIZEOF_INT128__)
    346222signed __int128 __sync_val_compare_and_swap(volatile signed __int128 *, signed __int128, signed __int128,...);
    347 signed __int128 __sync_val_compare_and_swap_16(volatile signed __int128 *, signed __int128, signed __int128,...);
    348223unsigned __int128 __sync_val_compare_and_swap(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...);
    349 unsigned __int128 __sync_val_compare_and_swap_16(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...);
    350224#endif
    351225forall(dtype T) T * __sync_val_compare_and_swap(T * volatile *, T *, T*,...);
    352226
    353227char __sync_lock_test_and_set(volatile char *, char,...);
    354 char __sync_lock_test_and_set_1(volatile char *, char,...);
    355228signed char __sync_lock_test_and_set(volatile signed char *, signed char,...);
    356 signed char __sync_lock_test_and_set_1(volatile signed char *, signed char,...);
    357229unsigned char __sync_lock_test_and_set(volatile unsigned char *, unsigned char,...);
    358 unsigned char __sync_lock_test_and_set_1(volatile unsigned char *, unsigned char,...);
    359230signed short __sync_lock_test_and_set(volatile signed short *, signed short,...);
    360 signed short __sync_lock_test_and_set_2(volatile signed short *, signed short,...);
    361231unsigned short __sync_lock_test_and_set(volatile unsigned short *, unsigned short,...);
    362 unsigned short __sync_lock_test_and_set_2(volatile unsigned short *, unsigned short,...);
    363232signed int __sync_lock_test_and_set(volatile signed int *, signed int,...);
    364 signed int __sync_lock_test_and_set_4(volatile signed int *, signed int,...);
    365233unsigned int __sync_lock_test_and_set(volatile unsigned int *, unsigned int,...);
    366 unsigned int __sync_lock_test_and_set_4(volatile unsigned int *, unsigned int,...);
     234signed long int __sync_lock_test_and_set(volatile signed long int *, signed long int,...);
     235unsigned long int __sync_lock_test_and_set(volatile unsigned long int *, unsigned long int,...);
    367236signed long long int __sync_lock_test_and_set(volatile signed long long int *, signed long long int,...);
    368 signed long long int __sync_lock_test_and_set_8(volatile signed long long int *, signed long long int,...);
    369237unsigned long long int __sync_lock_test_and_set(volatile unsigned long long int *, unsigned long long int,...);
    370 unsigned long long int __sync_lock_test_and_set_8(volatile unsigned long long int *, unsigned long long int,...);
    371238#if defined(__SIZEOF_INT128__)
    372239signed __int128 __sync_lock_test_and_set(volatile signed __int128 *, signed __int128,...);
    373 signed __int128 __sync_lock_test_and_set_16(volatile signed __int128 *, signed __int128,...);
    374240unsigned __int128 __sync_lock_test_and_set(volatile unsigned __int128 *, unsigned __int128,...);
    375 unsigned __int128 __sync_lock_test_and_set_16(volatile unsigned __int128 *, unsigned __int128,...);
    376241#endif
    377242
    378243void __sync_lock_release(volatile char *,...);
    379 void __sync_lock_release_1(volatile char *,...);
    380244void __sync_lock_release(volatile signed char *,...);
    381 void __sync_lock_release_1(volatile signed char *,...);
    382245void __sync_lock_release(volatile unsigned char *,...);
    383 void __sync_lock_release_1(volatile unsigned char *,...);
    384246void __sync_lock_release(volatile signed short *,...);
    385 void __sync_lock_release_2(volatile signed short *,...);
    386247void __sync_lock_release(volatile unsigned short *,...);
    387 void __sync_lock_release_2(volatile unsigned short *,...);
    388248void __sync_lock_release(volatile signed int *,...);
    389 void __sync_lock_release_4(volatile signed int *,...);
    390249void __sync_lock_release(volatile unsigned int *,...);
    391 void __sync_lock_release_4(volatile unsigned int *,...);
     250void __sync_lock_release(volatile signed long int *,...);
     251void __sync_lock_release(volatile unsigned long int *,...);
    392252void __sync_lock_release(volatile signed long long int *,...);
    393 void __sync_lock_release_8(volatile signed long long int *,...);
    394253void __sync_lock_release(volatile unsigned long long int *,...);
    395 void __sync_lock_release_8(volatile unsigned long long int *,...);
    396254#if defined(__SIZEOF_INT128__)
    397255void __sync_lock_release(volatile signed __int128 *,...);
    398 void __sync_lock_release_16(volatile signed __int128 *,...);
    399256void __sync_lock_release(volatile unsigned __int128 *,...);
    400 void __sync_lock_release_16(volatile unsigned __int128 *,...);
    401257#endif
    402258
     
    414270_Bool __atomic_test_and_set(volatile signed int *, int);
    415271_Bool __atomic_test_and_set(volatile unsigned int *, int);
     272_Bool __atomic_test_and_set(volatile signed long int *, int);
     273_Bool __atomic_test_and_set(volatile unsigned long int *, int);
    416274_Bool __atomic_test_and_set(volatile signed long long int *, int);
    417275_Bool __atomic_test_and_set(volatile unsigned long long int *, int);
     
    429287void __atomic_clear(volatile signed int *, int);
    430288void __atomic_clear(volatile unsigned int *, int);
     289void __atomic_clear(volatile signed long int *, int);
     290void __atomic_clear(volatile unsigned long int *, int);
    431291void __atomic_clear(volatile signed long long int *, int);
    432292void __atomic_clear(volatile unsigned long long int *, int);
     
    437297
    438298_Bool __atomic_exchange_n(volatile _Bool *, _Bool, int);
    439 _Bool __atomic_exchange_1(volatile _Bool *, _Bool, int);
    440299void __atomic_exchange(volatile _Bool *, volatile _Bool *, volatile _Bool *, int);
    441300char __atomic_exchange_n(volatile char *, char, int);
    442 char __atomic_exchange_1(volatile char *, char, int);
    443301void __atomic_exchange(volatile char *, volatile char *, volatile char *, int);
    444302signed char __atomic_exchange_n(volatile signed char *, signed char, int);
    445 signed char __atomic_exchange_1(volatile signed char *, signed char, int);
    446303void __atomic_exchange(volatile signed char *, volatile signed char *, volatile signed char *, int);
    447304unsigned char __atomic_exchange_n(volatile unsigned char *, unsigned char, int);
    448 unsigned char __atomic_exchange_1(volatile unsigned char *, unsigned char, int);
    449305void __atomic_exchange(volatile unsigned char *, volatile unsigned char *, volatile unsigned char *, int);
    450306signed short __atomic_exchange_n(volatile signed short *, signed short, int);
    451 signed short __atomic_exchange_2(volatile signed short *, signed short, int);
    452307void __atomic_exchange(volatile signed short *, volatile signed short *, volatile signed short *, int);
    453308unsigned short __atomic_exchange_n(volatile unsigned short *, unsigned short, int);
    454 unsigned short __atomic_exchange_2(volatile unsigned short *, unsigned short, int);
    455309void __atomic_exchange(volatile unsigned short *, volatile unsigned short *, volatile unsigned short *, int);
    456310signed int __atomic_exchange_n(volatile signed int *, signed int, int);
    457 signed int __atomic_exchange_4(volatile signed int *, signed int, int);
    458311void __atomic_exchange(volatile signed int *, volatile signed int *, volatile signed int *, int);
    459312unsigned int __atomic_exchange_n(volatile unsigned int *, unsigned int, int);
    460 unsigned int __atomic_exchange_4(volatile unsigned int *, unsigned int, int);
    461313void __atomic_exchange(volatile unsigned int *, volatile unsigned int *, volatile unsigned int *, int);
     314signed long int __atomic_exchange_n(volatile signed long int *, signed long int, int);
     315void __atomic_exchange(volatile signed long int *, volatile signed long int *, volatile signed long int *, int);
     316unsigned long int __atomic_exchange_n(volatile unsigned long int *, unsigned long int, int);
     317void __atomic_exchange(volatile unsigned long int *, volatile unsigned long int *, volatile unsigned long int *, int);
    462318signed long long int __atomic_exchange_n(volatile signed long long int *, signed long long int, int);
    463 signed long long int __atomic_exchange_8(volatile signed long long int *, signed long long int, int);
    464319void __atomic_exchange(volatile signed long long int *, volatile signed long long int *, volatile signed long long int *, int);
    465320unsigned long long int __atomic_exchange_n(volatile unsigned long long int *, unsigned long long int, int);
    466 unsigned long long int __atomic_exchange_8(volatile unsigned long long int *, unsigned long long int, int);
    467321void __atomic_exchange(volatile unsigned long long int *, volatile unsigned long long int *, volatile unsigned long long int *, int);
    468322#if defined(__SIZEOF_INT128__)
    469323signed __int128 __atomic_exchange_n(volatile signed __int128 *, signed __int128, int);
    470 signed __int128 __atomic_exchange_16(volatile signed __int128 *, signed __int128, int);
    471324void __atomic_exchange(volatile signed __int128 *, volatile signed __int128 *, volatile signed __int128 *, int);
    472325unsigned __int128 __atomic_exchange_n(volatile unsigned __int128 *, unsigned __int128, int);
    473 unsigned __int128 __atomic_exchange_16(volatile unsigned __int128 *, unsigned __int128, int);
    474326void __atomic_exchange(volatile unsigned __int128 *, volatile unsigned __int128 *, volatile unsigned __int128 *, int);
    475327#endif
     
    480332void __atomic_load(const volatile _Bool *, volatile _Bool *, int);
    481333char __atomic_load_n(const volatile char *, int);
    482 char __atomic_load_1(const volatile char *, int);
    483334void __atomic_load(const volatile char *, volatile char *, int);
    484335signed char __atomic_load_n(const volatile signed char *, int);
    485 signed char __atomic_load_1(const volatile signed char *, int);
    486336void __atomic_load(const volatile signed char *, volatile signed char *, int);
    487337unsigned char __atomic_load_n(const volatile unsigned char *, int);
    488 unsigned char __atomic_load_1(const volatile unsigned char *, int);
    489338void __atomic_load(const volatile unsigned char *, volatile unsigned char *, int);
    490339signed short __atomic_load_n(const volatile signed short *, int);
    491 signed short __atomic_load_2(const volatile signed short *, int);
    492340void __atomic_load(const volatile signed short *, volatile signed short *, int);
    493341unsigned short __atomic_load_n(const volatile unsigned short *, int);
    494 unsigned short __atomic_load_2(const volatile unsigned short *, int);
    495342void __atomic_load(const volatile unsigned short *, volatile unsigned short *, int);
    496343signed int __atomic_load_n(const volatile signed int *, int);
    497 signed int __atomic_load_4(const volatile signed int *, int);
    498344void __atomic_load(const volatile signed int *, volatile signed int *, int);
    499345unsigned int __atomic_load_n(const volatile unsigned int *, int);
    500 unsigned int __atomic_load_4(const volatile unsigned int *, int);
    501346void __atomic_load(const volatile unsigned int *, volatile unsigned int *, int);
     347signed long int __atomic_load_n(const volatile signed long int *, int);
     348void __atomic_load(const volatile signed long int *, volatile signed long int *, int);
     349unsigned long int __atomic_load_n(const volatile unsigned long int *, int);
     350void __atomic_load(const volatile unsigned long int *, volatile unsigned long int *, int);
    502351signed long long int __atomic_load_n(const volatile signed long long int *, int);
    503 signed long long int __atomic_load_8(const volatile signed long long int *, int);
    504352void __atomic_load(const volatile signed long long int *, volatile signed long long int *, int);
    505353unsigned long long int __atomic_load_n(const volatile unsigned long long int *, int);
    506 unsigned long long int __atomic_load_8(const volatile unsigned long long int *, int);
    507354void __atomic_load(const volatile unsigned long long int *, volatile unsigned long long int *, int);
    508355#if defined(__SIZEOF_INT128__)
    509356signed __int128 __atomic_load_n(const volatile signed __int128 *, int);
    510 signed __int128 __atomic_load_16(const volatile signed __int128 *, int);
    511357void __atomic_load(const volatile signed __int128 *, volatile signed __int128 *, int);
    512358unsigned __int128 __atomic_load_n(const volatile unsigned __int128 *, int);
    513 unsigned __int128 __atomic_load_16(const volatile unsigned __int128 *, int);
    514359void __atomic_load(const volatile unsigned __int128 *, volatile unsigned __int128 *, int);
    515360#endif
     
    518363
    519364_Bool __atomic_compare_exchange_n(volatile char *, char *, char, _Bool, int, int);
    520 _Bool __atomic_compare_exchange_1(volatile char *, char *, char, _Bool, int, int);
    521365_Bool __atomic_compare_exchange  (volatile char *, char *, char *, _Bool, int, int);
    522366_Bool __atomic_compare_exchange_n(volatile signed char *, signed char *, signed char, _Bool, int, int);
    523 _Bool __atomic_compare_exchange_1(volatile signed char *, signed char *, signed char, _Bool, int, int);
    524367_Bool __atomic_compare_exchange  (volatile signed char *, signed char *, signed char *, _Bool, int, int);
    525368_Bool __atomic_compare_exchange_n(volatile unsigned char *, unsigned char *, unsigned char, _Bool, int, int);
    526 _Bool __atomic_compare_exchange_1(volatile unsigned char *, unsigned char *, unsigned char, _Bool, int, int);
    527369_Bool __atomic_compare_exchange  (volatile unsigned char *, unsigned char *, unsigned char *, _Bool, int, int);
    528370_Bool __atomic_compare_exchange_n(volatile signed short *, signed short *, signed short, _Bool, int, int);
    529 _Bool __atomic_compare_exchange_2(volatile signed short *, signed short *, signed short, _Bool, int, int);
    530371_Bool __atomic_compare_exchange  (volatile signed short *, signed short *, signed short *, _Bool, int, int);
    531372_Bool __atomic_compare_exchange_n(volatile unsigned short *, unsigned short *, unsigned short, _Bool, int, int);
    532 _Bool __atomic_compare_exchange_2(volatile unsigned short *, unsigned short *, unsigned short, _Bool, int, int);
    533373_Bool __atomic_compare_exchange  (volatile unsigned short *, unsigned short *, unsigned short *, _Bool, int, int);
    534374_Bool __atomic_compare_exchange_n(volatile signed int *, signed int *, signed int, _Bool, int, int);
    535 _Bool __atomic_compare_exchange_4(volatile signed int *, signed int *, signed int, _Bool, int, int);
    536375_Bool __atomic_compare_exchange  (volatile signed int *, signed int *, signed int *, _Bool, int, int);
    537376_Bool __atomic_compare_exchange_n(volatile unsigned int *, unsigned int *, unsigned int, _Bool, int, int);
    538 _Bool __atomic_compare_exchange_4(volatile unsigned int *, unsigned int *, unsigned int, _Bool, int, int);
    539377_Bool __atomic_compare_exchange  (volatile unsigned int *, unsigned int *, unsigned int *, _Bool, int, int);
     378_Bool __atomic_compare_exchange_n(volatile signed long int *, signed long int *, signed long int, _Bool, int, int);
     379_Bool __atomic_compare_exchange  (volatile signed long int *, signed long int *, signed long int *, _Bool, int, int);
     380_Bool __atomic_compare_exchange_n(volatile unsigned long int *, unsigned long int *, unsigned long int, _Bool, int, int);
     381_Bool __atomic_compare_exchange  (volatile unsigned long int *, unsigned long int *, unsigned long int *, _Bool, int, int);
    540382_Bool __atomic_compare_exchange_n(volatile signed long long int *, signed long long int *, signed long long int, _Bool, int, int);
    541 _Bool __atomic_compare_exchange_8(volatile signed long long int *, signed long long int *, signed long long int, _Bool, int, int);
    542383_Bool __atomic_compare_exchange  (volatile signed long long int *, signed long long int *, signed long long int *, _Bool, int, int);
    543384_Bool __atomic_compare_exchange_n(volatile unsigned long long int *, unsigned long long int *, unsigned long long int, _Bool, int, int);
    544 _Bool __atomic_compare_exchange_8(volatile unsigned long long int *, unsigned long long int *, unsigned long long int, _Bool, int, int);
    545385_Bool __atomic_compare_exchange  (volatile unsigned long long int *, unsigned long long int *, unsigned long long int *, _Bool, int, int);
    546386#if defined(__SIZEOF_INT128__)
    547387_Bool __atomic_compare_exchange_n (volatile signed __int128 *, signed __int128 *, signed __int128, _Bool, int, int);
    548 _Bool __atomic_compare_exchange_16(volatile signed __int128 *, signed __int128 *, signed __int128, _Bool, int, int);
    549388_Bool __atomic_compare_exchange   (volatile signed __int128 *, signed __int128 *, signed __int128 *, _Bool, int, int);
    550389_Bool __atomic_compare_exchange_n (volatile unsigned __int128 *, unsigned __int128 *, unsigned __int128, _Bool, int, int);
    551 _Bool __atomic_compare_exchange_16(volatile unsigned __int128 *, unsigned __int128 *, unsigned __int128, _Bool, int, int);
    552390_Bool __atomic_compare_exchange   (volatile unsigned __int128 *, unsigned __int128 *, unsigned __int128 *, _Bool, int, int);
    553391#endif
     
    558396void __atomic_store(volatile _Bool *, _Bool *, int);
    559397void __atomic_store_n(volatile char *, char, int);
    560 void __atomic_store_1(volatile char *, char, int);
    561398void __atomic_store(volatile char *, char *, int);
    562399void __atomic_store_n(volatile signed char *, signed char, int);
    563 void __atomic_store_1(volatile signed char *, signed char, int);
    564400void __atomic_store(volatile signed char *, signed char *, int);
    565401void __atomic_store_n(volatile unsigned char *, unsigned char, int);
    566 void __atomic_store_1(volatile unsigned char *, unsigned char, int);
    567402void __atomic_store(volatile unsigned char *, unsigned char *, int);
    568403void __atomic_store_n(volatile signed short *, signed short, int);
    569 void __atomic_store_2(volatile signed short *, signed short, int);
    570404void __atomic_store(volatile signed short *, signed short *, int);
    571405void __atomic_store_n(volatile unsigned short *, unsigned short, int);
    572 void __atomic_store_2(volatile unsigned short *, unsigned short, int);
    573406void __atomic_store(volatile unsigned short *, unsigned short *, int);
    574407void __atomic_store_n(volatile signed int *, signed int, int);
    575 void __atomic_store_4(volatile signed int *, signed int, int);
    576408void __atomic_store(volatile signed int *, signed int *, int);
    577409void __atomic_store_n(volatile unsigned int *, unsigned int, int);
    578 void __atomic_store_4(volatile unsigned int *, unsigned int, int);
    579410void __atomic_store(volatile unsigned int *, unsigned int *, int);
     411void __atomic_store_n(volatile signed long int *, signed long int, int);
     412void __atomic_store(volatile signed long int *, signed long int *, int);
     413void __atomic_store_n(volatile unsigned long int *, unsigned long int, int);
     414void __atomic_store(volatile unsigned long int *, unsigned long int *, int);
    580415void __atomic_store_n(volatile signed long long int *, signed long long int, int);
    581 void __atomic_store_8(volatile signed long long int *, signed long long int, int);
    582416void __atomic_store(volatile signed long long int *, signed long long int *, int);
    583417void __atomic_store_n(volatile unsigned long long int *, unsigned long long int, int);
    584 void __atomic_store_8(volatile unsigned long long int *, unsigned long long int, int);
    585418void __atomic_store(volatile unsigned long long int *, unsigned long long int *, int);
    586419#if defined(__SIZEOF_INT128__)
    587420void __atomic_store_n(volatile signed __int128 *, signed __int128, int);
    588 void __atomic_store_16(volatile signed __int128 *, signed __int128, int);
    589421void __atomic_store(volatile signed __int128 *, signed __int128 *, int);
    590422void __atomic_store_n(volatile unsigned __int128 *, unsigned __int128, int);
    591 void __atomic_store_16(volatile unsigned __int128 *, unsigned __int128, int);
    592423void __atomic_store(volatile unsigned __int128 *, unsigned __int128 *, int);
    593424#endif
     
    596427
    597428char __atomic_add_fetch  (volatile char *, char, int);
    598 char __atomic_add_fetch_1(volatile char *, char, int);
    599429signed char __atomic_add_fetch  (volatile signed char *, signed char, int);
    600 signed char __atomic_add_fetch_1(volatile signed char *, signed char, int);
    601430unsigned char __atomic_add_fetch  (volatile unsigned char *, unsigned char, int);
    602 unsigned char __atomic_add_fetch_1(volatile unsigned char *, unsigned char, int);
    603431signed short __atomic_add_fetch  (volatile signed short *, signed short, int);
    604 signed short __atomic_add_fetch_2(volatile signed short *, signed short, int);
    605432unsigned short __atomic_add_fetch  (volatile unsigned short *, unsigned short, int);
    606 unsigned short __atomic_add_fetch_2(volatile unsigned short *, unsigned short, int);
    607433signed int __atomic_add_fetch  (volatile signed int *, signed int, int);
    608 signed int __atomic_add_fetch_4(volatile signed int *, signed int, int);
    609434unsigned int __atomic_add_fetch  (volatile unsigned int *, unsigned int, int);
    610 unsigned int __atomic_add_fetch_4(volatile unsigned int *, unsigned int, int);
     435signed long int __atomic_add_fetch  (volatile signed long int *, signed long int, int);
     436unsigned long int __atomic_add_fetch  (volatile unsigned long int *, unsigned long int, int);
    611437signed long long int __atomic_add_fetch  (volatile signed long long int *, signed long long int, int);
    612 signed long long int __atomic_add_fetch_8(volatile signed long long int *, signed long long int, int);
    613438unsigned long long int __atomic_add_fetch  (volatile unsigned long long int *, unsigned long long int, int);
    614 unsigned long long int __atomic_add_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
    615439#if defined(__SIZEOF_INT128__)
    616440signed __int128 __atomic_add_fetch   (volatile signed __int128 *, signed __int128, int);
    617 signed __int128 __atomic_add_fetch_16(volatile signed __int128 *, signed __int128, int);
    618441unsigned __int128 __atomic_add_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
    619 unsigned __int128 __atomic_add_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
    620442#endif
    621443
    622444char __atomic_sub_fetch  (volatile char *, char, int);
    623 char __atomic_sub_fetch_1(volatile char *, char, int);
    624445signed char __atomic_sub_fetch  (volatile signed char *, signed char, int);
    625 signed char __atomic_sub_fetch_1(volatile signed char *, signed char, int);
    626446unsigned char __atomic_sub_fetch  (volatile unsigned char *, unsigned char, int);
    627 unsigned char __atomic_sub_fetch_1(volatile unsigned char *, unsigned char, int);
    628447signed short __atomic_sub_fetch  (volatile signed short *, signed short, int);
    629 signed short __atomic_sub_fetch_2(volatile signed short *, signed short, int);
    630448unsigned short __atomic_sub_fetch  (volatile unsigned short *, unsigned short, int);
    631 unsigned short __atomic_sub_fetch_2(volatile unsigned short *, unsigned short, int);
    632449signed int __atomic_sub_fetch  (volatile signed int *, signed int, int);
    633 signed int __atomic_sub_fetch_4(volatile signed int *, signed int, int);
    634450unsigned int __atomic_sub_fetch  (volatile unsigned int *, unsigned int, int);
    635 unsigned int __atomic_sub_fetch_4(volatile unsigned int *, unsigned int, int);
     451signed long long int __atomic_sub_fetch  (volatile signed long int *, signed long int, int);
     452unsigned long long int __atomic_sub_fetch  (volatile unsigned long int *, unsigned long int, int);
    636453signed long long int __atomic_sub_fetch  (volatile signed long long int *, signed long long int, int);
    637 signed long long int __atomic_sub_fetch_8(volatile signed long long int *, signed long long int, int);
    638454unsigned long long int __atomic_sub_fetch  (volatile unsigned long long int *, unsigned long long int, int);
    639 unsigned long long int __atomic_sub_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
    640455#if defined(__SIZEOF_INT128__)
    641456signed __int128 __atomic_sub_fetch   (volatile signed __int128 *, signed __int128, int);
    642 signed __int128 __atomic_sub_fetch_16(volatile signed __int128 *, signed __int128, int);
    643457unsigned __int128 __atomic_sub_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
    644 unsigned __int128 __atomic_sub_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
    645458#endif
    646459
    647460char __atomic_and_fetch  (volatile char *, char, int);
    648 char __atomic_and_fetch_1(volatile char *, char, int);
    649461signed char __atomic_and_fetch  (volatile signed char *, signed char, int);
    650 signed char __atomic_and_fetch_1(volatile signed char *, signed char, int);
    651462unsigned char __atomic_and_fetch  (volatile unsigned char *, unsigned char, int);
    652 unsigned char __atomic_and_fetch_1(volatile unsigned char *, unsigned char, int);
    653463signed short __atomic_and_fetch  (volatile signed short *, signed short, int);
    654 signed short __atomic_and_fetch_2(volatile signed short *, signed short, int);
    655464unsigned short __atomic_and_fetch  (volatile unsigned short *, unsigned short, int);
    656 unsigned short __atomic_and_fetch_2(volatile unsigned short *, unsigned short, int);
    657465signed int __atomic_and_fetch  (volatile signed int *, signed int, int);
    658 signed int __atomic_and_fetch_4(volatile signed int *, signed int, int);
    659466unsigned int __atomic_and_fetch  (volatile unsigned int *, unsigned int, int);
    660 unsigned int __atomic_and_fetch_4(volatile unsigned int *, unsigned int, int);
     467signed long int __atomic_and_fetch  (volatile signed long int *, signed long int, int);
     468unsigned long int __atomic_and_fetch  (volatile unsigned long int *, unsigned long int, int);
    661469signed long long int __atomic_and_fetch  (volatile signed long long int *, signed long long int, int);
    662 signed long long int __atomic_and_fetch_8(volatile signed long long int *, signed long long int, int);
    663470unsigned long long int __atomic_and_fetch  (volatile unsigned long long int *, unsigned long long int, int);
    664 unsigned long long int __atomic_and_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
    665471#if defined(__SIZEOF_INT128__)
    666472signed __int128 __atomic_and_fetch   (volatile signed __int128 *, signed __int128, int);
    667 signed __int128 __atomic_and_fetch_16(volatile signed __int128 *, signed __int128, int);
    668473unsigned __int128 __atomic_and_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
    669 unsigned __int128 __atomic_and_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
    670474#endif
    671475
    672476char __atomic_nand_fetch  (volatile char *, char, int);
    673 char __atomic_nand_fetch_1(volatile char *, char, int);
    674477signed char __atomic_nand_fetch  (volatile signed char *, signed char, int);
    675 signed char __atomic_nand_fetch_1(volatile signed char *, signed char, int);
    676478unsigned char __atomic_nand_fetch  (volatile unsigned char *, unsigned char, int);
    677 unsigned char __atomic_nand_fetch_1(volatile unsigned char *, unsigned char, int);
    678479signed short __atomic_nand_fetch  (volatile signed short *, signed short, int);
    679 signed short __atomic_nand_fetch_2(volatile signed short *, signed short, int);
    680480unsigned short __atomic_nand_fetch  (volatile unsigned short *, unsigned short, int);
    681 unsigned short __atomic_nand_fetch_2(volatile unsigned short *, unsigned short, int);
    682481signed int __atomic_nand_fetch  (volatile signed int *, signed int, int);
    683 signed int __atomic_nand_fetch_4(volatile signed int *, signed int, int);
    684482unsigned int __atomic_nand_fetch  (volatile unsigned int *, unsigned int, int);
    685 unsigned int __atomic_nand_fetch_4(volatile unsigned int *, unsigned int, int);
     483signed long int __atomic_nand_fetch  (volatile signed long int *, signed long int, int);
     484unsigned long int __atomic_nand_fetch  (volatile unsigned long int *, unsigned long int, int);
    686485signed long long int __atomic_nand_fetch  (volatile signed long long int *, signed long long int, int);
    687 signed long long int __atomic_nand_fetch_8(volatile signed long long int *, signed long long int, int);
    688486unsigned long long int __atomic_nand_fetch  (volatile unsigned long long int *, unsigned long long int, int);
    689 unsigned long long int __atomic_nand_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
    690487#if defined(__SIZEOF_INT128__)
    691488signed __int128 __atomic_nand_fetch   (volatile signed __int128 *, signed __int128, int);
    692 signed __int128 __atomic_nand_fetch_16(volatile signed __int128 *, signed __int128, int);
    693489unsigned __int128 __atomic_nand_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
    694 unsigned __int128 __atomic_nand_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
    695490#endif
    696491
    697492char __atomic_xor_fetch  (volatile char *, char, int);
    698 char __atomic_xor_fetch_1(volatile char *, char, int);
    699493signed char __atomic_xor_fetch  (volatile signed char *, signed char, int);
    700 signed char __atomic_xor_fetch_1(volatile signed char *, signed char, int);
    701494unsigned char __atomic_xor_fetch  (volatile unsigned char *, unsigned char, int);
    702 unsigned char __atomic_xor_fetch_1(volatile unsigned char *, unsigned char, int);
    703495signed short __atomic_xor_fetch  (volatile signed short *, signed short, int);
    704 signed short __atomic_xor_fetch_2(volatile signed short *, signed short, int);
    705496unsigned short __atomic_xor_fetch  (volatile unsigned short *, unsigned short, int);
    706 unsigned short __atomic_xor_fetch_2(volatile unsigned short *, unsigned short, int);
    707497signed int __atomic_xor_fetch  (volatile signed int *, signed int, int);
    708 signed int __atomic_xor_fetch_4(volatile signed int *, signed int, int);
    709498unsigned int __atomic_xor_fetch  (volatile unsigned int *, unsigned int, int);
    710 unsigned int __atomic_xor_fetch_4(volatile unsigned int *, unsigned int, int);
     499signed long int __atomic_xor_fetch  (volatile signed long int *, signed long int, int);
     500unsigned long int __atomic_xor_fetch  (volatile unsigned long int *, unsigned long int, int);
    711501signed long long int __atomic_xor_fetch  (volatile signed long long int *, signed long long int, int);
    712 signed long long int __atomic_xor_fetch_8(volatile signed long long int *, signed long long int, int);
    713502unsigned long long int __atomic_xor_fetch  (volatile unsigned long long int *, unsigned long long int, int);
    714 unsigned long long int __atomic_xor_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
    715503#if defined(__SIZEOF_INT128__)
    716504signed __int128 __atomic_xor_fetch   (volatile signed __int128 *, signed __int128, int);
    717 signed __int128 __atomic_xor_fetch_16(volatile signed __int128 *, signed __int128, int);
    718505unsigned __int128 __atomic_xor_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
    719 unsigned __int128 __atomic_xor_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
    720506#endif
    721507
    722508char __atomic_or_fetch  (volatile char *, char, int);
    723 char __atomic_or_fetch_1(volatile char *, char, int);
    724509signed char __atomic_or_fetch  (volatile signed char *, signed char, int);
    725 signed char __atomic_or_fetch_1(volatile signed char *, signed char, int);
    726510unsigned char __atomic_or_fetch  (volatile unsigned char *, unsigned char, int);
    727 unsigned char __atomic_or_fetch_1(volatile unsigned char *, unsigned char, int);
    728511signed short __atomic_or_fetch  (volatile signed short *, signed short, int);
    729 signed short __atomic_or_fetch_2(volatile signed short *, signed short, int);
    730512unsigned short __atomic_or_fetch  (volatile unsigned short *, unsigned short, int);
    731 unsigned short __atomic_or_fetch_2(volatile unsigned short *, unsigned short, int);
    732513signed int __atomic_or_fetch  (volatile signed int *, signed int, int);
    733 signed int __atomic_or_fetch_4(volatile signed int *, signed int, int);
    734514unsigned int __atomic_or_fetch  (volatile unsigned int *, unsigned int, int);
    735 unsigned int __atomic_or_fetch_4(volatile unsigned int *, unsigned int, int);
     515signed long int __atomic_or_fetch  (volatile signed long int *, signed long int, int);
     516unsigned long int __atomic_or_fetch  (volatile unsigned long int *, unsigned long int, int);
    736517signed long long int __atomic_or_fetch  (volatile signed long long int *, signed long long int, int);
    737 signed long long int __atomic_or_fetch_8(volatile signed long long int *, signed long long int, int);
    738518unsigned long long int __atomic_or_fetch  (volatile unsigned long long int *, unsigned long long int, int);
    739 unsigned long long int __atomic_or_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
    740519#if defined(__SIZEOF_INT128__)
    741520signed __int128 __atomic_or_fetch   (volatile signed __int128 *, signed __int128, int);
    742 signed __int128 __atomic_or_fetch_16(volatile signed __int128 *, signed __int128, int);
    743521unsigned __int128 __atomic_or_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
    744 unsigned __int128 __atomic_or_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
    745522#endif
    746523
    747524char __atomic_fetch_add  (volatile char *, char, int);
    748 char __atomic_fetch_add_1(volatile char *, char, int);
    749525signed char __atomic_fetch_add  (volatile signed char *, signed char, int);
    750 signed char __atomic_fetch_add_1(volatile signed char *, signed char, int);
    751526unsigned char __atomic_fetch_add  (volatile unsigned char *, unsigned char, int);
    752 unsigned char __atomic_fetch_add_1(volatile unsigned char *, unsigned char, int);
    753527signed short __atomic_fetch_add  (volatile signed short *, signed short, int);
    754 signed short __atomic_fetch_add_2(volatile signed short *, signed short, int);
    755528unsigned short __atomic_fetch_add  (volatile unsigned short *, unsigned short, int);
    756 unsigned short __atomic_fetch_add_2(volatile unsigned short *, unsigned short, int);
    757529signed int __atomic_fetch_add  (volatile signed int *, signed int, int);
    758 signed int __atomic_fetch_add_4(volatile signed int *, signed int, int);
    759530unsigned int __atomic_fetch_add  (volatile unsigned int *, unsigned int, int);
    760 unsigned int __atomic_fetch_add_4(volatile unsigned int *, unsigned int, int);
     531signed long int __atomic_fetch_add  (volatile signed long int *, signed long int, int);
     532unsigned long int __atomic_fetch_add  (volatile unsigned long int *, unsigned long int, int);
    761533signed long long int __atomic_fetch_add  (volatile signed long long int *, signed long long int, int);
    762 signed long long int __atomic_fetch_add_8(volatile signed long long int *, signed long long int, int);
    763534unsigned long long int __atomic_fetch_add  (volatile unsigned long long int *, unsigned long long int, int);
    764 unsigned long long int __atomic_fetch_add_8(volatile unsigned long long int *, unsigned long long int, int);
    765535#if defined(__SIZEOF_INT128__)
    766536signed __int128 __atomic_fetch_add   (volatile signed __int128 *, signed __int128, int);
    767 signed __int128 __atomic_fetch_add_16(volatile signed __int128 *, signed __int128, int);
    768537unsigned __int128 __atomic_fetch_add   (volatile unsigned __int128 *, unsigned __int128, int);
    769 unsigned __int128 __atomic_fetch_add_16(volatile unsigned __int128 *, unsigned __int128, int);
    770538#endif
    771539
    772540char __atomic_fetch_sub  (volatile char *, char, int);
    773 char __atomic_fetch_sub_1(volatile char *, char, int);
    774541signed char __atomic_fetch_sub  (volatile signed char *, signed char, int);
    775 signed char __atomic_fetch_sub_1(volatile signed char *, signed char, int);
    776542unsigned char __atomic_fetch_sub  (volatile unsigned char *, unsigned char, int);
    777 unsigned char __atomic_fetch_sub_1(volatile unsigned char *, unsigned char, int);
    778543signed short __atomic_fetch_sub  (volatile signed short *, signed short, int);
    779 signed short __atomic_fetch_sub_2(volatile signed short *, signed short, int);
    780544unsigned short __atomic_fetch_sub  (volatile unsigned short *, unsigned short, int);
    781 unsigned short __atomic_fetch_sub_2(volatile unsigned short *, unsigned short, int);
    782545signed int __atomic_fetch_sub  (volatile signed int *, signed int, int);
    783 signed int __atomic_fetch_sub_4(volatile signed int *, signed int, int);
    784546unsigned int __atomic_fetch_sub  (volatile unsigned int *, unsigned int, int);
    785 unsigned int __atomic_fetch_sub_4(volatile unsigned int *, unsigned int, int);
     547signed long int __atomic_fetch_sub  (volatile signed long int *, signed long int, int);
     548unsigned long int __atomic_fetch_sub  (volatile unsigned long int *, unsigned long int, int);
    786549signed long long int __atomic_fetch_sub  (volatile signed long long int *, signed long long int, int);
    787 signed long long int __atomic_fetch_sub_8(volatile signed long long int *, signed long long int, int);
    788550unsigned long long int __atomic_fetch_sub  (volatile unsigned long long int *, unsigned long long int, int);
    789 unsigned long long int __atomic_fetch_sub_8(volatile unsigned long long int *, unsigned long long int, int);
    790551#if defined(__SIZEOF_INT128__)
    791552signed __int128 __atomic_fetch_sub   (volatile signed  __int128 *, signed __int128, int);
    792 signed __int128 __atomic_fetch_sub_16(volatile signed  __int128 *, signed __int128, int);
    793553unsigned __int128 __atomic_fetch_sub   (volatile unsigned  __int128 *, unsigned __int128, int);
    794 unsigned __int128 __atomic_fetch_sub_16(volatile unsigned  __int128 *, unsigned __int128, int);
    795554#endif
    796555
    797556char __atomic_fetch_and  (volatile char *, char, int);
    798 char __atomic_fetch_and_1(volatile char *, char, int);
    799557signed char __atomic_fetch_and  (volatile signed char *, signed char, int);
    800 signed char __atomic_fetch_and_1(volatile signed char *, signed char, int);
    801558unsigned char __atomic_fetch_and  (volatile unsigned char *, unsigned char, int);
    802 unsigned char __atomic_fetch_and_1(volatile unsigned char *, unsigned char, int);
    803559signed short __atomic_fetch_and  (volatile signed short *, signed short, int);
    804 signed short __atomic_fetch_and_2(volatile signed short *, signed short, int);
    805560unsigned short __atomic_fetch_and  (volatile unsigned short *, unsigned short, int);
    806 unsigned short __atomic_fetch_and_2(volatile unsigned short *, unsigned short, int);
    807561signed int __atomic_fetch_and  (volatile signed int *, signed int, int);
    808 signed int __atomic_fetch_and_4(volatile signed int *, signed int, int);
    809562unsigned int __atomic_fetch_and  (volatile unsigned int *, unsigned int, int);
    810 unsigned int __atomic_fetch_and_4(volatile unsigned int *, unsigned int, int);
     563signed long int __atomic_fetch_and  (volatile signed long int *, signed long int, int);
     564unsigned long int __atomic_fetch_and  (volatile unsigned long int *, unsigned long int, int);
    811565signed long long int __atomic_fetch_and  (volatile signed long long int *, signed long long int, int);
    812 signed long long int __atomic_fetch_and_8(volatile signed long long int *, signed long long int, int);
    813566unsigned long long int __atomic_fetch_and  (volatile unsigned long long int *, unsigned long long int, int);
    814 unsigned long long int __atomic_fetch_and_8(volatile unsigned long long int *, unsigned long long int, int);
    815567#if defined(__SIZEOF_INT128__)
    816568signed __int128 __atomic_fetch_and   (volatile signed __int128 *, signed __int128, int);
    817 signed __int128 __atomic_fetch_and_16(volatile signed __int128 *, signed __int128, int);
    818569unsigned __int128 __atomic_fetch_and   (volatile unsigned __int128 *, unsigned __int128, int);
    819 unsigned __int128 __atomic_fetch_and_16(volatile unsigned __int128 *, unsigned __int128, int);
    820570#endif
    821571
    822572char __atomic_fetch_nand  (volatile char *, char, int);
    823 char __atomic_fetch_nand_1(volatile char *, char, int);
    824573signed char __atomic_fetch_nand  (volatile signed char *, signed char, int);
    825 signed char __atomic_fetch_nand_1(volatile signed char *, signed char, int);
    826574unsigned char __atomic_fetch_nand  (volatile unsigned char *, unsigned char, int);
    827 unsigned char __atomic_fetch_nand_1(volatile unsigned char *, unsigned char, int);
    828575signed short __atomic_fetch_nand  (volatile signed short *, signed short, int);
    829 signed short __atomic_fetch_nand_2(volatile signed short *, signed short, int);
    830576unsigned short __atomic_fetch_nand  (volatile unsigned short *, unsigned short, int);
    831 unsigned short __atomic_fetch_nand_2(volatile unsigned short *, unsigned short, int);
    832577signed int __atomic_fetch_nand  (volatile signed int *, signed int, int);
    833 signed int __atomic_fetch_nand_4(volatile signed int *, signed int, int);
    834578unsigned int __atomic_fetch_nand  (volatile unsigned int *, unsigned int, int);
    835 unsigned int __atomic_fetch_nand_4(volatile unsigned int *, unsigned int, int);
     579signed long int __atomic_fetch_nand  (volatile signed long int *, signed long int, int);
     580unsigned long int __atomic_fetch_nand  (volatile unsigned long int *, unsigned long int, int);
    836581signed long long int __atomic_fetch_nand  (volatile signed long long int *, signed long long int, int);
    837 signed long long int __atomic_fetch_nand_8(volatile signed long long int *, signed long long int, int);
    838582unsigned long long int __atomic_fetch_nand  (volatile unsigned long long int *, unsigned long long int, int);
    839 unsigned long long int __atomic_fetch_nand_8(volatile unsigned long long int *, unsigned long long int, int);
    840583#if defined(__SIZEOF_INT128__)
    841584signed __int128 __atomic_fetch_nand   (volatile signed __int128 *, signed __int128, int);
    842 signed __int128 __atomic_fetch_nand_16(volatile signed __int128 *, signed __int128, int);
    843585unsigned __int128 __atomic_fetch_nand   (volatile unsigned __int128 *, unsigned __int128, int);
    844 unsigned __int128 __atomic_fetch_nand_16(volatile unsigned __int128 *, unsigned __int128, int);
    845586#endif
    846587
    847588char __atomic_fetch_xor  (volatile char *, char, int);
    848 char __atomic_fetch_xor_1(volatile char *, char, int);
    849589signed char __atomic_fetch_xor  (volatile signed char *, signed char, int);
    850 signed char __atomic_fetch_xor_1(volatile signed char *, signed char, int);
    851590unsigned char __atomic_fetch_xor  (volatile unsigned char *, unsigned char, int);
    852 unsigned char __atomic_fetch_xor_1(volatile unsigned char *, unsigned char, int);
    853591signed short __atomic_fetch_xor  (volatile signed short *, signed short, int);
    854 signed short __atomic_fetch_xor_2(volatile signed short *, signed short, int);
    855592unsigned short __atomic_fetch_xor  (volatile unsigned short *, unsigned short, int);
    856 unsigned short __atomic_fetch_xor_2(volatile unsigned short *, unsigned short, int);
    857593signed int __atomic_fetch_xor  (volatile signed int *, signed int, int);
    858 signed int __atomic_fetch_xor_4(volatile signed int *, signed int, int);
    859594unsigned int __atomic_fetch_xor  (volatile unsigned int *, unsigned int, int);
    860 unsigned int __atomic_fetch_xor_4(volatile unsigned int *, unsigned int, int);
     595signed long int __atomic_fetch_xor  (volatile signed long int *, signed long int, int);
     596unsigned long int __atomic_fetch_xor  (volatile unsigned long int *, unsigned long int, int);
    861597signed long long int __atomic_fetch_xor  (volatile signed long long int *, signed long long int, int);
    862 signed long long int __atomic_fetch_xor_8(volatile signed long long int *, signed long long int, int);
    863598unsigned long long int __atomic_fetch_xor  (volatile unsigned long long int *, unsigned long long int, int);
    864 unsigned long long int __atomic_fetch_xor_8(volatile unsigned long long int *, unsigned long long int, int);
    865599#if defined(__SIZEOF_INT128__)
    866600signed __int128 __atomic_fetch_xor   (volatile signed __int128 *, signed __int128, int);
    867 signed __int128 __atomic_fetch_xor_16(volatile signed __int128 *, signed __int128, int);
    868601unsigned __int128 __atomic_fetch_xor   (volatile unsigned __int128 *, unsigned __int128, int);
    869 unsigned __int128 __atomic_fetch_xor_16(volatile unsigned __int128 *, unsigned __int128, int);
    870602#endif
    871603
    872604char __atomic_fetch_or  (volatile char *, char, int);
    873 char __atomic_fetch_or_1(volatile char *, char, int);
    874605signed char __atomic_fetch_or  (volatile signed char *, signed char, int);
    875 signed char __atomic_fetch_or_1(volatile signed char *, signed char, int);
    876606unsigned char __atomic_fetch_or  (volatile unsigned char *, unsigned char, int);
    877 unsigned char __atomic_fetch_or_1(volatile unsigned char *, unsigned char, int);
    878607signed short __atomic_fetch_or  (volatile signed short *, signed short, int);
    879 signed short __atomic_fetch_or_2(volatile signed short *, signed short, int);
    880608unsigned short __atomic_fetch_or  (volatile unsigned short *, unsigned short, int);
    881 unsigned short __atomic_fetch_or_2(volatile unsigned short *, unsigned short, int);
    882609signed int __atomic_fetch_or  (volatile signed int *, signed int, int);
    883 signed int __atomic_fetch_or_4(volatile signed int *, signed int, int);
    884610unsigned int __atomic_fetch_or  (volatile unsigned int *, unsigned int, int);
    885 unsigned int __atomic_fetch_or_4(volatile unsigned int *, unsigned int, int);
     611signed long int __atomic_fetch_or  (volatile signed long int *, signed long int, int);
     612unsigned long int __atomic_fetch_or  (volatile unsigned long int *, unsigned long int, int);
    886613signed long long int __atomic_fetch_or  (volatile signed long long int *, signed long long int, int);
    887 signed long long int __atomic_fetch_or_8(volatile signed long long int *, signed long long int, int);
    888614unsigned long long int __atomic_fetch_or  (volatile unsigned long long int *, unsigned long long int, int);
    889 unsigned long long int __atomic_fetch_or_8(volatile unsigned long long int *, unsigned long long int, int);
    890615#if defined(__SIZEOF_INT128__)
    891616signed __int128 __atomic_fetch_or   (volatile signed __int128 *, signed __int128, int);
    892 signed __int128 __atomic_fetch_or_16(volatile signed __int128 *, signed __int128, int);
    893617unsigned __int128 __atomic_fetch_or   (volatile unsigned __int128 *, unsigned __int128, int);
    894 unsigned __int128 __atomic_fetch_or_16(volatile unsigned __int128 *, unsigned __int128, int);
    895618#endif
    896619
  • libcfa/src/assert.cfa

    r7768b8d r30763fd  
    1010// Created On       : Mon Nov 28 12:27:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 20 15:10:26 2017
    13 // Update Count     : 2
     12// Last Modified On : Thu Nov 21 17:09:26 2019
     13// Update Count     : 5
    1414//
    1515
     
    1717#include <stdarg.h>                                                             // varargs
    1818#include <stdio.h>                                                              // fprintf
     19#include <unistd.h>                                                             // STDERR_FILENO
    1920#include "bits/debug.hfa"
    2021
     
    2627        // called by macro assert in assert.h
    2728        void __assert_fail( const char *assertion, const char *file, unsigned int line, const char *function ) {
    28                 __cfaabi_dbg_bits_print_safe( CFA_ASSERT_FMT ".\n", assertion, __progname, function, line, file );
     29                __cfaabi_bits_print_safe( STDERR_FILENO, CFA_ASSERT_FMT ".\n", assertion, __progname, function, line, file );
    2930                abort();
    3031        }
     
    3233        // called by macro assertf
    3334        void __assert_fail_f( const char *assertion, const char *file, unsigned int line, const char *function, const char *fmt, ... ) {
    34                 __cfaabi_dbg_bits_acquire();
    35                 __cfaabi_dbg_bits_print_nolock( CFA_ASSERT_FMT ": ", assertion, __progname, function, line, file );
     35                __cfaabi_bits_acquire();
     36                __cfaabi_bits_print_nolock( STDERR_FILENO, CFA_ASSERT_FMT ": ", assertion, __progname, function, line, file );
    3637
    3738                va_list args;
    3839                va_start( args, fmt );
    39                 __cfaabi_dbg_bits_print_vararg( fmt, args );
     40                __cfaabi_bits_print_vararg( STDERR_FILENO, fmt, args );
    4041                va_end( args );
    4142
    42                 __cfaabi_dbg_bits_print_nolock( "\n" );
    43                 __cfaabi_dbg_bits_release();
     43                __cfaabi_bits_print_nolock( STDERR_FILENO, "\n" );
     44                __cfaabi_bits_release();
    4445                abort();
    4546        }
  • libcfa/src/bits/align.hfa

    r7768b8d r30763fd  
    1010// Created On       : Mon Nov 28 12:27:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 23:05:35 2017
    13 // Update Count     : 2
     12// Last Modified On : Sat Nov 16 18:58:22 2019
     13// Update Count     : 3
    1414//
    1515// This  library is free  software; you  can redistribute  it and/or  modify it
     
    3333
    3434// Minimum size used to align memory boundaries for memory allocations.
    35 #define libAlign() (sizeof(double))
     35//#define libAlign() (sizeof(double))
     36// gcc-7 uses xmms instructions, which require 16 byte alignment.
     37#define libAlign() (16)
    3638
    3739// Check for power of 2
  • libcfa/src/bits/debug.cfa

    r7768b8d r30763fd  
    1010// Created On       : Thu Mar 30 12:30:01 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Jul 14 22:17:35 2019
    13 // Update Count     : 4
     12// Last Modified On : Thu Nov 21 17:16:30 2019
     13// Update Count     : 10
    1414//
    1515
     
    2828extern "C" {
    2929
    30         void __cfaabi_dbg_bits_write( const char *in_buffer, int len ) {
     30        void __cfaabi_bits_write( int fd, const char *in_buffer, int len ) {
    3131                // ensure all data is written
    3232                for ( int count = 0, retcode; count < len; count += retcode ) {
     
    3434
    3535                        for ( ;; ) {
    36                                 retcode = write( STDERR_FILENO, in_buffer, len - count );
     36                                retcode = write( fd, in_buffer, len - count );
    3737
    3838                                // not a timer interrupt ?
     
    4444        }
    4545
    46         void __cfaabi_dbg_bits_acquire() __attribute__((__weak__)) {}
    47         void __cfaabi_dbg_bits_release() __attribute__((__weak__)) {}
     46        void __cfaabi_bits_acquire() __attribute__((__weak__)) {}
     47        void __cfaabi_bits_release() __attribute__((__weak__)) {}
    4848
    49         void __cfaabi_dbg_bits_print_safe  ( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) )) {
     49        void __cfaabi_bits_print_safe  ( int fd, const char fmt[], ... ) __attribute__(( format(printf, 2, 3) )) {
    5050                va_list args;
    5151
    5252                va_start( args, fmt );
    53                 __cfaabi_dbg_bits_acquire();
     53                __cfaabi_bits_acquire();
    5454
    5555                int len = vsnprintf( buffer, buffer_size, fmt, args );
    56                 __cfaabi_dbg_bits_write( buffer, len );
     56                __cfaabi_bits_write( fd, buffer, len );
    5757
    58                 __cfaabi_dbg_bits_release();
     58                __cfaabi_bits_release();
    5959                va_end( args );
    6060        }
    6161
    62         void __cfaabi_dbg_bits_print_nolock( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) )) {
     62        void __cfaabi_bits_print_nolock( int fd, const char fmt[], ... ) __attribute__(( format(printf, 2, 3) )) {
    6363                va_list args;
    6464
     
    6666
    6767                int len = vsnprintf( buffer, buffer_size, fmt, args );
    68                 __cfaabi_dbg_bits_write( buffer, len );
     68                __cfaabi_bits_write( fd, buffer, len );
    6969
    7070                va_end( args );
    7171        }
    7272
    73         void __cfaabi_dbg_bits_print_vararg( const char fmt[], va_list args ) {
     73        void __cfaabi_bits_print_vararg( int fd, const char fmt[], va_list args ) {
    7474                int len = vsnprintf( buffer, buffer_size, fmt, args );
    75                 __cfaabi_dbg_bits_write( buffer, len );
     75                __cfaabi_bits_write( fd, buffer, len );
    7676        }
    7777
    78         void __cfaabi_dbg_bits_print_buffer( char in_buffer[], int in_buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 3, 4) )) {
     78        void __cfaabi_bits_print_buffer( int fd, char in_buffer[], int in_buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 4, 5) )) {
    7979                va_list args;
    8080
     
    8282
    8383                int len = vsnprintf( in_buffer, in_buffer_size, fmt, args );
    84                 __cfaabi_dbg_bits_write( in_buffer, len );
     84                __cfaabi_bits_write( fd, in_buffer, len );
    8585
    8686                va_end( args );
  • libcfa/src/bits/debug.hfa

    r7768b8d r30763fd  
    1010// Created On       : Mon Nov 28 12:27:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb  8 12:35:19 2018
    13 // Update Count     : 2
     12// Last Modified On : Thu Nov 21 17:06:58 2019
     13// Update Count     : 8
    1414//
    1515
     
    3838        #include <stdio.h>
    3939
    40       extern void __cfaabi_dbg_bits_write( const char *buffer, int len );
    41       extern void __cfaabi_dbg_bits_acquire();
    42       extern void __cfaabi_dbg_bits_release();
    43       extern void __cfaabi_dbg_bits_print_safe  ( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) ));
    44       extern void __cfaabi_dbg_bits_print_nolock( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) ));
    45       extern void __cfaabi_dbg_bits_print_vararg( const char fmt[], va_list arg );
    46       extern void __cfaabi_dbg_bits_print_buffer( char buffer[], int buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 3, 4) ));
     40        extern void __cfaabi_bits_write( int fd, const char *buffer, int len );
     41        extern void __cfaabi_bits_acquire();
     42        extern void __cfaabi_bits_release();
     43        extern void __cfaabi_bits_print_safe  ( int fd, const char fmt[], ... ) __attribute__(( format(printf, 2, 3) ));
     44        extern void __cfaabi_bits_print_nolock( int fd, const char fmt[], ... ) __attribute__(( format(printf, 2, 3) ));
     45        extern void __cfaabi_bits_print_vararg( int fd, const char fmt[], va_list arg );
     46        extern void __cfaabi_bits_print_buffer( int fd, char buffer[], int buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 4, 5) ));
    4747#ifdef __cforall
    4848}
     
    5050
    5151#ifdef __CFA_DEBUG_PRINT__
    52         #define __cfaabi_dbg_write( buffer, len )         __cfaabi_dbg_bits_write( buffer, len )
    53         #define __cfaabi_dbg_acquire()                    __cfaabi_dbg_bits_acquire()
    54         #define __cfaabi_dbg_release()                    __cfaabi_dbg_bits_release()
    55         #define __cfaabi_dbg_print_safe(...)              __cfaabi_dbg_bits_print_safe   (__VA_ARGS__)
    56         #define __cfaabi_dbg_print_nolock(...)            __cfaabi_dbg_bits_print_nolock (__VA_ARGS__)
    57         #define __cfaabi_dbg_print_buffer(...)            __cfaabi_dbg_bits_print_buffer (__VA_ARGS__)
    58         #define __cfaabi_dbg_print_buffer_decl(...)       char __dbg_text[256]; int __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_dbg_bits_write( __dbg_text, __dbg_len );
    59         #define __cfaabi_dbg_print_buffer_local(...)      __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_dbg_bits_write( __dbg_text, __dbg_len );
     52        #define __cfaabi_dbg_write( buffer, len )         __cfaabi_bits_write( STDERR_FILENO, buffer, len )
     53        #define __cfaabi_dbg_acquire()                    __cfaabi_bits_acquire()
     54        #define __cfaabi_dbg_release()                    __cfaabi_bits_release()
     55        #define __cfaabi_dbg_print_safe(...)              __cfaabi_bits_print_safe   (__VA_ARGS__)
     56        #define __cfaabi_dbg_print_nolock(...)            __cfaabi_bits_print_nolock (__VA_ARGS__)
     57        #define __cfaabi_dbg_print_buffer(...)            __cfaabi_bits_print_buffer (__VA_ARGS__)
     58        #define __cfaabi_dbg_print_buffer_decl(...)       char __dbg_text[256]; int __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_bits_write( __dbg_text, __dbg_len );
     59        #define __cfaabi_dbg_print_buffer_local(...)      __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_dbg_write( __dbg_text, __dbg_len );
    6060#else
    6161        #define __cfaabi_dbg_write(...)               ((void)0)
  • libcfa/src/concurrency/kernel.cfa

    r7768b8d r30763fd  
    1010// Created On       : Tue Jan 17 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jun 20 17:21:23 2019
    13 // Update Count     : 25
     12// Last Modified On : Thu Nov 21 16:46:59 2019
     13// Update Count     : 27
    1414//
    1515
     
    841841        if(thrd) {
    842842                int len = snprintf( abort_text, abort_text_size, "Error occurred while executing thread %.256s (%p)", thrd->self_cor.name, thrd );
    843                 __cfaabi_dbg_bits_write( abort_text, len );
     843                __cfaabi_bits_write( STDERR_FILENO, abort_text, len );
    844844
    845845                if ( &thrd->self_cor != thrd->curr_cor ) {
    846846                        len = snprintf( abort_text, abort_text_size, " in coroutine %.256s (%p).\n", thrd->curr_cor->name, thrd->curr_cor );
    847                         __cfaabi_dbg_bits_write( abort_text, len );
     847                        __cfaabi_bits_write( STDERR_FILENO, abort_text, len );
    848848                }
    849849                else {
    850                         __cfaabi_dbg_bits_write( ".\n", 2 );
     850                        __cfaabi_bits_write( STDERR_FILENO, ".\n", 2 );
    851851                }
    852852        }
    853853        else {
    854854                int len = snprintf( abort_text, abort_text_size, "Error occurred outside of any thread.\n" );
    855                 __cfaabi_dbg_bits_write( abort_text, len );
     855                __cfaabi_bits_write( STDERR_FILENO, abort_text, len );
    856856        }
    857857}
     
    864864
    865865extern "C" {
    866         void __cfaabi_dbg_bits_acquire() {
     866        void __cfaabi_bits_acquire() {
    867867                lock( kernel_debug_lock __cfaabi_dbg_ctx2 );
    868868        }
    869869
    870         void __cfaabi_dbg_bits_release() {
     870        void __cfaabi_bits_release() {
    871871                unlock( kernel_debug_lock );
    872872        }
  • libcfa/src/heap.cfa

    r7768b8d r30763fd  
    1010// Created On       : Tue Dec 19 21:58:35 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Oct 18 07:42:09 2019
    13 // Update Count     : 556
     12// Last Modified On : Sun Nov 24 17:56:15 2019
     13// Update Count     : 638
    1414//
    1515
     
    1818#include <stdio.h>                                                                              // snprintf, fileno
    1919#include <errno.h>                                                                              // errno
     20#include <string.h>                                                                             // memset, memcpy
    2021extern "C" {
    2122#include <sys/mman.h>                                                                   // mmap, munmap
     
    2728#include "bits/locks.hfa"                                                               // __spinlock_t
    2829#include "startup.hfa"                                                                  // STARTUP_PRIORITY_MEMORY
    29 #include "stdlib.hfa"                                                                   // bsearchl
     30//#include "stdlib.hfa"                                                                 // bsearchl
    3031#include "malloc.h"
    3132
     33#define MIN(x, y) (y > x ? x : y)
    3234
    3335static bool traceHeap = false;
     
    5052
    5153
    52 static bool checkFree = false;
    53 
    54 inline bool checkFree() {
    55         return checkFree;
    56 } // checkFree
    57 
    58 bool checkFreeOn() {
    59         bool temp = checkFree;
    60         checkFree = true;
     54static bool prtFree = false;
     55
     56inline bool prtFree() {
     57        return prtFree;
     58} // prtFree
     59
     60bool prtFreeOn() {
     61        bool temp = prtFree;
     62        prtFree = true;
    6163        return temp;
    62 } // checkFreeOn
    63 
    64 bool checkFreeOff() {
    65         bool temp = checkFree;
    66         checkFree = false;
     64} // prtFreeOn
     65
     66bool prtFreeOff() {
     67        bool temp = prtFree;
     68        prtFree = false;
    6769        return temp;
    68 } // checkFreeOff
     70} // prtFreeOff
    6971
    7072
     
    8991
    9092enum {
     93        // Define the default extension heap amount in units of bytes. When the uC++ supplied heap reaches the brk address,
     94        // the brk address is extended by the extension amount.
     95        __CFA_DEFAULT_HEAP_EXPANSION__ = (1 * 1024 * 1024),
     96
     97        // Define the mmap crossover point during allocation. Allocations less than this amount are allocated from buckets;
     98        // values greater than or equal to this value are mmap from the operating system.
    9199        __CFA_DEFAULT_MMAP_START__ = (512 * 1024 + 1),
    92         __CFA_DEFAULT_HEAP_EXPANSION__ = (1 * 1024 * 1024),
    93100};
    94101
     
    105112static unsigned int allocFree;                                                  // running total of allocations minus frees
    106113
    107 static void checkUnfreed() {
     114static void prtUnfreed() {
    108115        if ( allocFree != 0 ) {
    109116                // DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT.
     
    112119                //                                      "Possible cause is unfreed storage allocated by the program or system/library routines called from the program.\n",
    113120                //                                      (long int)getpid(), allocFree, allocFree ); // always print the UNIX pid
    114                 // __cfaabi_dbg_bits_write( helpText, len );
    115         } // if
    116 } // checkUnfreed
     121                // __cfaabi_dbg_bits_write( STDERR_FILENO, helpText, len ); // print debug/nodebug
     122        } // if
     123} // prtUnfreed
    117124
    118125extern "C" {
     
    123130        void heapAppStop() {                                                            // called by __cfaabi_appready_startdown
    124131                fclose( stdin ); fclose( stdout );
    125                 checkUnfreed();
     132                prtUnfreed();
    126133        } // heapAppStop
    127134} // extern "C"
    128135#endif // __CFA_DEBUG__
     136
    129137
    130138// statically allocated variables => zero filled.
     
    134142static unsigned int maxBucketsUsed;                                             // maximum number of buckets in use
    135143
    136 
    137 // #comment TD : This defined is significantly different from the __ALIGN__ define from locks.hfa
    138 #define ALIGN 16
    139144
    140145#define SPINLOCK 0
     
    147152// Recursive definitions: HeapManager needs size of bucket array and bucket area needs sizeof HeapManager storage.
    148153// Break recusion by hardcoding number of buckets and statically checking number is correct after bucket array defined.
    149 enum { NoBucketSizes = 93 };                                                    // number of buckets sizes
     154enum { NoBucketSizes = 91 };                                                    // number of buckets sizes
    150155
    151156struct HeapManager {
     
    194199                        } kind; // Kind
    195200                } header; // Header
    196                 char pad[ALIGN - sizeof( Header )];
     201                char pad[libAlign() - sizeof( Header )];
    197202                char data[0];                                                                   // storage
    198203        }; // Storage
    199204
    200         static_assert( ALIGN >= sizeof( Storage ), "ALIGN < sizeof( Storage )" );
     205        static_assert( libAlign() >= sizeof( Storage ), "libAlign() < sizeof( Storage )" );
    201206
    202207        struct FreeHeader {
     
    228233#define __STATISTICS__
    229234
     235// Bucket size must be multiple of 16.
    230236// Powers of 2 are common allocation sizes, so make powers of 2 generate the minimum required size.
    231237static const unsigned int bucketSizes[] @= {                    // different bucket sizes
    232         16, 32, 48, 64,
    233         64 + sizeof(HeapManager.Storage), 96, 112, 128, 128 + sizeof(HeapManager.Storage), 160, 192, 224,
    234         256 + sizeof(HeapManager.Storage), 320, 384, 448, 512 + sizeof(HeapManager.Storage), 640, 768, 896,
    235         1_024 + sizeof(HeapManager.Storage), 1_536, 2_048 + sizeof(HeapManager.Storage), 2_560, 3_072, 3_584, 4_096 + sizeof(HeapManager.Storage), 6_144,
    236         8_192 + sizeof(HeapManager.Storage), 9_216, 10_240, 11_264, 12_288, 13_312, 14_336, 15_360,
    237         16_384 + sizeof(HeapManager.Storage), 18_432, 20_480, 22_528, 24_576, 26_624, 28_672, 30_720,
    238         32_768 + sizeof(HeapManager.Storage), 36_864, 40_960, 45_056, 49_152, 53_248, 57_344, 61_440,
    239         65_536 + sizeof(HeapManager.Storage), 73_728, 81_920, 90_112, 98_304, 106_496, 114_688, 122_880,
    240         131_072 + sizeof(HeapManager.Storage), 147_456, 163_840, 180_224, 196_608, 212_992, 229_376, 245_760,
    241         262_144 + sizeof(HeapManager.Storage), 294_912, 327_680, 360_448, 393_216, 425_984, 458_752, 491_520,
    242         524_288 + sizeof(HeapManager.Storage), 655_360, 786_432, 917_504, 1_048_576 + sizeof(HeapManager.Storage), 1_179_648, 1_310_720, 1_441_792,
    243         1_572_864, 1_703_936, 1_835_008, 1_966_080, 2_097_152 + sizeof(HeapManager.Storage), 2_621_440, 3_145_728, 3_670_016,
    244         4_194_304 + sizeof(HeapManager.Storage)
     238        16, 32, 48, 64 + sizeof(HeapManager.Storage), // 4
     239        96, 112, 128 + sizeof(HeapManager.Storage), // 3
     240        160, 192, 224, 256 + sizeof(HeapManager.Storage), // 4
     241        320, 384, 448, 512 + sizeof(HeapManager.Storage), // 4
     242        640, 768, 896, 1_024 + sizeof(HeapManager.Storage), // 4
     243        1_536, 2_048 + sizeof(HeapManager.Storage), // 2
     244        2_560, 3_072, 3_584, 4_096 + sizeof(HeapManager.Storage), // 4
     245        6_144, 8_192 + sizeof(HeapManager.Storage), // 2
     246        9_216, 10_240, 11_264, 12_288, 13_312, 14_336, 15_360, 16_384 + sizeof(HeapManager.Storage), // 8
     247        18_432, 20_480, 22_528, 24_576, 26_624, 28_672, 30_720, 32_768 + sizeof(HeapManager.Storage), // 8
     248        36_864, 40_960, 45_056, 49_152, 53_248, 57_344, 61_440, 65_536 + sizeof(HeapManager.Storage), // 8
     249        73_728, 81_920, 90_112, 98_304, 106_496, 114_688, 122_880, 131_072 + sizeof(HeapManager.Storage), // 8
     250        147_456, 163_840, 180_224, 196_608, 212_992, 229_376, 245_760, 262_144 + sizeof(HeapManager.Storage), // 8
     251        294_912, 327_680, 360_448, 393_216, 425_984, 458_752, 491_520, 524_288 + sizeof(HeapManager.Storage), // 8
     252        655_360, 786_432, 917_504, 1_048_576 + sizeof(HeapManager.Storage), // 4
     253        1_179_648, 1_310_720, 1_441_792, 1_572_864, 1_703_936, 1_835_008, 1_966_080, 2_097_152 + sizeof(HeapManager.Storage), // 8
     254        2_621_440, 3_145_728, 3_670_016, 4_194_304 + sizeof(HeapManager.Storage), // 4
    245255};
    246256
     
    251261static unsigned char lookup[LookupSizes];                               // O(1) lookup for small sizes
    252262#endif // FASTLOOKUP
     263
    253264static int mmapFd = -1;                                                                 // fake or actual fd for anonymous file
    254 
    255 
    256265#ifdef __CFA_DEBUG__
    257266static bool heapBoot = 0;                                                               // detect recursion during boot
     
    259268static HeapManager heapManager __attribute__(( aligned (128) )) @= {}; // size of cache line to prevent false sharing
    260269
    261 // #comment TD : The return type of this function should be commented
    262 static inline bool setMmapStart( size_t value ) {
    263   if ( value < pageSize || bucketSizes[NoBucketSizes - 1] < value ) return true;
    264         mmapStart = value;                                                                      // set global
    265 
    266         // find the closest bucket size less than or equal to the mmapStart size
    267         maxBucketsUsed = bsearchl( (unsigned int)mmapStart, bucketSizes, NoBucketSizes ); // binary search
    268         assert( maxBucketsUsed < NoBucketSizes );                       // subscript failure ?
    269         assert( mmapStart <= bucketSizes[maxBucketsUsed] ); // search failure ?
    270         return false;
    271 } // setMmapStart
    272 
    273 
    274 static void ?{}( HeapManager & manager ) with ( manager ) {
    275         pageSize = sysconf( _SC_PAGESIZE );
    276 
    277         for ( unsigned int i = 0; i < NoBucketSizes; i += 1 ) { // initialize the free lists
    278                 freeLists[i].blockSize = bucketSizes[i];
    279         } // for
    280 
    281         #ifdef FASTLOOKUP
    282         unsigned int idx = 0;
    283         for ( unsigned int i = 0; i < LookupSizes; i += 1 ) {
    284                 if ( i > bucketSizes[idx] ) idx += 1;
    285                 lookup[i] = idx;
    286         } // for
    287         #endif // FASTLOOKUP
    288 
    289         if ( setMmapStart( default_mmap_start() ) ) {
    290                 abort( "HeapManager : internal error, mmap start initialization failure." );
    291         } // if
    292         heapExpand = default_heap_expansion();
    293 
    294         char * End = (char *)sbrk( 0 );
    295         sbrk( (char *)libCeiling( (long unsigned int)End, libAlign() ) - End ); // move start of heap to multiple of alignment
    296         heapBegin = heapEnd = sbrk( 0 );                                        // get new start point
    297 } // HeapManager
    298 
    299 
    300 static void ^?{}( HeapManager & ) {
    301         #ifdef __STATISTICS__
    302         // if ( traceHeapTerm() ) {
    303         //      printStats();
    304         //      if ( checkfree() ) checkFree( heapManager, true );
    305         // } // if
    306         #endif // __STATISTICS__
    307 } // ~HeapManager
    308 
    309 
    310 static void memory_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_MEMORY ) ));
    311 void memory_startup( void ) {
    312         #ifdef __CFA_DEBUG__
    313         if ( unlikely( heapBoot ) ) {                                           // check for recursion during system boot
    314                 // DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT.
    315                 abort( "boot() : internal error, recursively invoked during system boot." );
    316         } // if
    317         heapBoot = true;
    318         #endif // __CFA_DEBUG__
    319 
    320         //assert( heapManager.heapBegin != 0 );
    321         //heapManager{};
    322         if ( heapManager.heapBegin == 0 ) heapManager{};
    323 } // memory_startup
    324 
    325 static void memory_shutdown( void ) __attribute__(( destructor( STARTUP_PRIORITY_MEMORY ) ));
    326 void memory_shutdown( void ) {
    327         ^heapManager{};
    328 } // memory_shutdown
    329 
    330270
    331271#ifdef __STATISTICS__
    332 static unsigned long long int mmap_storage;                             // heap statistics counters
     272// Heap statistics counters.
     273static unsigned long long int mmap_storage;
    333274static unsigned int mmap_calls;
    334275static unsigned long long int munmap_storage;
     
    348289static unsigned long long int realloc_storage;
    349290static unsigned int realloc_calls;
    350 
    351 static int statfd;                                                                              // statistics file descriptor (changed by malloc_stats_fd)
    352 
     291// Statistics file descriptor (changed by malloc_stats_fd).
     292static int statfd = STDERR_FILENO;                                              // default stderr
    353293
    354294// Use "write" because streams may be shutdown when calls are made.
    355295static void printStats() {
    356296        char helpText[512];
    357         __cfaabi_dbg_bits_print_buffer( helpText, sizeof(helpText),
     297        __cfaabi_bits_print_buffer( STDERR_FILENO, helpText, sizeof(helpText),
    358298                                                                        "\nHeap statistics:\n"
    359299                                                                        "  malloc: calls %u / storage %llu\n"
     
    405345                                                sbrk_calls, sbrk_storage
    406346                );
    407         return write( fileno( stream ), helpText, len );        // -1 => error
     347        __cfaabi_bits_write( fileno( stream ), helpText, len ); // ensures all bytes written or exit
     348        return len;
    408349} // printStatsXML
    409350#endif // __STATISTICS__
     351
    410352
    411353// #comment TD : Is this the samething as Out-of-Memory?
     
    418360
    419361static inline void checkAlign( size_t alignment ) {
    420         if ( alignment < sizeof(void *) || ! libPow2( alignment ) ) {
    421                 abort( "Alignment %zu for memory allocation is less than sizeof(void *) and/or not a power of 2.", alignment );
     362        if ( alignment < libAlign() || ! libPow2( alignment ) ) {
     363                abort( "Alignment %zu for memory allocation is less than %d and/or not a power of 2.", alignment, libAlign() );
    422364        } // if
    423365} // checkAlign
     
    431373
    432374
    433 static inline void checkHeader( bool check, const char * name, void * addr ) {
    434         if ( unlikely( check ) ) {                                                      // bad address ?
    435                 abort( "Attempt to %s storage %p with address outside the heap.\n"
    436                            "Possible cause is duplicate free on same block or overwriting of memory.",
    437                            name, addr );
    438         } // if
    439 } // checkHeader
    440 
    441 // #comment TD : function should be commented and/or have a more evocative name
    442 //               this isn't either a check or a constructor which is what I would expect this function to be
    443 static inline void fakeHeader( HeapManager.Storage.Header *& header, size_t & size, size_t & alignment ) {
    444         if ( unlikely( (header->kind.fake.alignment & 1) == 1 ) ) { // fake header ?
    445                 size_t offset = header->kind.fake.offset;
    446                 alignment = header->kind.fake.alignment & -2;   // remove flag from value
    447                 #ifdef __CFA_DEBUG__
    448                 checkAlign( alignment );                                                // check alignment
    449                 #endif // __CFA_DEBUG__
    450                 header = (HeapManager.Storage.Header *)((char *)header - offset);
    451         } // if
    452 } // fakeHeader
    453 
    454 // #comment TD : Why is this a define
    455 #define headerAddr( addr ) ((HeapManager.Storage.Header *)( (char *)addr - sizeof(HeapManager.Storage) ))
    456 
    457 static inline bool headers( const char * name, void * addr, HeapManager.Storage.Header *& header, HeapManager.FreeHeader *& freeElem, size_t & size, size_t & alignment ) with ( heapManager ) {
    458         header = headerAddr( addr );
    459 
    460         if ( unlikely( heapEnd < addr ) ) {                                     // mmapped ?
    461                 fakeHeader( header, size, alignment );
    462                 size = header->kind.real.blockSize & -3;                // mmap size
    463                 return true;
    464         } // if
    465 
    466         #ifdef __CFA_DEBUG__
    467         checkHeader( addr < heapBegin || header < (HeapManager.Storage.Header *)heapBegin, name, addr ); // bad low address ?
    468         #endif // __CFA_DEBUG__
    469 
    470         // #comment TD : This code looks weird...
    471         //               It's called as the first statement of both branches of the last if, with the same parameters in all cases
    472 
    473         // header may be safe to dereference
    474         fakeHeader( header, size, alignment );
    475         #ifdef __CFA_DEBUG__
    476         checkHeader( header < (HeapManager.Storage.Header *)heapBegin || (HeapManager.Storage.Header *)heapEnd < header, name, addr ); // bad address ? (offset could be + or -)
    477         #endif // __CFA_DEBUG__
    478 
    479         freeElem = (HeapManager.FreeHeader *)((size_t)header->kind.real.home & -3);
    480         #ifdef __CFA_DEBUG__
    481         if ( freeElem < &freeLists[0] || &freeLists[NoBucketSizes] <= freeElem ) {
    482                 abort( "Attempt to %s storage %p with corrupted header.\n"
    483                            "Possible cause is duplicate free on same block or overwriting of header information.",
    484                            name, addr );
    485         } // if
    486         #endif // __CFA_DEBUG__
    487         size = freeElem->blockSize;
    488         return false;
    489 } // headers
    490 
    491 
    492 static inline void * extend( size_t size ) with ( heapManager ) {
    493         lock( extlock __cfaabi_dbg_ctx2 );
    494         ptrdiff_t rem = heapRemaining - size;
    495         if ( rem < 0 ) {
    496                 // If the size requested is bigger than the current remaining storage, increase the size of the heap.
    497 
    498                 size_t increase = libCeiling( size > heapExpand ? size : heapExpand, libAlign() );
    499                 if ( sbrk( increase ) == (void *)-1 ) {
    500                         unlock( extlock );
    501                         errno = ENOMEM;
    502                         return 0;
    503                 } // if
    504                 #ifdef __STATISTICS__
    505                 sbrk_calls += 1;
    506                 sbrk_storage += increase;
    507                 #endif // __STATISTICS__
    508                 #ifdef __CFA_DEBUG__
    509                 // Set new memory to garbage so subsequent uninitialized usages might fail.
    510                 memset( (char *)heapEnd + heapRemaining, '\377', increase );
    511                 #endif // __CFA_DEBUG__
    512                 rem = heapRemaining + increase - size;
    513         } // if
    514 
    515         HeapManager.Storage * block = (HeapManager.Storage *)heapEnd;
    516         heapRemaining = rem;
    517         heapEnd = (char *)heapEnd + size;
    518         unlock( extlock );
    519         return block;
    520 } // extend
    521 
    522 
     375// thunk problem
    523376size_t Bsearchl( unsigned int key, const unsigned int * vals, size_t dim ) {
    524377        size_t l = 0, m, h = dim;
     
    535388
    536389
     390static inline bool setMmapStart( size_t value ) {               // true => mmapped, false => sbrk
     391  if ( value < pageSize || bucketSizes[NoBucketSizes - 1] < value ) return true;
     392        mmapStart = value;                                                                      // set global
     393
     394        // find the closest bucket size less than or equal to the mmapStart size
     395        maxBucketsUsed = Bsearchl( (unsigned int)mmapStart, bucketSizes, NoBucketSizes ); // binary search
     396        assert( maxBucketsUsed < NoBucketSizes );                       // subscript failure ?
     397        assert( mmapStart <= bucketSizes[maxBucketsUsed] ); // search failure ?
     398        return false;
     399} // setMmapStart
     400
     401
     402static inline void checkHeader( bool check, const char * name, void * addr ) {
     403        if ( unlikely( check ) ) {                                                      // bad address ?
     404                abort( "Attempt to %s storage %p with address outside the heap.\n"
     405                           "Possible cause is duplicate free on same block or overwriting of memory.",
     406                           name, addr );
     407        } // if
     408} // checkHeader
     409
     410
     411static inline void fakeHeader( HeapManager.Storage.Header *& header, size_t & alignment ) {
     412        if ( unlikely( (header->kind.fake.alignment & 1) == 1 ) ) { // fake header ?
     413                size_t offset = header->kind.fake.offset;
     414                alignment = header->kind.fake.alignment & -2;   // remove flag from value
     415                #ifdef __CFA_DEBUG__
     416                checkAlign( alignment );                                                // check alignment
     417                #endif // __CFA_DEBUG__
     418                header = (HeapManager.Storage.Header *)((char *)header - offset);
     419        } // if
     420} // fakeHeader
     421
     422
     423// <-------+----------------------------------------------------> bsize (bucket size)
     424// |header |addr
     425//==================================================================================
     426//                                | alignment
     427// <-----------------<------------+-----------------------------> bsize (bucket size)
     428//                   |fake-header | addr
     429#define headerAddr( addr ) ((HeapManager.Storage.Header *)( (char *)addr - sizeof(HeapManager.Storage) ))
     430
     431// <-------<<--------------------- dsize ---------------------->> bsize (bucket size)
     432// |header |addr
     433//==================================================================================
     434//                                | alignment
     435// <------------------------------<<---------- dsize --------->>> bsize (bucket size)
     436//                   |fake-header |addr
     437#define dataStorage( bsize, addr, header ) (bsize - ( (char *)addr - (char *)header ))
     438
     439
     440static inline bool headers( const char * name __attribute__(( unused )), void * addr, HeapManager.Storage.Header *& header, HeapManager.FreeHeader *& freeElem, size_t & size, size_t & alignment ) with ( heapManager ) {
     441        header = headerAddr( addr );
     442
     443        if ( unlikely( heapEnd < addr ) ) {                                     // mmapped ?
     444                fakeHeader( header, alignment );
     445                size = header->kind.real.blockSize & -3;                // mmap size
     446                return true;
     447        } // if
     448
     449        #ifdef __CFA_DEBUG__
     450        checkHeader( addr < heapBegin || header < (HeapManager.Storage.Header *)heapBegin, name, addr ); // bad low address ?
     451        #endif // __CFA_DEBUG__
     452
     453        // header may be safe to dereference
     454        fakeHeader( header, alignment );
     455        #ifdef __CFA_DEBUG__
     456        checkHeader( header < (HeapManager.Storage.Header *)heapBegin || (HeapManager.Storage.Header *)heapEnd < header, name, addr ); // bad address ? (offset could be + or -)
     457        #endif // __CFA_DEBUG__
     458
     459        freeElem = (HeapManager.FreeHeader *)((size_t)header->kind.real.home & -3);
     460        #ifdef __CFA_DEBUG__
     461        if ( freeElem < &freeLists[0] || &freeLists[NoBucketSizes] <= freeElem ) {
     462                abort( "Attempt to %s storage %p with corrupted header.\n"
     463                           "Possible cause is duplicate free on same block or overwriting of header information.",
     464                           name, addr );
     465        } // if
     466        #endif // __CFA_DEBUG__
     467        size = freeElem->blockSize;
     468        return false;
     469} // headers
     470
     471
     472static inline void * extend( size_t size ) with ( heapManager ) {
     473        lock( extlock __cfaabi_dbg_ctx2 );
     474        ptrdiff_t rem = heapRemaining - size;
     475        if ( rem < 0 ) {
     476                // If the size requested is bigger than the current remaining storage, increase the size of the heap.
     477
     478                size_t increase = libCeiling( size > heapExpand ? size : heapExpand, libAlign() );
     479                if ( sbrk( increase ) == (void *)-1 ) {
     480                        unlock( extlock );
     481                        errno = ENOMEM;
     482                        return 0p;
     483                } // if
     484                #ifdef __STATISTICS__
     485                sbrk_calls += 1;
     486                sbrk_storage += increase;
     487                #endif // __STATISTICS__
     488                #ifdef __CFA_DEBUG__
     489                // Set new memory to garbage so subsequent uninitialized usages might fail.
     490                memset( (char *)heapEnd + heapRemaining, '\377', increase );
     491                #endif // __CFA_DEBUG__
     492                rem = heapRemaining + increase - size;
     493        } // if
     494
     495        HeapManager.Storage * block = (HeapManager.Storage *)heapEnd;
     496        heapRemaining = rem;
     497        heapEnd = (char *)heapEnd + size;
     498        unlock( extlock );
     499        return block;
     500} // extend
     501
     502
    537503static inline void * doMalloc( size_t size ) with ( heapManager ) {
    538504        HeapManager.Storage * block;                                            // pointer to new block of storage
     
    541507        // along with the block and is a multiple of the alignment size.
    542508
    543   if ( unlikely( size > ~0ul - sizeof(HeapManager.Storage) ) ) return 0;
     509  if ( unlikely( size > ~0ul - sizeof(HeapManager.Storage) ) ) return 0p;
    544510        size_t tsize = size + sizeof(HeapManager.Storage);
    545511        if ( likely( tsize < mmapStart ) ) {                            // small size => sbrk
     
    574540                block = freeElem->freeList.pop();
    575541                #endif // SPINLOCK
    576                 if ( unlikely( block == 0 ) ) {                                 // no free block ?
     542                if ( unlikely( block == 0p ) ) {                                // no free block ?
    577543                        #if defined( SPINLOCK )
    578544                        unlock( freeElem->lock );
     
    583549
    584550                        block = (HeapManager.Storage *)extend( tsize ); // mutual exclusion on call
    585   if ( unlikely( block == 0 ) ) return 0;
    586                         #if defined( SPINLOCK )
     551  if ( unlikely( block == 0p ) ) return 0p;
     552                #if defined( SPINLOCK )
    587553                } else {
    588554                        freeElem->freeList = block->header.kind.real.next;
    589555                        unlock( freeElem->lock );
    590                         #endif // SPINLOCK
     556                #endif // SPINLOCK
    591557                } // if
    592558
    593559                block->header.kind.real.home = freeElem;                // pointer back to free list of apropriate size
    594560        } else {                                                                                        // large size => mmap
    595   if ( unlikely( size > ~0ul - pageSize ) ) return 0;
     561  if ( unlikely( size > ~0ul - pageSize ) ) return 0p;
    596562                tsize = libCeiling( tsize, pageSize );                  // must be multiple of page size
    597563                #ifdef __STATISTICS__
     
    611577        } // if
    612578
    613         void * area = &(block->data);                                           // adjust off header to user bytes
     579        void * addr = &(block->data);                                           // adjust off header to user bytes
    614580
    615581        #ifdef __CFA_DEBUG__
    616         assert( ((uintptr_t)area & (libAlign() - 1)) == 0 ); // minimum alignment ?
     582        assert( ((uintptr_t)addr & (libAlign() - 1)) == 0 ); // minimum alignment ?
    617583        __atomic_add_fetch( &allocFree, tsize, __ATOMIC_SEQ_CST );
    618584        if ( traceHeap() ) {
    619585                enum { BufferSize = 64 };
    620586                char helpText[BufferSize];
    621                 int len = snprintf( helpText, BufferSize, "%p = Malloc( %zu ) (allocated %zu)\n", area, size, tsize );
    622                 // int len = snprintf( helpText, BufferSize, "Malloc %p %zu\n", area, size );
    623                 __cfaabi_dbg_bits_write( helpText, len );
     587                int len = snprintf( helpText, BufferSize, "%p = Malloc( %zu ) (allocated %zu)\n", addr, size, tsize );
     588                // int len = snprintf( helpText, BufferSize, "Malloc %p %zu\n", addr, size );
     589                __cfaabi_bits_write( STDERR_FILENO, helpText, len ); // print debug/nodebug
    624590        } // if
    625591        #endif // __CFA_DEBUG__
    626592
    627         return area;
     593        return addr;
    628594} // doMalloc
    629595
     
    631597static inline void doFree( void * addr ) with ( heapManager ) {
    632598        #ifdef __CFA_DEBUG__
    633         if ( unlikely( heapManager.heapBegin == 0 ) ) {
     599        if ( unlikely( heapManager.heapBegin == 0p ) ) {
    634600                abort( "doFree( %p ) : internal error, called before heap is initialized.", addr );
    635601        } // if
     
    677643                char helpText[BufferSize];
    678644                int len = snprintf( helpText, sizeof(helpText), "Free( %p ) size:%zu\n", addr, size );
    679                 __cfaabi_dbg_bits_write( helpText, len );
     645                __cfaabi_bits_write( STDERR_FILENO, helpText, len ); // print debug/nodebug
    680646        } // if
    681647        #endif // __CFA_DEBUG__
     
    683649
    684650
    685 size_t checkFree( HeapManager & manager ) with ( manager ) {
     651size_t prtFree( HeapManager & manager ) with ( manager ) {
    686652        size_t total = 0;
    687653        #ifdef __STATISTICS__
    688         __cfaabi_dbg_bits_acquire();
    689         __cfaabi_dbg_bits_print_nolock( "\nBin lists (bin size : free blocks on list)\n" );
     654        __cfaabi_bits_acquire();
     655        __cfaabi_bits_print_nolock( STDERR_FILENO, "\nBin lists (bin size : free blocks on list)\n" );
    690656        #endif // __STATISTICS__
    691657        for ( unsigned int i = 0; i < maxBucketsUsed; i += 1 ) {
     
    696662
    697663                #if defined( SPINLOCK )
    698                 for ( HeapManager.Storage * p = freeLists[i].freeList; p != 0; p = p->header.kind.real.next ) {
     664                for ( HeapManager.Storage * p = freeLists[i].freeList; p != 0p; p = p->header.kind.real.next ) {
    699665                #else
    700                 for ( HeapManager.Storage * p = freeLists[i].freeList.top(); p != 0; p = p->header.kind.real.next.top ) {
     666                for ( HeapManager.Storage * p = freeLists[i].freeList.top(); p != 0p; p = p->header.kind.real.next.top ) {
    701667                #endif // SPINLOCK
    702668                        total += size;
     
    707673
    708674                #ifdef __STATISTICS__
    709                 __cfaabi_dbg_bits_print_nolock( "%7zu, %-7u  ", size, N );
    710                 if ( (i + 1) % 8 == 0 ) __cfaabi_dbg_bits_print_nolock( "\n" );
     675                __cfaabi_bits_print_nolock( STDERR_FILENO, "%7zu, %-7u  ", size, N );
     676                if ( (i + 1) % 8 == 0 ) __cfaabi_bits_print_nolock( STDERR_FILENO, "\n" );
    711677                #endif // __STATISTICS__
    712678        } // for
    713679        #ifdef __STATISTICS__
    714         __cfaabi_dbg_bits_print_nolock( "\ntotal free blocks:%zu\n", total );
    715         __cfaabi_dbg_bits_release();
     680        __cfaabi_bits_print_nolock( STDERR_FILENO, "\ntotal free blocks:%zu\n", total );
     681        __cfaabi_bits_release();
    716682        #endif // __STATISTICS__
    717683        return (char *)heapEnd - (char *)heapBegin - total;
    718 } // checkFree
     684} // prtFree
     685
     686
     687static void ?{}( HeapManager & manager ) with ( manager ) {
     688        pageSize = sysconf( _SC_PAGESIZE );
     689
     690        for ( unsigned int i = 0; i < NoBucketSizes; i += 1 ) { // initialize the free lists
     691                freeLists[i].blockSize = bucketSizes[i];
     692        } // for
     693
     694        #ifdef FASTLOOKUP
     695        unsigned int idx = 0;
     696        for ( unsigned int i = 0; i < LookupSizes; i += 1 ) {
     697                if ( i > bucketSizes[idx] ) idx += 1;
     698                lookup[i] = idx;
     699        } // for
     700        #endif // FASTLOOKUP
     701
     702        if ( setMmapStart( default_mmap_start() ) ) {
     703                abort( "HeapManager : internal error, mmap start initialization failure." );
     704        } // if
     705        heapExpand = default_heap_expansion();
     706
     707        char * end = (char *)sbrk( 0 );
     708        sbrk( (char *)libCeiling( (long unsigned int)end, libAlign() ) - end ); // move start of heap to multiple of alignment
     709        heapBegin = heapEnd = sbrk( 0 );                                        // get new start point
     710} // HeapManager
     711
     712
     713static void ^?{}( HeapManager & ) {
     714        #ifdef __STATISTICS__
     715        // if ( traceHeapTerm() ) {
     716        //      printStats();
     717        //      if ( prtfree() ) prtFree( heapManager, true );
     718        // } // if
     719        #endif // __STATISTICS__
     720} // ~HeapManager
     721
     722
     723static void memory_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_MEMORY ) ));
     724void memory_startup( void ) {
     725        #ifdef __CFA_DEBUG__
     726        if ( unlikely( heapBoot ) ) {                                           // check for recursion during system boot
     727                // DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT.
     728                abort( "boot() : internal error, recursively invoked during system boot." );
     729        } // if
     730        heapBoot = true;
     731        #endif // __CFA_DEBUG__
     732
     733        //assert( heapManager.heapBegin != 0 );
     734        //heapManager{};
     735        if ( heapManager.heapBegin == 0p ) heapManager{};
     736} // memory_startup
     737
     738static void memory_shutdown( void ) __attribute__(( destructor( STARTUP_PRIORITY_MEMORY ) ));
     739void memory_shutdown( void ) {
     740        ^heapManager{};
     741} // memory_shutdown
    719742
    720743
    721744static inline void * mallocNoStats( size_t size ) {             // necessary for malloc statistics
    722745        //assert( heapManager.heapBegin != 0 );
    723         if ( unlikely( heapManager.heapBegin == 0 ) ) heapManager{}; // called before memory_startup ?
    724         void * area = doMalloc( size );
    725         if ( unlikely( area == 0 ) ) errno = ENOMEM;            // POSIX
    726         return area;
     746        if ( unlikely( heapManager.heapBegin == 0p ) ) heapManager{}; // called before memory_startup ?
     747        void * addr = doMalloc( size );
     748        if ( unlikely( addr == 0p ) ) errno = ENOMEM;           // POSIX
     749        return addr;
    727750} // mallocNoStats
     751
     752
     753static inline void * callocNoStats( size_t noOfElems, size_t elemSize ) {
     754        size_t size = noOfElems * elemSize;
     755        char * addr = (char *)mallocNoStats( size );
     756  if ( unlikely( addr == 0p ) ) return 0p;
     757
     758        HeapManager.Storage.Header * header;
     759        HeapManager.FreeHeader * freeElem;
     760        size_t bsize, alignment;
     761        bool mapped __attribute__(( unused )) = headers( "calloc", addr, header, freeElem, bsize, alignment );
     762        #ifndef __CFA_DEBUG__
     763        // Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
     764        if ( ! mapped )
     765        #endif // __CFA_DEBUG__
     766                // Zero entire data space even when > than size => realloc without a new allocation and zero fill works.
     767                // <-------00000000000000000000000000000000000000000000000000000> bsize (bucket size)
     768                // `-header`-addr                      `-size
     769                memset( addr, '\0', bsize - sizeof(HeapManager.Storage) ); // set to zeros
     770
     771        header->kind.real.blockSize |= 2;                                       // mark as zero filled
     772        return addr;
     773} // callocNoStats
    728774
    729775
     
    745791        // subtract libAlign() because it is already the minimum alignment
    746792        // add sizeof(Storage) for fake header
    747         // #comment TD : this is the only place that calls doMalloc without calling mallocNoStats, why ?
    748         char * area = (char *)doMalloc( size + alignment - libAlign() + sizeof(HeapManager.Storage) );
    749   if ( unlikely( area == 0 ) ) return area;
     793        char * addr = (char *)mallocNoStats( size + alignment - libAlign() + sizeof(HeapManager.Storage) );
     794  if ( unlikely( addr == 0p ) ) return addr;
    750795
    751796        // address in the block of the "next" alignment address
    752         char * user = (char *)libCeiling( (uintptr_t)(area + sizeof(HeapManager.Storage)), alignment );
     797        char * user = (char *)libCeiling( (uintptr_t)(addr + sizeof(HeapManager.Storage)), alignment );
    753798
    754799        // address of header from malloc
    755         HeapManager.Storage.Header * realHeader = headerAddr( area );
     800        HeapManager.Storage.Header * realHeader = headerAddr( addr );
    756801        // address of fake header * before* the alignment location
    757802        HeapManager.Storage.Header * fakeHeader = headerAddr( user );
     
    763808        return user;
    764809} // memalignNoStats
     810
     811
     812static inline void * cmemalignNoStats( size_t alignment, size_t noOfElems, size_t elemSize ) {
     813        size_t size = noOfElems * elemSize;
     814        char * addr = (char *)memalignNoStats( alignment, size );
     815  if ( unlikely( addr == 0p ) ) return 0p;
     816        HeapManager.Storage.Header * header;
     817        HeapManager.FreeHeader * freeElem;
     818        size_t bsize;
     819        bool mapped __attribute__(( unused )) = headers( "cmemalign", addr, header, freeElem, bsize, alignment );
     820        #ifndef __CFA_DEBUG__
     821        // Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
     822        if ( ! mapped )
     823        #endif // __CFA_DEBUG__
     824                memset( addr, '\0', dataStorage( bsize, addr, header ) ); // set to zeros
     825        header->kind.real.blockSize |= 2;                               // mark as zero filled
     826
     827        return addr;
     828} // cmemalignNoStats
    765829
    766830
     
    776840extern "C" {
    777841        // The malloc() function allocates size bytes and returns a pointer to the allocated memory. The memory is not
    778         // initialized. If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be
     842        // initialized. If size is 0, then malloc() returns either 0p, or a unique pointer value that can later be
    779843        // successfully passed to free().
    780844        void * malloc( size_t size ) {
     
    788852
    789853        // The calloc() function allocates memory for an array of nmemb elements of size bytes each and returns a pointer to
    790         // the allocated memory. The memory is set to zero. If nmemb or size is 0, then calloc() returns either NULL, or a
     854        // the allocated memory. The memory is set to zero. If nmemb or size is 0, then calloc() returns either 0p, or a
    791855        // unique pointer value that can later be successfully passed to free().
    792856        void * calloc( size_t noOfElems, size_t elemSize ) {
    793                 size_t size = noOfElems * elemSize;
    794857                #ifdef __STATISTICS__
    795858                __atomic_add_fetch( &calloc_calls, 1, __ATOMIC_SEQ_CST );
    796                 __atomic_add_fetch( &calloc_storage, size, __ATOMIC_SEQ_CST );
    797                 #endif // __STATISTICS__
    798 
    799                 char * area = (char *)mallocNoStats( size );
    800           if ( unlikely( area == 0 ) ) return 0;
     859                __atomic_add_fetch( &calloc_storage, noOfElems * elemSize, __ATOMIC_SEQ_CST );
     860                #endif // __STATISTICS__
     861
     862                return callocNoStats( noOfElems, elemSize );
     863        } // calloc
     864
     865        // The realloc() function changes the size of the memory block pointed to by ptr to size bytes. The contents will be
     866        // unchanged in the range from the start of the region up to the minimum of the old and new sizes. If the new size
     867        // is larger than the old size, the added memory will not be initialized.  If ptr is 0p, then the call is
     868        // equivalent to malloc(size), for all values of size; if size is equal to zero, and ptr is not 0p, then the call
     869        // is equivalent to free(ptr). Unless ptr is 0p, it must have been returned by an earlier call to malloc(),
     870        // calloc() or realloc(). If the area pointed to was moved, a free(ptr) is done.
     871        void * realloc( void * oaddr, size_t size ) {
     872                #ifdef __STATISTICS__
     873                __atomic_add_fetch( &realloc_calls, 1, __ATOMIC_SEQ_CST );
     874                #endif // __STATISTICS__
     875
     876          if ( unlikely( size == 0 ) ) { free( oaddr ); return 0p; } // special cases
     877          if ( unlikely( oaddr == 0p ) ) return mallocNoStats( size );
    801878
    802879                HeapManager.Storage.Header * header;
    803880                HeapManager.FreeHeader * freeElem;
    804                 size_t asize, alignment;
    805                 bool mapped __attribute__(( unused )) = headers( "calloc", area, header, freeElem, asize, alignment );
    806                 #ifndef __CFA_DEBUG__
    807                 // Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
    808                 if ( ! mapped )
    809                 #endif // __CFA_DEBUG__
    810                         memset( area, '\0', asize - sizeof(HeapManager.Storage) ); // set to zeros
    811 
    812                 header->kind.real.blockSize |= 2;                               // mark as zero filled
    813                 return area;
    814         } // calloc
    815 
    816         // #comment TD : Document this function
    817         void * cmemalign( size_t alignment, size_t noOfElems, size_t elemSize ) {
    818                 size_t size = noOfElems * elemSize;
    819                 #ifdef __STATISTICS__
    820                 __atomic_add_fetch( &cmemalign_calls, 1, __ATOMIC_SEQ_CST );
    821                 __atomic_add_fetch( &cmemalign_storage, size, __ATOMIC_SEQ_CST );
    822                 #endif // __STATISTICS__
    823 
    824                 char * area = (char *)memalignNoStats( alignment, size );
    825           if ( unlikely( area == 0 ) ) return 0;
    826                 HeapManager.Storage.Header * header;
    827                 HeapManager.FreeHeader * freeElem;
    828                 size_t asize;
    829                 bool mapped __attribute__(( unused )) = headers( "cmemalign", area, header, freeElem, asize, alignment );
    830                 #ifndef __CFA_DEBUG__
    831                 // Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
    832                 if ( ! mapped )
    833                         #endif // __CFA_DEBUG__
    834                         memset( area, '\0', asize - ( (char *)area - (char *)header ) ); // set to zeros
    835                 header->kind.real.blockSize |= 2;                               // mark as zero filled
    836 
    837                 return area;
    838         } // cmemalign
    839 
    840         // The realloc() function changes the size of the memory block pointed to by ptr to size bytes. The contents will be
    841         // unchanged in the range from the start of the region up to the minimum of the old and new sizes. If the new size
    842         // is larger than the old size, the added memory will not be initialized.  If ptr is NULL, then the call is
    843         // equivalent to malloc(size), for all values of size; if size is equal to zero, and ptr is not NULL, then the call
    844         // is equivalent to free(ptr). Unless ptr is NULL, it must have been returned by an earlier call to malloc(),
    845         // calloc() or realloc(). If the area pointed to was moved, a free(ptr) is done.
    846         void * realloc( void * addr, size_t size ) {
    847                 #ifdef __STATISTICS__
    848                 __atomic_add_fetch( &realloc_calls, 1, __ATOMIC_SEQ_CST );
    849                 #endif // __STATISTICS__
    850 
    851           if ( unlikely( addr == 0 ) ) return mallocNoStats( size ); // special cases
    852           if ( unlikely( size == 0 ) ) { free( addr ); return 0; }
    853 
    854                 HeapManager.Storage.Header * header;
    855                 HeapManager.FreeHeader * freeElem;
    856                 size_t asize, alignment = 0;
    857                 headers( "realloc", addr, header, freeElem, asize, alignment );
    858 
    859                 size_t usize = asize - ( (char *)addr - (char *)header ); // compute the amount of user storage in the block
    860                 if ( usize >= size ) {                                                  // already sufficient storage
     881                size_t bsize, oalign = 0;
     882                headers( "realloc", oaddr, header, freeElem, bsize, oalign );
     883
     884                size_t odsize = dataStorage( bsize, oaddr, header ); // data storage available in bucket
     885          if ( size <= odsize && odsize <= size * 2 ) { // allow up to 50% wasted storage in smaller size
     886                        // Do not know size of original allocation => cannot do 0 fill for any additional space because do not know
     887                        // where to start filling, i.e., do not overwrite existing values in space.
     888                        //
    861889                        // This case does not result in a new profiler entry because the previous one still exists and it must match with
    862890                        // the free for this memory.  Hence, this realloc does not appear in the profiler output.
    863                         return addr;
     891                        return oaddr;
    864892                } // if
    865893
     
    868896                #endif // __STATISTICS__
    869897
    870                 void * area;
    871                 if ( unlikely( alignment != 0 ) ) {                             // previous request memalign?
    872                         area = memalign( alignment, size );                     // create new aligned area
     898                // change size and copy old content to new storage
     899
     900                void * naddr;
     901                if ( unlikely( oalign != 0 ) ) {                                // previous request memalign?
     902                        if ( unlikely( header->kind.real.blockSize & 2 ) ) { // previous request zero fill
     903                                naddr = cmemalignNoStats( oalign, 1, size ); // create new aligned area
     904                        } else {
     905                                naddr = memalignNoStats( oalign, size ); // create new aligned area
     906                        } // if
    873907                } else {
    874                         area = mallocNoStats( size );                           // create new area
     908                        if ( unlikely( header->kind.real.blockSize & 2 ) ) { // previous request zero fill
     909                                naddr = callocNoStats( 1, size );               // create new area
     910                        } else {
     911                                naddr = mallocNoStats( size );                  // create new area
     912                        } // if
    875913                } // if
    876           if ( unlikely( area == 0 ) ) return 0;
    877                 if ( unlikely( header->kind.real.blockSize & 2 ) ) { // previous request zero fill (calloc/cmemalign) ?
    878                         assert( (header->kind.real.blockSize & 1) == 0 );
    879                         bool mapped __attribute__(( unused )) = headers( "realloc", area, header, freeElem, asize, alignment );
    880                         #ifndef __CFA_DEBUG__
    881                         // Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
    882                         if ( ! mapped )
    883                         #endif // __CFA_DEBUG__
    884                                 memset( (char *)area + usize, '\0', asize - ( (char *)area - (char *)header ) - usize ); // zero-fill back part
    885                         header->kind.real.blockSize |= 2;                       // mark new request as zero fill
    886                 } // if
    887                 memcpy( area, addr, usize );                                    // copy bytes
    888                 free( addr );
    889                 return area;
     914          if ( unlikely( naddr == 0p ) ) return 0p;
     915
     916                headers( "realloc", naddr, header, freeElem, bsize, oalign );
     917                size_t ndsize = dataStorage( bsize, naddr, header ); // data storage avilable in bucket
     918                // To preserve prior fill, the entire bucket must be copied versus the size.
     919                memcpy( naddr, oaddr, MIN( odsize, ndsize ) );  // copy bytes
     920                free( oaddr );
     921                return naddr;
    890922        } // realloc
    891923
     
    898930                #endif // __STATISTICS__
    899931
    900                 void * area = memalignNoStats( alignment, size );
    901 
    902                 return area;
     932                return memalignNoStats( alignment, size );
    903933        } // memalign
     934
     935
     936        // The cmemalign() function is the same as calloc() with memory alignment.
     937        void * cmemalign( size_t alignment, size_t noOfElems, size_t elemSize ) {
     938                #ifdef __STATISTICS__
     939                __atomic_add_fetch( &cmemalign_calls, 1, __ATOMIC_SEQ_CST );
     940                __atomic_add_fetch( &cmemalign_storage, noOfElems * elemSize, __ATOMIC_SEQ_CST );
     941                #endif // __STATISTICS__
     942
     943                return cmemalignNoStats( alignment, noOfElems, elemSize );
     944        } // cmemalign
    904945
    905946        // The function aligned_alloc() is the same as memalign(), except for the added restriction that size should be a
     
    912953        // The function posix_memalign() allocates size bytes and places the address of the allocated memory in *memptr. The
    913954        // address of the allocated memory will be a multiple of alignment, which must be a power of two and a multiple of
    914         // sizeof(void *). If size is 0, then posix_memalign() returns either NULL, or a unique pointer value that can later
     955        // sizeof(void *). If size is 0, then posix_memalign() returns either 0p, or a unique pointer value that can later
    915956        // be successfully passed to free(3).
    916957        int posix_memalign( void ** memptr, size_t alignment, size_t size ) {
    917958          if ( alignment < sizeof(void *) || ! libPow2( alignment ) ) return EINVAL; // check alignment
    918959                * memptr = memalign( alignment, size );
    919           if ( unlikely( * memptr == 0 ) ) return ENOMEM;
     960          if ( unlikely( * memptr == 0p ) ) return ENOMEM;
    920961                return 0;
    921962        } // posix_memalign
     
    930971        // The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to
    931972        // malloc(), calloc() or realloc().  Otherwise, or if free(ptr) has already been called before, undefined behavior
    932         // occurs. If ptr is NULL, no operation is performed.
     973        // occurs. If ptr is 0p, no operation is performed.
    933974        void free( void * addr ) {
    934975                #ifdef __STATISTICS__
     
    936977                #endif // __STATISTICS__
    937978
    938                 // #comment TD : To decrease nesting I would but the special case in the
    939                 //               else instead, plus it reads more naturally to have the
    940                 //               short / normal case instead
    941                 if ( unlikely( addr == 0 ) ) {                                  // special case
    942                         #ifdef __CFA_DEBUG__
    943                         if ( traceHeap() ) {
    944                                 #define nullmsg "Free( 0x0 ) size:0\n"
    945                                 // Do not debug print free( 0 ), as it can cause recursive entry from sprintf.
    946                                 __cfaabi_dbg_bits_write( nullmsg, sizeof(nullmsg) - 1 );
    947                         } // if
    948                         #endif // __CFA_DEBUG__
     979          if ( unlikely( addr == 0p ) ) {                                       // special case
     980                        // #ifdef __CFA_DEBUG__
     981                        // if ( traceHeap() ) {
     982                        //      #define nullmsg "Free( 0x0 ) size:0\n"
     983                        //      // Do not debug print free( 0p ), as it can cause recursive entry from sprintf.
     984                        //      __cfaabi_dbg_write( nullmsg, sizeof(nullmsg) - 1 );
     985                        // } // if
     986                        // #endif // __CFA_DEBUG__
    949987                        return;
    950988                } // exit
     
    953991        } // free
    954992
    955         // The mallopt() function adjusts parameters that control the behavior of the memory-allocation functions (see
    956         // malloc(3)). The param argument specifies the parameter to be modified, and value specifies the new value for that
    957         // parameter.
    958         int mallopt( int option, int value ) {
    959                 choose( option ) {
    960                   case M_TOP_PAD:
    961                         if ( setHeapExpand( value ) ) fallthru default;
    962                   case M_MMAP_THRESHOLD:
    963                         if ( setMmapStart( value ) ) fallthru default;
    964                   default:
    965                         // #comment TD : 1 for unsopported feels wrong
    966                         return 1;                                                                       // success, or unsupported
    967                 } // switch
    968                 return 0;                                                                               // error
    969         } // mallopt
    970 
    971         // The malloc_trim() function attempts to release free memory at the top of the heap (by calling sbrk(2) with a
    972         // suitable argument).
    973         int malloc_trim( size_t ) {
    974                 return 0;                                                                               // => impossible to release memory
    975         } // malloc_trim
    976 
    977         // The malloc_usable_size() function returns the number of usable bytes in the block pointed to by ptr, a pointer to
    978         // a block of memory allocated by malloc(3) or a related function.
    979         size_t malloc_usable_size( void * addr ) {
    980           if ( unlikely( addr == 0 ) ) return 0;                        // null allocation has 0 size
    981 
    982                 HeapManager.Storage.Header * header;
    983                 HeapManager.FreeHeader * freeElem;
    984                 size_t size, alignment;
    985 
    986                 headers( "malloc_usable_size", addr, header, freeElem, size, alignment );
    987                 size_t usize = size - ( (char *)addr - (char *)header ); // compute the amount of user storage in the block
    988                 return usize;
    989         } // malloc_usable_size
    990 
    991 
    992     // The malloc_alignment() function returns the alignment of the allocation.
     993
     994        // The malloc_alignment() function returns the alignment of the allocation.
    993995        size_t malloc_alignment( void * addr ) {
    994           if ( unlikely( addr == 0 ) ) return libAlign();       // minimum alignment
     996          if ( unlikely( addr == 0p ) ) return libAlign();      // minimum alignment
    995997                HeapManager.Storage.Header * header = headerAddr( addr );
    996998                if ( (header->kind.fake.alignment & 1) == 1 ) { // fake header ?
     
    10021004
    10031005
    1004     // The malloc_zero_fill() function returns true if the allocation is zero filled, i.e., initially allocated by calloc().
     1006        // The malloc_zero_fill() function returns true if the allocation is zero filled, i.e., initially allocated by calloc().
    10051007        bool malloc_zero_fill( void * addr ) {
    1006           if ( unlikely( addr == 0 ) ) return false;            // null allocation is not zero fill
     1008          if ( unlikely( addr == 0p ) ) return false;           // null allocation is not zero fill
    10071009                HeapManager.Storage.Header * header = headerAddr( addr );
    10081010                if ( (header->kind.fake.alignment & 1) == 1 ) { // fake header ?
     
    10131015
    10141016
    1015     // The malloc_stats() function prints (on default standard error) statistics about memory allocated by malloc(3) and
    1016     // related functions.
     1017        // The malloc_usable_size() function returns the number of usable bytes in the block pointed to by ptr, a pointer to
     1018        // a block of memory allocated by malloc(3) or a related function.
     1019        size_t malloc_usable_size( void * addr ) {
     1020          if ( unlikely( addr == 0p ) ) return 0;                       // null allocation has 0 size
     1021                HeapManager.Storage.Header * header;
     1022                HeapManager.FreeHeader * freeElem;
     1023                size_t bsize, alignment;
     1024
     1025                headers( "malloc_usable_size", addr, header, freeElem, bsize, alignment );
     1026                return dataStorage( bsize, addr, header );      // data storage in bucket
     1027        } // malloc_usable_size
     1028
     1029
     1030        // The malloc_stats() function prints (on default standard error) statistics about memory allocated by malloc(3) and
     1031        // related functions.
    10171032        void malloc_stats( void ) {
    10181033                #ifdef __STATISTICS__
    10191034                printStats();
    1020                 if ( checkFree() ) checkFree( heapManager );
     1035                if ( prtFree() ) prtFree( heapManager );
    10211036                #endif // __STATISTICS__
    10221037        } // malloc_stats
    10231038
    10241039        // The malloc_stats_fd() function changes the file descripter where malloc_stats() writes the statistics.
    1025         int malloc_stats_fd( int fd ) {
     1040        int malloc_stats_fd( int fd __attribute__(( unused )) ) {
    10261041                #ifdef __STATISTICS__
    10271042                int temp = statfd;
     
    10331048        } // malloc_stats_fd
    10341049
     1050
     1051        // The mallopt() function adjusts parameters that control the behavior of the memory-allocation functions (see
     1052        // malloc(3)). The param argument specifies the parameter to be modified, and value specifies the new value for that
     1053        // parameter.
     1054        int mallopt( int option, int value ) {
     1055                choose( option ) {
     1056                  case M_TOP_PAD:
     1057                        if ( setHeapExpand( value ) ) return 1;
     1058                  case M_MMAP_THRESHOLD:
     1059                        if ( setMmapStart( value ) ) return 1;
     1060                } // switch
     1061                return 0;                                                                               // error, unsupported
     1062        } // mallopt
     1063
     1064        // The malloc_trim() function attempts to release free memory at the top of the heap (by calling sbrk(2) with a
     1065        // suitable argument).
     1066        int malloc_trim( size_t ) {
     1067                return 0;                                                                               // => impossible to release memory
     1068        } // malloc_trim
     1069
     1070
    10351071        // The malloc_info() function exports an XML string that describes the current state of the memory-allocation
    10361072        // implementation in the caller.  The string is printed on the file stream stream.  The exported string includes
    10371073        // information about all arenas (see malloc(3)).
    10381074        int malloc_info( int options, FILE * stream ) {
     1075                if ( options != 0 ) { errno = EINVAL; return -1; }
    10391076                return printStatsXML( stream );
    10401077        } // malloc_info
     
    10461083        // structure is returned as the function result.  (It is the caller's responsibility to free(3) this memory.)
    10471084        void * malloc_get_state( void ) {
    1048                 return 0;                                                                               // unsupported
     1085                return 0p;                                                                              // unsupported
    10491086        } // malloc_get_state
    10501087
     
    10581095
    10591096
     1097// Must have CFA linkage to overload with C linkage realloc.
     1098void * realloc( void * oaddr, size_t nalign, size_t size ) {
     1099        #ifdef __STATISTICS__
     1100        __atomic_add_fetch( &realloc_calls, 1, __ATOMIC_SEQ_CST );
     1101        #endif // __STATISTICS__
     1102
     1103  if ( unlikely( size == 0 ) ) { free( oaddr ); return 0p; } // special cases
     1104  if ( unlikely( oaddr == 0p ) ) return mallocNoStats( size );
     1105
     1106        if ( unlikely( nalign == 0 ) ) nalign = libAlign();     // reset alignment to minimum
     1107        #ifdef __CFA_DEBUG__
     1108        else
     1109                checkAlign( nalign );                                                   // check alignment
     1110        #endif // __CFA_DEBUG__
     1111
     1112        HeapManager.Storage.Header * header;
     1113        HeapManager.FreeHeader * freeElem;
     1114        size_t bsize, oalign = 0;
     1115        headers( "realloc", oaddr, header, freeElem, bsize, oalign );
     1116        size_t odsize = dataStorage( bsize, oaddr, header ); // data storage available in bucket
     1117
     1118  if ( oalign != 0 && (uintptr_t)oaddr % nalign == 0 ) { // has alignment and just happens to work out
     1119                headerAddr( oaddr )->kind.fake.alignment = nalign | 1; // update alignment (could be the same)
     1120                return realloc( oaddr, size );
     1121        } // if
     1122
     1123        #ifdef __STATISTICS__
     1124        __atomic_add_fetch( &realloc_storage, size, __ATOMIC_SEQ_CST );
     1125        #endif // __STATISTICS__
     1126
     1127        // change size and copy old content to new storage
     1128
     1129        void * naddr;
     1130        if ( unlikely( header->kind.real.blockSize & 2 ) ) { // previous request zero fill
     1131                naddr = cmemalignNoStats( nalign, 1, size );    // create new aligned area
     1132        } else {
     1133                naddr = memalignNoStats( nalign, size );                // create new aligned area
     1134        } // if
     1135
     1136        headers( "realloc", naddr, header, freeElem, bsize, oalign );
     1137        size_t ndsize = dataStorage( bsize, naddr, header ); // data storage avilable in bucket
     1138        // To preserve prior fill, the entire bucket must be copied versus the size.
     1139        memcpy( naddr, oaddr, MIN( odsize, ndsize ) );          // copy bytes
     1140        free( oaddr );
     1141        return naddr;
     1142} // realloc
     1143
     1144
    10601145// Local Variables: //
    10611146// tab-width: 4 //
  • libcfa/src/interpose.cfa

    r7768b8d r30763fd  
    1010// Created On       : Wed Mar 29 16:10:31 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Jul 14 22:57:16 2019
    13 // Update Count     : 116
     12// Last Modified On : Thu Nov 21 16:47:02 2019
     13// Update Count     : 118
    1414//
    1515
     
    163163        abort_lastframe = kernel_abort_lastframe();
    164164        len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid)
    165         __cfaabi_dbg_bits_write( abort_text, len );
     165        __cfaabi_dbg_write( abort_text, len );
    166166
    167167        if ( fmt ) {
     
    171171                len = vsnprintf( abort_text, abort_text_size, fmt, args );
    172172                va_end( args );
    173                 __cfaabi_dbg_bits_write( abort_text, len );
     173                __cfaabi_dbg_write( abort_text, len );
    174174
    175175                if ( fmt[strlen( fmt ) - 1] != '\n' ) {         // add optional newline if missing at the end of the format text
    176                         __cfaabi_dbg_bits_write( "\n", 1 );
     176                        __cfaabi_dbg_write( "\n", 1 );
    177177                }
    178178        }
     
    194194        // find executable name
    195195        *index( messages[0], '(' ) = '\0';
    196         __cfaabi_dbg_bits_print_nolock( "Stack back trace for: %s\n", messages[0]);
     196        __cfaabi_bits_print_nolock( STDERR_FILENO, "Stack back trace for: %s\n", messages[0]);
    197197
    198198        for ( int i = Start; i < size - abort_lastframe && messages != NULL; i += 1 ) {
     
    200200
    201201                for ( char * p = messages[i]; *p; ++p ) {
    202                         //__cfaabi_dbg_bits_print_nolock( "X %s\n", p);
     202                        //__cfaabi_bits_print_nolock( "X %s\n", p);
    203203                        // find parantheses and +offset
    204204                        if ( *p == '(' ) {
     
    220220                        *offset_end++ = '\0';
    221221
    222                         __cfaabi_dbg_bits_print_nolock( "(%i) %s : %s + %s %s\n", frameNo, messages[i], name, offset_begin, offset_end);
     222                        __cfaabi_bits_print_nolock( STDERR_FILENO, "(%i) %s : %s + %s %s\n", frameNo, messages[i], name, offset_begin, offset_end);
    223223                } else {                                                                                // otherwise, print the whole line
    224                         __cfaabi_dbg_bits_print_nolock( "(%i) %s\n", frameNo, messages[i] );
     224                        __cfaabi_bits_print_nolock( STDERR_FILENO, "(%i) %s\n", frameNo, messages[i] );
    225225                }
    226226        }
  • libcfa/src/stdlib.cfa

    r7768b8d r30763fd  
    1010// Created On       : Thu Jan 28 17:10:29 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Oct 22 08:57:52 2019
    13 // Update Count     : 478
     12// Last Modified On : Wed Nov 20 17:22:47 2019
     13// Update Count     : 485
    1414//
    1515
     
    3030        T * alloc_set( T ptr[], size_t dim, char fill ) {       // realloc array with fill
    3131                size_t olen = malloc_usable_size( ptr );                // current allocation
    32                 char * nptr = (char *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc
     32                void * nptr = (void *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc
    3333                size_t nlen = malloc_usable_size( nptr );               // new allocation
    3434                if ( nlen > olen ) {                                                    // larger ?
    35                         memset( nptr + olen, (int)fill, nlen - olen ); // initialize added storage
     35                        memset( (char *)nptr + olen, (int)fill, nlen - olen ); // initialize added storage
    3636                } // if
    3737                return (T *)nptr;
    3838        } // alloc_set
    3939
    40         T * alloc_align( T ptr[], size_t align ) {                      // aligned realloc array
    41                 char * nptr;
    42                 size_t alignment = malloc_alignment( ptr );
    43                 if ( align != alignment && (uintptr_t)ptr % align != 0 ) {
    44                         size_t olen = malloc_usable_size( ptr );        // current allocation
    45                         nptr = (char *)memalign( align, olen );
    46                         size_t nlen = malloc_usable_size( nptr );       // new allocation
    47                         size_t lnth = olen < nlen ? olen : nlen;        // min
    48                         memcpy( nptr, ptr, lnth );                                      // initialize storage
    49                         free( ptr );
    50                 } else {
    51                         nptr = (char *)ptr;
    52                 } // if
    53                 return (T *)nptr;
    54         } // alloc_align
    55 
    56         T * alloc_align( T ptr[], size_t align, size_t dim ) { // aligned realloc array
    57                 char * nptr;
    58                 size_t alignment = malloc_alignment( ptr );
    59                 if ( align != alignment ) {
    60                         size_t olen = malloc_usable_size( ptr );        // current allocation
    61                         nptr = (char *)memalign( align, dim * sizeof(T) );
    62                         size_t nlen = malloc_usable_size( nptr );       // new allocation
    63                         size_t lnth = olen < nlen ? olen : nlen;        // min
    64                         memcpy( nptr, ptr, lnth );                                      // initialize storage
    65                         free( ptr );
    66                 } else {
    67                         nptr = (char *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc
    68                 } // if
    69                 return (T *)nptr;
    70         } // alloc_align
    71 
    7240        T * alloc_align_set( T ptr[], size_t align, char fill ) { // aligned realloc with fill
    7341                size_t olen = malloc_usable_size( ptr );                // current allocation
    74                 char * nptr = alloc_align( ptr, align );
     42                void * nptr = (void *)realloc( (void *)ptr, align, sizeof(T) ); // CFA realloc
     43                // char * nptr = alloc_align( ptr, align );
    7544                size_t nlen = malloc_usable_size( nptr );               // new allocation
    7645                if ( nlen > olen ) {                                                    // larger ?
    77                         memset( nptr + olen, (int)fill, nlen - olen ); // initialize added storage
     46                        memset( (char *)nptr + olen, (int)fill, nlen - olen ); // initialize added storage
    7847                } // if
    7948                return (T *)nptr;
  • libcfa/src/stdlib.hfa

    r7768b8d r30763fd  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Oct 20 22:57:33 2019
    13 // Update Count     : 390
     12// Last Modified On : Fri Nov 22 15:13:14 2019
     13// Update Count     : 399
    1414//
    1515
     
    2828} // extern "C"
    2929
     30void * realloc( void * oaddr, size_t nalign, size_t size ); // CFA heap
     31
    3032//---------------------------------------
    3133
     
    5052        } // calloc
    5153
    52         T * realloc( T * ptr, size_t size ) {
    53                 if ( unlikely( ptr == 0 ) ) return malloc();
     54        T * realloc( T * ptr, size_t size ) {                           // CFA realloc, eliminate return-type cast
    5455                return (T *)(void *)realloc( (void *)ptr, size ); // C realloc
    5556        } // realloc
     
    5960        } // memalign
    6061
     62        T * cmemalign( size_t align, size_t dim  ) {
     63                return (T *)cmemalign( align, dim, sizeof(T) ); // CFA cmemalign
     64        } // cmemalign
     65
    6166        T * aligned_alloc( size_t align ) {
    6267                return (T *)aligned_alloc( align, sizeof(T) );  // C aligned_alloc
     
    7984
    8085        T * alloc( T ptr[], size_t dim ) {                                      // realloc
    81                 return realloc( ptr, dim * sizeof(T) );
     86                return (T *)(void *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc
    8287        } // alloc
    8388
     
    118123        } // alloc_align
    119124
     125        T * alloc_align( T ptr[], size_t align ) {                      // aligned realloc array
     126                return (T *)(void *)realloc( (void *)ptr, align, sizeof(T) ); // CFA realloc
     127        } // alloc_align
     128
     129        T * alloc_align( T ptr[], size_t align, size_t dim ) { // aligned realloc array
     130                return (T *)(void *)realloc( (void *)ptr, align, dim * sizeof(T) ); // CFA realloc
     131        } // alloc_align
     132
    120133        T * alloc_align_set( size_t align, char fill ) {
    121134                return (T *)memset( (T *)alloc_align( align ), (int)fill, sizeof(T) ); // initialize with fill value
     
    142155
    143156forall( dtype T | sized(T) ) {
    144         T * alloc_align( T ptr[], size_t align );                       // realign
    145         T * alloc_align( T ptr[], size_t align, size_t dim ); // aligned realloc array
    146157        T * alloc_align_set( T ptr[], size_t align, size_t dim, char fill ); // aligned realloc array with fill
    147158} // distribution
Note: See TracChangeset for help on using the changeset viewer.