From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 3A13B385E83A; Mon, 8 Mar 2021 12:47:09 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3A13B385E83A From: "nathan at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/99456] [11 regression] ABI breakage with some static initialization Date: Mon, 08 Mar 2021 12:47:09 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c++ X-Bugzilla-Version: 11.0 X-Bugzilla-Keywords: ABI, missed-optimization X-Bugzilla-Severity: normal X-Bugzilla-Who: nathan at gcc dot gnu.org X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Resolution: X-Bugzilla-Priority: P1 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: 11.0 X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: gcc-bugs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-bugs mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 08 Mar 2021 12:47:09 -0000 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D99456 --- Comment #4 from Nathan Sidwell --- It's an ABI issue, because all compilers must agree on which parts of an in= line object are dynamically initialized. (gcc-11 does not agree with gcc-10). consider: inline Type Var =3D Expr; That'll be emitted as comdat in every TU that needs it. Assume some of tho= se TUs generate a static init and others generate a dynamic init. Let's say i= t's a dynamic one that gets into the executable, but one of the static TUs acce= sses Var before that dyn init has run. Boom, zero-initialized entity observed. Or, let's say a static one wins, but then a dynmic initializer runs concurrently to a (static TU's) access. Oops, we could observe (weird) par= tial writes. (this would require Var to be a function-scope static because glob= al inits run in a single-thread environment, and it's less likelu to be a problem). In case it's not clear, this example shows both the above happening, and po= or code generation with (a) unused inline vars emitting code and (b) guard variables for inline vars with no dynamic init. Hope that helps.=