[PATCH tree-inline] Do not say "called from here" with UNKNOWN_LOCATION
authorManuel López-Ibáñez <manu@gcc.gnu.org>
Tue, 22 Sep 2015 09:14:04 +0000 (09:14 +0000)
committerManuel López-Ibáñez <manu@gcc.gnu.org>
Tue, 22 Sep 2015 09:14:04 +0000 (09:14 +0000)
In https://sourceware.org/ml/libc-alpha/2014-12/msg00300.html, we give a
"called from here" note without actually having a location, which looks
strange. I haven't been able to generate such a testcase. If this happens,
try to at least point to the current function being called. If that location is
also unknown, skip the extra note.

gcc/ChangeLog:

2015-09-22  Manuel López-Ibáñez  <manu@gcc.gnu.org>

* tree-inline.c (expand_call_inline): Use inform for extra note.
Do not give a note with UNKNOWN_LOCATION.
Replace input_location with gimple_location (stmt).
Use true/false instead of TRUE/FALSE.

gcc/testsuite/ChangeLog:

2015-09-22  Manuel López-Ibáñez  <manu@gcc.gnu.org>

* gcc.target/i386/inline_error.c (int bar): Use dg-message for note.
* gcc.target/i386/pr57756.c (static __inline int caller): Likewise.
* gcc.target/i386/pr59789.c (f1): Likewise.
* gcc.target/i386/intrinsics_5.c (__m128i foo): Likewise.
* gcc.target/i386/intrinsics_6.c: Likewise.
* gcc.dg/winline-5.c (int t): Likewise.
* gcc.dg/winline-9.c (t): Likewise.
* gcc.dg/always_inline2.c (q): Likewise.
* gcc.dg/winline-2.c (inline int t): Likewise.
* gcc.dg/winline-6.c: Likewise.
* gcc.dg/winline-10.c (void g): Likewise.
* gcc.dg/pr49243.c (void parse): Likewise.
* gcc.dg/always_inline3.c (q2): Likewise.
* gcc.dg/winline-3.c: Likewise.
* gcc.dg/winline-7.c (inline void *t): Likewise.

From-SVN: r227997

18 files changed:
gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/always_inline2.c
gcc/testsuite/gcc.dg/always_inline3.c
gcc/testsuite/gcc.dg/pr49243.c
gcc/testsuite/gcc.dg/winline-10.c
gcc/testsuite/gcc.dg/winline-2.c
gcc/testsuite/gcc.dg/winline-3.c
gcc/testsuite/gcc.dg/winline-5.c
gcc/testsuite/gcc.dg/winline-6.c
gcc/testsuite/gcc.dg/winline-7.c
gcc/testsuite/gcc.dg/winline-9.c
gcc/testsuite/gcc.target/i386/inline_error.c
gcc/testsuite/gcc.target/i386/intrinsics_5.c
gcc/testsuite/gcc.target/i386/intrinsics_6.c
gcc/testsuite/gcc.target/i386/pr57756.c
gcc/testsuite/gcc.target/i386/pr59789.c
gcc/tree-inline.c

index 3dd8a1d6d8a68792a18924b46537fbaa90083b3d..86b5c21f5014865236561db0a923967834629dc9 100644 (file)
@@ -1,3 +1,10 @@
+2015-09-22  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       * tree-inline.c (expand_call_inline): Use inform for extra note.
+       Do not give a note with UNKNOWN_LOCATION.
+       Replace input_location with gimple_location (stmt).
+       Use true/false instead of TRUE/FALSE.
+
 2015-09-22  Tom de Vries  <tom@codesourcery.com>
 
        PR tree-optimization/67666
