From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2049) id B564E3856270; Thu, 5 May 2022 12:09:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B564E3856270 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Matthew Malcomson To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/vendors/ARM/heads/morello)] Hybrid Morello fix for convert_debug_memory_address X-Act-Checkin: gcc X-Git-Author: Richard Sandiford X-Git-Refname: refs/vendors/ARM/heads/morello X-Git-Oldrev: 2c3e1203f8d2854c7f77f77ada636b2070807e73 X-Git-Newrev: 7fd4e1ea35cb19c7dbf39a89dea2b244a208e31f Message-Id: <20220505120918.B564E3856270@sourceware.org> Date: Thu, 5 May 2022 12:09:18 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 May 2022 12:09:18 -0000 https://gcc.gnu.org/g:7fd4e1ea35cb19c7dbf39a89dea2b244a208e31f commit 7fd4e1ea35cb19c7dbf39a89dea2b244a208e31f Author: Richard Sandiford Date: Wed Apr 20 08:09:18 2022 +0100 Hybrid Morello fix for convert_debug_memory_address When expanding hybrid Morello code like: int x; ... ... __CAP_ADDR x ... it's inevitable that we'll be asked to convert the non-capability address of x into a capability address. This is because expanding __CAP_ADDR x involves expanding x to a MEM and then converting the address of that MEM to the required mode. But the MEM obtained from expanding x is simply x's DECL_RTL; it isn't something we recalculate from scratch on demand, and so isn't something that's influenced by the consumer of the final value. On targets without address spaces, this MEM DECL_RTL will always have a Pmode or ptr_mode address. convert_memory_address_addr_space_1 has the following code to cope with this case: gcc_assert (! CAPABILITY_MODE_P (to_mode) || GET_CODE (x) == LABEL_REF || GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST); For the allowed LABEL_REF, SYMBOL_REF and CONST cases, the function recreates the constant address with the new capability mode in place of the original non-capability mode. The resulting pointer therefore has the right bounds, rather than being implicitly derived from DDC. However, as the existing TODO says, capability permissions and bounds aren't really relevant for an address calculated within a debugger (or other consumer of the debug information). And since DWARF is not strongly typed, there isn't really a distinction in DWARF between Pmode and CADImode symbolic constants. So debug expressions are laxer in two ways: they don't need to worry about preserving provenance, and they don't need to worry (too much) about strong typing. Despite that, the expressions created during debug expansion are first represented as RTL, rather than directly as DWARF, and RTL only allows us to relax the provenance side, not the typing side. The easiest fix therefore seems to be: - allow any address conversion for debug purposes (only) - calculate the address normally - wrap the address in (pointer_plus (const_null) X) when it needs to be converted from a non-capability to a capability There is already code in loc_descriptor to optimise this pointer_plus away. Diff: --- gcc/cfgexpand.c | 33 ++++++++++++++-------- .../aarch64/morello/hybrid-addr-expr-4.c | 2 +- .../aarch64/morello/hybrid-addr-expr-5.c | 2 +- .../aarch64/morello/hybrid-addr-expr-6.c | 2 +- .../aarch64/morello/hybrid-addr-expr-7.c | 2 +- .../aarch64/morello/hybrid-addr-expr-8.c | 2 +- 6 files changed, 27 insertions(+), 16 deletions(-) diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index d685e3968da..305c2d07233 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -4066,19 +4066,30 @@ convert_debug_memory_address (scalar_addr_mode mode, rtx x, if (GET_MODE (x) == mode || GET_MODE (x) == VOIDmode) return x; - /* We can't convert a mode to a capability mode. - However, in debug expressions this doesn't really matter since the - pointer will not actually be used for dereferencing. - MORELLO TODO - We're adding this line here just to alert us when we try and convert to a - capability mode, but it's probably better to do something like just use - the noncapability_mode since I guess that will be all the debugger can - use. */ - gcc_assert (! CAPABILITY_MODE_P (mode)); - /* X must have some form of address mode already. */ scalar_addr_mode xmode = as_a (GET_MODE (x)); - if (GET_MODE_PRECISION (mode) < GET_MODE_PRECISION (xmode)) + if (CAPABILITY_MODE_P (mode) && !CAPABILITY_MODE_P (xmode)) + { + /* The debug information can't (and doesn't need to) add valid + metadata to a non-capability pointer. It just needs to specify + the capability value. However, the rtl we create here still has + to be type-correct, so wrap the capability value in a + + (pointer_plus (const_null) VALUE) + + We can optimize this scaffolding away when outputting the + information. + + Note that consumers of the debug information are expected + to perform address arithmetic in the precision of offset_mode (mode) + rather than in the precision of mode, so that there is no problem + with excess precision. */ + rtx off = convert_debug_memory_address (offset_mode (mode), x, as); + x = gen_pointer_plus (mode, CONST0_RTX (mode), off); + if (CONSTANT_P (off)) + x = gen_rtx_CONST (mode, x); + } + else if (GET_MODE_PRECISION (mode) < GET_MODE_PRECISION (xmode)) x = lowpart_subreg (mode, x, xmode); else if (POINTERS_EXTEND_UNSIGNED > 0) x = gen_rtx_ZERO_EXTEND (mode, x); diff --git a/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-4.c b/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-4.c index 9f6ab6a54ce..6c75c03cc36 100644 --- a/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-4.c +++ b/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-4.c @@ -1,5 +1,5 @@ /* { dg-do assemble } */ -/* { dg-additional-options "-mcmodel=small -fPIC -fgimple -g0 -save-temps" } */ +/* { dg-additional-options "-mcmodel=small -fPIC -fgimple -save-temps" } */ /* { dg-final { check-function-bodies "**" "" } } */ /* { dg-skip-if "" { *-*-* } { "-O0" "-mabi=purecap" "-mfake-capability" } { "" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-5.c b/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-5.c index 53368e6dfab..336af2385f9 100644 --- a/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-5.c +++ b/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-5.c @@ -1,5 +1,5 @@ /* { dg-do assemble } */ -/* { dg-additional-options "-mcmodel=small -fno-PIC -mpc-relative-literal-loads -fgimple -g0 -save-temps" } */ +/* { dg-additional-options "-mcmodel=small -fno-PIC -mpc-relative-literal-loads -fgimple -save-temps" } */ /* { dg-final { check-function-bodies "**" "" } } */ /* { dg-skip-if "" { *-*-* } { "-O0" "-mabi=purecap" "-mfake-capability" } { "" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-6.c b/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-6.c index 7ed909424db..b2de53702bd 100644 --- a/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-6.c +++ b/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-6.c @@ -1,5 +1,5 @@ /* { dg-do assemble } */ -/* { dg-additional-options "-mcmodel=small -fPIC -mpc-relative-literal-loads -fgimple -g0 -save-temps" } */ +/* { dg-additional-options "-mcmodel=small -fPIC -mpc-relative-literal-loads -fgimple -save-temps" } */ /* { dg-final { check-function-bodies "**" "" } } */ /* { dg-skip-if "" { *-*-* } { "-O0" "-mabi=purecap" "-mfake-capability" } { "" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-7.c b/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-7.c index 89ba1759861..28815382ad4 100644 --- a/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-7.c +++ b/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-7.c @@ -1,5 +1,5 @@ /* { dg-do assemble } */ -/* { dg-additional-options "-mcmodel=large -fno-PIC -fgimple -g0 -save-temps" } */ +/* { dg-additional-options "-mcmodel=large -fno-PIC -fgimple -save-temps" } */ /* { dg-final { check-function-bodies "**" "" } } */ /* { dg-skip-if "" { *-*-* } { "-O0" "-mabi=purecap" "-mfake-capability" } { "" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-8.c b/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-8.c index ef2129371c1..e3af4896246 100644 --- a/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-8.c +++ b/gcc/testsuite/gcc.target/aarch64/morello/hybrid-addr-expr-8.c @@ -1,5 +1,5 @@ /* { dg-do assemble } */ -/* { dg-additional-options "-mcmodel=large -fno-PIC -mpc-relative-literal-loads -fgimple -g0 -save-temps" } */ +/* { dg-additional-options "-mcmodel=large -fno-PIC -mpc-relative-literal-loads -fgimple -save-temps" } */ /* { dg-final { check-function-bodies "**" "" } } */ /* { dg-skip-if "" { *-*-* } { "-O0" "-mabi=purecap" "-mfake-capability" } { "" } } */