[avr] Improve location of late diagnostics

Message ID 6ef8c5a8-ac0d-49f0-ab5c-99bd9b8a3830@gjlay.de
State New
Headers
Series [avr] Improve location of late diagnostics |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 success Test passed
linaro-tcwg-bot/tcwg_gcc_check--master-arm fail Patch failed to apply

Commit Message

Georg-Johann Lay Dec. 3, 2024, 1:32 p.m. UTC
  Some diagnostics are issues late, e.g. in avr_print_operand().
This patch uses the insn's location as a proxy for the operand
location.  Without the patch, the location is usually input_location,
which points to the closing } of the function body.

Ok for trunk?

Johan

--

AVR: Improve location of late diagnostics.

Some diagnostics are issues late, e.g. in avr_print_operand().
This patch uses the insn's location as a proxy for the operand
location.  Without the patch, the location is usually input_location,
which points to the closing } of the function body.

gcc/
	* config/avr/avr.cc (avr_insn_location): New variable.
	(avr_final_prescan_insn): Set avr_insn_location.
	(avr_asm_final_postscan_insn): Unset avr_insn_location after last insn.
	(avr_print_operand): Pass avr_insn_location to warning_at.

gcc/testsuite/
	* gcc.dg/Warray-bounds-33.c: Adjust for avr diagnostics.
	* gcc.dg/pr56228.c: Same.
	* gcc.dg/pr86124.c: Same.
	* gcc.dg/pr94291.c: Same.
	* gcc.dg/tree-ssa/pr82059.c: Same.
  

Comments

Denis Chertykov Dec. 3, 2024, 3:42 p.m. UTC | #1
вт, 3 дек. 2024 г. в 17:32, Georg-Johann Lay <avr@gjlay.de>:
>
> Some diagnostics are issues late, e.g. in avr_print_operand().
> This patch uses the insn's location as a proxy for the operand
> location.  Without the patch, the location is usually input_location,
> which points to the closing } of the function body.
>
> Ok for trunk?

Ok.

Denis.
  

Patch

    AVR: Improve location of late diagnostics.
    
    Some diagnostics are issues late, e.g. in avr_print_operand().
    This patch uses the insn's location as a proxy for the operand
    location.  Without the patch, the location is usually input_location,
    which points to the closing } of the function body.
    
    gcc/
            * config/avr/avr.cc (avr_insn_location): New variable.
            (avr_final_prescan_insn): Set avr_insn_location.
            (avr_asm_final_postscan_insn): Unset avr_insn_location after last insn.
            (avr_print_operand): Pass avr_insn_location to warning_at.
    
    gcc/testsuite/
            * gcc.dg/Warray-bounds-33.c: Adjust for avr diagnostics.
            * gcc.dg/pr56228.c: Same.
            * gcc.dg/pr86124.c: Same.
            * gcc.dg/pr94291.c: Same.
            * gcc.dg/tree-ssa/pr82059.c: Same.

diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc
index ccf9b05bb3e..9bebd67cd9c 100644
--- a/gcc/config/avr/avr.cc
+++ b/gcc/config/avr/avr.cc
@@ -234,6 +234,7 @@  bool avr_has_rodata_p = false;
    insn condition for shift insn splitters.  */
 int n_avr_fuse_add_executed = 0;
 
+static location_t avr_insn_location = UNKNOWN_LOCATION;
 
 
 /* Transform UP into lowercase and write the result to LO.
@@ -2712,12 +2713,17 @@  avr_print_operand (FILE *file, rtx x, int code)
 	    fatal_insn ("bad address, not a constant:", addr);
 	  /* Assembler template with m-code is data - not progmem section */
 	  if (text_segment_operand (addr, VOIDmode))
-	    if (warning (0, "accessing data memory with"
-			 " program memory address"))
-	      {
-		output_addr_const (stderr, addr);
-		fprintf(stderr,"\n");
-	      }
+	    {
+	      location_t loc = avr_insn_location != UNKNOWN_LOCATION
+		? avr_insn_location
+		: input_location;
+	      if (warning_at (loc, 0, "accessing data memory with"
+			      " program memory address"))
+		{
+		  output_addr_const (stderr, addr);
+		  fprintf (stderr,"\n");
+		}
+	    }
 	  output_addr_const (file, addr);
 	}
       else if (code == 'o')
@@ -2760,12 +2766,17 @@  avr_print_operand (FILE *file, rtx x, int code)
     {
       /* Constant progmem address - like used in jmp or call */
       if (text_segment_operand (x, VOIDmode) == 0)
-	if (warning (0, "accessing program memory"
-		     " with data memory address"))
-	  {
-	    output_addr_const (stderr, x);
-	    fprintf (stderr, "\n");
-	  }
+	{
+	  location_t loc = avr_insn_location != UNKNOWN_LOCATION
+	    ? avr_insn_location
+	    : input_location;
+	  if (warning_at (loc, 0, "accessing program memory"
+			  " with data memory address"))
+	    {
+	      output_addr_const (stderr, x);
+	      fprintf (stderr, "\n");
+	    }
+	}
       /* Use normal symbol for direct address no linker trampoline needed */
       output_addr_const (file, x);
     }
