[Bug c/31886] New: (different from bug report c/31077 and 29241) C handling of always_inline attribute error and a solution

zhouyi04 at ios dot cn gcc-bugzilla@gcc.gnu.org
Thu May 10 03:07:00 GMT 2007


When compiling following code with no optimize flags given, gcc will complain:
      1 __attribute__((always_inline)) unsigned int
      2 alloc_null_binding1(void)
      3 {
      4  return 1;
      5 }
      6
      7 static inline __attribute__((always_inline)) int
ip_nat_initialized1(void)
      8 {
      9
     10    return 2;
     11 }
     12
     13 int ip_nat_rule_find1(void)
     14 {
     15  int ret;
     16  if (!ip_nat_initialized1()){
     17    ret = alloc_null_binding1();
     18   }
     19  return ret;
     20 }
/***************************************************************
****************************************************************
***************************************************************/
[root@zzy inline]gcc -S hello.c
hello.c: In function 'ip_nat_rule_find1':
hello.c:3: sorry, unimplemented: inlining failed in call to
'alloc_null_binding1': function body not available
hello.c:17: sorry, unimplemented: called from here
/***************************************************************
****************************************************************
***************************************************************/
solutions:
Solution 1:
--- gcc-4.1.0/gcc/tree-optimize.c.back  2007-05-09 22:38:58.000000000 -0400
+++ gcc-4.1.0/gcc/tree-optimize.c       2007-05-09 22:38:31.000000000 -0400
@@ -389,9 +389,15 @@
          break;
       if (e)
        {
-         timevar_push (TV_INTEGRATION);
-         optimize_inline_calls (fndecl);
-         timevar_pop (TV_INTEGRATION);
+         for (e = node->callees; e; e = e->next_callee)
+           if (e->inline_failed && !warn_inline)
+             break;
+         if (!e)
+           {
+             timevar_push (TV_INTEGRATION);
+             optimize_inline_calls (fndecl);
+             timevar_pop (TV_INTEGRATION);
+           }
        }
     }
   /* We are not going to maintain the cgraph edges up to date.

/***************************************************************
****************************************************************
***************************************************************/
Solution 2:
--- gcc-4.1.0/gcc/cgraphunit.c.back     2007-05-09 22:41:35.000000000 -0400
+++ gcc-4.1.0/gcc/cgraphunit.c  2007-05-09 22:24:21.000000000 -0400
@@ -1206,7 +1206,7 @@
   if (dump_enabled_p (TDI_tree_all))
     return true;
   if (!cgraph_global_info_ready)
-    return (DECL_INLINE (decl) && !flag_really_no_inline);
+    return ((DECL_INLINE (decl) && !flag_really_no_inline)||lookup_attribute
("always_inline", DECL_ATTRIBUTES (decl)));
   /* Look if there is any clone around.  */
   for (node = cgraph_node (decl); node; node = node->next_clone)
     if (node->global.inlined_to)
--- gcc-4.1.0/gcc/tree-inline.c.back    2007-05-09 22:41:18.000000000 -0400
+++ gcc-4.1.0/gcc/tree-inline.c 2007-05-09 22:35:12.000000000 -0400
@@ -1594,6 +1594,8 @@
     }

   /* Squirrel away the result so that we don't have to check again.  */
+  if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
+    inlinable = true;
   DECL_UNINLINABLE (fn) = !inlinable;

   return inlinable;

/***************************************************************
****************************************************************
***************************************************************/

Sincerely yours
Zhouyi Zhou


-- 
           Summary: (different from bug report c/31077 and 29241) C handling
                    of always_inline attribute error and a solution
           Product: gcc
           Version: 4.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: zhouyi04 at ios dot cn
 GCC build triplet: Linux i686 GNU/Linux
  GCC host triplet: Linux i686 GNU/Linux
GCC target triplet: Linux i686 GNU/Linux


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31886



More information about the Gcc-bugs mailing list