From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 91321 invoked by alias); 6 May 2017 18:07:51 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 90639 invoked by uid 89); 6 May 2017 18:07:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-15.6 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_ASCII_DIVIDERS,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2 spammy=evening, principle, H*c:HHH, reality X-HELO: EUR01-VE1-obe.outbound.protection.outlook.com Received: from mail-oln040092066039.outbound.protection.outlook.com (HELO EUR01-VE1-obe.outbound.protection.outlook.com) (40.92.66.39) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 06 May 2017 18:07:46 +0000 Received: from VE1EUR01FT049.eop-EUR01.prod.protection.outlook.com (10.152.2.52) by VE1EUR01HT174.eop-EUR01.prod.protection.outlook.com (10.152.3.207) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.1047.9; Sat, 6 May 2017 18:07:45 +0000 Received: from AM4PR0701MB2162.eurprd07.prod.outlook.com (10.152.2.53) by VE1EUR01FT049.mail.protection.outlook.com (10.152.3.56) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1047.9 via Frontend Transport; Sat, 6 May 2017 18:07:45 +0000 Received: from AM4PR0701MB2162.eurprd07.prod.outlook.com ([fe80::40a0:2642:4335:50ed]) by AM4PR0701MB2162.eurprd07.prod.outlook.com ([fe80::40a0:2642:4335:50ed%19]) with mapi id 15.01.1084.011; Sat, 6 May 2017 18:07:45 +0000 From: Bernd Edlinger To: "Richard Earnshaw (lists)" , Jeff Law , "gcc-patches@gcc.gnu.org" CC: Richard Biener , Jakub Jelinek , Richard Sandiford , Ramana Radhakrishnan , Nick Clifton Subject: Re: [PATCH, ARM] Add a new target hook to compute the frame layout Date: Sat, 06 May 2017 18:16:00 -0000 Message-ID: References: <538a413b-ef74-4a9a-1665-f3b84a8d9035@redhat.com> <67767f62-f973-546b-1e18-1d3bf472d748@arm.com> <4b971f30-b5e2-7960-aab4-a873f3ed433e@arm.com> <5e8289c8-1e20-5f74-d1db-9ae236df22e4@arm.com> In-Reply-To: <5e8289c8-1e20-5f74-d1db-9ae236df22e4@arm.com> authentication-results: arm.com; dkim=none (message not signed) header.d=none;arm.com; dmarc=none action=none header.from=hotmail.de; x-incomingtopheadermarker: OriginalChecksum:1CACFF0921C25895234C66B8EE6D3750BC3C4313A3A05731E60541828338C2EF;UpperCasedChecksum:CD41C8295952E7AEA070F7B7A7D9E7C99094F6F46F6FDE2AED5E4C25A5395420;SizeAsReceived:8965;Count:43 x-ms-exchange-messagesentrepresentingtype: 1 x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;VE1EUR01HT174;5:4N3SBVLaUg2APMmgDv44ZNfP3CyLHjKklRUdFeJQGpRc/O7nfsiCnAgT+Pw3AAm1bJPJkGJpovJtVSKDR4pMc9GVQnXAAtgI8fW47Mcdt/vGlvSXnSgW6pr/iU7Fu+63b+g7s0B+iJgioIeYDn5+Ng==;24:GdX3OM/EE/5i/yDMKZqLfUdHfvW27ABlUnh5zaCsd5WTJWkekPPZWQoWXLfzqnTwqERpM3qz+cUHVPNbvaOlNERLj6G1GJU6zz+spoZIME4=;7:PKLnhvaiQjxXvXOaGbb7Aey7mvikDSSRU4J7QklCEXmjp4ykYoLAxVF9HDJfbW6y+Im7y3Xe9liBVaX2oxxm4r6m1oFj2s7x7fx51vVX4ifSQm/Wc1ngVQu6MHuMt/TlAQRUn2nLRiiFtzOzmFefZ58UdheifacXbGAS+Djmbf6RO6CReYpgOTQnJ46rENuf4DCPQb4eYlhGrjYRTDQz/Z+57kX4HXjki0i5xE29aVdWUvmXA9UJmy8vginNKbojbmIga2mAgtarh776r/HIo1b6ad+CPxedwUwwYN12GUSVdtZ8hMqc+72sOIiogJlA x-incomingheadercount: 43 x-eopattributedmessage: 0 x-forefront-antispam-report: EFV:NLI;SFV:NSPM;SFS:(7070007)(98901004);DIR:OUT;SFP:1901;SCL:1;SRVR:VE1EUR01HT174;H:AM4PR0701MB2162.eurprd07.prod.outlook.com;FPR:;SPF:None;LANG:en; x-ms-office365-filtering-correlation-id: f395e7e9-0233-474b-928a-08d494aacb58 x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(201702061074)(5061506573)(5061507331)(1603103135)(2017031320274)(2017031324274)(2017031323274)(2017031322274)(1601125374)(1603101448)(1701031045);SRVR:VE1EUR01HT174; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(444000031);SRVR:VE1EUR01HT174;BCL:0;PCL:0;RULEID:;SRVR:VE1EUR01HT174; x-forefront-prvs: 029976C540 spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: multipart/mixed; boundary="_003_AM4PR0701MB2162E930AA1FF46D63E3AC55E4E80AM4PR0701MB2162_" MIME-Version: 1.0 X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-originalarrivaltime: 06 May 2017 18:07:45.7465 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Internet X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1EUR01HT174 X-SW-Source: 2017-05/txt/msg00484.txt.bz2 --_003_AM4PR0701MB2162E930AA1FF46D63E3AC55E4E80AM4PR0701MB2162_ Content-Type: text/plain; charset="Windows-1252" Content-ID: Content-Transfer-Encoding: quoted-printable Content-length: 18885 On 05/05/17 16:59, Richard Earnshaw (lists) wrote: > On 05/09/16 17:43, Bernd Edlinger wrote: >> Hi Richard, >> >> what do you think of this patch, is it OK (with the suggested wording)? >> > > Bernd, > > Apologies, this seems to have fallen through a crack. > > I'm happy with this. Does it still apply? > Yes, only in a few places the context lines changed slightly. So I attached a refreshed patch for your reference. > If so, I suggest applying it after a 24-hour cooling off period for any > final comments. > Fine, then I will apply it on monday evening, unless someone objects. Thanks Bernd. > R. > >> >> Thanks >> Bernd. >> >> On 08/05/16 16:06, Richard Earnshaw (lists) wrote: >>> On 05/08/16 13:49, Bernd Edlinger wrote: >>>> On 08/05/16 11:29, Richard Earnshaw (lists) wrote: >>>>> On 04/08/16 22:16, Bernd Edlinger wrote: >>>>>> Hi, >>>>>> >>>>>> this patch introduces a new target hook that allows the target's >>>>>> INITIAL_ELIMINATION_OFFSET function to use cached values instead of >>>>>> re-computing the frame layout every time. >>>>>> >>>>>> I have updated the documentation a bit and hope it is clearer this t= ime. >>>>>> >>>>>> It still needs a review by ARM port maintainers. >>>>>> >>>>>> If the ARM port maintainers find this patch useful, that would be fi= ne. >>>>>> >>>>> >>>>> I need to look into this more, but my first thought was that the >>>>> documentation is confusing, or there is a real problem in this patch. >>>>> >>>> >>>> Thanks for your quick response. >>>> >>>> The documentation is actually the most difficult part for me. >>>> >>>>> As I understand it the frame has to be re-laid out each time the >>>>> contents of the frame changes (an extra register becomes live or anot= her >>>>> spill slot is needed). So saying that it is laid out once can't be >>>>> right if (as I read it initially) you mean 'once per function' since I >>>>> think it needs to be 'once for each time the frame contents changes'. >>>>> >>>>> Of course, things might be a bit different with LRA compared with >>>>> reload, but I strongly suspect this is never going to be an 'exactly >>>>> once per function' operation. >>>>> >>>> >>>> Right. It will be done 2 or 3 times for each function. >>>> LRA and reload behave identical in that respect. >>>> >>>> But each time reload changes something in the input data the >>>> INITIAL_EMIMINATION_OFFSET is called several times, and the results >>>> have to be consistent in each iteration. >>>> >>>> The frame layout function has no way to know if the frame layout >>>> is expected to change or not. >>>> >>>> Many targets use reload_completed as an indication when the frame layo= ut >>>> may not change at all, but that is only an approximation. >>>> >>>>> Can you clarify your meaning in the documentation please? >>>>> >>>> >>>> I meant 'once' in the sense of 'once for each time the frame contents >>>> change'. >>>> >>>> Thus I'd change that sentence to: >>>> >>>> "This target hook allows the target to compute the frame layout once f= or >>>> each time the frame contents change and make use of the cached frame >>>> layout in @code{INITIAL_ELIMINATION_OFFSET} instead of re-computing it >>>> on every invocation. This is particularly useful for targets that have >>>> an expensive frame layout function. Implementing this callback is >>>> optional." >>>> >>> >>> Thanks, that's pretty much what I expected would be the case. >>> >>> Could I suggest: >>> >>> This target hook is called once each time the frame layout needs to be >>> recalculated. The calculations can be cached by the target and can then >>> be used by @code{INITIAL_ELIMINATION_OFFSET} instead of re-computing the >>> layout on every invocation of that hook. This is particularly useful >>> for targets that have an expensive frame layout function. Implementing >>> this callback is optional. >>> >>> R. >>> >>>> >>>> Thanks >>>> Bernd. >>>> >>>> >>>>> R. >>>>> >>>>>> >>>>>> Thanks >>>>>> Bernd. >>>>>> >>>>>> On 06/21/16 23:29, Jeff Law wrote: >>>>>>> On 06/16/2016 08:47 AM, Bernd Edlinger wrote: >>>>>>>> Hi! >>>>>>>> >>>>>>>> >>>>>>>> By the design of the target hook INITIAL_ELIMINATION_OFFSET >>>>>>>> it is necessary to call this function several times with >>>>>>>> different register combinations. >>>>>>>> Most targets use a cached data structure that describes the >>>>>>>> exact frame layout of the current function. >>>>>>>> >>>>>>>> It is safe to skip the computation when reload_completed =3D true, >>>>>>>> and most targets do that already. >>>>>>>> >>>>>>>> However while reload is doing its work, it is not clear when to >>>>>>>> do the computation and when not. This results in unnecessary >>>>>>>> work. Computing the frame layout can be a simple function or an >>>>>>>> arbitrarily complex one, that walks all instructions of the current >>>>>>>> function for instance, which is more or less the common case. >>>>>>>> >>>>>>>> >>>>>>>> This patch adds a new optional target hook that can be used >>>>>>>> by the target to factor the INITIAL_ELIMINATION_OFFSET-hook >>>>>>>> into a O(n) computation part, and a O(1) result function. >>>>>>>> >>>>>>>> The patch implements a compute_frame_layout target hook just >>>>>>>> for ARM in the moment, to show the principle. >>>>>>>> Other targets may also implement that hook, if it seems appropriat= e. >>>>>>>> >>>>>>>> >>>>>>>> Boot-strapped and reg-tested on arm-linux-gnueabihf. >>>>>>>> OK for trunk? >>>>>>>> >>>>>>>> >>>>>>>> Thanks >>>>>>>> Bernd. >>>>>>>> >>>>>>>> >>>>>>>> changelog-frame-layout.txt >>>>>>>> >>>>>>>> >>>>>>>> 2016-06-16 Bernd Edlinger >>>>>>>> >>>>>>>> * target.def (compute_frame_layout): New optional target hoo= k. >>>>>>>> * doc/tm.texi.in (TARGET_COMPUTE_FRAME_LAYOUT): Add hook. >>>>>>>> * doc/tm.texi (TARGET_COMPUTE_FRAME_LAYOUT): Add documentati= on. >>>>>>>> * lra-eliminations.c (update_reg_eliminate): Call >>>>>>>> compute_frame_layout >>>>>>>> target hook. >>>>>>>> * reload1.c (verify_initial_elim_offsets): Likewise. >>>>>>>> * config/arm/arm.c (TARGET_COMPUTE_FRAME_LAYOUT): Define. >>>>>>>> (use_simple_return_p): Call arm_compute_frame_layout if need= ed. >>>>>>>> (arm_get_frame_offsets): Split up into this ... >>>>>>>> (arm_compute_frame_layout): ... and this function. >>>>>>> The ARM maintainers would need to chime in on the ARM specific chan= ges >>>>>>> though. >>>>>>> >>>>>>> >>>>>>> >>>>>>>> Index: gcc/target.def >>>>>>>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>>>>>>> --- gcc/target.def (Revision 233176) >>>>>>>> +++ gcc/target.def (Arbeitskopie) >>>>>>>> @@ -5245,8 +5245,19 @@ five otherwise. This is best for most mach= ines.", >>>>>>>> unsigned int, (void), >>>>>>>> default_case_values_threshold) >>>>>>>> >>>>>>>> -/* Retutn true if a function must have and use a frame pointer. = */ >>>>>>> s/Retutn/Return >>>>>>> >>>>>>>> +/* Optional callback to advise the target to compute the frame >>>>>>>> layout. */ >>>>>>>> DEFHOOK >>>>>>>> +(compute_frame_layout, >>>>>>>> + "This target hook is called immediately before reload wants to c= all\n\ >>>>>>>> +@code{INITIAL_ELIMINATION_OFFSET} and allows the target to cache = the >>>>>>>> frame\n\ >>>>>>>> +layout instead of re-computing it on every invocation. This is >>>>>>>> particularly\n\ >>>>>>>> +useful for targets that have an O(n) frame layout function. >>>>>>>> Implementing\n\ >>>>>>>> +this callback is optional.", >>>>>>>> + void, (void), >>>>>>>> + hook_void_void) >>>>>>> So the docs say "immediately before", but that's not actually reali= ty in >>>>>>> lra-eliminations. I think you can just say "This target hook is ca= lled >>>>>>> before reload or lra-eliminations calls >>>>>>> @code{INITIAL_ELIMINATION_OFFSET} and allows ..." >>>>>>> >>>>>>> >>>>>>> How does this macro interact with INITIAL_FRAME_POINTER_OFFSET? >>>>>>> >>>>>>> I'm OK with this conceptually. I think you need a minor doc update= and >>>>>>> OK from the ARM maintainers before it can be installed though. >>>>>>> >>>>>>> jeff >>>>>>> >>>>>>> changelog-frame-layout.txt >>>>>>> >>>>>>> >>>>>>> 2016-06-16 Bernd Edlinger >>>>>>> >>>>>>> * target.def (compute_frame_layout): New optional target hook. >>>>>>> * doc/tm.texi.in (TARGET_COMPUTE_FRAME_LAYOUT): Add hook. >>>>>>> * doc/tm.texi (TARGET_COMPUTE_FRAME_LAYOUT): Add documentation. >>>>>>> * lra-eliminations.c (update_reg_eliminate): Call compute_frame_la= yout >>>>>>> target hook. >>>>>>> * reload1.c (verify_initial_elim_offsets): Likewise. >>>>>>> * config/arm/arm.c (TARGET_COMPUTE_FRAME_LAYOUT): Define. >>>>>>> (use_simple_return_p): Call arm_compute_frame_layout if needed. >>>>>>> (arm_get_frame_offsets): Split up into this ... >>>>>>> (arm_compute_frame_layout): ... and this function. >>>>>>> >>>>>>> patch-frame-layout.diff >>>>>>> >>>>>>> >>>>>>> Index: gcc/config/arm/arm.c >>>>>>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>>>>>> --- gcc/config/arm/arm.c (revision 239144) >>>>>>> +++ gcc/config/arm/arm.c (working copy) >>>>>>> @@ -81,6 +81,7 @@ static bool arm_const_not_ok_for_debug_p (rtx); >>>>>>> static bool arm_needs_doubleword_align (machine_mode, const_tree= ); >>>>>>> static int arm_compute_static_chain_stack_bytes (void); >>>>>>> static arm_stack_offsets *arm_get_frame_offsets (void); >>>>>>> +static void arm_compute_frame_layout (void); >>>>>>> static void arm_add_gc_roots (void); >>>>>>> static int arm_gen_constant (enum rtx_code, machine_mode, rtx, >>>>>>> unsigned HOST_WIDE_INT, rtx, rtx, int, int); >>>>>>> @@ -663,6 +664,9 @@ static const struct attribute_spec arm_attribut= e_t >>>>>>> #undef TARGET_SCALAR_MODE_SUPPORTED_P >>>>>>> #define TARGET_SCALAR_MODE_SUPPORTED_P arm_scalar_mode_supported= _p >>>>>>> >>>>>>> +#undef TARGET_COMPUTE_FRAME_LAYOUT >>>>>>> +#define TARGET_COMPUTE_FRAME_LAYOUT arm_compute_frame_layout >>>>>>> + >>>>>>> #undef TARGET_FRAME_POINTER_REQUIRED >>>>>>> #define TARGET_FRAME_POINTER_REQUIRED arm_frame_pointer_required >>>>>>> >>>>>>> @@ -3880,6 +3884,10 @@ use_simple_return_p (void) >>>>>>> { >>>>>>> arm_stack_offsets *offsets; >>>>>>> >>>>>>> + /* Note this function can be called before or after reload. */ >>>>>>> + if (!reload_completed) >>>>>>> + arm_compute_frame_layout (); >>>>>>> + >>>>>>> offsets =3D arm_get_frame_offsets (); >>>>>>> return offsets->outgoing_args !=3D 0; >>>>>>> } >>>>>>> @@ -19370,7 +19378,7 @@ arm_compute_static_chain_stack_bytes (void) >>>>>>> >>>>>>> /* Compute a bit mask of which registers need to be >>>>>>> saved on the stack for the current function. >>>>>>> - This is used by arm_get_frame_offsets, which may add extra regi= sters. */ >>>>>>> + This is used by arm_compute_frame_layout, which may add extra r= egisters. */ >>>>>>> >>>>>>> static unsigned long >>>>>>> arm_compute_save_reg_mask (void) >>>>>>> @@ -20926,12 +20934,25 @@ any_sibcall_could_use_r3 (void) >>>>>>> alignment. */ >>>>>>> >>>>>>> >>>>>>> +/* Return cached stack offsets. */ >>>>>>> + >>>>>>> +static arm_stack_offsets * >>>>>>> +arm_get_frame_offsets (void) >>>>>>> +{ >>>>>>> + struct arm_stack_offsets *offsets; >>>>>>> + >>>>>>> + offsets =3D &cfun->machine->stack_offsets; >>>>>>> + >>>>>>> + return offsets; >>>>>>> +} >>>>>>> + >>>>>>> + >>>>>>> /* Calculate stack offsets. These are used to calculate registe= r elimination >>>>>>> offsets and in prologue/epilogue code. Also calculates which= registers >>>>>>> should be saved. */ >>>>>>> >>>>>>> -static arm_stack_offsets * >>>>>>> -arm_get_frame_offsets (void) >>>>>>> +static void >>>>>>> +arm_compute_frame_layout (void) >>>>>>> { >>>>>>> struct arm_stack_offsets *offsets; >>>>>>> unsigned long func_type; >>>>>>> @@ -20943,19 +20964,6 @@ any_sibcall_could_use_r3 (void) >>>>>>> >>>>>>> offsets =3D &cfun->machine->stack_offsets; >>>>>>> >>>>>>> - /* We need to know if we are a leaf function. Unfortunately, it >>>>>>> - is possible to be called after start_sequence has been called, >>>>>>> - which causes get_insns to return the insns for the sequence, >>>>>>> - not the function, which will cause leaf_function_p to return >>>>>>> - the incorrect result. >>>>>>> - >>>>>>> - to know about leaf functions once reload has completed, and t= he >>>>>>> - frame size cannot be changed after that time, so we can safely >>>>>>> - use the cached value. */ >>>>>>> - >>>>>>> - if (reload_completed) >>>>>>> - return offsets; >>>>>>> - >>>>>>> /* Initially this is the size of the local variables. It will= translated >>>>>>> into an offset once we have determined the size of precedin= g data. */ >>>>>>> frame_size =3D ROUND_UP_WORD (get_frame_size ()); >>>>>>> @@ -21022,7 +21030,7 @@ any_sibcall_could_use_r3 (void) >>>>>>> { >>>>>>> offsets->outgoing_args =3D offsets->soft_frame; >>>>>>> offsets->locals_base =3D offsets->soft_frame; >>>>>>> - return offsets; >>>>>>> + return; >>>>>>> } >>>>>>> >>>>>>> /* Ensure SFP has the correct alignment. */ >>>>>>> @@ -21098,8 +21106,6 @@ any_sibcall_could_use_r3 (void) >>>>>>> offsets->outgoing_args +=3D 4; >>>>>>> gcc_assert (!(offsets->outgoing_args & 7)); >>>>>>> } >>>>>>> - >>>>>>> - return offsets; >>>>>>> } >>>>>>> >>>>>>> >>>>>>> Index: gcc/doc/tm.texi >>>>>>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>>>>>> --- gcc/doc/tm.texi (revision 239144) >>>>>>> +++ gcc/doc/tm.texi (working copy) >>>>>>> @@ -3693,6 +3693,14 @@ registers. This macro must be defined if @c= ode{EL >>>>>>> defined. >>>>>>> @end defmac >>>>>>> >>>>>>> +@deftypefn {Target Hook} void TARGET_COMPUTE_FRAME_LAYOUT (void) >>>>>>> +This target hook allows the target to compute the frame layout onc= e and >>>>>>> +make use of the cached frame layout in @code{INITIAL_ELIMINATION_O= FFSET} >>>>>>> +instead of re-computing it on every invocation. This is particula= rly >>>>>>> +useful for targets that have an expensive frame layout function. >>>>>>> +Implementing this callback is optional. >>>>>>> +@end deftypefn >>>>>>> + >>>>>>> @node Stack Arguments >>>>>>> @subsection Passing Function Arguments on the Stack >>>>>>> @cindex arguments on stack >>>>>>> Index: gcc/doc/tm.texi.in >>>>>>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>>>>>> --- gcc/doc/tm.texi.in (revision 239144) >>>>>>> +++ gcc/doc/tm.texi.in (working copy) >>>>>>> @@ -3227,6 +3227,8 @@ registers. This macro must be defined if @co= de{EL >>>>>>> defined. >>>>>>> @end defmac >>>>>>> >>>>>>> +@hook TARGET_COMPUTE_FRAME_LAYOUT >>>>>>> + >>>>>>> @node Stack Arguments >>>>>>> @subsection Passing Function Arguments on the Stack >>>>>>> @cindex arguments on stack >>>>>>> Index: gcc/lra-eliminations.c >>>>>>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>>>>>> --- gcc/lra-eliminations.c (revision 239144) >>>>>>> +++ gcc/lra-eliminations.c (working copy) >>>>>>> @@ -1203,6 +1203,10 @@ update_reg_eliminate (bitmap insns_with_chan= ged_of >>>>>>> struct lra_elim_table *ep, *ep1; >>>>>>> HARD_REG_SET temp_hard_reg_set; >>>>>>> >>>>>>> +#ifdef ELIMINABLE_REGS >>>>>>> + targetm.compute_frame_layout (); >>>>>>> +#endif >>>>>>> + >>>>>>> /* Clear self elimination offsets. */ >>>>>>> for (ep =3D reg_eliminate; ep < ®_eliminate[NUM_ELIMINABLE_= REGS]; ep++) >>>>>>> self_elim_offsets[ep->from] =3D 0; >>>>>>> Index: gcc/reload1.c >>>>>>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>>>>>> --- gcc/reload1.c (revision 239144) >>>>>>> +++ gcc/reload1.c (working copy) >>>>>>> @@ -3831,6 +3831,7 @@ verify_initial_elim_offsets (void) >>>>>>> { >>>>>>> struct elim_table *ep; >>>>>>> >>>>>>> + targetm.compute_frame_layout (); >>>>>>> for (ep =3D reg_eliminate; ep < ®_eliminate[NUM_ELIMINABLE= _REGS]; ep++) >>>>>>> { >>>>>>> INITIAL_ELIMINATION_OFFSET (ep->from, ep->to, t); >>>>>>> @@ -3855,6 +3856,7 @@ set_initial_elim_offsets (void) >>>>>>> struct elim_table *ep =3D reg_eliminate; >>>>>>> >>>>>>> #ifdef ELIMINABLE_REGS >>>>>>> + targetm.compute_frame_layout (); >>>>>>> for (; ep < ®_eliminate[NUM_ELIMINABLE_REGS]; ep++) >>>>>>> { >>>>>>> INITIAL_ELIMINATION_OFFSET (ep->from, ep->to, ep->initial_= offset); >>>>>>> Index: gcc/target.def >>>>>>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>>>>>> --- gcc/target.def (revision 239144) >>>>>>> +++ gcc/target.def (working copy) >>>>>>> @@ -5269,8 +5269,19 @@ five otherwise. This is best for most machi= nes.", >>>>>>> unsigned int, (void), >>>>>>> default_case_values_threshold) >>>>>>> >>>>>>> -/* Retutn true if a function must have and use a frame pointer. */ >>>>>>> +/* Optional callback to advise the target to compute the frame lay= out. */ >>>>>>> DEFHOOK >>>>>>> +(compute_frame_layout, >>>>>>> + "This target hook allows the target to compute the frame layout o= nce and\n\ >>>>>>> +make use of the cached frame layout in @code{INITIAL_ELIMINATION_O= FFSET}\n\ >>>>>>> +instead of re-computing it on every invocation. This is particula= rly\n\ >>>>>>> +useful for targets that have an expensive frame layout function.\n\ >>>>>>> +Implementing this callback is optional.", >>>>>>> + void, (void), >>>>>>> + hook_void_void) >>>>>>> + >>>>>>> +/* Return true if a function must have and use a frame pointer. */ >>>>>>> +DEFHOOK >>>>>>> (frame_pointer_required, >>>>>>> "This target hook should return @code{true} if a function must = have and use\n\ >>>>>>> a frame pointer. This target hook is called in the reload pass.= If its return\n\ >>>>> >>>> >>> > --_003_AM4PR0701MB2162E930AA1FF46D63E3AC55E4E80AM4PR0701MB2162_ Content-Type: text/plain; name="changelog-frame-layout.txt" Content-Description: changelog-frame-layout.txt Content-Disposition: attachment; filename="changelog-frame-layout.txt"; size=622; creation-date="Sat, 06 May 2017 18:07:44 GMT"; modification-date="Sat, 06 May 2017 18:07:44 GMT" Content-ID: <58016F070086F042BCD6457B38DCBFD7@eurprd07.prod.outlook.com> Content-Transfer-Encoding: base64 Content-length: 846 MjAxNi0wNi0xNiAgQmVybmQgRWRsaW5nZXIgIDxiZXJuZC5lZGxpbmdlckBo b3RtYWlsLmRlPg0KDQoJKiB0YXJnZXQuZGVmIChjb21wdXRlX2ZyYW1lX2xh eW91dCk6IE5ldyBvcHRpb25hbCB0YXJnZXQgaG9vay4NCgkqIGRvYy90bS50 ZXhpLmluIChUQVJHRVRfQ09NUFVURV9GUkFNRV9MQVlPVVQpOiBBZGQgaG9v ay4NCgkqIGRvYy90bS50ZXhpIChUQVJHRVRfQ09NUFVURV9GUkFNRV9MQVlP VVQpOiBBZGQgZG9jdW1lbnRhdGlvbi4NCgkqIGxyYS1lbGltaW5hdGlvbnMu YyAodXBkYXRlX3JlZ19lbGltaW5hdGUpOiBDYWxsIGNvbXB1dGVfZnJhbWVf bGF5b3V0DQoJdGFyZ2V0IGhvb2suDQoJKiByZWxvYWQxLmMgKHZlcmlmeV9p bml0aWFsX2VsaW1fb2Zmc2V0cyk6IExpa2V3aXNlLg0KCSogY29uZmlnL2Fy bS9hcm0uYyAoVEFSR0VUX0NPTVBVVEVfRlJBTUVfTEFZT1VUKTogRGVmaW5l Lg0KCSh1c2Vfc2ltcGxlX3JldHVybl9wKTogQ2FsbCBhcm1fY29tcHV0ZV9m cmFtZV9sYXlvdXQgaWYgbmVlZGVkLg0KCShhcm1fZ2V0X2ZyYW1lX29mZnNl dHMpOiBTcGxpdCB1cCBpbnRvIHRoaXMgLi4uDQoJKGFybV9jb21wdXRlX2Zy YW1lX2xheW91dCk6IC4uLiBhbmQgdGhpcyBmdW5jdGlvbi4NCg== --_003_AM4PR0701MB2162E930AA1FF46D63E3AC55E4E80AM4PR0701MB2162_ Content-Type: text/x-patch; name="patch-frame-layout.diff" Content-Description: patch-frame-layout.diff Content-Disposition: attachment; filename="patch-frame-layout.diff"; size=6915; creation-date="Sat, 06 May 2017 18:07:44 GMT"; modification-date="Sat, 06 May 2017 18:07:44 GMT" Content-ID: <36B78689F98F4F46A5A995DF24F0829C@eurprd07.prod.outlook.com> Content-Transfer-Encoding: base64 Content-length: 9374 SW5kZXg6IGdjYy9jb25maWcvYXJtL2FybS5jDQo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09DQotLS0gZ2NjL2NvbmZpZy9hcm0vYXJtLmMJKHJldmlzaW9uIDI0 NzcxMCkNCisrKyBnY2MvY29uZmlnL2FybS9hcm0uYwkod29ya2luZyBjb3B5 KQ0KQEAgLTg1LDYgKzg1LDcgQEAgc3RhdGljIGJvb2wgYXJtX2NvbnN0X25v dF9va19mb3JfZGVidWdfcCAocnR4KTsNCiBzdGF0aWMgaW50IGFybV9uZWVk c19kb3VibGV3b3JkX2FsaWduIChtYWNoaW5lX21vZGUsIGNvbnN0X3RyZWUp Ow0KIHN0YXRpYyBpbnQgYXJtX2NvbXB1dGVfc3RhdGljX2NoYWluX3N0YWNr X2J5dGVzICh2b2lkKTsNCiBzdGF0aWMgYXJtX3N0YWNrX29mZnNldHMgKmFy bV9nZXRfZnJhbWVfb2Zmc2V0cyAodm9pZCk7DQorc3RhdGljIHZvaWQgYXJt X2NvbXB1dGVfZnJhbWVfbGF5b3V0ICh2b2lkKTsNCiBzdGF0aWMgdm9pZCBh cm1fYWRkX2djX3Jvb3RzICh2b2lkKTsNCiBzdGF0aWMgaW50IGFybV9nZW5f Y29uc3RhbnQgKGVudW0gcnR4X2NvZGUsIG1hY2hpbmVfbW9kZSwgcnR4LA0K IAkJCSAgICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCwgcnR4LCBydHgsIGlu dCwgaW50KTsNCkBAIC02ODAsNiArNjgxLDkgQEAgc3RhdGljIGNvbnN0IHN0 cnVjdCBhdHRyaWJ1dGVfc3BlYyBhcm1fYXR0cmlidXRlX3QNCiAjdW5kZWYg VEFSR0VUX1NDQUxBUl9NT0RFX1NVUFBPUlRFRF9QDQogI2RlZmluZSBUQVJH RVRfU0NBTEFSX01PREVfU1VQUE9SVEVEX1AgYXJtX3NjYWxhcl9tb2RlX3N1 cHBvcnRlZF9wDQogDQorI3VuZGVmIFRBUkdFVF9DT01QVVRFX0ZSQU1FX0xB WU9VVA0KKyNkZWZpbmUgVEFSR0VUX0NPTVBVVEVfRlJBTUVfTEFZT1VUIGFy bV9jb21wdXRlX2ZyYW1lX2xheW91dA0KKw0KICN1bmRlZiBUQVJHRVRfRlJB TUVfUE9JTlRFUl9SRVFVSVJFRA0KICNkZWZpbmUgVEFSR0VUX0ZSQU1FX1BP SU5URVJfUkVRVUlSRUQgYXJtX2ZyYW1lX3BvaW50ZXJfcmVxdWlyZWQNCiAN CkBAIC00MDMxLDYgKzQwMzUsMTAgQEAgdXNlX3NpbXBsZV9yZXR1cm5fcCAo dm9pZCkNCiB7DQogICBhcm1fc3RhY2tfb2Zmc2V0cyAqb2Zmc2V0czsNCiAN CisgIC8qIE5vdGUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGJlZm9y ZSBvciBhZnRlciByZWxvYWQuICAqLw0KKyAgaWYgKCFyZWxvYWRfY29tcGxl dGVkKQ0KKyAgICBhcm1fY29tcHV0ZV9mcmFtZV9sYXlvdXQgKCk7DQorDQog ICBvZmZzZXRzID0gYXJtX2dldF9mcmFtZV9vZmZzZXRzICgpOw0KICAgcmV0 dXJuIG9mZnNldHMtPm91dGdvaW5nX2FyZ3MgIT0gMDsNCiB9DQpAQCAtMTkx MzgsNyArMTkxNDYsNyBAQCBhcm1fY29tcHV0ZV9zdGF0aWNfY2hhaW5fc3Rh Y2tfYnl0ZXMgKHZvaWQpDQogDQogLyogQ29tcHV0ZSBhIGJpdCBtYXNrIG9m IHdoaWNoIHJlZ2lzdGVycyBuZWVkIHRvIGJlDQogICAgc2F2ZWQgb24gdGhl IHN0YWNrIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4NCi0gICBUaGlzIGlz IHVzZWQgYnkgYXJtX2dldF9mcmFtZV9vZmZzZXRzLCB3aGljaCBtYXkgYWRk IGV4dHJhIHJlZ2lzdGVycy4gICovDQorICAgVGhpcyBpcyB1c2VkIGJ5IGFy bV9jb21wdXRlX2ZyYW1lX2xheW91dCwgd2hpY2ggbWF5IGFkZCBleHRyYSBy ZWdpc3RlcnMuICAqLw0KIA0KIHN0YXRpYyB1bnNpZ25lZCBsb25nDQogYXJt X2NvbXB1dGVfc2F2ZV9yZWdfbWFzayAodm9pZCkNCkBAIC0yMDc3MiwxMiAr MjA3ODAsMjUgQEAgYW55X3NpYmNhbGxfY291bGRfdXNlX3IzICh2b2lkKQ0K ICAgYWxpZ25tZW50LiAgKi8NCiANCiANCisvKiBSZXR1cm4gY2FjaGVkIHN0 YWNrIG9mZnNldHMuICAqLw0KKw0KK3N0YXRpYyBhcm1fc3RhY2tfb2Zmc2V0 cyAqDQorYXJtX2dldF9mcmFtZV9vZmZzZXRzICh2b2lkKQ0KK3sNCisgIHN0 cnVjdCBhcm1fc3RhY2tfb2Zmc2V0cyAqb2Zmc2V0czsNCisNCisgIG9mZnNl dHMgPSAmY2Z1bi0+bWFjaGluZS0+c3RhY2tfb2Zmc2V0czsNCisNCisgIHJl dHVybiBvZmZzZXRzOw0KK30NCisNCisNCiAvKiBDYWxjdWxhdGUgc3RhY2sg b2Zmc2V0cy4gIFRoZXNlIGFyZSB1c2VkIHRvIGNhbGN1bGF0ZSByZWdpc3Rl ciBlbGltaW5hdGlvbg0KICAgIG9mZnNldHMgYW5kIGluIHByb2xvZ3VlL2Vw aWxvZ3VlIGNvZGUuICBBbHNvIGNhbGN1bGF0ZXMgd2hpY2ggcmVnaXN0ZXJz DQogICAgc2hvdWxkIGJlIHNhdmVkLiAgKi8NCiANCi1zdGF0aWMgYXJtX3N0 YWNrX29mZnNldHMgKg0KLWFybV9nZXRfZnJhbWVfb2Zmc2V0cyAodm9pZCkN CitzdGF0aWMgdm9pZA0KK2FybV9jb21wdXRlX2ZyYW1lX2xheW91dCAodm9p ZCkNCiB7DQogICBzdHJ1Y3QgYXJtX3N0YWNrX29mZnNldHMgKm9mZnNldHM7 DQogICB1bnNpZ25lZCBsb25nIGZ1bmNfdHlwZTsNCkBAIC0yMDc4OCw5ICsy MDgwOSw2IEBAIGFueV9zaWJjYWxsX2NvdWxkX3VzZV9yMyAodm9pZCkNCiAN CiAgIG9mZnNldHMgPSAmY2Z1bi0+bWFjaGluZS0+c3RhY2tfb2Zmc2V0czsN CiANCi0gIGlmIChyZWxvYWRfY29tcGxldGVkKQ0KLSAgICByZXR1cm4gb2Zm c2V0czsNCi0NCiAgIC8qIEluaXRpYWxseSB0aGlzIGlzIHRoZSBzaXplIG9m IHRoZSBsb2NhbCB2YXJpYWJsZXMuICBJdCB3aWxsIHRyYW5zbGF0ZWQNCiAg ICAgIGludG8gYW4gb2Zmc2V0IG9uY2Ugd2UgaGF2ZSBkZXRlcm1pbmVkIHRo ZSBzaXplIG9mIHByZWNlZGluZyBkYXRhLiAgKi8NCiAgIGZyYW1lX3NpemUg PSBST1VORF9VUF9XT1JEIChnZXRfZnJhbWVfc2l6ZSAoKSk7DQpAQCAtMjA4 NTUsNyArMjA4NzMsNyBAQCBhbnlfc2liY2FsbF9jb3VsZF91c2VfcjMgKHZv aWQpDQogICAgIHsNCiAgICAgICBvZmZzZXRzLT5vdXRnb2luZ19hcmdzID0g b2Zmc2V0cy0+c29mdF9mcmFtZTsNCiAgICAgICBvZmZzZXRzLT5sb2NhbHNf YmFzZSA9IG9mZnNldHMtPnNvZnRfZnJhbWU7DQotICAgICAgcmV0dXJuIG9m ZnNldHM7DQorICAgICAgcmV0dXJuOw0KICAgICB9DQogDQogICAvKiBFbnN1 cmUgU0ZQIGhhcyB0aGUgY29ycmVjdCBhbGlnbm1lbnQuICAqLw0KQEAgLTIw OTMxLDggKzIwOTQ5LDYgQEAgYW55X3NpYmNhbGxfY291bGRfdXNlX3IzICh2 b2lkKQ0KIAlvZmZzZXRzLT5vdXRnb2luZ19hcmdzICs9IDQ7DQogICAgICAg Z2NjX2Fzc2VydCAoIShvZmZzZXRzLT5vdXRnb2luZ19hcmdzICYgNykpOw0K ICAgICB9DQotDQotICByZXR1cm4gb2Zmc2V0czsNCiB9DQogDQogDQpJbmRl eDogZ2NjL2RvYy90bS50ZXhpDQo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot LS0gZ2NjL2RvYy90bS50ZXhpCShyZXZpc2lvbiAyNDc3MTApDQorKysgZ2Nj L2RvYy90bS50ZXhpCSh3b3JraW5nIGNvcHkpDQpAQCAtMzY4NCw2ICszNjg0 LDE1IEBAIHN1Y2ggYXMgdGhlIHJlc3VsdCBvZiBAY29kZXtnZXRfZnJhbWVf c2l6ZSAoKX0gYW5kDQogcmVnaXN0ZXJzIEBjb2Rle2RmX3JlZ3NfZXZlcl9s aXZlX3B9IGFuZCBAY29kZXtjYWxsX3VzZWRfcmVnc30uDQogQGVuZCBkZWZt YWMNCiANCitAZGVmdHlwZWZuIHtUYXJnZXQgSG9va30gdm9pZCBUQVJHRVRf Q09NUFVURV9GUkFNRV9MQVlPVVQgKHZvaWQpDQorVGhpcyB0YXJnZXQgaG9v ayBpcyBjYWxsZWQgb25jZSBlYWNoIHRpbWUgdGhlIGZyYW1lIGxheW91dCBu ZWVkcyB0byBiZQ0KK3JlY2FsY3VsYXRlZC4gIFRoZSBjYWxjdWxhdGlvbnMg Y2FuIGJlIGNhY2hlZCBieSB0aGUgdGFyZ2V0IGFuZCBjYW4gdGhlbg0KK2Jl IHVzZWQgYnkgQGNvZGV7SU5JVElBTF9FTElNSU5BVElPTl9PRkZTRVR9IGlu c3RlYWQgb2YgcmUtY29tcHV0aW5nIHRoZQ0KK2xheW91dCBvbiBldmVyeSBp bnZvY2F0aW9uIG9mIHRoYXQgaG9vay4gIFRoaXMgaXMgcGFydGljdWxhcmx5 IHVzZWZ1bA0KK2ZvciB0YXJnZXRzIHRoYXQgaGF2ZSBhbiBleHBlbnNpdmUg ZnJhbWUgbGF5b3V0IGZ1bmN0aW9uLiAgSW1wbGVtZW50aW5nDQordGhpcyBj YWxsYmFjayBpcyBvcHRpb25hbC4NCitAZW5kIGRlZnR5cGVmbg0KKw0KIEBu b2RlIFN0YWNrIEFyZ3VtZW50cw0KIEBzdWJzZWN0aW9uIFBhc3NpbmcgRnVu Y3Rpb24gQXJndW1lbnRzIG9uIHRoZSBTdGFjaw0KIEBjaW5kZXggYXJndW1l bnRzIG9uIHN0YWNrDQpJbmRleDogZ2NjL2RvYy90bS50ZXhpLmluDQo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09DQotLS0gZ2NjL2RvYy90bS50ZXhpLmluCShy ZXZpc2lvbiAyNDc3MTApDQorKysgZ2NjL2RvYy90bS50ZXhpLmluCSh3b3Jr aW5nIGNvcHkpDQpAQCAtMzIxMyw2ICszMjEzLDggQEAgc3VjaCBhcyB0aGUg cmVzdWx0IG9mIEBjb2Rle2dldF9mcmFtZV9zaXplICgpfSBhbmQNCiByZWdp c3RlcnMgQGNvZGV7ZGZfcmVnc19ldmVyX2xpdmVfcH0gYW5kIEBjb2Rle2Nh bGxfdXNlZF9yZWdzfS4NCiBAZW5kIGRlZm1hYw0KIA0KK0Bob29rIFRBUkdF VF9DT01QVVRFX0ZSQU1FX0xBWU9VVA0KKw0KIEBub2RlIFN0YWNrIEFyZ3Vt ZW50cw0KIEBzdWJzZWN0aW9uIFBhc3NpbmcgRnVuY3Rpb24gQXJndW1lbnRz IG9uIHRoZSBTdGFjaw0KIEBjaW5kZXggYXJndW1lbnRzIG9uIHN0YWNrDQpJ bmRleDogZ2NjL2xyYS1lbGltaW5hdGlvbnMuYw0KPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQ0KLS0tIGdjYy9scmEtZWxpbWluYXRpb25zLmMJKHJldmlzaW9u IDI0NzcxMCkNCisrKyBnY2MvbHJhLWVsaW1pbmF0aW9ucy5jCSh3b3JraW5n IGNvcHkpDQpAQCAtMTE5Niw2ICsxMTk2LDEwIEBAIHVwZGF0ZV9yZWdfZWxp bWluYXRlIChiaXRtYXAgaW5zbnNfd2l0aF9jaGFuZ2VkX29mDQogICBzdHJ1 Y3QgbHJhX2VsaW1fdGFibGUgKmVwLCAqZXAxOw0KICAgSEFSRF9SRUdfU0VU IHRlbXBfaGFyZF9yZWdfc2V0Ow0KIA0KKyNpZmRlZiBFTElNSU5BQkxFX1JF R1MNCisgIHRhcmdldG0uY29tcHV0ZV9mcmFtZV9sYXlvdXQgKCk7DQorI2Vu ZGlmDQorDQogICAvKiBDbGVhciBzZWxmIGVsaW1pbmF0aW9uIG9mZnNldHMu ICAqLw0KICAgZm9yIChlcCA9IHJlZ19lbGltaW5hdGU7IGVwIDwgJnJlZ19l bGltaW5hdGVbTlVNX0VMSU1JTkFCTEVfUkVHU107IGVwKyspDQogICAgIHNl bGZfZWxpbV9vZmZzZXRzW2VwLT5mcm9tXSA9IDA7DQpJbmRleDogZ2NjL3Jl bG9hZDEuYw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIGdjYy9yZWxv YWQxLmMJKHJldmlzaW9uIDI0NzcxMCkNCisrKyBnY2MvcmVsb2FkMS5jCSh3 b3JraW5nIGNvcHkpDQpAQCAtMzgyMSw2ICszODIxLDcgQEAgdmVyaWZ5X2lu aXRpYWxfZWxpbV9vZmZzZXRzICh2b2lkKQ0KICAgaWYgKCFudW1fZWxpbWlu YWJsZSkNCiAgICAgcmV0dXJuIHRydWU7DQogDQorICB0YXJnZXRtLmNvbXB1 dGVfZnJhbWVfbGF5b3V0ICgpOw0KICAgZm9yIChlcCA9IHJlZ19lbGltaW5h dGU7IGVwIDwgJnJlZ19lbGltaW5hdGVbTlVNX0VMSU1JTkFCTEVfUkVHU107 IGVwKyspDQogICAgIHsNCiAgICAgICBJTklUSUFMX0VMSU1JTkFUSU9OX09G RlNFVCAoZXAtPmZyb20sIGVwLT50bywgdCk7DQpAQCAtMzgzOCw2ICszODM5 LDcgQEAgc2V0X2luaXRpYWxfZWxpbV9vZmZzZXRzICh2b2lkKQ0KIHsNCiAg IHN0cnVjdCBlbGltX3RhYmxlICplcCA9IHJlZ19lbGltaW5hdGU7DQogDQor ICB0YXJnZXRtLmNvbXB1dGVfZnJhbWVfbGF5b3V0ICgpOw0KICAgZm9yICg7 IGVwIDwgJnJlZ19lbGltaW5hdGVbTlVNX0VMSU1JTkFCTEVfUkVHU107IGVw KyspDQogICAgIHsNCiAgICAgICBJTklUSUFMX0VMSU1JTkFUSU9OX09GRlNF VCAoZXAtPmZyb20sIGVwLT50bywgZXAtPmluaXRpYWxfb2Zmc2V0KTsNCklu ZGV4OiBnY2MvdGFyZ2V0LmRlZg0KPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K LS0tIGdjYy90YXJnZXQuZGVmCShyZXZpc2lvbiAyNDc3MTApDQorKysgZ2Nj L3RhcmdldC5kZWYJKHdvcmtpbmcgY29weSkNCkBAIC01Mzk1LDYgKzUzOTUs MTggQEAgZml2ZSBvdGhlcndpc2UuICBUaGlzIGlzIGJlc3QgZm9yIG1vc3Qg bWFjaGluZXMuIiwNCiAgdW5zaWduZWQgaW50LCAodm9pZCksDQogIGRlZmF1 bHRfY2FzZV92YWx1ZXNfdGhyZXNob2xkKQ0KIA0KKy8qIE9wdGlvbmFsIGNh bGxiYWNrIHRvIGFkdmlzZSB0aGUgdGFyZ2V0IHRvIGNvbXB1dGUgdGhlIGZy YW1lIGxheW91dC4gICovDQorREVGSE9PSw0KKyhjb21wdXRlX2ZyYW1lX2xh eW91dCwNCisgIlRoaXMgdGFyZ2V0IGhvb2sgaXMgY2FsbGVkIG9uY2UgZWFj aCB0aW1lIHRoZSBmcmFtZSBsYXlvdXQgbmVlZHMgdG8gYmVcblwNCityZWNh bGN1bGF0ZWQuICBUaGUgY2FsY3VsYXRpb25zIGNhbiBiZSBjYWNoZWQgYnkg dGhlIHRhcmdldCBhbmQgY2FuIHRoZW5cblwNCitiZSB1c2VkIGJ5IEBjb2Rl e0lOSVRJQUxfRUxJTUlOQVRJT05fT0ZGU0VUfSBpbnN0ZWFkIG9mIHJlLWNv bXB1dGluZyB0aGVcblwNCitsYXlvdXQgb24gZXZlcnkgaW52b2NhdGlvbiBv ZiB0aGF0IGhvb2suICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWxcblwN Citmb3IgdGFyZ2V0cyB0aGF0IGhhdmUgYW4gZXhwZW5zaXZlIGZyYW1lIGxh eW91dCBmdW5jdGlvbi4gIEltcGxlbWVudGluZ1xuXA0KK3RoaXMgY2FsbGJh Y2sgaXMgb3B0aW9uYWwuIiwNCisgdm9pZCwgKHZvaWQpLA0KKyBob29rX3Zv aWRfdm9pZCkNCisNCiAvKiBSZXR1cm4gdHJ1ZSBpZiBhIGZ1bmN0aW9uIG11 c3QgaGF2ZSBhbmQgdXNlIGEgZnJhbWUgcG9pbnRlci4gICovDQogREVGSE9P Sw0KIChmcmFtZV9wb2ludGVyX3JlcXVpcmVkLA0K --_003_AM4PR0701MB2162E930AA1FF46D63E3AC55E4E80AM4PR0701MB2162_--