delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2019/11/14/13:23:57

X-Recipient: archive-cygwin AT delorie DOT com
DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id
:list-unsubscribe:list-subscribe:list-archive:list-post
:list-help:sender:date:from:to:subject:message-id:mime-version
:content-type; q=dns; s=default; b=CySxoAfTQJksaw5V+ccpbK5dUMjLr
5qWXkOBl4aCoga4/50+Ety+CU1xVJVyRlYyVQCnfWXTQ/nunUbwBoSquEeEe9Yrp
TArHPROCOblbWHuhtFPB5db75NJ+R0T4T7iTbp1W9VsGKRVn3H/aWwmgAWeuMhXw
kWywhktbkpWK18=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id
:list-unsubscribe:list-subscribe:list-archive:list-post
:list-help:sender:date:from:to:subject:message-id:mime-version
:content-type; s=default; bh=2x8JITMlOCkKjvXImL4ZjCB6ibw=; b=oru
R53U/O2lmUIXO7G1meYUGF7QT2CdwoxvQR+08Nv5unCRzRSDYsdZJ2o5Q6KJmVNL
q96fBZV7/KMyet/NbpeqOOekUF75fi8W/Fz7w97O0dJHQCZ/1yIad57HUTj79rkD
BBHedZSOQd2+6kIpU634SqBIxHU1StObpAvP1Kjc=
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Authentication-Results: sourceware.org; auth=none
X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.1 spammy=one, th, one!, H*c:HHHH
X-HELO: ppsw-43.csi.cam.ac.uk
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=cam.ac.uk; s=20180806.ppsw; h=Content-Type:MIME-Version:Message-ID:Subject:To:From:Date :Sender:Reply-To:Cc:Content-Transfer-Encoding:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=fcorSGnjPSKeTfw4nPWTZMfBoKjN4cO2vrjfAiH0ug0=; b=MaWOGwG4j/WChhv113aNlLqF4m eiCBgh6Qq+doncgZqjpP+Ei3b8GhLISU6aEqT4+n4UTct2lQX9kRVC0depJCjUDVc4+Cs60U6Hf5Y gnyxyFOjWUyx0AlRo9Ekze970kJT/XxX+OJYpzfde6++bC8dMrZUu08qFNvPbLBgyEGU=;
Date: Thu, 14 Nov 2019 18:23:00 +0000 (GMT Standard Time)
From: Arthur Norman <acn1 AT cam DOT ac DOT uk>
To: cygwin AT cygwin DOT com
Subject: linker fails with multiple definitions after inline thread_local var within class
Message-ID: <alpine.WNT.2.00.1911141816490.14912@panamint>
User-Agent: Alpine 2.00 (WNT 1167 2008-08-23)
MIME-Version: 1.0
X-IsSubscribed: yes

--426969-2287-1573755781=:14912
Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII

#! /bin/bash
# When I run this on Ubuntu-x86_64, Macintosh(clang) or a Raspberry pi
# the code links and when it runs it just prints 999 - which is the behaviour
# that I expect. On both Cygwin and using x86_64-w64-mingw32-g++  (and i686)
# I get a linker diagnostic of the form
# ./tltest.sh
# /usr/lib/gcc/x86_64-pc-cygwin/8.3.0/../../../../x86_64-pc-cygwin/bin/ld:
#   /tmp/cczVTcZ1.o:t2.cpp:(.text+0x86): multiple definition of
#   `TLS init function for Data::valref';
#   /tmp/ccyLQlRb.o:t1.cpp:(.text+0x4a): first defined here
# collect2: error: ld returned 1 exit status
#
# I believe that given the specification of C++17 "inline" variables this
# is incorrect, but there are better experts who may be able to explain
# otherwise.
#
# When people raise issues here I often see other asking "Why are you doing
# that?". This is a cut-down version of my real code where rather than
# storing a reference to the thread_local Record that I am interested in
# in a simple array (tvec) at a fixed offset (1) I store and retrieve a
# referece to it using TlsAlloc(), TlsGetValue and TlsSetValue - those being
# the Microsoft API for thread-local access, and for my purposes my
# measurements suggest that using them gives me useful performance gains
# over the emutls code that g++ creates on the relevant platforms.
# And I am then (trying to) build a header-only library (for which t.h is
# the surrogate here) which can be included from several other compilation
# units but by virtue of "inline variables" its private (including thread-
# local) date can be defined within that header file  so that the files that
# #include the header-only library do not need to contain anything beyond
# uses of it. To illustrate this I have two source files which each include
# t.h but the bad behaviour does not need any other code in the first one!
# The second just contains a tiny main program that inspects data from the
# library data.

