The patch is now ready, reviewed by Fred Chow and discussed with pathscale
guys. Thanks

besides fixing bug838, the patch also enhances the gnu compatibility:
(1). enables -O0 -inline now
(2). does not delete non-callable static functions under O0
(3). bug838-1 to bug838-6 at the open64.net regression test suite prove
that.

we also provide a _GNU_COMPATIBLE macro to identify the compiler is gnu
compatible one. For other backends with no gnu compatible interest, you can
set
BUILD_GNU_COMPATIBLE=FALSE in Makefile.gsetup.in

Any comments please let us know.

If no one objects, I will check the patch in tomorrow.

Regards
Gang

below is the patch:

diff --git a/osprey/Makefile.gsetup.in b/osprey/Makefile.gsetup.in
index b7df96c..c987f08 100644
--- a/osprey/Makefile.gsetup.in
+++ b/osprey/Makefile.gsetup.in
@@ -76,6 +76,7 @@
 #     BUILD_OS      = specifies OS (LINUX only right now)
 #     BUILD_HOST     = specifies host that are building on
(MIPS/IA32/IA64/SL)
 #                      [defaults to $(BUILD_ARCH)].
+#     BUILD_GNU_COMPATIBLE = specifies whether to be gnu compatible
 #
 #  Default values for BUILD_* parameters are set here with values from the
 #  configure script.  BUILD_BASE is not set by configure but must be set
@@ -156,6 +157,9 @@ endif
 ifndef GCC_DIR
      GCC_DIR = @GCC_DIR@
 endif
+ifndef BUILD_GNU_COMPATIBLE
+     BUILD_GNU_COMPATIBLE = YES
+endif

 #  For cross compilers, there are really 3 separate variables:
 #  the build host (machine you are building on),
