diff mbox

libsanitizer merge from upstream r196090

Message ID 20131202223259.GQ892@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Dec. 2, 2013, 10:32 p.m. UTC
On Mon, Dec 02, 2013 at 05:59:53PM +0100, Konstantin Serebryany wrote:
> >> with #if LINUX_VERSION_CODE >= 132640
> Good idea, let me try that.

Had a quick look at this on RHEL 5.
Following patch let me compile at least the first source file, but then
I run into tons of issues in sanitizer_platform_limits_posix.cc.

I think the main problem is that you are mixing standard glibc headers and
linux kernel headers in the same source file, that is a big no no.
Lots of the kernel headers declare the same things as glibc headers.

I'd strongly recommend splitting the files, so that you include absolute minimum of
glibc headers when you include linux/* and/or asm/* headers and no kernel headers
if you include tons of glibc headers.
And as the errors show up, there are also .cfi* directives that are used
unconditionally (you've set you've removed it from sanitizer_common or where it
was used (IMHO a pitty, much better would be conditionalizing them on either compiler
preprocessor macros or whatever clang provides as alternative for that when not building
with gcc)), but they are used in tsan (in HACKY_CALL macro).  Plus in *.S file
(either that could be again guarded by the same preprocessor macro, or configure or
something else).  Note that RHEL5 here has already gas that supports .cfi_* directives
(just not .cfi_personality/.cfi_lsda I think), but if you go to even older system
it will not be there.  E.g. glibc assembler files solve that by defining various
CFI_STARTPROC etc. macros that either expand to .cfi_startproc etc. if assembler
supports the directives, or nothing otherwise.


So the current errors are (from make -j64 -k to show more than one file):
In file included from /usr/include/sys/ustat.h:30:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:84:
/usr/include/bits/ustat.h:25:8: error: redefinition of ‘struct ustat’
 struct ustat
        ^
In file included from /usr/include/linux/if_ether.h:24:0,
                 from /usr/include/netinet/if_ether.h:26,
                 from /usr/include/netinet/ether.h:26,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:47:
/usr/include/linux/types.h:156:8: error: previous definition of ‘struct ustat’
 struct ustat {
        ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:26:16: error: redeclaration of ‘IPPROTO_IP’
   IPPROTO_IP = 0,  /* Dummy protocol for TCP  */
                ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:33:5: note: previous declaration ‘<anonymous enum> IPPROTO_IP’
     IPPROTO_IP = 0,    /* Dummy protocol for TCP.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:27:18: error: redeclaration of ‘IPPROTO_ICMP’
   IPPROTO_ICMP = 1,  /* Internet Control Message Protocol */
                  ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:37:5: note: previous declaration ‘<anonymous enum> IPPROTO_ICMP’
     IPPROTO_ICMP = 1,    /* Internet Control Message Protocol.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:28:18: error: redeclaration of ‘IPPROTO_IGMP’
   IPPROTO_IGMP = 2,  /* Internet Group Management Protocol */
                  ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:39:5: note: previous declaration ‘<anonymous enum> IPPROTO_IGMP’
     IPPROTO_IGMP = 2,    /* Internet Group Management Protocol. */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:29:18: error: redeclaration of ‘IPPROTO_IPIP’
   IPPROTO_IPIP = 4,  /* IPIP tunnels (older KA9Q tunnels use 94) */
                  ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:41:5: note: previous declaration ‘<anonymous enum> IPPROTO_IPIP’
     IPPROTO_IPIP = 4,    /* IPIP tunnels (older KA9Q tunnels use 94).  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:30:17: error: redeclaration of ‘IPPROTO_TCP’
   IPPROTO_TCP = 6,  /* Transmission Control Protocol */
                 ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:43:5: note: previous declaration ‘<anonymous enum> IPPROTO_TCP’
     IPPROTO_TCP = 6,    /* Transmission Control Protocol.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:31:17: error: redeclaration of ‘IPPROTO_EGP’
   IPPROTO_EGP = 8,  /* Exterior Gateway Protocol  */
                 ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:45:5: note: previous declaration ‘<anonymous enum> IPPROTO_EGP’
     IPPROTO_EGP = 8,    /* Exterior Gateway Protocol.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:32:17: error: redeclaration of ‘IPPROTO_PUP’
   IPPROTO_PUP = 12,  /* PUP protocol    */
                 ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:47:5: note: previous declaration ‘<anonymous enum> IPPROTO_PUP’
     IPPROTO_PUP = 12,    /* PUP protocol.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:33:17: error: redeclaration of ‘IPPROTO_UDP’
   IPPROTO_UDP = 17,  /* User Datagram Protocol  */
                 ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:49:5: note: previous declaration ‘<anonymous enum> IPPROTO_UDP’
     IPPROTO_UDP = 17,    /* User Datagram Protocol.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:34:17: error: redeclaration of ‘IPPROTO_IDP’
   IPPROTO_IDP = 22,  /* XNS IDP protocol   */
                 ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:51:5: note: previous declaration ‘<anonymous enum> IPPROTO_IDP’
     IPPROTO_IDP = 22,    /* XNS IDP protocol.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:36:18: error: redeclaration of ‘IPPROTO_RSVP’
   IPPROTO_RSVP = 46,  /* RSVP protocol   */
                  ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:61:5: note: previous declaration ‘<anonymous enum> IPPROTO_RSVP’
     IPPROTO_RSVP = 46,    /* Reservation Protocol.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:37:17: error: redeclaration of ‘IPPROTO_GRE’
   IPPROTO_GRE = 47,  /* Cisco GRE tunnels (rfc 1701,1702) */
                 ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:63:5: note: previous declaration ‘<anonymous enum> IPPROTO_GRE’
     IPPROTO_GRE = 47,    /* General Routing Encapsulation.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:39:19: error: redeclaration of ‘IPPROTO_IPV6’
   IPPROTO_IPV6  = 41,  /* IPv6-in-IPv4 tunnelling  */
                   ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:55:5: note: previous declaration ‘<anonymous enum> IPPROTO_IPV6’
     IPPROTO_IPV6 = 41,     /* IPv6 header.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:41:17: error: redeclaration of ‘IPPROTO_ESP’
   IPPROTO_ESP = 50,            /* Encapsulation Security Payload protocol */
                 ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:65:5: note: previous declaration ‘<anonymous enum> IPPROTO_ESP’
     IPPROTO_ESP = 50,      /* encapsulating security payload.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:42:16: error: redeclaration of ‘IPPROTO_AH’
   IPPROTO_AH = 51,             /* Authentication Header protocol       */
                ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:67:5: note: previous declaration ‘<anonymous enum> IPPROTO_AH’
     IPPROTO_AH = 51,       /* authentication header.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:43:20: error: redeclaration of ‘IPPROTO_PIM’
   IPPROTO_PIM    = 103,  /* Protocol Independent Multicast */
                    ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:79:5: note: previous declaration ‘<anonymous enum> IPPROTO_PIM’
     IPPROTO_PIM = 103,    /* Protocol Independent Multicast.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:45:20: error: redeclaration of ‘IPPROTO_COMP’
   IPPROTO_COMP   = 108,                /* Compression Header protocol */
                    ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:81:5: note: previous declaration ‘<anonymous enum> IPPROTO_COMP’
     IPPROTO_COMP = 108,    /* Compression Header Protocol.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:46:20: error: redeclaration of ‘IPPROTO_SCTP’
   IPPROTO_SCTP   = 132,  /* Stream Control Transport Protocol */
                    ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:83:5: note: previous declaration ‘<anonymous enum> IPPROTO_SCTP’
     IPPROTO_SCTP = 132,    /* Stream Control Transmission Protocol.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:48:18: error: redeclaration of ‘IPPROTO_RAW’
   IPPROTO_RAW  = 255,  /* Raw IP packets   */
                  ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:85:5: note: previous declaration ‘<anonymous enum> IPPROTO_RAW’
     IPPROTO_RAW = 255,    /* Raw IP packets.  */
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:49:3: error: redeclaration of ‘IPPROTO_MAX’
   IPPROTO_MAX
   ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:87:5: note: previous declaration ‘<anonymous enum> IPPROTO_MAX’
     IPPROTO_MAX
     ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:54:8: error: redefinition of ‘struct in_addr’
 struct in_addr {
        ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:137:8: error: previous definition of ‘struct in_addr’
 struct in_addr
        ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:113:8: error: redefinition of ‘struct ip_mreq’
 struct ip_mreq 
        ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:244:8: error: previous definition of ‘struct ip_mreq’
 struct ip_mreq
        ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:119:8: error: redefinition of ‘struct ip_mreqn’
 struct ip_mreqn
        ^
In file included from /usr/include/netinet/in.h:345:0,
                 from /usr/include/arpa/inet.h:23,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/bits/in.h:89:8: error: previous definition of ‘struct ip_mreqn’
 struct ip_mreqn
        ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:126:8: error: redefinition of ‘struct ip_mreq_source’
 struct ip_mreq_source {
        ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:253:8: error: previous definition of ‘struct ip_mreq_source’
 struct ip_mreq_source
        ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:132:8: error: redefinition of ‘struct ip_msfilter’
 struct ip_msfilter {
        ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:300:8: error: previous definition of ‘struct ip_msfilter’
 struct ip_msfilter
        ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:144:8: error: redefinition of ‘struct group_req’
 struct group_req
        ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:277:8: error: previous definition of ‘struct group_req’
 struct group_req
        ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:150:8: error: redefinition of ‘struct group_source_req’
 struct group_source_req
        ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:286:8: error: previous definition of ‘struct group_source_req’
 struct group_source_req
        ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsani    from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/bits/in.h:97:8: error: previous definition of ‘struct in_pktinfo’
 struct in_pktinfo
        ^
In file included from /usr/include/linux/mroute.h:5:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
/usr/include/linux/in.h:179:8: error: redefinition of ‘struct sockaddr_in’
 struct sockaddr_in {
        ^
In file included from /usr/include/arpa/inet.h:23:0,
                 from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
/usr/include/netinet/in.h:219:8: error: previous definition of ‘struct sockaddr_in’
 struct sockaddr_in
        ^
make[1]: *** [sanitizer_platform_limits_posix.lo] Error 1
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
make[1]: *** [tsan_rtl_thread.lo] Error 1
../../../../libsanitizer/tsan/tsan_rtl.h: Assembler messages:
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
make[1]: *** [tsan_rtl_mutex.lo] Error 1
...
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
make[1]: *** [tsan_interface_atomic.lo] Error 1
../../../../libsanitizer/tsan/tsan_rtl.cc: Assembler messages:
../../../../libsanitizer/tsan/tsan_rtl.cc:400: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.cc:400: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.cc:400: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.cc:400: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
...
../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
make[1]: *** [tsan_rtl.lo] Error 1



	Jakub

Comments

Konstantin Serebryany Dec. 3, 2013, 5:53 a.m. UTC | #1
On Tue, Dec 3, 2013 at 2:32 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Mon, Dec 02, 2013 at 05:59:53PM +0100, Konstantin Serebryany wrote:
>> >> with #if LINUX_VERSION_CODE >= 132640
>> Good idea, let me try that.
>
> Had a quick look at this on RHEL 5.
> Following patch let me compile at least the first source file, but then
> I run into tons of issues in sanitizer_platform_limits_posix.cc.

That's what I am afraid of. Even if we manage to compile everything,
there is no guarantee that the code will work.
I suggest to simply disable libsanitizer build on the older systems
which is what happens de facto now.
If there is significant interest in maintaining asan&co on older
systems (which I have not seen so far),
then those interested will need to help us in upstream repository (llvm) by
a) sending us patches using http://llvm.org/docs/Phabricator.html and
b) setting up a public buildbot (attached to the LLVM master bot) with
the system they care about.
If there is no one interested enough to do a) and b) I say we should
not spend time on this.

