From owner-freebsd-current@freebsd.org Wed Jul 25 21:10:13 2018 Return-Path: Delivered-To: freebsd-current@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id CB0241054683 for ; Wed, 25 Jul 2018 21:10:13 +0000 (UTC) (envelope-from marklmi@yahoo.com) Received: from sonic307-9.consmr.mail.gq1.yahoo.com (sonic307-9.consmr.mail.gq1.yahoo.com [98.137.64.33]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 367F98E8FD for ; Wed, 25 Jul 2018 21:10:13 +0000 (UTC) (envelope-from marklmi@yahoo.com) X-YMail-OSG: xREWIf8VM1lt31kfGzgwYYLFDSbNIcPUSC14uD0F_KLdCYgSz.o34a7V0R52SdD 94BtDAihPRKGVB3.MTD2m2nfr0rRePoEkzlyrtE.maKZDOUS5GXlyjKBYysGYx9AQSZRAMHQ0AK1 t.idog589KMVTIzxvJgbVDk3L.mV.QmhC4LPWotMteXycjLA21g5yMVuyWsLzBrVVy5TreiTinBB dHI_oxqPBC55v_IDm5hkcWZ4__.3Q2HPRJMoYYv0OrwFSLszddfpp2uDUGMiSBQxorqx3b7PAgik lR8FW3qZkfwAGYsX_rnbP8_dXFAXvLb6ZTnMh4TbLCq0wkw4cxoXJ3_owDtzp3nIlP1AgiOkRohP fnVxWQNvFhQ4s0hEsg1NdqnQac_wLptRBt0HBIi9SkLeT9dSsNth.SH8_bumUaUw8diZUcS8XCdB 81R8VCQKVNR45ujJbhtLq2mxjAG.s957zWSZSzSFCtLwOTpbptwAY1Cf8_bo40EHMSwSwQjedpOP ZjLy.mGofsiWjCB6v6ZPv4v4LuP_KdthixQXCIqHAqZgeM4rFaj8o6g0q1sE90gCD_IFLofC6FeE ab0cfF8u3F0e9MndA3A4dwZCp3A0yex0CcYjJ2HwUeGUWZ7YBDksAvoNoc2dRM8UzREmXFfeaeZm 0iZIVjZnR1qzg2.dsn_tB1fWSil6itzBQVV3I5.F0rKKmf5rCnEMfs8gxOWEpjsG7HtvcYh9ZeJ_ PjVr5ncRYdn6pmRRiuORPC.Uld6frUckbauouCBznZfnR4Swcc16wD.WTD_3yu_tVn_rLmNp5wSI NnAWisLGG_KsadEhUqa797pTmIyzZl8Bc0JQiOCvOyPvWTMunR_rZatHXztt7BhQlddTpsnNYFoY D5i5xGFJLmPYmAd7941mz76ae7ZTRJ9qLlTkdPE.F_l_PhTsB3UHTqHheX1NQtRsGMZQai4sXXB8 pewH8JSLN8lG6rqTck38dugPSpkU_vc6Ezg8nBVbXe1UJpDm7dU0_b0W_oouePhlFJf96vfYuYFa hCNi1rZGcebk7nNKOGg-- Received: from sonic.gate.mail.ne1.yahoo.com by sonic307.consmr.mail.gq1.yahoo.com with HTTP; Wed, 25 Jul 2018 21:10:06 +0000 Received: from ip70-189-131-151.lv.lv.cox.net (EHLO [192.168.0.105]) ([70.189.131.151]) by smtp423.mail.gq1.yahoo.com (Oath Hermes SMTP Server) with ESMTPA ID b3e6d7ef3467e9040aa33384097272b6; Wed, 25 Jul 2018 21:10:02 +0000 (UTC) Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 11.5 \(3445.9.1\)) Subject: Re: head -r336568 and -r336570 appears to have made ci.freebsg.org's FreeBSD-head-amd64-gcc fail either than it had been (error: operand type 'struct *' is incompatible with argument 1 of '__atomic_fetch_add') From: Mark Millard In-Reply-To: <788B1EE7-EFC9-4AD4-9FD1-9876D0121189@yahoo.com> Date: Wed, 25 Jul 2018 14:10:00 -0700 Cc: Konstantin Belousov , FreeBSD Current Content-Transfer-Encoding: quoted-printable Message-Id: <9D40F38E-F1DC-4A3F-8792-09AD30D8802B@yahoo.com> References: <95fdbf29-6c11-77a6-27a3-2d0dc30f1668@FreeBSD.org> <788B1EE7-EFC9-4AD4-9FD1-9876D0121189@yahoo.com> To: John Baldwin X-Mailer: Apple Mail (2.3445.9.1) X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.27 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Jul 2018 21:10:14 -0000 On 2018-Jul-25, at 10:09 AM, Mark Millard wrote: > On 2018-Jul-25, at 8:39 AM, John Baldwin wrote: >=20 >> On 7/24/18 11:39 PM, Mark Millard wrote: >>> On 2018-Jul-24, at 10:32 PM, Mark Millard = wrote: >>>=20 >>>> https://ci.freebsd.org/job/FreeBSD-head-amd64-gcc/6597/consoleText >>>> (head -r336573 after the prior 6596's -r336565 ): >>>>=20 >>>> --- all_subdir_lib/ofed --- >>>> In file included from = /workspace/src/contrib/ofed/librdmacm/cma.h:43:0, >>>> from /workspace/src/contrib/ofed/librdmacm/acm.c:42: >>>> /workspace/src/contrib/ofed/librdmacm/cma.h: In function = 'fastlock_init': >>>> /workspace/src/contrib/ofed/librdmacm/cma.h:60:2: error: invalid = initializer >>>> atomic_store(&lock->cnt, 0); >>>> ^ >>>> In file included from = /workspace/src/contrib/ofed/librdmacm/acm.c:42:0: >>>> /workspace/src/contrib/ofed/librdmacm/cma.h: In function = 'fastlock_acquire': >>>> /workspace/src/contrib/ofed/librdmacm/cma.h:68:2: error: operand = type 'struct *' is incompatible with argument 1 of = '__atomic_fetch_add' >>>> if (atomic_fetch_add(&lock->cnt, 1) > 0) >>>> ^~ >>>> /workspace/src/contrib/ofed/librdmacm/cma.h: In function = 'fastlock_release': >>>> /workspace/src/contrib/ofed/librdmacm/cma.h:73:2: error: operand = type 'struct *' is incompatible with argument 1 of = '__atomic_fetch_sub' >>>> if (atomic_fetch_sub(&lock->cnt, 1) > 1) >>>> ^~ >>>> . . . >>>> --- all_subdir_lib/ofed --- >>>> *** [acm.o] Error code 1 >>>>=20 >>>>=20 >>>> https://ci.freebsd.org/job/FreeBSD-head-amd64-gcc/6621/consoleText = ( for >>>> -r336700 ) still shows this type of error. >>>=20 >>>=20 >>> [I should have a subject with "head -r336568 through -r336570 . . = .".] >>>=20 >>> =46rom what I can tell looking around having something like: >>>=20 >>> if (atomic_fetch_add(&lock->cnt, 1) > 0) >>>=20 >>> involve a __atomic_fetch_add indicates that: >>>=20 >>> = /usr/local/lib/gcc/x86_64-unknown-freebsd12.0/6.4.0/include/stdatomic.h >>>=20 >>> was in use instead of FreeBSD's stdatomic.h file. >>>=20 >>> If this is right, then the issue may be tied to head -r335782 >>> implicitly changing the order of the include file directory >>> searching for builds via the devel/*-gcc . >>>=20 >>> (I reverted -r335782 in my environment some time ago and have >>> not run into this problem in my context so far.) >>=20 >> C11 atomics should work fine with compiler-provided headers since = they >> are a part of the language (and the system stdatomic.h simply = attempts >> to mimic the compiler-provided header in case it is missing). >>=20 >> Simple standalone tests of _Atomic(int) with GCC don't trigger those >> failures when using its stdatomic.h, so there is probably something = else >> going on with kernel includes being used while building the library, >> etc. The last time we had this issue with stdarg.h it was because a >> header shared between the kernel and userland always used = '' >> which is correct for the kernel but not for userland. >=20 > I did misread the headers. FreeBSD has the likes of: >=20 > #if defined(__CLANG_ATOMICS) > . . . > #define atomic_fetch_add_explicit(object, operand, order) = \ > __c11_atomic_fetch_add(object, operand, order) > . . . > #elif defined(__GNUC_ATOMICS) > . . . > #define atomic_fetch_add_explicit(object, operand, order) = \ > __atomic_fetch_add(&(object)->__val, operand, order) > . . . > #endif > . . . > #define atomic_fetch_add(object, operand) = \ > atomic_fetch_add_explicit(object, operand, memory_order_seq_cst) >=20 > so __atomic_fetch_add would occur. >=20 > But so far I do not see the problem with -r335782 reverted. I last = built > -r336693 last night via devel/amd64-gcc (via xtoolchain). >=20 > =46rom what I can tell FreeBSD defines: >=20 > #if !defined(__CLANG_ATOMICS) > #define _Atomic(T) struct { volatile T = __val; } > #endif >=20 > and that struct is being used in &(object)->__val is what the > error reports are about. So that would be, for example, >=20 > &(&lock->cnt)->__val >=20 > This would appear to suggest that __val itself had a type meeting: >=20 > operand type struct >=20 > for T in _Atomic(T) . >=20 > (This is independent of just what the issue traces back to: just > the net result on ci.freebsd.org . No claim that you are right > or wrong here. I'll not be looking any more until this afternoon > or night.) Going in a somewhat different direction . . . Looking around I found https://bugs.llvm.org/show_bug.cgi?id=3D26462 which is titled: 26462 =E2=80=93 GCC/clang C11 _Atomic incompatibility It appears that the normal source of platform ABI definitions are not explicit/detailed in the area and allow for incompatibilities in this area. clang and gcc made differing choices absent being constrained to match. An example (a powerpc64 context was indicated): struct A16 { char val[16]; };=20 _Atomic struct A16 a16;=20 // GCC: _Static_assert(_Alignof(a16) =3D=3D 16, "");=20 // Clang: _Static_assert(_Alignof(a16) =3D=3D 1, "");=20 Non-power-of-2 is a general problem (not a powerpc64 context from what I can tell): struct A3 { char val[3]; }; _Atomic struct A3 a3; // GCC: _Static_assert(sizeof(a3) =3D=3D 3, ""); _Static_assert(_Alignof(a3) =3D=3D 1, ""); // Clang: _Static_assert(sizeof(a3) =3D=3D 4, ""); _Static_assert(_Alignof(a3) =3D=3D 4, ""); Comment 6 (by John McCall) is relevant: QUOTE Anyway, while I prefer the Clang rule, the GCC rule is defensible, as = are any number of other rules. The important point, however, is that = having this discussion is not the right approach to solving this = problem. The layout of _Atomic(T) is ABI. ABI rules are not generally = determined by compiler implementors making things up as they go along, = or at least they shouldn't be. The Darwin ABI for _Atomic is the rule = implemented in Clang, which we actually did think about carefully when = we adopted it. Other platforms need to make their own call, and it = probably shouldn't just be "whatever's implemented in GCC", especially = on other platforms where GCC is not the system compiler. END QUOTE (I do nto claim to have proivided all the material that should be read in https://bugs.llvm.org/show_bug.cgi?id=3D26462 .) It may be that FreeBSD needs to be the source of the ABI definitions involved if clang and gcc freeBSD builds are to be interoperable in this area. But this could mean avoiding builtins? If any of this is inlined and so not behind a more stable interface, it looks like clang and gcc can not be mixed for the same instances of various _Atomic possibilities. =3D=3D=3D Mark Millard marklmi at yahoo.com ( dsl-only.net went away in early 2018-Mar)