# Have I misunderstood C++ and so am I doing something wrong or is this
# a g++/Windows bug?

cat <<XXX > t.h
#include <cstdint>

inline void *tvec[4];

class Record
{
public:
     int val = 999;
};

class Data_Ref
{   static inline thread_local Record val;
public:
     static Record* get()  // Get reference to Record via tvec[]
     {   return (Record*)tvec[1];
     }
     Data_Ref()            // Stash it in tvec[] for later use
     {   tvec[1] = (void *)&val;
     }
};

class Data
{   static inline thread_local Data_Ref valref;
public:
     static Record &get()
     {   return *valref.get(); // note that get() is static in Data_Ref
     }
};

XXX
cat <<XXX > t1.cpp
#include <iostream>
#include "t.h"  // First copy

XXX
cat <<XXX > t2.cpp
#include <iostream>
#include "t.h"  // Second copy

int main()
{   std::cout << Data::get().val << std::endl;
     return 0;
}
XXX

${1:-g++} -std=c++17 -I. t1.cpp t2.cpp -o t
./t

# end of test script
--426969-2287-1573755781=:14912
Content-Type: APPLICATION/octet-stream; name=tltest.sh
Content-Transfer-Encoding: BASE64
Content-ID: <alpine DOT WNT DOT 2 DOT 00 DOT 1911141823000 DOT 14912 AT panamint>
Content-Description: 
Content-Disposition: attachment; filename=tltest.sh