@@ -664,6 +668,9 @@ STD_COMPILE_OPTS += -DKEY -DOSP_OPT -DPATHSCALE_MERGE
-DPSC_TO_OPEN64 $(LOCAL_CF
 ifeq ($(BUILD_TYPE), SHARED)
 STD_COMPILE_OPTS += -DSHARED_BUILD
 endif
+ifeq ($(BUILD_GNU_COMPATIBLE), YES)
+STD_COMPILE_OPTS += -D_GNU_COMPATIBLE
+endif

 #
 #  Assign STD_C++_OPTS here
        Modified osprey/driver/phases.c
diff --git a/osprey/driver/phases.c b/osprey/driver/phases.c
index 8451756..b67f1dd 100644
--- a/osprey/driver/phases.c
+++ b/osprey/driver/phases.c
@@ -3228,6 +3228,18 @@ run_compiler (int argc, char *argv[])
                } else {
                        args = init_string_list();
                        add_file_args_first (args, phase_order[i]);  // bug
6874
+#ifdef _GNU_COMPATIBLE
+                       if (phase_order[i] == P_inline &&
+                           run_inline == TRUE &&
+                           olevel == 0 &&
+                           !(option_was_seen(O_INLINE_) ||
+                           option_was_seen(O_INLINE) ||
+                           option_was_seen(O_inline) ||
+                           option_was_seen(O_finline) ||
+                           option_was_seen(O_finline_functions))) {
+                               prepend_option_seen
(add_string_option(O_INLINE_, "none"));
+                       }
+#endif
                        copy_phase_options (args, phase_order[i]);

                        if (!cmd_line_updated &&
        Modified osprey/driver/special_options.c
diff --git a/osprey/driver/special_options.c
b/osprey/driver/special_options.c
index 65f3092..fed6ed9 100644
--- a/osprey/driver/special_options.c
+++ b/osprey/driver/special_options.c
@@ -365,8 +365,14 @@ add_special_options (void)
         * -g to change the generated code so we leave it off always.
         * See bugs 1917 and 7595.
         */
+        /*
+          open64.net bug838, if defined _GNU_COMPATIBLE then, we
+          open inline for O0.
+        */
+#ifndef _GNU_COMPATIBLE
        if (olevel == 0 && inline_t == UNDEFINED)
          inline_t = FALSE;
+#endif

         /* In the SGI world, -g3 says to emit crippled debug info for use
         * with optimized code. In the GNU/Pathscale world, -g3 says to emit
        Modified osprey/ipa/inline/inline_driver.cxx
diff --git a/osprey/ipa/inline/inline_driver.cxx
b/osprey/ipa/inline/inline_driver.cxx
index 77704bc..5060e8b 100644
--- a/osprey/ipa/inline/inline_driver.cxx
+++ b/osprey/ipa/inline/inline_driver.cxx
@@ -196,6 +196,12 @@ Process_Command_Line (INT argc, char **argv)
                        Opt_Level = 2;
                        INLINE_Enable_Split_Common = FALSE;
                        break;
+#ifdef _GNU_COMPATIBLE
+                    case '0': /* setup O0 for lw_inline in gcc compatible
compiler*/
+                        Opt_Level = 0;
+                        INLINE_Enable_Split_Common = FALSE;
+                       break;
+#endif
                    default:
                        Opt_Level = 1;
                        INLINE_Enable_Split_Common = FALSE;
        Modified osprey/ipa/main/analyze/ipa_cg.cxx
diff --git a/osprey/ipa/main/analyze/ipa_cg.cxx
b/osprey/ipa/main/analyze/ipa_cg.cxx
index 5b58f01..ce74695 100644
--- a/osprey/ipa/main/analyze/ipa_cg.cxx
+++ b/osprey/ipa/main/analyze/ipa_cg.cxx
@@ -1848,6 +1848,14 @@ Mark_Deletable_Funcs (NODE_INDEX v, DFE_ACTION
action, mUINT8 *visited)
            node->Set_Undeletable();
            action = MARK_USED;
            visited[v] = VISITED_AND_KEEP;
+#if defined(_LIGHTWEIGHT_INLINER) && defined(_GNU_COMPATIBLE)
+        /* O0 does not delete functions with no inline attrib */
+        } else if (Opt_Level == 0 && ! node->Has_Inline_Attrib()) {
+          node->Clear_Deletable();
+          node->Set_Undeletable();
+          action = MARK_USED;
+          visited[v] = VISITED_AND_KEEP;
+#endif
        } else if (visited[v] == 0)
            visited[v] = VISITED_BUT_UNDECIDED;
        break;


On Wed, Oct 12, 2011 at 1:38 PM, Gang Yu <yugang...@gmail.com> wrote:

> Sorry for the duplication effort on this bug, before my patch, yongchong
> had also submitted a patch to the list.
>
> I personally think my patch will be better, since patch from build system
> does not solve the compability problem with gnu and -inline will do really
> inline which is not a desired behavior under O0. we can add options with
> -INLINE=on, -INLINE:none to work around, but this does not solve the root
> cause.
>
> Could gatekeeper on IPA or global gatekeeper help review this? it is a
> major severity bug in bugzilla.
>
> Here is his original mail:
>
> Hi
> Can a gatekeeper help review this patch, it's a bug fixed for bug#838
> When building the gcc front end with opencc -g -O0,  there is some
> dead functions that call other undefined functions. when building with
> gcc or opencc -O1 optimization above, the compiler will eliminated the
> dead function. But when building with opencc -O0, dead function would
> be kept, this fact will cause the undefined reference error.
> This patch will add options -INLINE when build using open64 to build
> the front end with DEBUG optimization. With -O0 -INLINE, the open64
> can eliminated the dead functions.
> Index: configure
> ===================================================================
> --- configure   (revision 3737)
> +++ configure   (working copy)
> @@ -1418,6 +1418,9 @@
>    DEBUG|debug)
>      BUILD_OPTIMIZE=DEBUG
>      GCC_CONFIGURE_CFLAGS="-O0 -g -DIs_True_On"
> +    if test "${BUILD_COMPILER}" = "OSP"; then
> +      GCC_CONFIGURE_CFLAGS="${GCC_CONFIGURE_CFLAGS} -INLINE"
> +    fi
>      ;;
>    *)
>      { { echo "$as_me:$LINENO: error: \"BUILD_OPTIMIZE=$BUILD_OPTIMIZE
> is not supported\"" >&5
> Index: configure.ac
> ===================================================================
> --- configure.ac        (revision 3737)
> +++ configure.ac        (working copy)
> @@ -88,6 +88,9 @@
>    DEBUG|debug)
>      BUILD_OPTIMIZE=DEBUG
>      GCC_CONFIGURE_CFLAGS="-O0 -g -DIs_True_On"
> +    if test "${BUILD_COMPILER}" = "OSP"; then
> +      GCC_CONFIGURE_CFLAGS="${GCC_CONFIGURE_CFLAGS} -INLINE"
> +    fi
>      ;;
>    *)
>      AC_MSG_ERROR(["BUILD_OPTIMIZE=$BUILD_OPTIMIZE is not supported"])
> --
> yongchong
>
>
> Regards
> Gang
>
>
> On Sat, Oct 8, 2011 at 9:26 AM, Gang Yu <yugang...@gmail.com> wrote:
>
>> Hi,
>>
>>    Could a gatekeeper please help review the fix for bug838?
>> http://bugs.open64.net/show_bug.cgi?id=838
>>
>> symptom:
>>
>>   opencc could not compile gcc for debug build(O0), a cutted down case as
>> below:
>>
>> int i;
>> static __inline__ void
>> should_not_exist (void)
>> {
>>         i=1;
>> }
>>
>> yug@jupiter:~/work/bugs/bug838> $TOOLROOT/bin/opencc -c case1.i -O0
>> yug@jupiter:~/work/bugs/bug838> readelf -s case1.o | grep
>> should_not_exist
>>      4: 0000000000000000    21 FUNC    LOCAL  DEFAULT    1
>> should_not_exist
>> yug@jupiter:~/work/bugs/bug838> gcc -c -O0 case1.i
>> yug@jupiter:~/work/bugs/bug838> readelf -s case1.o | grep
>> should_not_exist
>>
>> Since opencc does not do inline on O0(non-ipa) option, so no deletion
>> for should_not_exit, this incompatibility causes the break.
>>
>> Solution:
>>
>>    open inline for O0, but only do dead function elimination
>> for unreachable functions with inline attribute.
>>
>> Patch:
>>
>>  --- a/osprey/driver/special_options.c
>> +++ b/osprey/driver/special_options.c
>> @@ -360,13 +360,6 @@ add_special_options (void)
>>                 turn_down_opt_level(0, "-g changes optimization to -O0
>> since no optimization level is specified");
>>         }
>> -       /* Turn off inlining when compiling -O0.  We definitly want
>> -        * this off when compiling with -g -O0, but we don't want
>> -        * -g to change the generated code so we leave it off always.
>> -        * See bugs 1917 and 7595.
>> -        */
>> -       if (olevel == 0 && inline_t == UNDEFINED)
>> -         inline_t = FALSE;
>>          /* In the SGI world, -g3 says to emit crippled debug info for use
>>          * with optimized code. In the GNU/Pathscale world, -g3 says to
>> emit
>>         Modified osprey/ipa/inline/inline.cxx
>> diff --git a/osprey/ipa/inline/inline.cxx b/osprey/ipa/inline/inline.cxx
>> index 7a2e8ad..a41e779 100644
>> --- a/osprey/ipa/inline/inline.cxx
>> +++ b/osprey/ipa/inline/inline.cxx
>> @@ -635,6 +635,9 @@ Perform_inlining()
>>  #endif // _LIGHTWEIGHT_INLINER
>>                     Write_inline_succ_pu();
>>         } else {
>> +#ifdef _LIGHTWEIGHT_INLINER
>> +          if (Opt_Level !=0) /* O0 does not do real inline. */
>> +#endif
>>             Inline_callees_into_caller(caller);
>>  #ifdef DEBUG_SYMTAB
>>          Scope_tab = caller->Scope();
>>         Modified osprey/ipa/inline/inline_driver.cxx
>> diff --git a/osprey/ipa/inline/inline_driver.cxx
>> b/osprey/ipa/inline/inline_driver.cxx
>> index 77704bc..4aff837 100644
>> --- a/osprey/ipa/inline/inline_driver.cxx
>> +++ b/osprey/ipa/inline/inline_driver.cxx
>> @@ -196,6 +196,10 @@ Process_Command_Line (INT argc, char **argv)
>>                         Opt_Level = 2;
>>                         INLINE_Enable_Split_Common = FALSE;
>>                         break;
>> +                    case '0': /* setup O0 for lw_inline */
>> +                        Opt_Level = 0;
>> +                        INLINE_Enable_Split_Common = FALSE;
>> +                       break;
>>                     default:
>>                         Opt_Level = 1;
>>                         INLINE_Enable_Split_Common = FALSE;
>>         Modified osprey/ipa/main/analyze/ipa_cg.cxx
>> diff --git a/osprey/ipa/main/analyze/ipa_cg.cxx
>> b/osprey/ipa/main/analyze/ipa_cg.cxx
>> index 5b58f01..4638977 100644
>> --- a/osprey/ipa/main/analyze/ipa_cg.cxx
>> +++ b/osprey/ipa/main/analyze/ipa_cg.cxx
>> @@ -1848,6 +1848,14 @@ Mark_Deletable_Funcs (NODE_INDEX v, DFE_ACTION
>> action, mUINT8 *visited)
>>             node->Set_Undeletable();
>>             action = MARK_USED;
>>             visited[v] = VISITED_AND_KEEP;
>> +#ifdef _LIGHTWEIGHT_INLINER
>> +        /* O0 does not delete functions with no inline attrib */
>> +        } else if (Opt_Level == 0 && ! node->Has_Inline_Attrib()) {
>> +          node->Clear_Deletable();
>> +          node->Set_Undeletable();
>> +          action = MARK_USED;
>> +          visited[v] = VISITED_AND_KEEP;
>> +#endif
>>         } else if (visited[v] == 0)
>>             visited[v] = VISITED_BUT_UNDECIDED;
>>         break;
>>
>>
>> Regards
>> Gang
>>
>
>
------------------------------------------------------------------------------
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Cisco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to