Bug 233481

Summary: flex/lex: __dead2 define in flex.skl precludes cross compiles for embedded systems
Product: Base System Reporter: Craig Leres <leres>
Component: binAssignee: freebsd-bugs (Nobody) <bugs>
Status: New ---    
Severity: Affects Only Me    
Priority: ---    
Version: 11.2-RELEASE   
Hardware: Any   
OS: Any   
Description Flags
patch none

Description Craig Leres freebsd_committer 2018-11-24 21:13:49 UTC
We're unable to compile a lex generated module for the openvehicles.com project with the devel/xtensa-esp32-elf toolchain. The problem is the flex/lex generated code unconditionally defines __dead2 when !defined(__FreeBSD__):

    In file included from /home/leres/esp/openvehicles-xtensa-esp32-elf/components/newlib/include/stdio.h:35:0,
                     from /home/leres/src/Open-Vehicle-Monitoring-System-3/vehicle/OVMS.V3/components/dbc/yacclex/dbc_tokeniser.c:30:
    /home/leres/esp/openvehicles-xtensa-esp32-elf/components/newlib/include/sys/cdefs.h:246:0: warning: "__dead2" redefined
     #define __dead2  __attribute__((__noreturn__))
    /home/leres/src/Open-Vehicle-Monitoring-System-3/vehicle/OVMS.V3/components/dbc/yacclex/dbc_tokeniser.c:26:0: note: this is the location of the previous definition
     #define __dead2

The problem is the generated code unconditionally defines __dead2:

    /* First, we deal with  platform-specific or compiler-specific issues. */

    #if defined(__FreeBSD__)
    #ifndef __STDC_LIMIT_MACROS
    #define __STDC_LIMIT_MACROS
    #include <sys/cdefs.h>
    #include <stdint.h>
    #define __dead2

And then later includes stdio.h:

    /* begin standard C headers. */
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    #include <stdlib.h>

    /* end standard C headers. */

But stdio.h causes the xtensa-esp32-elf version sys/cdefs.h to be included which defines __dead2 for the second time:

    #if __GNUC_PREREQ__(2, 7)
    #define __dead2         __attribute__((__noreturn__))

The only workaround is to do hacky post-processing on the generated code (or perhaps use the textproc/flex port which does not patch the standard flex.skl file).

The attached patch moves the __dead2 define after the "standard C headers" are included and only attempts to define __dead2 if it is not already defined.
Comment 1 Craig Leres freebsd_committer 2018-11-24 21:14:12 UTC
Created attachment 199525 [details]