IyEgL2Jpbi9iYXNoCiMgV2hlbiBJIHJ1biB0aGlzIG9uIFVidW50dS14ODZf
NjQsIE1hY2ludG9zaChjbGFuZykgb3IgYSBSYXNwYmVycnkgcGkKIyB0aGUg
Y29kZSBsaW5rcyBhbmQgd2hlbiBpdCBydW5zIGl0IGp1c3QgcHJpbnRzIDk5
OSAtIHdoaWNoIGlzIHRoZSBiZWhhdmlvdXIKIyB0aGF0IEkgZXhwZWN0LiBP
biBib3RoIEN5Z3dpbiBhbmQgdXNpbmcgeDg2XzY0LXc2NC1taW5ndzMyLWcr
KyAgKGFuZCBpNjg2KQojIEkgZ2V0IGEgbGlua2VyIGRpYWdub3N0aWMgb2Yg
dGhlIGZvcm0KIyAuL3RsdGVzdC5zaAojIC91c3IvbGliL2djYy94ODZfNjQt
cGMtY3lnd2luLzguMy4wLy4uLy4uLy4uLy4uL3g4Nl82NC1wYy1jeWd3aW4v
YmluL2xkOgojICAgL3RtcC9jY3pWVGNaMS5vOnQyLmNwcDooLnRleHQrMHg4
Nik6IG11bHRpcGxlIGRlZmluaXRpb24gb2YKIyAgIGBUTFMgaW5pdCBmdW5j
dGlvbiBmb3IgRGF0YTo6dmFscmVmJzsKIyAgIC90bXAvY2N5TFFsUmIubzp0
MS5jcHA6KC50ZXh0KzB4NGEpOiBmaXJzdCBkZWZpbmVkIGhlcmUKIyBjb2xs
ZWN0MjogZXJyb3I6IGxkIHJldHVybmVkIDEgZXhpdCBzdGF0dXMKIwojIEkg
YmVsaWV2ZSB0aGF0IGdpdmVuIHRoZSBzcGVjaWZpY2F0aW9uIG9mIEMrKzE3
ICJpbmxpbmUiIHZhcmlhYmxlcyB0aGlzCiMgaXMgaW5jb3JyZWN0LCBidXQg
dGhlcmUgYXJlIGJldHRlciBleHBlcnRzIHdobyBtYXkgYmUgYWJsZSB0byBl
eHBsYWluCiMgb3RoZXJ3aXNlLgojCiMgV2hlbiBwZW9wbGUgcmFpc2UgaXNz
dWVzIGhlcmUgSSBvZnRlbiBzZWUgb3RoZXIgYXNraW5nICJXaHkgYXJlIHlv
dSBkb2luZwojIHRoYXQ/Ii4gVGhpcyBpcyBhIGN1dC1kb3duIHZlcnNpb24g
b2YgbXkgcmVhbCBjb2RlIHdoZXJlIHJhdGhlciB0aGFuCiMgc3RvcmluZyBh
IHJlZmVyZW5jZSB0byB0aGUgdGhyZWFkX2xvY2FsIFJlY29yZCB0aGF0IEkg
YW0gaW50ZXJlc3RlZCBpbgojIGluIGEgc2ltcGxlIGFycmF5ICh0dmVjKSBh
dCBhIGZpeGVkIG9mZnNldCAoMSkgSSBzdG9yZSBhbmQgcmV0cmlldmUgYQoj
IHJlZmVyZWNlIHRvIGl0IHVzaW5nIFRsc0FsbG9jKCksIFRsc0dldFZhbHVl
IGFuZCBUbHNTZXRWYWx1ZSAtIHRob3NlIGJlaW5nCiMgdGhlIE1pY3Jvc29m
dCBBUEkgZm9yIHRocmVhZC1sb2NhbCBhY2Nlc3MsIGFuZCBmb3IgbXkgcHVy
cG9zZXMgbXkKIyBtZWFzdXJlbWVudHMgc3VnZ2VzdCB0aGF0IHVzaW5nIHRo
ZW0gZ2l2ZXMgbWUgdXNlZnVsIHBlcmZvcm1hbmNlIGdhaW5zCiMgb3ZlciB0
aGUgZW11dGxzIGNvZGUgdGhhdCBnKysgY3JlYXRlcyBvbiB0aGUgcmVsZXZh
bnQgcGxhdGZvcm1zLgojIEFuZCBJIGFtIHRoZW4gKHRyeWluZyB0bykgYnVp
bGQgYSBoZWFkZXItb25seSBsaWJyYXJ5IChmb3Igd2hpY2ggdC5oIGlzCiMg
dGhlIHN1cnJvZ2F0ZSBoZXJlKSB3aGljaCBjYW4gYmUgaW5jbHVkZWQgZnJv
bSBzZXZlcmFsIG90aGVyIGNvbXBpbGF0aW9uCiMgdW5pdHMgYnV0IGJ5IHZp
cnR1ZSBvZiAiaW5saW5lIHZhcmlhYmxlcyIgaXRzIHByaXZhdGUgKGluY2x1
ZGluZyB0aHJlYWQtCiMgbG9jYWwpIGRhdGUgY2FuIGJlIGRlZmluZWQgd2l0
aGluIHRoYXQgaGVhZGVyIGZpbGUgIHNvIHRoYXQgdGhlIGZpbGVzIHRoYXQK
IyAjaW5jbHVkZSB0aGUgaGVhZGVyLW9ubHkgbGlicmFyeSBkbyBub3QgbmVl
ZCB0byBjb250YWluIGFueXRoaW5nIGJleW9uZAojIHVzZXMgb2YgaXQuIFRv
IGlsbHVzdHJhdGUgdGhpcyBJIGhhdmUgdHdvIHNvdXJjZSBmaWxlcyB3aGlj
aCBlYWNoIGluY2x1ZGUKIyB0LmggYnV0IHRoZSBiYWQgYmVoYXZpb3VyIGRv
ZXMgbm90IG5lZWQgYW55IG90aGVyIGNvZGUgaW4gdGhlIGZpcnN0IG9uZSEK
IyBUaGUgc2Vjb25kIGp1c3QgY29udGFpbnMgYSB0aW55IG1haW4gcHJvZ3Jh
bSB0aGF0IGluc3BlY3RzIGRhdGEgZnJvbSB0aGUKIyBsaWJyYXJ5IGRhdGEu
CgojIEhhdmUgSSBtaXN1bmRlcnN0b29kIEMrKyBhbmQgc28gYW0gSSBkb2lu
ZyBzb21ldGhpbmcgd3Jvbmcgb3IgaXMgdGhpcwojIGEgZysrL1dpbmRvd3Mg
YnVnPwoKY2F0IDw8WFhYID4gdC5oCiNpbmNsdWRlIDxjc3RkaW50PgoKaW5s
aW5lIHZvaWQgKnR2ZWNbNF07CgpjbGFzcyBSZWNvcmQKewpwdWJsaWM6CiAg
ICBpbnQgdmFsID0gOTk5Owp9OwoKY2xhc3MgRGF0YV9SZWYKeyAgIHN0YXRp
YyBpbmxpbmUgdGhyZWFkX2xvY2FsIFJlY29yZCB2YWw7CnB1YmxpYzoKICAg
IHN0YXRpYyBSZWNvcmQqIGdldCgpICAvLyBHZXQgcmVmZXJlbmNlIHRvIFJl
Y29yZCB2aWEgdHZlY1tdCiAgICB7ICAgcmV0dXJuIChSZWNvcmQqKXR2ZWNb
MV07CiAgICB9CiAgICBEYXRhX1JlZigpICAgICAgICAgICAgLy8gU3Rhc2gg
aXQgaW4gdHZlY1tdIGZvciBsYXRlciB1c2UKICAgIHsgICB0dmVjWzFdID0g
KHZvaWQgKikmdmFsOwogICAgfQp9OwoKY2xhc3MgRGF0YQp7ICAgc3RhdGlj
IGlubGluZSB0aHJlYWRfbG9jYWwgRGF0YV9SZWYgdmFscmVmOwpwdWJsaWM6
CiAgICBzdGF0aWMgUmVjb3JkICZnZXQoKQogICAgeyAgIHJldHVybiAqdmFs
cmVmLmdldCgpOyAvLyBub3RlIHRoYXQgZ2V0KCkgaXMgc3RhdGljIGluIERh
dGFfUmVmCiAgICB9Cn07CgpYWFgKY2F0IDw8WFhYID4gdDEuY3BwCiNpbmNs
dWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgInQuaCIgIC8vIEZpcnN0IGNvcHkK
ClhYWApjYXQgPDxYWFggPiB0Mi5jcHAKI2luY2x1ZGUgPGlvc3RyZWFtPgoj
aW5jbHVkZSAidC5oIiAgLy8gU2Vjb25kIGNvcHkKCmludCBtYWluKCkKeyAg
IHN0ZDo6Y291dCA8PCBEYXRhOjpnZXQoKS52YWwgPDwgc3RkOjplbmRsOwog
ICAgcmV0dXJuIDA7Cn0KWFhYCgokezE6LWcrK30gLXN0ZD1jKysxNyAtSS4g
dDEuY3BwIHQyLmNwcCAtbyB0Ci4vdAoKIyBlbmQgb2YgdGVzdCBzY3JpcHQ=


--426969-2287-1573755781=:14912
Content-Type: text/plain; charset=us-ascii


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
--426969-2287-1573755781=:14912--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019