On Wed, Nov 8, 2017 at 2:26 PM, Tsimbalist, Igor V <igor.v.tsimbal...@intel.com> wrote: >> -----Original Message----- >> From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches- >> ow...@gcc.gnu.org] On Behalf Of Jeff Law >> Sent: Wednesday, November 8, 2017 7:31 PM >> To: Tsimbalist, Igor V <igor.v.tsimbal...@intel.com>; gcc- >> patc...@gcc.gnu.org >> Cc: trie...@redhat.com; Jakub Jelinek <ja...@redhat.com> >> Subject: Re: [PATCH 21/22] Add extra field to gtm_jmpbuf on x86 only >> >> On 11/07/2017 09:22 AM, Tsimbalist, Igor V wrote: >> > I decided to split my previous patch "Enable building libitm with Intel >> > CET " >> > into two different patches. The first patch will add a new field to sjlj.S >> > and >> > target.h files. The second one will add Intel CET support on the top of >> > the >> > first one. In this case the further changes for adding Intel CET support >> > are >> > seen clearly. >> > >> > Ok for trunk? >> > >> >> [ ... snip ... ] >> >> > >> > >> > 0021-Add-extra-field-to-gtm_jmpbuf-on-x86-only.patch >> > >> > >> > From a6361c78bf774f2b4dbeeaf4147c286cff4ae5a4 Mon Sep 17 00:00:00 >> 2001 >> > From: Igor Tsimbalist <igor.v.tsimbal...@intel.com> >> > Date: Tue, 7 Nov 2017 17:00:24 +0300 >> > Subject: [PATCH 21/22] Add extra field to gtm_jmpbuf on x86 only >> > >> > Expand the gtm_jmpbuf structure by one word field to add >> > Intel CET support further. The code in sjlj.S already >> > allocates more space on the stack then gtm_jmpbuf needs. >> > Use this extra space to absorb the new field. >> > >> > The structure is allocated on the stack in such a way >> > that eip/rsp field is overlapped with return address on >> > the stack. Locate the new field right before eip/rsp so >> > code that accesses buffer fields relative to address of >> > gtm_jmpbuf has its offsets unchanged. >> > >> > The libtool_VERSION is updated for x86 due to extending >> > the gtm_jmpbuf structure. >> > >> > * libitm/config/x86/target.h: Add new field (ssp). >> > * libitm/config/x86/sjlj.S: Change offsets. >> > * libitm/configure.tgt: Update libtool_VERSION. >> So if I understand correctly, given the desire to to have the eip/rip >> field overlap with the return address on the stack offset changes are >> inevitable if we add fields. > > Yes, that's exactly the case. > >> > esac >> > + >> > +# Update libtool_VERSION since the size of struct gtm_jmpbuf is >> > +# changed for x86. >> > +case "${host}" in >> > + >> > + # For x86, we use slots in the TCB head for most of our TLS. >> > + # The setup of those slots in beginTransaction can afford to >> > + # use the global-dynamic model. >> > + i[456]86-*-* | x86_64-*-*) >> > + libtool_VERSION=2:0:0 >> What's the plan for supporting existing code that may have linked >> dynamically against libitm? > > This should just work. > >> One approach is to force the distros to carry the old libitm DSO. >> >> THe other would be to try and support both within the same DSO using >> symbol versioning. That would seem to imply that we'd need to the >> before/after code to build that single library that supported both. >> >> Thoughts? Jakub, any interest in chiming in here? > > My thought is that the buffer is encapsulated in the library, only sjlj.S > functions allocate the buffer and access the fields of the buffer, it's > sort of a black box. If an app loads the library it will work with the > buffer through the library's functions from sjlj.S , which are compiled > together.
It isn't the black box since gtm_jmpbuf is used in: struct gtm_transaction_cp { gtm_jmpbuf jb; size_t undolog_size; If we don't want to change libtool_VERSION, we need to add symbol versioning to libitm.so. But from what I can see, libitm.so wasn't designed with symbol versioning. Instead, it changes libtool_VERSION when ABI is changed. -- H.J.