And this discussion does not affect the merge since nothing that works
today will get broken, right?





>
> I think the main problem is that you are mixing standard glibc headers and
> linux kernel headers in the same source file, that is a big no no.
> Lots of the kernel headers declare the same things as glibc headers.
>
> I'd strongly recommend splitting the files, so that you include absolute minimum of
> glibc headers when you include linux/* and/or asm/* headers and no kernel headers
> if you include tons of glibc headers.
> And as the errors show up, there are also .cfi* directives that are used
> unconditionally (you've set you've removed it from sanitizer_common or where it
> was used (IMHO a pitty, much better would be conditionalizing them on either compiler
> preprocessor macros or whatever clang provides as alternative for that when not building
> with gcc)), but they are used in tsan (in HACKY_CALL macro).  Plus in *.S file
> (either that could be again guarded by the same preprocessor macro, or configure or
> something else).  Note that RHEL5 here has already gas that supports .cfi_* directives
> (just not .cfi_personality/.cfi_lsda I think), but if you go to even older system
> it will not be there.  E.g. glibc assembler files solve that by defining various
> CFI_STARTPROC etc. macros that either expand to .cfi_startproc etc. if assembler
> supports the directives, or nothing otherwise.
>
> --- sanitizer_platform_limits_linux.cc.jj       2013-12-02 15:27:58.000000000 -0500
> +++ sanitizer_platform_limits_linux.cc  2013-12-02 17:06:19.000000000 -0500
> @@ -51,8 +51,12 @@
>  #endif
>
>  #if !SANITIZER_ANDROID
> +#include <linux/version.h>
> +// <linux/perf_event.h> has been added in 2.6.32
> +#if LINUX_VERSION_CODE >= 132640
>  #include <linux/perf_event.h>
>  #endif
> +#endif
>
>  namespace __sanitizer {
>    unsigned struct_statfs64_sz = sizeof(struct statfs64);
> @@ -75,15 +79,18 @@ CHECK_SIZE_AND_OFFSET(io_event, res);
>  CHECK_SIZE_AND_OFFSET(io_event, res2);
>
>  #if !SANITIZER_ANDROID
> +#if LINUX_VERSION_CODE >= 132640
>  COMPILER_CHECK(sizeof(struct __sanitizer_perf_event_attr) <=
>                 sizeof(struct perf_event_attr));
>  CHECK_SIZE_AND_OFFSET(perf_event_attr, type);
>  CHECK_SIZE_AND_OFFSET(perf_event_attr, size);
>  #endif
> +#endif
>
>  COMPILER_CHECK(iocb_cmd_pread == IOCB_CMD_PREAD);
>  COMPILER_CHECK(iocb_cmd_pwrite == IOCB_CMD_PWRITE);
> -#if !SANITIZER_ANDROID
> +#if !SANITIZER_ANDROID && LINUX_VERSION_CODE >= 132627
> +// IOCB_CMD_PREADV/PWRITEV has been added in 2.6.19
>  COMPILER_CHECK(iocb_cmd_preadv == IOCB_CMD_PREADV);
>  COMPILER_CHECK(iocb_cmd_pwritev == IOCB_CMD_PWRITEV);
>  #endif
> --- sanitizer_platform_limits_posix.cc.jj       2013-12-02 15:27:58.000000000 -0500
> +++ sanitizer_platform_limits_posix.cc  2013-12-02 17:11:00.000000000 -0500
> @@ -82,12 +82,16 @@
>  #include <sys/timex.h>
>  #include <sys/user.h>
>  #include <sys/ustat.h>
> +#include <linux/version.h>
>  #include <linux/cyclades.h>
>  #include <linux/if_eql.h>
>  #include <linux/if_plip.h>
>  #include <linux/lp.h>
>  #include <linux/mroute.h>
> +// <linux/mroute6.h> has been added in 2.6.26
> +#if LINUX_VERSION_CODE >= 132634
>  #include <linux/mroute6.h>
> +#endif
>  #include <linux/scc.h>
>  #include <linux/serial.h>
>  #include <sys/msg.h>
>
> So the current errors are (from make -j64 -k to show more than one file):
> In file included from /usr/include/sys/ustat.h:30:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:84:
> /usr/include/bits/ustat.h:25:8: error: redefinition of ‘struct ustat’
>  struct ustat
>         ^
> In file included from /usr/include/linux/if_ether.h:24:0,
>                  from /usr/include/netinet/if_ether.h:26,
>                  from /usr/include/netinet/ether.h:26,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:47:
> /usr/include/linux/types.h:156:8: error: previous definition of ‘struct ustat’
>  struct ustat {
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:26:16: error: redeclaration of ‘IPPROTO_IP’
>    IPPROTO_IP = 0,  /* Dummy protocol for TCP  */
>                 ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:33:5: note: previous declaration ‘<anonymous enum> IPPROTO_IP’
>      IPPROTO_IP = 0,    /* Dummy protocol for TCP.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:27:18: error: redeclaration of ‘IPPROTO_ICMP’
>    IPPROTO_ICMP = 1,  /* Internet Control Message Protocol */
>                   ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:37:5: note: previous declaration ‘<anonymous enum> IPPROTO_ICMP’
>      IPPROTO_ICMP = 1,    /* Internet Control Message Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:28:18: error: redeclaration of ‘IPPROTO_IGMP’
>    IPPROTO_IGMP = 2,  /* Internet Group Management Protocol */
>                   ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:39:5: note: previous declaration ‘<anonymous enum> IPPROTO_IGMP’
>      IPPROTO_IGMP = 2,    /* Internet Group Management Protocol. */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:29:18: error: redeclaration of ‘IPPROTO_IPIP’
>    IPPROTO_IPIP = 4,  /* IPIP tunnels (older KA9Q tunnels use 94) */
>                   ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:41:5: note: previous declaration ‘<anonymous enum> IPPROTO_IPIP’
>      IPPROTO_IPIP = 4,    /* IPIP tunnels (older KA9Q tunnels use 94).  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:30:17: error: redeclaration of ‘IPPROTO_TCP’
>    IPPROTO_TCP = 6,  /* Transmission Control Protocol */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:43:5: note: previous declaration ‘<anonymous enum> IPPROTO_TCP’
>      IPPROTO_TCP = 6,    /* Transmission Control Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:31:17: error: redeclaration of ‘IPPROTO_EGP’
>    IPPROTO_EGP = 8,  /* Exterior Gateway Protocol  */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:45:5: note: previous declaration ‘<anonymous enum> IPPROTO_EGP’
>      IPPROTO_EGP = 8,    /* Exterior Gateway Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:32:17: error: redeclaration of ‘IPPROTO_PUP’
>    IPPROTO_PUP = 12,  /* PUP protocol    */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:47:5: note: previous declaration ‘<anonymous enum> IPPROTO_PUP’
>      IPPROTO_PUP = 12,    /* PUP protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:33:17: error: redeclaration of ‘IPPROTO_UDP’
>    IPPROTO_UDP = 17,  /* User Datagram Protocol  */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:49:5: note: previous declaration ‘<anonymous enum> IPPROTO_UDP’
>      IPPROTO_UDP = 17,    /* User Datagram Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:34:17: error: redeclaration of ‘IPPROTO_IDP’
>    IPPROTO_IDP = 22,  /* XNS IDP protocol   */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:51:5: note: previous declaration ‘<anonymous enum> IPPROTO_IDP’
>      IPPROTO_IDP = 22,    /* XNS IDP protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:36:18: error: redeclaration of ‘IPPROTO_RSVP’
>    IPPROTO_RSVP = 46,  /* RSVP protocol   */
>                   ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:61:5: note: previous declaration ‘<anonymous enum> IPPROTO_RSVP’
>      IPPROTO_RSVP = 46,    /* Reservation Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:37:17: error: redeclaration of ‘IPPROTO_GRE’
>    IPPROTO_GRE = 47,  /* Cisco GRE tunnels (rfc 1701,1702) */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:63:5: note: previous declaration ‘<anonymous enum> IPPROTO_GRE’
>      IPPROTO_GRE = 47,    /* General Routing Encapsulation.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:39:19: error: redeclaration of ‘IPPROTO_IPV6’
>    IPPROTO_IPV6  = 41,  /* IPv6-in-IPv4 tunnelling  */
>                    ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:55:5: note: previous declaration ‘<anonymous enum> IPPROTO_IPV6’
>      IPPROTO_IPV6 = 41,     /* IPv6 header.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:41:17: error: redeclaration of ‘IPPROTO_ESP’
>    IPPROTO_ESP = 50,            /* Encapsulation Security Payload protocol */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:65:5: note: previous declaration ‘<anonymous enum> IPPROTO_ESP’
>      IPPROTO_ESP = 50,      /* encapsulating security payload.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:42:16: error: redeclaration of ‘IPPROTO_AH’
>    IPPROTO_AH = 51,             /* Authentication Header protocol       */
>                 ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:67:5: note: previous declaration ‘<anonymous enum> IPPROTO_AH’
>      IPPROTO_AH = 51,       /* authentication header.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:43:20: error: redeclaration of ‘IPPROTO_PIM’
>    IPPROTO_PIM    = 103,  /* Protocol Independent Multicast */
>                     ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:79:5: note: previous declaration ‘<anonymous enum> IPPROTO_PIM’
>      IPPROTO_PIM = 103,    /* Protocol Independent Multicast.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:45:20: error: redeclaration of ‘IPPROTO_COMP’
>    IPPROTO_COMP   = 108,                /* Compression Header protocol */
>                     ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:81:5: note: previous declaration ‘<anonymous enum> IPPROTO_COMP’
>      IPPROTO_COMP = 108,    /* Compression Header Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:46:20: error: redeclaration of ‘IPPROTO_SCTP’
>    IPPROTO_SCTP   = 132,  /* Stream Control Transport Protocol */
>                     ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:83:5: note: previous declaration ‘<anonymous enum> IPPROTO_SCTP’
>      IPPROTO_SCTP = 132,    /* Stream Control Transmission Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:48:18: error: redeclaration of ‘IPPROTO_RAW’
>    IPPROTO_RAW  = 255,  /* Raw IP packets   */
>                   ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:85:5: note: previous declaration ‘<anonymous enum> IPPROTO_RAW’
>      IPPROTO_RAW = 255,    /* Raw IP packets.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:49:3: error: redeclaration of ‘IPPROTO_MAX’
>    IPPROTO_MAX
>    ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:87:5: note: previous declaration ‘<anonymous enum> IPPROTO_MAX’
>      IPPROTO_MAX
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:54:8: error: redefinition of ‘struct in_addr’
>  struct in_addr {
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:137:8: error: previous definition of ‘struct in_addr’
>  struct in_addr
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:113:8: error: redefinition of ‘struct ip_mreq’
>  struct ip_mreq
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:244:8: error: previous definition of ‘struct ip_mreq’
>  struct ip_mreq
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:119:8: error: redefinition of ‘struct ip_mreqn’
>  struct ip_mreqn
>         ^
> In file included from /usr/include/netinet/in.h:345:0,
>                  from /usr/include/arpa/inet.h:23,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/bits/in.h:89:8: error: previous definition of ‘struct ip_mreqn’
>  struct ip_mreqn
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:126:8: error: redefinition of ‘struct ip_mreq_source’
>  struct ip_mreq_source {
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:253:8: error: previous definition of ‘struct ip_mreq_source’
>  struct ip_mreq_source
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:132:8: error: redefinition of ‘struct ip_msfilter’
>  struct ip_msfilter {
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:300:8: error: previous definition of ‘struct ip_msfilter’
>  struct ip_msfilter
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:144:8: error: redefinition of ‘struct group_req’
>  struct group_req
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:277:8: error: previous definition of ‘struct group_req’
>  struct group_req
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:150:8: error: redefinition of ‘struct group_source_req’
>  struct group_source_req
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:286:8: error: previous definition of ‘struct group_source_req’
>  struct group_source_req
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsani    from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/bits/in.h:97:8: error: previous definition of ‘struct in_pktinfo’
>  struct in_pktinfo
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:179:8: error: redefinition of ‘struct sockaddr_in’
>  struct sockaddr_in {
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:219:8: error: previous definition of ‘struct sockaddr_in’
>  struct sockaddr_in
>         ^
> make[1]: *** [sanitizer_platform_limits_posix.lo] Error 1
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> make[1]: *** [tsan_rtl_thread.lo] Error 1
> ../../../../libsanitizer/tsan/tsan_rtl.h: Assembler messages:
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> make[1]: *** [tsan_rtl_mutex.lo] Error 1
> ...
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> make[1]: *** [tsan_interface_atomic.lo] Error 1
> ../../../../libsanitizer/tsan/tsan_rtl.cc: Assembler messages:
> ../../../../libsanitizer/tsan/tsan_rtl.cc:400: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.cc:400: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.cc:400: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.cc:400: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ...
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> make[1]: *** [tsan_rtl.lo] Error 1
>
>
>
>         Jakub
Uros Bizjak Dec. 3, 2013, 7:34 a.m. UTC | #2
On Tue, Dec 3, 2013 at 6:53 AM, Konstantin Serebryany
<konstantin.s.serebryany@gmail.com> wrote:

>>> >> with #if LINUX_VERSION_CODE >= 132640
>>> Good idea, let me try that.
>>
>> Had a quick look at this on RHEL 5.
>> Following patch let me compile at least the first source file, but then
>> I run into tons of issues in sanitizer_platform_limits_posix.cc.
>
> That's what I am afraid of. Even if we manage to compile everything,
> there is no guarantee that the code will work.
> I suggest to simply disable libsanitizer build on the older systems
> which is what happens de facto now.
> If there is significant interest in maintaining asan&co on older
> systems (which I have not seen so far),
> then those interested will need to help us in upstream repository (llvm) by
> a) sending us patches using http://llvm.org/docs/Phabricator.html and
> b) setting up a public buildbot (attached to the LLVM master bot) with
> the system they care about.
> If there is no one interested enough to do a) and b) I say we should
> not spend time on this.

IMO, it is also OK for the configure to check for needed features and
disable libsanitizer (perhaps with some informative message) if
minimum requirements are not met. If someone adds workarounds for
those missing features to support older systems, then chese checks can
easily be adapted. The problem ATM is, that gcc won't build
out-of-the-box on older distributions, although adding
--disable-libsanitizer manually works OK.

> And this discussion does not affect the merge since nothing that works
> today will get broken, right?

Yes, that's right.

Uros.
Konstantin Serebryany Dec. 4, 2013, 5:28 a.m. UTC | #3
On Mon, Dec 2, 2013 at 11:32 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Mon, Dec 02, 2013 at 05:59:53PM +0100, Konstantin Serebryany wrote:
>> >> with #if LINUX_VERSION_CODE >= 132640
>> Good idea, let me try that.
>
> Had a quick look at this on RHEL 5.
> Following patch let me compile at least the first source file, but then
> I run into tons of issues in sanitizer_platform_limits_posix.cc.
>
> I think the main problem is that you are mixing standard glibc headers and
> linux kernel headers in the same source file, that is a big no no.
> Lots of the kernel headers declare the same things as glibc headers.
>
> I'd strongly recommend splitting the files, so that you include absolute minimum of
> glibc headers when you include linux/* and/or asm/* headers and no kernel headers
> if you include tons of glibc headers.
> And as the errors show up, there are also .cfi* directives that are used
> unconditionally (you've set you've removed it from sanitizer_common or where it
> was used (IMHO a pitty, much better would be conditionalizing them on either compiler
> preprocessor macros or whatever clang provides as alternative for that when not building
> with gcc)), but they are used in tsan (in HACKY_CALL macro).  Plus in *.S file
> (either that could be again guarded by the same preprocessor macro, or configure or
> something else).  Note that RHEL5 here has already gas that supports .cfi_* directives
> (just not .cfi_personality/.cfi_lsda I think), but if you go to even older system
> it will not be there.  E.g. glibc assembler files solve that by defining various
> CFI_STARTPROC etc. macros that either expand to .cfi_startproc etc. if assembler
> supports the directives, or nothing otherwise.


We don't have any .cfi stuff in sanitizer_common (and I don't think we
really need it in the internal_clone).
Before fixing the tsan sources I'd like to see some indication that
anyone cares about tsan working on older systems.
tsan makes many assumptions about the system (address space, etc)
which may not hold on old systems anyway.
And tsan, even if it builds, will not work reliably.

I really think that we need to disable libsanitizer on old systems
until someone volunteers to set up a proper testing process upstream.
If no one volunteers -- no one really needs it.

--kcc



>
> --- sanitizer_platform_limits_linux.cc.jj       2013-12-02 15:27:58.000000000 -0500
> +++ sanitizer_platform_limits_linux.cc  2013-12-02 17:06:19.000000000 -0500
> @@ -51,8 +51,12 @@
>  #endif
>
>  #if !SANITIZER_ANDROID
> +#include <linux/version.h>
> +// <linux/perf_event.h> has been added in 2.6.32
> +#if LINUX_VERSION_CODE >= 132640
>  #include <linux/perf_event.h>
>  #endif
> +#endif
>
>  namespace __sanitizer {
>    unsigned struct_statfs64_sz = sizeof(struct statfs64);
> @@ -75,15 +79,18 @@ CHECK_SIZE_AND_OFFSET(io_event, res);
>  CHECK_SIZE_AND_OFFSET(io_event, res2);
>
>  #if !SANITIZER_ANDROID
> +#if LINUX_VERSION_CODE >= 132640
>  COMPILER_CHECK(sizeof(struct __sanitizer_perf_event_attr) <=
>                 sizeof(struct perf_event_attr));
>  CHECK_SIZE_AND_OFFSET(perf_event_attr, type);
>  CHECK_SIZE_AND_OFFSET(perf_event_attr, size);
>  #endif
> +#endif
>
>  COMPILER_CHECK(iocb_cmd_pread == IOCB_CMD_PREAD);
>  COMPILER_CHECK(iocb_cmd_pwrite == IOCB_CMD_PWRITE);
> -#if !SANITIZER_ANDROID
> +#if !SANITIZER_ANDROID && LINUX_VERSION_CODE >= 132627
> +// IOCB_CMD_PREADV/PWRITEV has been added in 2.6.19
>  COMPILER_CHECK(iocb_cmd_preadv == IOCB_CMD_PREADV);
>  COMPILER_CHECK(iocb_cmd_pwritev == IOCB_CMD_PWRITEV);
>  #endif
> --- sanitizer_platform_limits_posix.cc.jj       2013-12-02 15:27:58.000000000 -0500
> +++ sanitizer_platform_limits_posix.cc  2013-12-02 17:11:00.000000000 -0500
> @@ -82,12 +82,16 @@
>  #include <sys/timex.h>
>  #include <sys/user.h>
>  #include <sys/ustat.h>
> +#include <linux/version.h>
>  #include <linux/cyclades.h>
>  #include <linux/if_eql.h>
>  #include <linux/if_plip.h>
>  #include <linux/lp.h>
>  #include <linux/mroute.h>
> +// <linux/mroute6.h> has been added in 2.6.26
> +#if LINUX_VERSION_CODE >= 132634
>  #include <linux/mroute6.h>
> +#endif
>  #include <linux/scc.h>
>  #include <linux/serial.h>
>  #include <sys/msg.h>
>
> So the current errors are (from make -j64 -k to show more than one file):
> In file included from /usr/include/sys/ustat.h:30:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:84:
> /usr/include/bits/ustat.h:25:8: error: redefinition of ‘struct ustat’
>  struct ustat
>         ^
> In file included from /usr/include/linux/if_ether.h:24:0,
>                  from /usr/include/netinet/if_ether.h:26,
>                  from /usr/include/netinet/ether.h:26,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:47:
> /usr/include/linux/types.h:156:8: error: previous definition of ‘struct ustat’
>  struct ustat {
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:26:16: error: redeclaration of ‘IPPROTO_IP’
>    IPPROTO_IP = 0,  /* Dummy protocol for TCP  */
>                 ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:33:5: note: previous declaration ‘<anonymous enum> IPPROTO_IP’
>      IPPROTO_IP = 0,    /* Dummy protocol for TCP.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:27:18: error: redeclaration of ‘IPPROTO_ICMP’
>    IPPROTO_ICMP = 1,  /* Internet Control Message Protocol */
>                   ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:37:5: note: previous declaration ‘<anonymous enum> IPPROTO_ICMP’
>      IPPROTO_ICMP = 1,    /* Internet Control Message Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:28:18: error: redeclaration of ‘IPPROTO_IGMP’
>    IPPROTO_IGMP = 2,  /* Internet Group Management Protocol */
>                   ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:39:5: note: previous declaration ‘<anonymous enum> IPPROTO_IGMP’
>      IPPROTO_IGMP = 2,    /* Internet Group Management Protocol. */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:29:18: error: redeclaration of ‘IPPROTO_IPIP’
>    IPPROTO_IPIP = 4,  /* IPIP tunnels (older KA9Q tunnels use 94) */
>                   ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:41:5: note: previous declaration ‘<anonymous enum> IPPROTO_IPIP’
>      IPPROTO_IPIP = 4,    /* IPIP tunnels (older KA9Q tunnels use 94).  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:30:17: error: redeclaration of ‘IPPROTO_TCP’
>    IPPROTO_TCP = 6,  /* Transmission Control Protocol */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:43:5: note: previous declaration ‘<anonymous enum> IPPROTO_TCP’
>      IPPROTO_TCP = 6,    /* Transmission Control Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:31:17: error: redeclaration of ‘IPPROTO_EGP’
>    IPPROTO_EGP = 8,  /* Exterior Gateway Protocol  */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:45:5: note: previous declaration ‘<anonymous enum> IPPROTO_EGP’
>      IPPROTO_EGP = 8,    /* Exterior Gateway Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:32:17: error: redeclaration of ‘IPPROTO_PUP’
>    IPPROTO_PUP = 12,  /* PUP protocol    */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:47:5: note: previous declaration ‘<anonymous enum> IPPROTO_PUP’
>      IPPROTO_PUP = 12,    /* PUP protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:33:17: error: redeclaration of ‘IPPROTO_UDP’
>    IPPROTO_UDP = 17,  /* User Datagram Protocol  */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:49:5: note: previous declaration ‘<anonymous enum> IPPROTO_UDP’
>      IPPROTO_UDP = 17,    /* User Datagram Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:34:17: error: redeclaration of ‘IPPROTO_IDP’
>    IPPROTO_IDP = 22,  /* XNS IDP protocol   */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:51:5: note: previous declaration ‘<anonymous enum> IPPROTO_IDP’
>      IPPROTO_IDP = 22,    /* XNS IDP protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:36:18: error: redeclaration of ‘IPPROTO_RSVP’
>    IPPROTO_RSVP = 46,  /* RSVP protocol   */
>                   ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:61:5: note: previous declaration ‘<anonymous enum> IPPROTO_RSVP’
>      IPPROTO_RSVP = 46,    /* Reservation Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:37:17: error: redeclaration of ‘IPPROTO_GRE’
>    IPPROTO_GRE = 47,  /* Cisco GRE tunnels (rfc 1701,1702) */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:63:5: note: previous declaration ‘<anonymous enum> IPPROTO_GRE’
>      IPPROTO_GRE = 47,    /* General Routing Encapsulation.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:39:19: error: redeclaration of ‘IPPROTO_IPV6’
>    IPPROTO_IPV6  = 41,  /* IPv6-in-IPv4 tunnelling  */
>                    ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:55:5: note: previous declaration ‘<anonymous enum> IPPROTO_IPV6’
>      IPPROTO_IPV6 = 41,     /* IPv6 header.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:41:17: error: redeclaration of ‘IPPROTO_ESP’
>    IPPROTO_ESP = 50,            /* Encapsulation Security Payload protocol */
>                  ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:65:5: note: previous declaration ‘<anonymous enum> IPPROTO_ESP’
>      IPPROTO_ESP = 50,      /* encapsulating security payload.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:42:16: error: redeclaration of ‘IPPROTO_AH’
>    IPPROTO_AH = 51,             /* Authentication Header protocol       */
>                 ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:67:5: note: previous declaration ‘<anonymous enum> IPPROTO_AH’
>      IPPROTO_AH = 51,       /* authentication header.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:43:20: error: redeclaration of ‘IPPROTO_PIM’
>    IPPROTO_PIM    = 103,  /* Protocol Independent Multicast */
>                     ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:79:5: note: previous declaration ‘<anonymous enum> IPPROTO_PIM’
>      IPPROTO_PIM = 103,    /* Protocol Independent Multicast.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:45:20: error: redeclaration of ‘IPPROTO_COMP’
>    IPPROTO_COMP   = 108,                /* Compression Header protocol */
>                     ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:81:5: note: previous declaration ‘<anonymous enum> IPPROTO_COMP’
>      IPPROTO_COMP = 108,    /* Compression Header Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:46:20: error: redeclaration of ‘IPPROTO_SCTP’
>    IPPROTO_SCTP   = 132,  /* Stream Control Transport Protocol */
>                     ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:83:5: note: previous declaration ‘<anonymous enum> IPPROTO_SCTP’
>      IPPROTO_SCTP = 132,    /* Stream Control Transmission Protocol.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:48:18: error: redeclaration of ‘IPPROTO_RAW’
>    IPPROTO_RAW  = 255,  /* Raw IP packets   */
>                   ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:85:5: note: previous declaration ‘<anonymous enum> IPPROTO_RAW’
>      IPPROTO_RAW = 255,    /* Raw IP packets.  */
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:49:3: error: redeclaration of ‘IPPROTO_MAX’
>    IPPROTO_MAX
>    ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:87:5: note: previous declaration ‘<anonymous enum> IPPROTO_MAX’
>      IPPROTO_MAX
>      ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:54:8: error: redefinition of ‘struct in_addr’
>  struct in_addr {
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:137:8: error: previous definition of ‘struct in_addr’
>  struct in_addr
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:113:8: error: redefinition of ‘struct ip_mreq’
>  struct ip_mreq
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:244:8: error: previous definition of ‘struct ip_mreq’
>  struct ip_mreq
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:119:8: error: redefinition of ‘struct ip_mreqn’
>  struct ip_mreqn
>         ^
> In file included from /usr/include/netinet/in.h:345:0,
>                  from /usr/include/arpa/inet.h:23,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/bits/in.h:89:8: error: previous definition of ‘struct ip_mreqn’
>  struct ip_mreqn
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:126:8: error: redefinition of ‘struct ip_mreq_source’
>  struct ip_mreq_source {
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:253:8: error: previous definition of ‘struct ip_mreq_source’
>  struct ip_mreq_source
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:132:8: error: redefinition of ‘struct ip_msfilter’
>  struct ip_msfilter {
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:300:8: error: previous definition of ‘struct ip_msfilter’
>  struct ip_msfilter
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:144:8: error: redefinition of ‘struct group_req’
>  struct group_req
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:277:8: error: previous definition of ‘struct group_req’
>  struct group_req
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:150:8: error: redefinition of ‘struct group_source_req’
>  struct group_source_req
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:286:8: error: previous definition of ‘struct group_source_req’
>  struct group_source_req
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsani    from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/bits/in.h:97:8: error: previous definition of ‘struct in_pktinfo’
>  struct in_pktinfo
>         ^
> In file included from /usr/include/linux/mroute.h:5:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:90:
> /usr/include/linux/in.h:179:8: error: redefinition of ‘struct sockaddr_in’
>  struct sockaddr_in {
>         ^
> In file included from /usr/include/arpa/inet.h:23:0,
>                  from ../../../../libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:20:
> /usr/include/netinet/in.h:219:8: error: previous definition of ‘struct sockaddr_in’
>  struct sockaddr_in
>         ^
> make[1]: *** [sanitizer_platform_limits_posix.lo] Error 1
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> make[1]: *** [tsan_rtl_thread.lo] Error 1
> ../../../../libsanitizer/tsan/tsan_rtl.h: Assembler messages:
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> make[1]: *** [tsan_rtl_mutex.lo] Error 1
> ...
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> make[1]: *** [tsan_interface_atomic.lo] Error 1
> ../../../../libsanitizer/tsan/tsan_rtl.cc: Assembler messages:
> ../../../../libsanitizer/tsan/tsan_rtl.cc:400: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.cc:400: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.cc:400: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.cc:400: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> ...
> ../../../../libsanitizer/tsan/tsan_rtl.h:763: Error: CFI instruction used without previous .cfi_startproc
> make[1]: *** [tsan_rtl.lo] Error 1
>
>
>
>         Jakub
Jakub Jelinek Dec. 4, 2013, 8:22 a.m. UTC | #4
On Wed, Dec 04, 2013 at 06:28:31AM +0100, Konstantin Serebryany wrote:
> We don't have any .cfi stuff in sanitizer_common (and I don't think we
> really need it in the internal_clone).
> Before fixing the tsan sources I'd like to see some indication that
> anyone cares about tsan working on older systems.

Of course various parties care about that.  But that doesn't necessarily
imply they can or want to run buildbots for a different compiler they don't
care about, there are e.g. security implications to that, resources etc.

For GCC new ports etc. we never require people running some buildbots,
people just report issues they encounter and those issues are fixed.

> tsan makes many assumptions about the system (address space, etc)
> which may not hold on old systems anyway.
> And tsan, even if it builds, will not work reliably.
> 
> I really think that we need to disable libsanitizer on old systems
> until someone volunteers to set up a proper testing process upstream.
> If no one volunteers -- no one really needs it.

The problem is that the definition of "old systems" is extremelly fuzzy,
for you it is clearly != "Ubuntu 12.04" or similar, but the unwritten
assumptions libsanitizer makes are not related to one exact version of
a single dependent component, it is a matter of compiler, compiler
configuration, binutils, glibc, kernel, kernel headers, ...

So, how do you disable libsanitizer on "old systems" when it is so fuzzy?
There may be assumptions you just don't know about, and "fixing" bugreports
by just adding reporter's toolchain combinations to kill lists is certainly
not the way GCC is developed.

	Jakub
Konstantin Serebryany Dec. 4, 2013, 12:49 p.m. UTC | #5
> Of course various parties care about that.  But that doesn't necessarily
> imply they can or want to run buildbots for a different compiler they don't
> care about, there are e.g. security implications to that, resources etc.

This brings us back to the initial issue: the way asan&co are developed.
The fact of life is that the development happens in the LLVM tree.
The only strategy to keeping GCC's version in sync with upstream that
works for us
it to have verbatim copy of the sources in GCC and to have the merge process
purely mechanical. It has not been purely mechanical with the last merge.
Any other strategy would mean that someone else does the merges.
This is totally fine as long as the sources do not diverge over time;
but I afraid they will diverge.

Testing asan&co upstream does not necessary require testing the rest
of the LLVM compiler.
It would be really great to have someone test the entire LLVM tree on
e.g. "old" Fedora,
but we can limit such testing just to the compiler-rt project.

Ideally for me, GCC would use sanitizer sources from compiler-rt
completely verbatim,
retaining the entire directory structure with all the tests and not
adding any extra files inside that tree.
Maybe even use "svn external" for greater simplicity.
The GCC's build files (Makefile.am, etc) and GCC-specific tests would
live outside of that source tree.
This way it would be easy to set up a build bot that takes fresh
compiler-rt, puts it into the GCC tree,
and runs the GCC testing.
The merges than will become purely mechanical: check the bots, put the
new sources into gcc
(or even update the "svn external" revision!).



>
> For GCC new ports etc. we never require people running some buildbots,
> people just report issues they encounter and those issues are fixed.
>
>> tsan makes many assumptions about the system (address space, etc)
>> which may not hold on old systems anyway.
>> And tsan, even if it builds, will not work reliably.
>>
>> I really think that we need to disable libsanitizer on old systems
>> until someone volunteers to set up a proper testing process upstream.
>> If no one volunteers -- no one really needs it.
>
> The problem is that the definition of "old systems" is extremelly fuzzy,
> for you it is clearly != "Ubuntu 12.04" or similar, but the unwritten
> assumptions libsanitizer makes are not related to one exact version of
> a single dependent component, it is a matter of compiler, compiler
> configuration, binutils, glibc, kernel, kernel headers, ...
>
> So, how do you disable libsanitizer on "old systems" when it is so fuzzy?

I would start from kernel version and glibc version, this should cover
the majority of use cases.

--kcc

> There may be assumptions you just don't know about, and "fixing" bugreports
> by just adding reporter's toolchain combinations to kill lists is certainly
> not the way GCC is developed.
>
>         Jakub
Jakub Jelinek Dec. 4, 2013, 1:02 p.m. UTC | #6
On Wed, Dec 04, 2013 at 04:49:22PM +0400, Konstantin Serebryany wrote:
> I would start from kernel version and glibc version, this should cover
> the majority of use cases.

Well, for the kernel headers what we perhaps can do is just add
libsanitizer/include/linux/ tree that will be maintained by GCC and will
contain (where needed) wrappers for kernel headers or their replacements
to make sure things compile, if you don't care about it in the compiler-rt
tree.  But for the ppc32 stuff, we can't avoid modifying sanitizer_common
(the first patch I've posted recently, btw, I wonder if it works on sparc*,
we'll need to wait for somebody to test it), or e.g. for the .cfi_* stuff
(if you just apply the the .cfi_* related part of the patch I've posted
with say the macros __GCC_HAVE_* replaced by SANITIZER_USE_CFI_DIRECTIVES
or similar, I guess we can provide the right definition for that outside of
the compiler-rt maintained files.
Regarding the TLS size, can you e.g. just only do it for glibc 2.13 and
later, rather than having an (even for glibc 2.11/2.12 incorrect) values for
older glibcs?

	Jakub
Jeff Law Dec. 4, 2013, 8:56 p.m. UTC | #7
On 12/03/13 22:28, Konstantin Serebryany wrote:
>
> I really think that we need to disable libsanitizer on old systems
> until someone volunteers to set up a proper testing process upstream.
> If no one volunteers -- no one really needs it.
The right way to do this is to do feature tests rather than just 
declaring something to be too old based on a version number.  Using 
version #s is a decent, but not great fall back (though it is often 
easier to writing the appropriate feature tests).

Do you use autoconf upstream?  If so, testing for things like the 
existence of particular header files is trivial and avoids nonsense like 
this entirely:

>>
>>   #if !SANITIZER_ANDROID
>> +#include <linux/version.h>
>> +// <linux/perf_event.h> has been added in 2.6.32
>> +#if LINUX_VERSION_CODE >= 132640
>>   #include <linux/perf_event.h>
>>   #endif
>> +#endif
This kind of testing is so easy with autoconf that it's just silly.


>>
>>   namespace __sanitizer {
>>     unsigned struct_statfs64_sz = sizeof(struct statfs64);
>> @@ -75,15 +79,18 @@ CHECK_SIZE_AND_OFFSET(io_event, res);
>>   CHECK_SIZE_AND_OFFSET(io_event, res2);
>>
>>   #if !SANITIZER_ANDROID
>> +#if LINUX_VERSION_CODE >= 132640
>>   COMPILER_CHECK(sizeof(struct __sanitizer_perf_event_attr) <=
>>                  sizeof(struct perf_event_attr));
>>   CHECK_SIZE_AND_OFFSET(perf_event_attr, type);
>>   CHECK_SIZE_AND_OFFSET(perf_event_attr, size);
>>   #endif
>> +#endif
Couldn't this be done with a test as well.  Given header files and the 
ability to run the compiler, it should be fairly easy to test for this, 
even in cross environments.

>>
>>   COMPILER_CHECK(iocb_cmd_pread == IOCB_CMD_PREAD);
>>   COMPILER_CHECK(iocb_cmd_pwrite == IOCB_CMD_PWRITE);
>> -#if !SANITIZER_ANDROID
>> +#if !SANITIZER_ANDROID && LINUX_VERSION_CODE >= 132627
>> +// IOCB_CMD_PREADV/PWRITEV has been added in 2.6.19
>>   COMPILER_CHECK(iocb_cmd_preadv == IOCB_CMD_PREADV);
>>   COMPILER_CHECK(iocb_cmd_pwritev == IOCB_CMD_PWRITEV);
>>   #endif
Also trivial to do with autoconf.

[ ... ]

But more generally, I'd look real closely at anything including linux/ 
headers directly and see if it can be reasonably avoided.    The 
ultimate result will actually be easier maintenance upstream over the 
long term.

jeff
diff mbox

Patch

--- sanitizer_platform_limits_linux.cc.jj	2013-12-02 15:27:58.000000000 -0500
+++ sanitizer_platform_limits_linux.cc	2013-12-02 17:06:19.000000000 -0500
@@ -51,8 +51,12 @@ 
 #endif
 
 #if !SANITIZER_ANDROID
+#include <linux/version.h>
+// <linux/perf_event.h> has been added in 2.6.32
+#if LINUX_VERSION_CODE >= 132640
 #include <linux/perf_event.h>
 #endif
+#endif
 
 namespace __sanitizer {
   unsigned struct_statfs64_sz = sizeof(struct statfs64);
@@ -75,15 +79,18 @@  CHECK_SIZE_AND_OFFSET(io_event, res);
 CHECK_SIZE_AND_OFFSET(io_event, res2);
 
 #if !SANITIZER_ANDROID
+#if LINUX_VERSION_CODE >= 132640
 COMPILER_CHECK(sizeof(struct __sanitizer_perf_event_attr) <=
                sizeof(struct perf_event_attr));
 CHECK_SIZE_AND_OFFSET(perf_event_attr, type);
 CHECK_SIZE_AND_OFFSET(perf_event_attr, size);
 #endif
+#endif
 
 COMPILER_CHECK(iocb_cmd_pread == IOCB_CMD_PREAD);
 COMPILER_CHECK(iocb_cmd_pwrite == IOCB_CMD_PWRITE);
-#if !SANITIZER_ANDROID
+#if !SANITIZER_ANDROID && LINUX_VERSION_CODE >= 132627
+// IOCB_CMD_PREADV/PWRITEV has been added in 2.6.19
 COMPILER_CHECK(iocb_cmd_preadv == IOCB_CMD_PREADV);
 COMPILER_CHECK(iocb_cmd_pwritev == IOCB_CMD_PWRITEV);
 #endif
--- sanitizer_platform_limits_posix.cc.jj	2013-12-02 15:27:58.000000000 -0500
+++ sanitizer_platform_limits_posix.cc	2013-12-02 17:11:00.000000000 -0500
@@ -82,12 +82,16 @@ 
 #include <sys/timex.h>
 #include <sys/user.h>
 #include <sys/ustat.h>
+#include <linux/version.h>
 #include <linux/cyclades.h>
 #include <linux/if_eql.h>
 #include <linux/if_plip.h>
 #include <linux/lp.h>
 #include <linux/mroute.h>
+// <linux/mroute6.h> has been added in 2.6.26
+#if LINUX_VERSION_CODE >= 132634
 #include <linux/mroute6.h>
+#endif
 #include <linux/scc.h>
 #include <linux/serial.h>
 #include <sys/msg.h>