Changeset 6fbe9a5


Ignore:
Timestamp:
Oct 7, 2020, 9:33:22 PM (4 years ago)
Author:
Michael Brooks <mlbrooks@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
8e4bc30
Parents:
69c5c00
Message:

Fixing code-gen of constants. Fixes #182? Removes workaround 58b6d1.

Forcing recent GCC versions to place CFA-initialized constants in writeable memory, so CFA initialization doesn't segfault when writing them. See the const-init test for specifics about recent GCC versions.

src/InitTweak/FixGlobalInit.cc: generating the attribute to control GCC's placement
libcfa/src/limits.* : removing workaround from 58b6d1, making these limits const again
tests//limits.* : commenting old test that uses the constants from licfa-limits, explaining what the test doesn't exercise
tests/
/const-init.* : new test of static constants, taken from #182, and comments explaining how to test this issue

Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/limits.cfa

    r69c5c00 r6fbe9a5  
    1010// Created On       : Wed Apr  6 18:06:52 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Sep 30 22:56:32 2020
    13 // Update Count     : 76
     12// Last Modified On : Thu Mar  1 16:22:51 2018
     13// Update Count     : 74
    1414//
    1515
     
    2323// Integral Constants
    2424
    25 signed char MIN = SCHAR_MIN;
    26 unsigned char MIN = 0;
    27 short int MIN = SHRT_MIN;
    28 unsigned short int MIN = 0;
    29 int MIN = INT_MIN;
    30 unsigned int MIN = 0;
    31 long int MIN = LONG_MIN;
    32 unsigned long int MIN = 0;
    33 long long int MIN = LLONG_MIN;
    34 unsigned long long int MIN = 0;
     25const signed char MIN = SCHAR_MIN;
     26const unsigned char MIN = 0;
     27const short int MIN = SHRT_MIN;
     28const unsigned short int MIN = 0;
     29const int MIN = INT_MIN;
     30const unsigned int MIN = 0;
     31const long int MIN = LONG_MIN;
     32const unsigned long int MIN = 0;
     33const long long int MIN = LLONG_MIN;
     34const unsigned long long int MIN = 0;
    3535
    36 signed char MAX = SCHAR_MAX;
    37 unsigned char MAX = UCHAR_MAX;
    38 short int MAX = SHRT_MAX;
    39 unsigned short int MAX = USHRT_MAX;
    40 int MAX = INT_MAX;
    41 unsigned int MAX = UINT_MAX;
    42 long int MAX = LONG_MAX;
    43 unsigned long int MAX = ULONG_MAX;
    44 long long int MAX = LLONG_MAX;
    45 unsigned long long int MAX = ULLONG_MAX;
     36const signed char MAX = SCHAR_MAX;
     37const unsigned char MAX = UCHAR_MAX;
     38const short int MAX = SHRT_MAX;
     39const unsigned short int MAX = USHRT_MAX;
     40const int MAX = INT_MAX;
     41const unsigned int MAX = UINT_MAX;
     42const long int MAX = LONG_MAX;
     43const unsigned long int MAX = ULONG_MAX;
     44const long long int MAX = LLONG_MAX;
     45const unsigned long long int MAX = ULLONG_MAX;
    4646
    4747// Floating-Point Constants
    4848
    49 float MIN = FLT_MIN;
    50 double MIN = DBL_MIN;
    51 long double MIN = LDBL_MIN;
    52 float _Complex MIN = __FLT_MIN__ + __FLT_MIN__ * I;
    53 double _Complex MIN = DBL_MIN +  DBL_MIN * I;
    54 long double _Complex MIN = LDBL_MIN + LDBL_MIN * I;
     49const float MIN = FLT_MIN;
     50const double MIN = DBL_MIN;
     51const long double MIN = LDBL_MIN;
     52const float _Complex MIN = __FLT_MIN__ + __FLT_MIN__ * I;
     53const double _Complex MIN = DBL_MIN +  DBL_MIN * I;
     54const long double _Complex MIN = LDBL_MIN + LDBL_MIN * I;
    5555
    56 float MAX = FLT_MAX;
    57 double MAX = DBL_MAX;
    58 long double MAX = LDBL_MAX;
    59 float _Complex MAX = FLT_MAX + FLT_MAX * I;
    60 double _Complex MAX = DBL_MAX + DBL_MAX * I;
    61 long double _Complex MAX = LDBL_MAX + LDBL_MAX * I;
     56const float MAX = FLT_MAX;
     57const double MAX = DBL_MAX;
     58const long double MAX = LDBL_MAX;
     59const float _Complex MAX = FLT_MAX + FLT_MAX * I;
     60const double _Complex MAX = DBL_MAX + DBL_MAX * I;
     61const long double _Complex MAX = LDBL_MAX + LDBL_MAX * I;
    6262
    63 float PI = (float)M_PI;                                                                 // pi
    64 float PI_2 = (float)M_PI_2;                                                             // pi / 2
    65 float PI_4 = (float)M_PI_4;                                                             // pi / 4
    66 float _1_PI = (float)M_1_PI;                                                    // 1 / pi
    67 float _2_PI = (float)M_2_PI;                                                    // 2 / pi
    68 float _2_SQRT_PI = (float)M_2_SQRTPI;                                   // 2 / sqrt(pi)
     63const float PI = (float)M_PI;                                                   // pi
     64const float PI_2 = (float)M_PI_2;                                               // pi / 2
     65const float PI_4 = (float)M_PI_4;                                               // pi / 4
     66const float _1_PI = (float)M_1_PI;                                              // 1 / pi
     67const float _2_PI = (float)M_2_PI;                                              // 2 / pi
     68const float _2_SQRT_PI = (float)M_2_SQRTPI;                             // 2 / sqrt(pi)
    6969
    70 double PI = M_PI;                                                                               // pi
    71 double PI_2 = M_PI_2;                                                                   // pi / 2
    72 double PI_4 = M_PI_4;                                                                   // pi / 4
    73 double _1_PI = M_1_PI;                                                                  // 1 / pi
    74 double _2_PI = M_2_PI;                                                                  // 2 / pi
    75 double _2_SQRT_PI = M_2_SQRTPI;                                                 // 2 / sqrt(pi)
     70const double PI = M_PI;                                                                 // pi
     71const double PI_2 = M_PI_2;                                                             // pi / 2
     72const double PI_4 = M_PI_4;                                                             // pi / 4
     73const double _1_PI = M_1_PI;                                                    // 1 / pi
     74const double _2_PI = M_2_PI;                                                    // 2 / pi
     75const double _2_SQRT_PI = M_2_SQRTPI;                                   // 2 / sqrt(pi)
    7676
    77 long double PI = M_PIl;                                                                 // pi
    78 long double PI_2 = M_PI_2l;                                                             // pi / 2
    79 long double PI_4 = M_PI_4l;                                                             // pi / 4
    80 long double _1_PI = M_1_PIl;                                                    // 1 / pi
    81 long double _2_PI = M_2_PIl;                                                    // 2 / pi
    82 long double _2_SQRT_PI = M_2_SQRTPIl;                                   // 2 / sqrt(pi)
     77const long double PI = M_PIl;                                                   // pi
     78const long double PI_2 = M_PI_2l;                                               // pi / 2
     79const long double PI_4 = M_PI_4l;                                               // pi / 4
     80const long double _1_PI = M_1_PIl;                                              // 1 / pi
     81const long double _2_PI = M_2_PIl;                                              // 2 / pi
     82const long double _2_SQRT_PI = M_2_SQRTPIl;                             // 2 / sqrt(pi)
    8383
    84 float _Complex PI = (float)M_PI + 0.0_iF;                               // pi
    85 float _Complex PI_2 = (float)M_PI_2 + 0.0_iF;                   // pi / 2
    86 float _Complex PI_4 = (float)M_PI_4 + 0.0_iF;                   // pi / 4
    87 float _Complex _1_PI = (float)M_1_PI + 0.0_iF;                  // 1 / pi
    88 float _Complex _2_PI = (float)M_2_PI + 0.0_iF;                  // 2 / pi
    89 float _Complex _2_SQRT_PI = (float)M_2_SQRTPI + 0.0_iF; // 2 / sqrt(pi)
     84const float _Complex PI = (float)M_PI + 0.0_iF;                 // pi
     85const float _Complex PI_2 = (float)M_PI_2 + 0.0_iF;             // pi / 2
     86const float _Complex PI_4 = (float)M_PI_4 + 0.0_iF;             // pi / 4
     87const float _Complex _1_PI = (float)M_1_PI + 0.0_iF;    // 1 / pi
     88const float _Complex _2_PI = (float)M_2_PI + 0.0_iF;    // 2 / pi
     89const float _Complex _2_SQRT_PI = (float)M_2_SQRTPI + 0.0_iF; // 2 / sqrt(pi)
    9090
    91 double _Complex PI = M_PI + 0.0_iD;                                             // pi
    92 double _Complex PI_2 = M_PI_2 + 0.0_iD;                                 // pi / 2
    93 double _Complex PI_4 = M_PI_4 + 0.0_iD;                                 // pi / 4
    94 double _Complex _1_PI = M_1_PI + 0.0_iD;                                // 1 / pi
    95 double _Complex _2_PI = M_2_PI + 0.0_iD;                                // 2 / pi
    96 double _Complex _2_SQRT_PI = M_2_SQRTPI + 0.0_iD;               // 2 / sqrt(pi)
     91const double _Complex PI = M_PI + 0.0_iD;                               // pi
     92const double _Complex PI_2 = M_PI_2 + 0.0_iD;                   // pi / 2
     93const double _Complex PI_4 = M_PI_4 + 0.0_iD;                   // pi / 4
     94const double _Complex _1_PI = M_1_PI + 0.0_iD;                  // 1 / pi
     95const double _Complex _2_PI = M_2_PI + 0.0_iD;                  // 2 / pi
     96const double _Complex _2_SQRT_PI = M_2_SQRTPI + 0.0_iD; // 2 / sqrt(pi)
    9797
    98 long double _Complex PI = M_PIl + 0.0_iL;                               // pi
    99 long double _Complex PI_2 = M_PI_2l + 0.0_iL;                   // pi / 2
    100 long double _Complex PI_4 = M_PI_4l + 0.0_iL;                   // pi / 4
    101 long double _Complex _1_PI = M_1_PIl + 0.0_iL;                  // 1 / pi
    102 long double _Complex _2_PI = M_2_PIl + 0.0_iL;                  // 2 / pi
    103 long double _Complex _2_SQRT_PI = M_2_SQRTPIl + 0.0_iL; // 2 / sqrt(pi)
     98const long double _Complex PI = M_PIl + 0.0_iL;                 // pi
     99const long double _Complex PI_2 = M_PI_2l + 0.0_iL;             // pi / 2
     100const long double _Complex PI_4 = M_PI_4l + 0.0_iL;             // pi / 4
     101const long double _Complex _1_PI = M_1_PIl + 0.0_iL;    // 1 / pi
     102const long double _Complex _2_PI = M_2_PIl + 0.0_iL;    // 2 / pi
     103const long double _Complex _2_SQRT_PI = M_2_SQRTPIl + 0.0_iL; // 2 / sqrt(pi)
    104104
    105 float E = (float)M_E;                                                                   // e
    106 float LOG2_E = (float)M_LOG2E;                                                  // log_2(e)
    107 float LOG10_E = (float)M_LOG10E;                                                // log_10(e)
    108 float LN_2 = (float)M_LN2;                                                              // log_e(2)
    109 float LN_10 = (float)M_LN10;                                                    // log_e(10)
    110 float SQRT_2 = (float)M_SQRT2;                                                  // sqrt(2)
    111 float _1_SQRT_2 = (float)M_SQRT1_2;                                             // 1 / sqrt(2)
     105const float E = (float)M_E;                                                             // e
     106const float LOG2_E = (float)M_LOG2E;                                    // log_2(e)
     107const float LOG10_E = (float)M_LOG10E;                                  // log_10(e)
     108const float LN_2 = (float)M_LN2;                                                // log_e(2)
     109const float LN_10 = (float)M_LN10;                                              // log_e(10)
     110const float SQRT_2 = (float)M_SQRT2;                                    // sqrt(2)
     111const float _1_SQRT_2 = (float)M_SQRT1_2;                               // 1 / sqrt(2)
    112112
    113 double E = M_E;                                                                                 // e
    114 double LOG2_E = M_LOG2E;                                                                // log_2(e)
    115 double LOG10_E = M_LOG10E;                                                              // log_10(e)
    116 double LN_2 = M_LN2;                                                                    // log_e(2)
    117 double LN_10 = M_LN10;                                                                  // log_e(10)
    118 double SQRT_2 = M_SQRT2;                                                                // sqrt(2)
    119 double _1_SQRT_2 = M_SQRT1_2;                                                   // 1 / sqrt(2)
     113const double E = M_E;                                                                   // e
     114const double LOG2_E = M_LOG2E;                                                  // log_2(e)
     115const double LOG10_E = M_LOG10E;                                                // log_10(e)
     116const double LN_2 = M_LN2;                                                              // log_e(2)
     117const double LN_10 = M_LN10;                                                    // log_e(10)
     118const double SQRT_2 = M_SQRT2;                                                  // sqrt(2)
     119const double _1_SQRT_2 = M_SQRT1_2;                                             // 1 / sqrt(2)
    120120
    121 long double E = M_El;                                                                   // e
    122 long double LOG2_E = M_LOG2El;                                                  // log_2(e)
    123 long double LOG10_E = M_LOG10El;                                                // log_10(e)
    124 long double LN_2 = M_LN2l;                                                              // log_e(2)
    125 long double LN_10 = M_LN10l;                                                    // log_e(10)
    126 long double SQRT_2 = M_SQRT2l;                                                  // sqrt(2)
    127 long double _1_SQRT_2 = M_SQRT1_2l;                                             // 1 / sqrt(2)
     121const long double E = M_El;                                                             // e
     122const long double LOG2_E = M_LOG2El;                                    // log_2(e)
     123const long double LOG10_E = M_LOG10El;                                  // log_10(e)
     124const long double LN_2 = M_LN2l;                                                // log_e(2)
     125const long double LN_10 = M_LN10l;                                              // log_e(10)
     126const long double SQRT_2 = M_SQRT2l;                                    // sqrt(2)
     127const long double _1_SQRT_2 = M_SQRT1_2l;                               // 1 / sqrt(2)
    128128
    129 float _Complex E = M_E + 0.0_iF;                                                // e
    130 float _Complex LOG2_E = M_LOG2E + 0.0_iF;                               // log_2(e)
    131 float _Complex LOG10_E = M_LOG10E + 0.0_iF;                             // log_10(e)
    132 float _Complex LN_2 = M_LN2 + 0.0_iF;                                   // log_e(2)
    133 float _Complex LN_10 = M_LN10 + 0.0_iF;                                 // log_e(10)
    134 float _Complex SQRT_2 = M_SQRT2 + 0.0_iF;                               // sqrt(2)
    135 float _Complex _1_SQRT_2 = M_SQRT1_2 + 0.0_iF;                  // 1 / sqrt(2)
     129const float _Complex E = M_E + 0.0_iF;                                  // e
     130const float _Complex LOG2_E = M_LOG2E + 0.0_iF;                 // log_2(e)
     131const float _Complex LOG10_E = M_LOG10E + 0.0_iF;               // log_10(e)
     132const float _Complex LN_2 = M_LN2 + 0.0_iF;                             // log_e(2)
     133const float _Complex LN_10 = M_LN10 + 0.0_iF;                   // log_e(10)
     134const float _Complex SQRT_2 = M_SQRT2 + 0.0_iF;                 // sqrt(2)
     135const float _Complex _1_SQRT_2 = M_SQRT1_2 + 0.0_iF;    // 1 / sqrt(2)
    136136
    137 double _Complex E = M_E + 0.0_iD;                                               // e
    138 double _Complex LOG2_E = M_LOG2E + 0.0_iD;                              // log_2(e)
    139 double _Complex LOG10_E = M_LOG10E + 0.0_iD;                    // log_10(e)
    140 double _Complex LN_2 = M_LN2 + 0.0_iD;                                  // log_e(2)
    141 double _Complex LN_10 = M_LN10 + 0.0_iD;                                // log_e(10)
    142 double _Complex SQRT_2 = M_SQRT2 + 0.0_iD;                              // sqrt(2)
    143 double _Complex _1_SQRT_2 = M_SQRT1_2 + 0.0_iD;                 // 1 / sqrt(2)
     137const double _Complex E = M_E + 0.0_iD;                                 // e
     138const double _Complex LOG2_E = M_LOG2E + 0.0_iD;                // log_2(e)
     139const double _Complex LOG10_E = M_LOG10E + 0.0_iD;              // log_10(e)
     140const double _Complex LN_2 = M_LN2 + 0.0_iD;                    // log_e(2)
     141const double _Complex LN_10 = M_LN10 + 0.0_iD;                  // log_e(10)
     142const double _Complex SQRT_2 = M_SQRT2 + 0.0_iD;                // sqrt(2)
     143const double _Complex _1_SQRT_2 = M_SQRT1_2 + 0.0_iD;   // 1 / sqrt(2)
    144144
    145 long double _Complex E = M_El + 0.0_iL;                                 // e
    146 long double _Complex LOG2_E = M_LOG2El + 0.0_iL;                // log_2(e)
    147 long double _Complex LOG10_E = M_LOG10El + 0.0_iL;              // log_10(e)
    148 long double _Complex LN_2 = M_LN2l + 0.0_iL;                    // log_e(2)
    149 long double _Complex LN_10 = M_LN10l + 0.0_iL;                  // log_e(10)
    150 long double _Complex SQRT_2 = M_SQRT2l + 0.0_iL;                // sqrt(2)
    151 long double _Complex _1_SQRT_2 = M_SQRT1_2l + 0.0_iL;   // 1 / sqrt(2)
     145const long double _Complex E = M_El + 0.0_iL;                   // e
     146const long double _Complex LOG2_E = M_LOG2El + 0.0_iL;  // log_2(e)
     147const long double _Complex LOG10_E = M_LOG10El + 0.0_iL; // log_10(e)
     148const long double _Complex LN_2 = M_LN2l + 0.0_iL;              // log_e(2)
     149const long double _Complex LN_10 = M_LN10l + 0.0_iL;    // log_e(10)
     150const long double _Complex SQRT_2 = M_SQRT2l + 0.0_iL;  // sqrt(2)
     151const long double _Complex _1_SQRT_2 = M_SQRT1_2l + 0.0_iL; // 1 / sqrt(2)
    152152
    153153// Local Variables: //
  • libcfa/src/limits.hfa

    r69c5c00 r6fbe9a5  
    1010// Created On       : Wed Apr  6 18:06:52 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Sep 30 22:56:35 2020
    13 // Update Count     : 15
     12// Last Modified On : Thu Mar  1 16:20:54 2018
     13// Update Count     : 13
    1414//
    1515
     
    1818// Integral Constants
    1919
    20 extern signed char MIN;
    21 extern unsigned char MIN;
    22 extern short int MIN;
    23 extern unsigned short int MIN;
    24 extern int MIN;
    25 extern unsigned int MIN;
    26 extern long int MIN;
    27 extern unsigned long int MIN;
    28 extern long long int MIN;
    29 extern unsigned long long int MIN;
     20extern const signed char MIN;
     21extern const unsigned char MIN;
     22extern const short int MIN;
     23extern const unsigned short int MIN;
     24extern const int MIN;
     25extern const unsigned int MIN;
     26extern const long int MIN;
     27extern const unsigned long int MIN;
     28extern const long long int MIN;
     29extern const unsigned long long int MIN;
    3030
    31 extern signed char MAX;
    32 extern unsigned char MAX;
    33 extern short int MAX;
    34 extern unsigned short int MAX;
    35 extern int MAX;
    36 extern unsigned int MAX;
    37 extern long int MAX;
    38 extern unsigned long int MAX;
    39 extern long long int MAX;
    40 extern unsigned long long int MAX;
     31extern const signed char MAX;
     32extern const unsigned char MAX;
     33extern const short int MAX;
     34extern const unsigned short int MAX;
     35extern const int MAX;
     36extern const unsigned int MAX;
     37extern const long int MAX;
     38extern const unsigned long int MAX;
     39extern const long long int MAX;
     40extern const unsigned long long int MAX;
    4141
    4242// Floating-Point Constants
    4343
    44 extern float MIN;
    45 extern double MIN;
    46 extern long double MIN;
    47 extern float _Complex MIN;
    48 extern double _Complex MIN;
    49 extern long double _Complex MIN;
     44extern const float MIN;
     45extern const double MIN;
     46extern const long double MIN;
     47extern const float _Complex MIN;
     48extern const double _Complex MIN;
     49extern const long double _Complex MIN;
    5050
    51 extern float MAX;
    52 extern double MAX;
    53 extern long double MAX;
    54 extern float _Complex MAX;
    55 extern double _Complex MAX;
    56 extern long double _Complex MAX;
     51extern const float MAX;
     52extern const double MAX;
     53extern const long double MAX;
     54extern const float _Complex MAX;
     55extern const double _Complex MAX;
     56extern const long double _Complex MAX;
    5757
    58 extern float PI;                                                                                // pi
    59 extern float PI_2;                                                                              // pi / 2
    60 extern float PI_4;                                                                              // pi / 4
    61 extern float _1_PI;                                                                             // 1 / pi
    62 extern float _2_PI;                                                                             // 2 / pi
    63 extern float _2_SQRT_PI;                                                                // 2 / sqrt(pi)
     58extern const float PI;                                                                  // pi
     59extern const float PI_2;                                                                // pi / 2
     60extern const float PI_4;                                                                // pi / 4
     61extern const float _1_PI;                                                               // 1 / pi
     62extern const float _2_PI;                                                               // 2 / pi
     63extern const float _2_SQRT_PI;                                                  // 2 / sqrt(pi)
    6464
    65 extern double PI;                                                                               // pi
    66 extern double PI_2;                                                                             // pi / 2
    67 extern double PI_4;                                                                             // pi / 4
    68 extern double _1_PI;                                                                    // 1 / pi
    69 extern double _2_PI;                                                                    // 2 / pi
    70 extern double _2_SQRT_PI;                                                               // 2 / sqrt(pi)
     65extern const double PI;                                                                 // pi
     66extern const double PI_2;                                                               // pi / 2
     67extern const double PI_4;                                                               // pi / 4
     68extern const double _1_PI;                                                              // 1 / pi
     69extern const double _2_PI;                                                              // 2 / pi
     70extern const double _2_SQRT_PI;                                                 // 2 / sqrt(pi)
    7171
    72 extern long double PI;                                                                  // pi
    73 extern long double PI_2;                                                                // pi / 2
    74 extern long double PI_4;                                                                // pi / 4
    75 extern long double _1_PI;                                                               // 1 / pi
    76 extern long double _2_PI;                                                               // 2 / pi
    77 extern long double _2_SQRT_PI;                                                  // 2 / sqrt(pi)
     72extern const long double PI;                                                    // pi
     73extern const long double PI_2;                                                  // pi / 2
     74extern const long double PI_4;                                                  // pi / 4
     75extern const long double _1_PI;                                                 // 1 / pi
     76extern const long double _2_PI;                                                 // 2 / pi
     77extern const long double _2_SQRT_PI;                                    // 2 / sqrt(pi)
    7878
    79 extern float _Complex PI;                                                               // pi
    80 extern float _Complex PI_2;                                                             // pi / 2
    81 extern float _Complex PI_4;                                                             // pi / 4
    82 extern float _Complex _1_PI;                                                    // 1 / pi
    83 extern float _Complex _2_PI;                                                    // 2 / pi
    84 extern float _Complex _2_SQRT_PI;                                               // 2 / sqrt(pi)
     79extern const float _Complex PI;                                                 // pi
     80extern const float _Complex PI_2;                                               // pi / 2
     81extern const float _Complex PI_4;                                               // pi / 4
     82extern const float _Complex _1_PI;                                              // 1 / pi
     83extern const float _Complex _2_PI;                                              // 2 / pi
     84extern const float _Complex _2_SQRT_PI;                                 // 2 / sqrt(pi)
    8585
    86 extern double _Complex PI;                                                              // pi
    87 extern double _Complex PI_2;                                                    // pi / 2
    88 extern double _Complex PI_4;                                                    // pi / 4
    89 extern double _Complex _1_PI;                                                   // 1 / pi
    90 extern double _Complex _2_PI;                                                   // 2 / pi
    91 extern double _Complex _2_SQRT_PI;                                              // 2 / sqrt(pi)
     86extern const double _Complex PI;                                                // pi
     87extern const double _Complex PI_2;                                              // pi / 2
     88extern const double _Complex PI_4;                                              // pi / 4
     89extern const double _Complex _1_PI;                                             // 1 / pi
     90extern const double _Complex _2_PI;                                             // 2 / pi
     91extern const double _Complex _2_SQRT_PI;                                // 2 / sqrt(pi)
    9292
    93 extern long double _Complex PI;                                                 // pi
    94 extern long double _Complex PI_2;                                               // pi / 2
    95 extern long double _Complex PI_4;                                               // pi / 4
    96 extern long double _Complex _1_PI;                                              // 1 / pi
    97 extern long double _Complex _2_PI;                                              // 2 / pi
    98 extern long double _Complex _2_SQRT_PI;                                 // 2 / sqrt(pi)
     93extern const long double _Complex PI;                                   // pi
     94extern const long double _Complex PI_2;                                 // pi / 2
     95extern const long double _Complex PI_4;                                 // pi / 4
     96extern const long double _Complex _1_PI;                                // 1 / pi
     97extern const long double _Complex _2_PI;                                // 2 / pi
     98extern const long double _Complex _2_SQRT_PI;                   // 2 / sqrt(pi)
    9999
    100 extern float E;                                                                                 // e
    101 extern float LOG2_E;                                                                    // log_2(e)
    102 extern float LOG10_E;                                                                   // log_10(e)
    103 extern float LN_2;                                                                              // log_e(2)
    104 extern float LN_10;                                                                             // log_e(10)
    105 extern float SQRT_2;                                                                    // sqrt(2)
    106 extern float _1_SQRT_2;                                                                 // 1 / sqrt(2)
     100extern const float E;                                                                   // e
     101extern const float LOG2_E;                                                              // log_2(e)
     102extern const float LOG10_E;                                                             // log_10(e)
     103extern const float LN_2;                                                                // log_e(2)
     104extern const float LN_10;                                                               // log_e(10)
     105extern const float SQRT_2;                                                              // sqrt(2)
     106extern const float _1_SQRT_2;                                                   // 1 / sqrt(2)
    107107
    108 extern double E;                                                                                // e
    109 extern double LOG2_E;                                                                   // log_2(e)
    110 extern double LOG10_E;                                                                  // log_10(e)
    111 extern double LN_2;                                                                             // log_e(2)
    112 extern double LN_10;                                                                    // log_e(10)
    113 extern double SQRT_2;                                                                   // sqrt(2)
    114 extern double _1_SQRT_2;                                                                // 1 / sqrt(2)
     108extern const double E;                                                                  // e
     109extern const double LOG2_E;                                                             // log_2(e)
     110extern const double LOG10_E;                                                    // log_10(e)
     111extern const double LN_2;                                                               // log_e(2)
     112extern const double LN_10;                                                              // log_e(10)
     113extern const double SQRT_2;                                                             // sqrt(2)
     114extern const double _1_SQRT_2;                                                  // 1 / sqrt(2)
    115115
    116 extern long double E;                                                                   // e
    117 extern long double LOG2_E;                                                              // log_2(e)
    118 extern long double LOG10_E;                                                             // log_10(e)
    119 extern long double LN_2;                                                                // log_e(2)
    120 extern long double LN_10;                                                               // log_e(10)
    121 extern long double SQRT_2;                                                              // sqrt(2)
    122 extern long double _1_SQRT_2;                                                   // 1/sqrt(2)
     116extern const long double E;                                                             // e
     117extern const long double LOG2_E;                                                // log_2(e)
     118extern const long double LOG10_E;                                               // log_10(e)
     119extern const long double LN_2;                                                  // log_e(2)
     120extern const long double LN_10;                                                 // log_e(10)
     121extern const long double SQRT_2;                                                // sqrt(2)
     122extern const long double _1_SQRT_2;                                             // 1/sqrt(2)
    123123
    124 extern float _Complex E;                                                                // e
    125 extern float _Complex LOG2_E;                                                   // log_2(e)
    126 extern float _Complex LOG10_E;                                                  // log_10(e)
    127 extern float _Complex LN_2;                                                             // log_e(2)
    128 extern float _Complex LN_10;                                                    // log_e(10)
    129 extern float _Complex SQRT_2;                                                   // sqrt(2)
    130 extern float _Complex _1_SQRT_2;                                                // 1 / sqrt(2)
     124extern const float _Complex E;                                                  // e
     125extern const float _Complex LOG2_E;                                             // log_2(e)
     126extern const float _Complex LOG10_E;                                    // log_10(e)
     127extern const float _Complex LN_2;                                               // log_e(2)
     128extern const float _Complex LN_10;                                              // log_e(10)
     129extern const float _Complex SQRT_2;                                             // sqrt(2)
     130extern const float _Complex _1_SQRT_2;                                  // 1 / sqrt(2)
    131131
    132 extern double _Complex E;                                                               // e
    133 extern double _Complex LOG2_E;                                                  // log_2(e)
    134 extern double _Complex LOG10_E;                                                 // log_10(e)
    135 extern double _Complex LN_2;                                                    // log_e(2)
    136 extern double _Complex LN_10;                                                   // log_e(10)
    137 extern double _Complex SQRT_2;                                                  // sqrt(2)
    138 extern double _Complex _1_SQRT_2;                                               // 1 / sqrt(2)
     132extern const double _Complex E;                                                 // e
     133extern const double _Complex LOG2_E;                                    // log_2(e)
     134extern const double _Complex LOG10_E;                                   // log_10(e)
     135extern const double _Complex LN_2;                                              // log_e(2)
     136extern const double _Complex LN_10;                                             // log_e(10)
     137extern const double _Complex SQRT_2;                                    // sqrt(2)
     138extern const double _Complex _1_SQRT_2;                                 // 1 / sqrt(2)
    139139
    140 extern long double _Complex E;                                                  // e
    141 extern long double _Complex LOG2_E;                                             // log_2(e)
    142 extern long double _Complex LOG10_E;                                    // log_10(e)
    143 extern long double _Complex LN_2;                                               // log_e(2)
    144 extern long double _Complex LN_10;                                              // log_e(10)
    145 extern long double _Complex SQRT_2;                                             // sqrt(2)
    146 extern long double _Complex _1_SQRT_2;                                  // 1 / sqrt(2)
     140extern const long double _Complex E;                                    // e
     141extern const long double _Complex LOG2_E;                               // log_2(e)
     142extern const long double _Complex LOG10_E;                              // log_10(e)
     143extern const long double _Complex LN_2;                                 // log_e(2)
     144extern const long double _Complex LN_10;                                // log_e(10)
     145extern const long double _Complex SQRT_2;                               // sqrt(2)
     146extern const long double _Complex _1_SQRT_2;                    // 1 / sqrt(2)
    147147
    148148// Local Variables: //
  • src/InitTweak/FixGlobalInit.cc

    r69c5c00 r6fbe9a5  
    112112                        } // if
    113113                        if ( Statement * ctor = ctorInit->ctor ) {
     114                                // Translation 1: Add this attribute on the global declaration:
     115                                //    __attribute__((section (".data#")))
     116                                // which makes gcc put the global in the data section,
     117                                // so that the global is writeable (via a const cast) in the init function.
     118                                // The trailing # is an injected assembly comment, to suppress the "a" in
     119                                //    .section .data,"a"
     120                                //    .section .data#,"a"
     121                                // to avoid assembler warning "ignoring changed section attributes for .data"
     122                                Type *strLitT = new PointerType( Type::Qualifiers( ),
     123                                        new BasicType( Type::Qualifiers( ), BasicType::Char ) );
     124                                std::list< Expression * > attr_params;
     125                                attr_params.push_back(
     126                                        new ConstantExpr( Constant( strLitT, "\".data#\"", std::nullopt ) ) );
     127                                objDecl->attributes.push_back(new Attribute("section", attr_params));
     128                                // Translation 2: Move the initizliation off the global declaration,
     129                                // into the startup function.
    114130                                initStatements.push_back( ctor );
    115131                                objDecl->init = nullptr;
  • tests/.expect/limits.txt

    r69c5c00 r6fbe9a5  
    11limits.cfa: In function '_X4mainFi_iPPKc__1':
    2 limits.cfa:151:9: note: #pragma message: Compiled
     2limits.cfa:154:9: note: #pragma message: Compiled
  • tests/limits.cfa

    r69c5c00 r6fbe9a5  
    1313// Update Count     : 10
    1414//
     15
     16// Note: For testing the ability to load the constants defined in libcfa/src/limits.cfa,
     17// see discussion in test const-init.
    1518
    1619#include <limits.hfa>
Note: See TracChangeset for help on using the changeset viewer.