@@ -2954,6 +2965,8 @@  void
 avr_final_prescan_insn (rtx_insn *insn, rtx * /*operands*/,
 			int /*num_operands*/)
 {
+  avr_insn_location = LOCATION_LOCUS (INSN_LOCATION (insn));
+
   if (avr_log.rtx_costs)
     {
       rtx set = single_set (insn);
@@ -2982,6 +2995,9 @@  avr_final_prescan_insn (rtx_insn *insn, rtx * /*operands*/,
 static void
 avr_asm_final_postscan_insn (FILE *stream, rtx_insn *insn, rtx *, int)
 {
+  if (!next_real_insn (insn))
+    avr_insn_location = UNKNOWN_LOCATION;
+
   if (cfun->machine->gasisr.yes
       && !next_real_insn (insn))
     {
diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-33.c b/gcc/testsuite/gcc.dg/Warray-bounds-33.c
index 13efabe33b6..5f06471f820 100644
--- a/gcc/testsuite/gcc.dg/Warray-bounds-33.c
+++ b/gcc/testsuite/gcc.dg/Warray-bounds-33.c
@@ -2,7 +2,6 @@ 
    an object of incomplete type
    { dg-do compile }
    { dg-options "-O2 -Wall" }  */
-/* { dg-skip-if "acessing data memory with program memory address" { "avr-*-*" } } */
 
 struct S
 {
@@ -30,7 +29,7 @@  void test_incomplete_enum (void)
 void test_func (void)
 {
   struct S *b = (struct S*)&f;
-  if (b->s)
+  if (b->s) /* { dg-warning "accessing data memory with program memory address.*" "" { target avr-*-* } } */
     f ();
 }
 
diff --git a/gcc/testsuite/gcc.dg/pr56228.c b/gcc/testsuite/gcc.dg/pr56228.c
index 6e2b4b1ab99..79699a21c16 100644
--- a/gcc/testsuite/gcc.dg/pr56228.c
+++ b/gcc/testsuite/gcc.dg/pr56228.c
@@ -1,7 +1,6 @@ 
 /* PR target/56228 */
 /* { dg-do assemble } */
 /* { dg-options "-O2" } */
-/* { dg-skip-if "accessing program memory with data memory address" { "avr-*-*" } } */
 
 short a[14] = { 1, 2 };
 short b[15] = { 3, 4 };
@@ -11,7 +10,7 @@  foo ()
 {
   void (*fna) (void) = (void (*) (void)) a;
   void (*fnb) (void) = (void (*) (void)) b;
-  fna ();
+  fna (); /* { dg-warning "accessing program memory with data memory address.*" "" { target avr-*-* } } */
   fnb ();
   return a[1] == b[1];
 }
diff --git a/gcc/testsuite/gcc.dg/pr86124.c b/gcc/testsuite/gcc.dg/pr86124.c
index c8a66ffbfb4..ebcaed78842 100644
--- a/gcc/testsuite/gcc.dg/pr86124.c
+++ b/gcc/testsuite/gcc.dg/pr86124.c
@@ -1,6 +1,5 @@ 
 /* { dg-do compile } */
 /* { dg-options "-O -fipa-pta" } */
-/* { dg-skip-if "acessing data memory with program memory address" { "avr-*-*" } } */
 
 extern void a (void);
 
@@ -8,5 +7,5 @@  void b (void)
 {
   void *c;
   c = a;
-  *(char *)c = 1;
+  *(char *)c = 1; /* { dg-warning "accessing data memory with program memory address.*" "" { target avr-*-* } } */
 }
diff --git a/gcc/testsuite/gcc.dg/pr94291.c b/gcc/testsuite/gcc.dg/pr94291.c
index 7d9331b391f..400524cc506 100644
--- a/gcc/testsuite/gcc.dg/pr94291.c
+++ b/gcc/testsuite/gcc.dg/pr94291.c
@@ -1,7 +1,6 @@ 
 /* PR rtl-optimization/94291 */
 /* { dg-do compile } */
 /* { dg-options "-Og" } */
-/* { dg-skip-if "accessing data memory with program memory address" { "avr-*-*" } } */
 
 unsigned a;
 
@@ -10,6 +9,7 @@  foo (void)
 {
   unsigned x
     = (__builtin_sub_overflow ((long long) a, 0, &x)
-       ? 1 : (__INTPTR_TYPE__) __builtin_memmove (&x, foo, 1));
+       ? 1 : (__INTPTR_TYPE__) __builtin_memmove (&x, foo, 1)); /* { dg-warning "accessing data memory with program memory address.*" "" { target avr-*-* } } */
+
   return a;
 }
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr82059.c b/gcc/testsuite/gcc.dg/tree-ssa/pr82059.c
index 6421101b867..ffa643faa17 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr82059.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr82059.c
@@ -1,7 +1,6 @@ 
 /* PR tree-optimization/82059 */
 /* { dg-do compile } */
 /* { dg-options "-O2 -fdump-tree-isolate-paths" } */
-/* { dg-skip-if "accessing data memory with program memory address" { avr-*-* } } */
 
 struct a
 {
@@ -19,5 +18,5 @@  h ()
   if (!i)
     d ();
   i->c = &f;
-  i->b = *(char *) h;
+  i->b = *(char *) h; /* { dg-warning "accessing data memory with program memory address.*" "" { target avr-*-* } } */
 }