From nobody Mon Apr 25 13:01:48 2022 X-Original-To: freebsd-hackers@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4DE8E1A921E5 for ; Mon, 25 Apr 2022 13:02:07 +0000 (UTC) (envelope-from jbo@insane.engineer) Received: from mail-4317.proton.ch (mail-4317.proton.ch [185.70.43.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "protonmail.com", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Kn4sn5cGjz4jS3 for ; Mon, 25 Apr 2022 13:02:05 +0000 (UTC) (envelope-from jbo@insane.engineer) Date: Mon, 25 Apr 2022 13:01:48 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=insane.engineer; s=protonmail2; t=1650891716; bh=8yHIvPCk4E8bNztVuxYf5l4r6g/NfvdbS5/sBnW4oqE=; h=Date:To:From:Cc:Reply-To:Subject:Message-ID:In-Reply-To: References:Feedback-ID:From:To:Cc:Date:Subject:Reply-To: Feedback-ID:Message-ID; b=X3QTl2MXcFiFTksjg1GBtEyIHvw0p5DGc0zK+AgqkrZ/386TTmLcmAMzVT0BFrwMq /8yWKstJq5MYVgdpNHrTChKARuiGlYOe+rU5/t6jQCFILqq6smtgiLfT5Gxg3+wDEp VyhQ5Hv+CnWLpoAoZinHayOE3ZCxz6ihDkEbLHNScZcWOS1AbDr4caCIU/wvZZiDCO whTp1IEK15nD1V7Qpef16tY0UQv/C/aoT8Oi1o8nX21av3hlOrABxKU4BNLesbGrCY SkXM15OfR5chJi6SNnXqHkFOcbSh9a18HG8be0mjadIRT64JmIfZruC6TdnLgz3AdM TDq41Oz+QuomA== To: FreeBSD Hackers From: jbo@insane.engineer Cc: Mark Millard , joerg@bec.de Reply-To: jbo@insane.engineer Subject: Re: llvm & RTTI over shared libraries Message-ID: In-Reply-To: <3141FACD-5154-40CC-91CC-0A6C55B7220B@yahoo.com> References: <3141FACD-5154-40CC-91CC-0A6C55B7220B@yahoo.com> Feedback-ID: 40997969:user:proton List-Id: Technical discussions relating to FreeBSD List-Archive: https://lists.freebsd.org/archives/freebsd-hackers List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-freebsd-hackers@freebsd.org MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_6fZ6VCZszW1kBu5na9SCxToUWtvKMDShcGjVMVxszi0" X-Rspamd-Queue-Id: 4Kn4sn5cGjz4jS3 X-Spamd-Bar: --- Authentication-Results: mx1.freebsd.org; dkim=pass header.d=insane.engineer header.s=protonmail2 header.b=X3QTl2MX; dmarc=pass (policy=none) header.from=insane.engineer; spf=pass (mx1.freebsd.org: domain of jbo@insane.engineer designates 185.70.43.17 as permitted sender) smtp.mailfrom=jbo@insane.engineer X-Spamd-Result: default: False [-3.55 / 15.00]; HAS_REPLYTO(0.00)[jbo@insane.engineer]; ARC_NA(0.00)[]; R_DKIM_ALLOW(-0.20)[insane.engineer:s=protonmail2]; REPLYTO_EQ_FROM(0.00)[]; RCPT_COUNT_THREE(0.00)[3]; TO_DN_SOME(0.00)[]; R_SPF_ALLOW(-0.20)[+ip4:185.70.43.0/24]; NEURAL_HAM_LONG(-1.00)[-1.000]; MIME_GOOD(-0.10)[multipart/mixed,text/plain]; HAS_ATTACHMENT(0.00)[]; HAS_PHPMAILER_SIG(0.00)[]; TO_MATCH_ENVRCPT_SOME(0.00)[]; DKIM_TRACE(0.00)[insane.engineer:+]; DMARC_POLICY_ALLOW(-0.50)[insane.engineer,none]; FROM_NO_DN(0.00)[]; NEURAL_HAM_SHORT(-0.55)[-0.545]; NEURAL_HAM_MEDIUM(-1.00)[-1.000]; MLMMJ_DEST(0.00)[freebsd-hackers]; RCVD_COUNT_ZERO(0.00)[0]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+,1:+,2:~]; ASN(0.00)[asn:62371, ipnet:185.70.43.0/24, country:CH]; FREEMAIL_CC(0.00)[yahoo.com,bec.de]; MID_RHS_MATCH_FROM(0.00)[] X-ThisMailContainsUnwantedMimeParts: N This is a multi-part message in MIME format. --b1_6fZ6VCZszW1kBu5na9SCxToUWtvKMDShcGjVMVxszi0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello guys, Thank you for your replies. I've created a small minimal test case which reproduces the problem (attach= ed). The key points here are: - CMake based project consisting of: - The header-only interface for the plugin and the types (test-interfac= e). - The main executable that loads the plugin (test-core). - A plugin implementation (plugin-one). - Compiles out-of-the-box on FreeBSD 13/stable with both lang/gcc11 and d= evel/llvm14. - It uses the exact mechanism I use to load the plugins in my actual appl= ication. stdout output when compiling with lang/gcc11: t is type_int t is type_string done. stdout output when compiling with lang/llvm14: could not cast t could not cast t done. Unfortunately, I could not yet figure out which compiler/linker flags llvm = requires to implement the same behavior as GCC does. I understand that even= tually I'd be better of rewriting the necessary parts to eliminate that pro= blem but this is not a quick job. Could somebody lend me a hand in figuring out which compiler/linker flags a= re necessary to get this to work with llvm? Best regards, ~ Joel ------- Original Message ------- On Saturday, April 23rd, 2022 at 22:42, Mark Millard wr= ote: > > > > On 2022-Apr-23, at 15:33, Mark Millard marklmi@yahoo.com wrote: > > > =E2=80=A2 Joerg Sonnenberger wrote on > > =E2=80=A2 Date: Sat, 23 Apr 2022 21:33:04 UTC : > > > > > Am Tue, Apr 19, 2022 at 11:03:33PM -0700 schrieb Mark Millard: > > > > > > > Joerg Sonnenberger wrote on > > > > Tue, 19 Apr 2022 21:49:44 UTC : > > > > > > > > > Am Thu, Apr 14, 2022 at 04:36:24PM +0000 schrieb jbo@insane.engin= eer: > > > > > > > > > > > > After some research I seem to understand that the way that RT= TI is handled over shared library boundaries is different between GCC and L= LVM. > > > > > > > > > > I think you are running into the old problem that GCC thinks comp= aring > > > > > types by name makes sense where as everyone else compares types b= y type > > > > > pointer identity. > > > > > > > > Seems out of date for the GCC information . . . > > > > > > > > https://gcc.gnu.org/faq.html#dso reports: > > > > > > > > QUOTE > > > > The new C++ ABI in the GCC 3.0 series uses address comparisons, rat= her than string compares, to determine type equality. > > > > END QUOTE > > > > > > Compare that with the implementation in . > > > > Looking at /usr/local/lib/gcc11/include/c++/typeinfo I see: > > configurable, in part based on the intent for possible > > handling RTLD_LOCAL (when weak symbol are available). I'll > > quote the comments for reference . . . > > > > // Determine whether typeinfo names for the same type are merged (in wh= ich > > // case comparison can just compare pointers) or not (in which case str= ings > > // must be compared), and whether comparison is to be implemented inlin= e or > > // not. We used to do inline pointer comparison by default if weak symb= ols > > // are available, but even with weak symbols sometimes names are not me= rged > > // when objects are loaded with RTLD_LOCAL, so now we always use strcmp= by > > // default. For ABI compatibility, we do the strcmp inline if weak symb= ols > > // are available, and out-of-line if not. Out-of-line pointer compariso= n > > // is used where the object files are to be portable to multiple system= s, > > // some of which may not be able to use pointer comparison, but the > > // particular system for which libstdc++ is being built can use pointer > > // comparison; in particular for most ARM EABI systems, where the ABI > > // specifies out-of-line comparison. The compiler's target configuratio= n > > // can override the defaults by defining __GXX_TYPEINFO_EQUALITY_INLINE= to > > // 1 or 0 to indicate whether or not comparison is inline, and > > // __GXX_MERGED_TYPEINFO_NAMES to 1 or 0 to indicate whether or not poi= nter > > // comparison can be used. > > > > So, to some extent, the details are choices in the likes of lang/gcc11 > > instead of an always-the-same rule for handling. Below gives some > > more idea of what __GXX_TYPEINFO_EQUALITY_INLINE and > > __GXX_MERGED_TYPEINFO_NAMES do for configuration. Is there a combinatio= n > > that matches FreeBSD's system clang++ related behavior? If yes, should > > the likes of lang/gcc11 be using that combination? > > > I should have quoted a little bit more that describes the > defaults used: > > #ifndef __GXX_MERGED_TYPEINFO_NAMES > // By default, typeinfo names are not merged. > #define __GXX_MERGED_TYPEINFO_NAMES 0 > #endif > > // By default follow the old inline rules to avoid ABI changes. > #ifndef __GXX_TYPEINFO_EQUALITY_INLINE > #if !GXX_WEAK > #define __GXX_TYPEINFO_EQUALITY_INLINE 0 > #else > #define __GXX_TYPEINFO_EQUALITY_INLINE 1 > #endif > #endif > > . . . > > > #if !__GXX_TYPEINFO_EQUALITY_INLINE > > // In old abi, or when weak symbols are not supported, there can > > // be multiple instances of a type_info object for one > > // type. Uniqueness must use the _name value, not object address. > > . . . > > #else > > #if !__GXX_MERGED_TYPEINFO_NAMES > > . . . > > // Even with the new abi, on systems that support dlopen > > // we can run into cases where type_info names aren't merged, > > // so we still need to do string comparison. > > . . . > > #else > > // On some targets we can rely on type_info's NTBS being unique, > > // and therefore address comparisons are sufficient. > > . . . > > #endif > > #endif > > > > =3D=3D=3D > Mark Millard > marklmi at yahoo.com --b1_6fZ6VCZszW1kBu5na9SCxToUWtvKMDShcGjVMVxszi0 Content-Type: application/zip; name=clang_test.zip Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=clang_test.zip UEsDBAoAAAAAAMClk1QAAAAAAAAAAAAAAAAQABwAY2xhbmdfdGVzdF9kaXN0L1VUCQADiB9fYuMd X2J1eAsAAQTpAwAABOkDAABQSwMEFAAAAAgA4KSTVIZ8FyuFAAAAsAAAAB4AHABjbGFuZ190ZXN0 X2Rpc3QvQ01ha2VMaXN0cy50eHRVVAkAA+MdX2LjHV9idXgLAAEE6QMAAATpAwAAbYy9DsIgFEZ3 nqIjLA71CUzLQIzQ2Mb1BuHaoAUqP4NvL7su33DOyWe8fiF4F5yvHhK+q0to6Y1fZ6Fkdzz0PSN7 ik80hZpNhxUK5sIIyVjocDmdOUxqFkurQciRT7yNXGBQI++UbKG2FnK923ZsSkwfamJC9otdKJge 2vxz+1ZXFzIjX1BLAwQKAAAAAADgpJNUAAAAAAAAAAAAAAAAGAAcAGNsYW5nX3Rlc3RfZGlzdC9w bHVnaW5zL1VUCQAD4x1fYuMdX2J1eAsAAQTpAwAABOkDAABQSwMECgAAAAAA4KSTVKSNxmYdAAAA HQAAACYAHABjbGFuZ190ZXN0X2Rpc3QvcGx1Z2lucy9DTWFrZUxpc3RzLnR4dFVUCQAD4x1fYuMd X2J1eAsAAQTpAwAABOkDAABhZGRfc3ViZGlyZWN0b3J5KHBsdWdpbl9vbmUpClBLAwQKAAAAAADg pJNUAAAAAAAAAAAAAAAAIwAcAGNsYW5nX3Rlc3RfZGlzdC9wbHVnaW5zL3BsdWdpbl9vbmUvVVQJ AAPjHV9i4x1fYnV4CwABBOkDAAAE6QMAAFBLAwQUAAAACADgpJNUef00AmkBAACPAwAALQAcAGNs YW5nX3Rlc3RfZGlzdC9wbHVnaW5zL3BsdWdpbl9vbmUvcGx1Z2luLmNwcFVUCQAD4x1fYuMdX2J1 eAsAAQTpAwAABOkDAACVUttuwjAMfc9XeEWa2j3Q98J44RP2AVVIXIiWJVHjsCHUfftCsnIRjG1W VSX28fFxeybKCB0kQjGd1vFRhrDvuMDa6bBWZrpxrmBsMsLmynrqkb8tGBOaew8ZBw2DGC6stBJw ZGmaXGZ7lkvfsJQsK3gGiR0PmmYp/3ks2C32vYoDzxAJsrVKgrStp9B1pbDGE3iSTeM3vEfZOurn Z+Np57BdcY+LR6AKMn4kT4T79D5EXcMLN4p2IDYoXo951UH5EJtPyEOkocIGgvkcCgLlwQSt4/zi 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 VEmMUh/6W7nAC1BLAwQUAAAACADgpJNUivbHKXsAAAChAAAAKAAcAGNsYW5nX3Rlc3RfZGlzdC9p bnRlcmZhY2UvQ01ha2VMaXN0cy50eHRVVAkAA+MdX2LjHV9idXgLAAEE6QMAAATpAwAAK04t0Qhx DHJ3DVEoSS0u0c3MK0ktSktMTtXk4kpMSYnPyUwqSiyq1FCphqiqVfD0C3ENcnN0dlXw9A3wDwpx dVFw9/F3cvQB6ihJLEpPLYkvzi8tSk4t1uBSAAK4TjAPrhvMA4GCnNL0zDy9jIICuFBJZUFqMVhE kwsAUEsDBBQAAAAIAOCkk1SU7eLpvwAAAD0BAAAkABwAY2xhbmdfdGVzdF9kaXN0L2ludGVyZmFj ZS9wbHVnaW4uaHBwVVQJAAPjHV9i4x1fYnV4CwABBOkDAAAE6QMAAG2PwQrCMAyG732K4EA2D+J5 br7KiG06C1tb2lQYMp/dzskQNIcQki9//hQ+YD8iOCtJiMJYOSRFsOPJUzzevN99dZuRRhemixAW R4oeJYGxTEHnSjyEgByRQ5IMfki9se/O452XWFQV6c/wADIQMnVcVucf5u6MAkVZzk2Z+KxkcCPv JnDCAZ7rrKygzQsa08B/qFXPdZGT1qV0NnL2quo63jCQ6jyHZnumrhcb3RUjXfbAFax8C6fV6JwP zOIFUEsBAh4DCgAAAAAAwKWTVAAAAAAAAAAAAAAAABAAGAAAAAAAAAAQAO1BAAAAAGNsYW5nX3Rl c3RfZGlzdC9VVAUAA4gfX2J1eAsAAQTpAwAABOkDAABQSwECHgMUAAAACADgpJNUhnwXK4UAAACw AAAAHgAYAAAAAAABAAAApIFKAAAAY2xhbmdfdGVzdF9kaXN0L0NNYWtlTGlzdHMudHh0VVQFAAPj HV9idXgLAAEE6QMAAATpAwAAUEsBAh4DCgAAAAAA4KSTVAAAAAAAAAAAAAAAABgAGAAAAAAAAAAQ AO1BJwEAAGNsYW5nX3Rlc3RfZGlzdC9wbHVnaW5zL1VUBQAD4x1fYnV4CwABBOkDAAAE6QMAAFBL AQIeAwoAAAAAAOCkk1SkjcZmHQAAAB0AAAAmABgAAAAAAAEAAACkgXkBAABjbGFuZ190ZXN0X2Rp c3QvcGx1Z2lucy9DTWFrZUxpc3RzLnR4dFVUBQAD4x1fYnV4CwABBOkDAAAE6QMAAFBLAQIeAwoA AAAAAOCkk1QAAAAAAAAAAAAAAAAjABgAAAAAAAAAEADtQfYBAABjbGFuZ190ZXN0X2Rpc3QvcGx1 Z2lucy9wbHVnaW5fb25lL1VUBQAD4x1fYnV4CwABBOkDAAAE6QMAAFBLAQIeAxQAAAAIAOCkk1R5 /TQCaQEAAI8DAAAtABgAAAAAAAEAAACkgVMCAABjbGFuZ190ZXN0X2Rpc3QvcGx1Z2lucy9wbHVn aW5fb25lL3BsdWdpbi5jcHBVVAUAA+MdX2J1eAsAAQTpAwAABOkDAABQSwECHgMUAAAACADgpJNU ohptd3oAAAC+AAAAMQAYAAAAAAABAAAApIEjBAAAY2xhbmdfdGVzdF9kaXN0L3BsdWdpbnMvcGx1 Z2luX29uZS9DTWFrZUxpc3RzLnR4dFVUBQAD4x1fYnV4CwABBOkDAAAE6QMAAFBLAQIeAwoAAAAA AOCkk1QAAAAAAAAAAAAAAAAVABgAAAAAAAAAEADtQQgFAABjbGFuZ190ZXN0X2Rpc3QvY29yZS9V VAUAA+MdX2J1eAsAAQTpAwAABOkDAABQSwECHgMUAAAACADgpJNUgiUUWv4BAADMBAAAHQAYAAAA AAABAAAApIFXBQAAY2xhbmdfdGVzdF9kaXN0L2NvcmUvbWFpbi5jcHBVVAUAA+MdX2J1eAsAAQTp AwAABOkDAABQSwECHgMUAAAACADgpJNUZF3xYgAEAAAiDAAAIAAYAAAAAAABAAAApIGsBwAAY2xh bmdfdGVzdF9kaXN0L2NvcmUvZGxjbGFzcy5ocHBVVAUAA+MdX2J1eAsAAQTpAwAABOkDAABQSwEC HgMUAAAACADgpJNU9jicX64AAABTAQAAIwAYAAAAAAABAAAApIEGDAAAY2xhbmdfdGVzdF9kaXN0 L2NvcmUvQ01ha2VMaXN0cy50eHRVVAUAA+MdX2J1eAsAAQTpAwAABOkDAABQSwECHgMKAAAAAADg pJNUAAAAAAAAAAAAAAAAGgAYAAAAAAAAABAA7UERDQAAY2xhbmdfdGVzdF9kaXN0L2ludGVyZmFj ZS9VVAUAA+MdX2J1eAsAAQTpAwAABOkDAABQSwECHgMUAAAACADgpJNULk3iLogAAAAgAQAAIwAY AAAAAAABAAAApIFlDQAAY2xhbmdfdGVzdF9kaXN0L2ludGVyZmFjZS90eXBlcy5ocHBVVAUAA+Md X2J1eAsAAQTpAwAABOkDAABQSwECHgMUAAAACADgpJNUivbHKXsAAAChAAAAKAAYAAAAAAABAAAA pIFKDgAAY2xhbmdfdGVzdF9kaXN0L2ludGVyZmFjZS9DTWFrZUxpc3RzLnR4dFVUBQAD4x1fYnV4 CwABBOkDAAAE6QMAAFBLAQIeAxQAAAAIAOCkk1SU7eLpvwAAAD0BAAAkABgAAAAAAAEAAACkgScP AABjbGFuZ190ZXN0X2Rpc3QvaW50ZXJmYWNlL3BsdWdpbi5ocHBVVAUAA+MdX2J1eAsAAQTpAwAA BOkDAABQSwUGAAAAAA8ADwAFBgAARBAAAAAA --b1_6fZ6VCZszW1kBu5na9SCxToUWtvKMDShcGjVMVxszi0--