index 0f5d39c3586bbe3f8150f8469ade01dff62ba49a..e5c415e3b7d3e6c8305c28d23b7d7d3629174c6c 100644 (file)
@@ -1,3 +1,21 @@
+2015-09-22  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       * gcc.target/i386/inline_error.c (int bar): Use dg-message for note.
+       * gcc.target/i386/pr57756.c (static __inline int caller): Likewise.
+       * gcc.target/i386/pr59789.c (f1): Likewise.
+       * gcc.target/i386/intrinsics_5.c (__m128i foo): Likewise.
+       * gcc.target/i386/intrinsics_6.c: Likewise.
+       * gcc.dg/winline-5.c (int t): Likewise.
+       * gcc.dg/winline-9.c (t): Likewise.
+       * gcc.dg/always_inline2.c (q): Likewise.
+       * gcc.dg/winline-2.c (inline int t): Likewise.
+       * gcc.dg/winline-6.c: Likewise.
+       * gcc.dg/winline-10.c (void g): Likewise.
+       * gcc.dg/pr49243.c (void parse): Likewise.
+       * gcc.dg/always_inline3.c (q2): Likewise.
+       * gcc.dg/winline-3.c: Likewise.
+       * gcc.dg/winline-7.c (inline void *t): Likewise.
+
 2015-09-22  Tom de Vries  <tom@codesourcery.com>
 
        PR tree-optimization/67666
index 297159b6d668b6fea115ff506913fb143f1253dd..89b439f4eb2a6e97fc24232b5cc390720794b103 100644 (file)
@@ -4,5 +4,5 @@ inline __attribute__ ((always_inline)) void t(void); /* { dg-error "body not ava
 void
 q(void)
 {
-  t();                                 /* { dg-error "called from here" } */
+  t();                                 /* { dg-message "called from here" } */
 }
index 5d55e4d7e1830156da39fbd6b8c08cb83aaa8d47..1bd2b6d57fedb388e7c52ae263601f505b11ff51 100644 (file)
@@ -6,6 +6,6 @@ q2(void) /* { dg-error "recursive inlining" } */
 {
   if (do_something_evil ())
     return;
-  q2();                        /* { dg-error "called from here" } */
+  q2();                        /* { dg-message "called from here" } */
   q2(); /* With -O2 we don't warn here, it is eliminated by tail recursion.  */
 }
index f896b05b06018da00d078ec10bcaa446617bfd9a..78ac226aa2492815b197c073ea27ecc3800c7f5f 100644 (file)
@@ -20,6 +20,6 @@ static inline int wrapper(const char **s_ptr) /* { dg-warning "(inlining failed|
 void parse(const char *data)
 {
     const char *s = data;
-    if (!(wrapper(&s) == -1 && (s - data) == 1)) /* { dg-warning "called from here" } */
+    if (!(wrapper(&s) == -1 && (s - data) == 1)) /* { dg-message "called from here" } */
        __builtin_abort();
 }
index 2106253fcf278d5108c36f55f68b90d15d3062e5..b781bc6f6562b5f522dfbcc21cbcf13a849c383f 100644 (file)
@@ -11,7 +11,7 @@ inline void f (x)     /* { dg-warning "inlining .* mismatched arg" "" } */
 
 void g (struct s x)
 {
-  f (x);               /* { dg-warning "called from here" "" } */
+  f (x);               /* { dg-message "called from here" } */
 }
 
 void f (int x);                /* { dg-warning "follows non-prototype definition" } */
index f47c38c709526226d93fae8869d60c8c558895d8..f4f7cc48104aff56bdb6087223d35e069e195db1 100644 (file)
@@ -4,5 +4,5 @@
 inline int q(void);             /* { dg-warning "body not available" "" } */
 inline int t(void)
 {
-       return q();              /* { dg-warning "called from here" "" } */
+       return q();              /* { dg-message "called from here" } */
 }
index 0540a243e24802a21dd06a087aa3cda7ce3fbf73..6c5d6ae544045f05148af9825b5e9a536c9fdb1e 100644 (file)
@@ -17,5 +17,5 @@ inline int q(void) /* { dg-warning "max-inline-insns-single" "" } */
 }
 inline int t (void)
 {
-       return q ();             /* { dg-warning "called from here" "" } */
+       return q ();             /* { dg-message "called from here" } */
 }
