Hi all,

I'm trying to see a way forward for PR 42954: when preprocessing Fortran source 
files, we used to call the C preprocessor and run the Fortran compiler on the 
generated file. We now use libcpp directly, but by doing so, we have lost a 
good number of target-dependent CPP builtins that are defined via 
TARGET_OS_CPP_BUILTINS and TARGET_CPU_CPP_BUILTINS macros. These macros were 
used in real-life code (including mine!) for conditional compilation, and the 
new behaviour is a regression.


The reason these macros can't be used directly can be seen on the example of 
config/sol2.h:

#define TARGET_OS_CPP_BUILTINS()                        \
    do {                                                \
        builtin_define_std ("unix");                    \
        builtin_define_std ("sun");                     \
        /* For C++ we need to add some additional macro \
           definitions required by the C++ standard     \
           library.  */                                 \
        if (c_dialect_cxx ())                           \
          {                                             \
            builtin_define ("__STDC_VERSION__=199901L");\
            builtin_define ("_XOPEN_SOURCE=600");       \
          }                                             \
        TARGET_SUB_OS_CPP_BUILTINS();                   \
    } while (0)

(I've removed a few lines, but you get the idea.)

Calling c_dialect_cxx() is not going to work in the Fortran front-end, as this 
is a function defined in c-family/c-common.h, which we don't include (and don't 
want to include!). Other such problematic functions or variables include 
flag_isoc99, flag_iso, flag_leading_underscore (see full list at 
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42954).



How can we fix this? The only way I see would be to have two macros instead of 
TARGET_OS_CPP_BUILTINS: one that will be used for source-preprocessing in all 
languages (maybe keeping the name TARGET_OS_CPP_BUILTINS), and one that will be 
used only for C-family languages (TARGET_OS_CPP_BUILTINS_CFAMILY). It seems 
like a bit of work, to get everything in the right place. However, I don't 
really see an alternative solution, which is why I'm writing here: would there 
be any easier solution? Or one that makes more sense to you?

As this is a major change, I'd like to get this in before the end of stage1, 
probably submitting it next week-end, if we can agree on a path for me to 
implement.

Thanks for the help!
FX

Reply via email to