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