Can this change be made unconditionally instead of putting it under
"GNU_COMPATIBLE" ?
Why is this change not reasonable for all contexts ?
Adding this macro definition and use just seems added complexity.

- Suneel


On Thu, Oct 27, 2011 at 7:58 PM, Gang Yu <yugang...@gmail.com> wrote:
> 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
>
>

------------------------------------------------------------------------------
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