index da4be45eb2984375a98449624a4a4cf1147e1c35..a587e969ad2dda59c1f9a5d4aa15343ffdd226ea 100644 (file)
@@ -17,5 +17,5 @@ inline int q(void) /* { dg-warning "inline-unit-growth" } */
 }
 int t (void)
 {
-       return q ();             /* { dg-warning "called from here" } */
+       return q ();             /* { dg-message "called from here" } */
 }
index 35e3aacb4b822a2bb90d10808dbf7d59915e0f8d..9e89976cffda65a944f837a3123a64dada706214 100644 (file)
@@ -17,5 +17,5 @@ inline int q(void) /* { dg-warning "large-function-growth" } */
 }
 inline int t (void)
 {
-       return q () + 1;         /* { dg-warning "called from here" } */
+       return q () + 1;         /* { dg-message "called from here" } */
 }
index e3ac1296583fd48b5cb2b5d0bff92c51f18a1984..34deca42592dfc5a33c0fa8fe4f24fe3d967f024 100644 (file)
@@ -11,5 +11,5 @@ inline void *q (void) /* { dg-warning "(function not inlinable|alloca)" } */
 }
 inline void *t (void)
 {
-       return q ();             /* { dg-warning "called from here" } */
+       return q ();             /* { dg-message "called from here" } */
 }
index c8b18c912a841e09862773e3aa47277887514795..f97a76494c5b4151f384c0812cb84bdb885299cb 100644 (file)
@@ -22,5 +22,5 @@ t()
   if (a)
     aa();
   if (b)
-    bb();                      /* { dg-warning "called from here" "" } */
+    bb();                      /* { dg-message "called from here" } */
 }
index da1cea10ca07fd568272c86c49020c9cbc7f17d5..18e506631ebffde0e8b85f7a157f4931c45417fe 100644 (file)
@@ -9,5 +9,5 @@ foo () /* { dg-error "inlining failed in call to always_inline .* target specifi
 
 int bar()
 {
-  return foo (); /* { dg-error "called from here" } */
+  return foo (); /* { dg-message "called from here" } */
 }
index e4486b17acd5598d693b5ce040ccac3dbb3776bc..6fd71741fe6e4efcef93071510c079a5f2286740 100644 (file)
@@ -10,7 +10,7 @@
 
 __m128i foo(__m128i *V)
 {
-    return _mm_stream_load_si128(V); /* { dg-error "called from here" } */
+    return _mm_stream_load_si128(V); /* { dg-message "called from here" } */
 }
 
 /* { dg-prune-output ".*inlining failed.*" }  */
index eea22bb79517d4da2ee2740d6e19e127cf170740..e58673980638b2ae90ad891906decee599627944 100644 (file)
@@ -10,7 +10,7 @@
 
 __m128i foo(__m128i *V)
 {
-    return _mm_stream_load_si128(V); /* { dg-error "called from here" } */
+    return _mm_stream_load_si128(V); /* { dg-message "called from here" } */
 }
 
 /* { dg-prune-output ".*inlining failed.*" }  */
index 7edd4b5d697e107bdb583b6b78bec393ee91d0fc..25c565c879a2cf4305faa04853d001f08890d597 100644 (file)
@@ -11,7 +11,7 @@ __inline int callee () /* { dg-error "inlining failed in call to always_inline"
 __attribute__((target("sse")))
 static __inline int caller ()
 {
-  return callee(); /* { dg-error "called from here" }  */
+  return callee(); /* { dg-message "called from here" }  */
 }
 
 int main ()
