[llvm-dev] [MC] Target-Independent Small Data Section Handling
Jack Andersen via llvm-dev
llvm-dev at lists.llvm.org
Wed Nov 30 13:56:14 PST 2016
Bumping this again.
Rebased against upstream master with some minor consistency improvements.
Thanks!
-Jack
> On 18 Nov 2016, at 08:39, Hal Finkel <hfinkel at anl.gov> wrote:
>
> ----- Original Message -----
>> From: "Jack Andersen via llvm-dev" <llvm-dev at lists.llvm.org>
>> To: "llvm-dev" <llvm-dev at lists.llvm.org>
>> Sent: Wednesday, November 16, 2016 10:39:53 PM
>> Subject: Re: [llvm-dev] [MC] Target-Independent Small Data Section Handling
>>
>> Just pinging this patch for review, particularly from PPC
>> maintainers:
>
> Hi Jack, thanks for working on this. I'll look at your patches next week.
>
> -Hal
>
>>
>> https://reviews.llvm.org/D26344
>>
>> It's now rebased for the latest master commits, `check-all` test
>> results match those of the upstream base.
>>
>> There is also a clang driver patch, extending PPC target support for
>> the `-G` flag:
>>
>> https://reviews.llvm.org/D26345
>>
>> And lld patch implementing the _SDA_BASE_ symbols and includes an
>> end-to-end test for small data relocations:
>>
>> https://reviews.llvm.org/D26346
>>
>> I don't have commit access either, so I could use some help with that
>> when ready.
>>
>> Thanks,
>> Jack
>>
>>> On 8 Nov 2016, at 07:21, Simon Dardis <Simon.Dardis at imgtec.com>
>>> wrote:
>>>
>>> Hi Jack,
>>>
>>> Thanks for working on this, I think you have the right approach by
>>> making this more general.
>>>
>>> I've been looking at your posted patch and I'll post some comments
>>> there.
>>>
>>> Thanks,
>>> Simon
>>>
>>>
>>> From: llvm-dev [mailto:llvm-dev-bounces at lists.llvm.org] On Behalf
>>> Of Jack Andersen via llvm-dev
>>> Sent: 08 November 2016 02:48
>>> To: llvm-dev
>>> Subject: [llvm-dev] [MC] Target-Independent Small Data Section
>>> Handling
>>>
>>> I've prepared a preliminary patch with the intention of
>>> implementing PPC-EABI subtarget features for applications that run
>>> in a standalone embedded environment.
>>>
>>> https://reviews.llvm.org/D26344
>>>
>>> The most significant difference compared with the SVR4 ABI is the
>>> use of SDA (small data area). This allows full-word constants and
>>> data to be grouped into small-data sections accessed using
>>> relocated addresses; calculated relative to the non-volatile
>>> values loaded into base registers r13 and r2 by the runtime init
>>> (similar to gp_rel on MIPS). Only a single load/store instruction
>>> is needed to contain the relocated address.
>>>
>>> The MIPS target already has a solid approach for handling small
>>> global variables in its TargetLoweringObjectFile subclass. Also,
>>> the clang driver responds to the `-G <bytes>` flag so the user can
>>> define a cutoff size other than 8 (or 0 to disable small data
>>> altogether).
>>>
>>> It seems the Hexagon and Lanai targets duplicate much of the
>>> IsGlobalInSmallSection handling from the MIPS target, but perform
>>> the same basic classification tasks:
>>>
>>> 1. Pass GlobalObject to target-declared IsGlobalInSmallSection.
>>> If it's a declaration, skip to step 4.
>>> 2. Pass GlobalObject to target-independent
>>> TargetLoweringObjectFile::getKindForGlobal.
>>> 3. Ensure the returned SectionKind is Data, BSS or Common.
>>> 4. Pass GlobalObject to target-specific IsGlobalInSmallSectionImpl,
>>> which scrutinizes the object's type for the specific
>>> architecture.
>>>
>>> I believe this redundant implementation between targets can be
>>> reduced by giving SectionKind an 'isSmallKind' bit (OR'd with
>>> 0x80). This provides a much clearer (and cached) predicate that
>>> ISel lowering can take advantage of when a small data load/store
>>> must be generated. The existing predicates in SectionKind may be
>>> modified to use the underlying Kind (AND-ing with 0x7f), so
>>> existing ISel behaviors are mostly unchanged.
>>>
>>> The proposed target-independent small data classification has 2
>>> usage avenues depending on the context:
>>>
>>> For all GlobalObjects:
>>>
>>> 1. Pass GlobalObject to target-independent
>>> TargetLoweringObjectFile::isGlobalInSmallSection. If it's a
>>> declaration, make a virtual call to a new method named
>>> TargetLoweringObjectFile::isGlobalInSmallSectionKind (doing
>>> target-specific scrutiny) and return the result early.
>>> 2. Pass to TargetLoweringObjectFile::getKindForGlobal.
>>> If the Kind is Data, BSS or Common, make a virtual call to
>>> TargetLoweringObjectFile::isGlobalInSmallSectionKind just before
>>> returning the SectionKind. If true is returned, set the
>>> 'isSmallKind'
>>> bit in the returned SectionKind.
>>> 3. Return the result of the isSmallKind() predicate from
>>> isGlobalInSmallSection
>>>
>>> If the GlobalObject is known to be a definition, the process is
>>> even simpler:
>>>
>>> 1. Pass GlobalObject to TargetLoweringObjectFile::getKindForGlobal
>>> (which calls isGlobalInSmallSectionKind in turn).
>>> 2. Act on isSmallKind() predicate (and conveniently get the
>>> SectionKind at the same time).
>>>
>>> I feel that the SectionKind modification is the best route, since
>>> it's already used to uniquely classify constant merge sections.
>>> Even though small data sections are linked in the same manner as
>>> their 'regular' counterparts, there must be a clear distinction
>>> when producing memory access code (and obviously selecting the
>>> target section to allocate in).
>>>
>>> I'd like some input from PowerPC, MIPS, Hexagon and Lanai
>>> maintainers to ensure this approach accommodates their targets
>>> appropriately.
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>
> --
> Hal Finkel
> Lead, Compiler Technology and Programming Languages
> Leadership Computing Facility
> Argonne National Laboratory
More information about the llvm-dev
mailing list