index b1440254bb0b233f8f9e73a292a2c5e55e038ddf..d320578f75eaa3b1bb5f34157d03cd4e66f2db38 100644 (file)
@@ -18,5 +18,5 @@ _mm_set_epi32 (int __q3, int __q2, int __q1, int __q0) /* { dg-error "target spe
 __m128i
 f1(void)
 { /* { dg-message "warning: SSE vector return without SSE enabled changes the ABI" } */
-  return _mm_set_epi32 (0, 0, 0, 0); /* { dg-error "called from here" } */
+  return _mm_set_epi32 (0, 0, 0, 0); /* { dg-message "called from here" } */
 }
index abaea3f64d9d9fbb68c2cf3ac6455dde3bcebb98..b7874668fb370eb0f6bbef0a9e6a755bc1dfe09f 100644 (file)
@@ -4384,21 +4384,19 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
   tree return_slot;
   tree modify_dest;
   tree return_bounds = NULL;
-  location_t saved_location;
   struct cgraph_edge *cg_edge;
   cgraph_inline_failed_t reason;
   basic_block return_block;
   edge e;
   gimple_stmt_iterator gsi, stmt_gsi;
-  bool successfully_inlined = FALSE;
+  bool successfully_inlined = false;
   bool purge_dead_abnormal_edges;
   gcall *call_stmt;
   unsigned int i;
 
-  /* Set input_location here so we get the right instantiation context
-     if we call instantiate_decl from inlinable_function_p.  */
-  /* FIXME: instantiate_decl isn't called by inlinable_function_p.  */
-  saved_location = input_location;
+  /* The gimplifier uses input_location in too many places, such as
+     internal_get_tmp_var ().  */
+  location_t saved_location = input_location;
   input_location = gimple_location (stmt);
 
   /* From here on, we're only interested in CALL_EXPRs.  */
@@ -4454,7 +4452,11 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
        {
          error ("inlining failed in call to always_inline %q+F: %s", fn,
                 cgraph_inline_failed_string (reason));
-         error ("called from here");
+         if (gimple_location (stmt) != UNKNOWN_LOCATION)
+           inform (gimple_location (stmt), "called from here");
+         else if (DECL_SOURCE_LOCATION (cfun->decl) != UNKNOWN_LOCATION)
+           inform (DECL_SOURCE_LOCATION (cfun->decl),
+                   "called from this function");
        }
       else if (warn_inline
               && DECL_DECLARED_INLINE_P (fn)
@@ -4467,9 +4469,15 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
               /* Avoid warnings during early inline pass. */
               && symtab->global_info_ready)
        {
-         warning (OPT_Winline, "inlining failed in call to %q+F: %s",
-                  fn, _(cgraph_inline_failed_string (reason)));
-         warning (OPT_Winline, "called from here");
+         if (warning (OPT_Winline, "inlining failed in call to %q+F: %s",
+                      fn, _(cgraph_inline_failed_string (reason))))
+           {
+             if (gimple_location (stmt) != UNKNOWN_LOCATION)
+               inform (gimple_location (stmt), "called from here");
+             else if (DECL_SOURCE_LOCATION (cfun->decl) != UNKNOWN_LOCATION)
+               inform (DECL_SOURCE_LOCATION (cfun->decl),
+                       "called from this function");
+           }
        }
       goto egress;
     }
@@ -4534,7 +4542,8 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
     {
       id->block = make_node (BLOCK);
       BLOCK_ABSTRACT_ORIGIN (id->block) = fn;
-      BLOCK_SOURCE_LOCATION (id->block) = LOCATION_LOCUS (input_location);
+      BLOCK_SOURCE_LOCATION (id->block) 
+       = LOCATION_LOCUS (gimple_location (stmt));
       prepend_lexical_block (gimple_block (stmt), id->block);
     }
 
@@ -4799,7 +4808,7 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
   cg_edge->callee->remove ();
 
   id->block = NULL_TREE;
-  successfully_inlined = TRUE;
+  successfully_inlined = true;
 
  egress:
   input_location = saved_location;