diff --git a/gcc/Makefile.in b/gcc/Makefile.in index ffed3aa..ce8d5bf 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -914,7 +914,7 @@ BUILD_LIBDEPS= $(BUILD_LIBIBERTY) # How to link with both our special library facilities # and the system's installed libraries. LIBS = @LIBS@ $(CPPLIB) $(LIBINTL) $(LIBICONV) $(LIBIBERTY) $(LIBDECNUMBER) -BACKENDLIBS = $(CLOOGLIBS) $(PPLLIBS) $(GMPLIBS) +BACKENDLIBS = $(GMPLIBS) $(if $(CLOOGLIBS),@DL_LIB@) # Any system libraries needed just for GNAT. SYSLIBS = @GNAT_LIBEXC@ @@ -3061,6 +3061,9 @@ $(out_object_file): $(out_file) $(CONFIG_H) coretypes.h $(TM_H) $(TREE_H) \ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) \ $(out_file) $(OUTPUT_OPTION) +graphite.o : \ + ALL_CFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CFLAGS)) + # Build auxiliary files that support ecoff format. mips-tfile: mips-tfile.o version.o $(LIBDEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ mips-tfile.o version.o $(LIBS) diff --git a/gcc/configure b/gcc/configure index 119b70d..f6b2950 100755 --- a/gcc/configure +++ b/gcc/configure @@ -458,7 +458,7 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical build_libsubdir build_subdir host_subdir target_subdir GENINSRC CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT GNATBIND ac_ct_GNATBIND GNATMAKE ac_ct_GNATMAKE NO_MINUS_C_MINUS_O OUTPUT_OPTION CPP EGREP loose_warn strict_warn warn_cflags nocommon_flag TREEBROWSER valgrind_path valgrind_path_defines valgrind_command coverage_flags enable_multilib enable_decimal_float enable_fixed_point enable_shared TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE CROSS_SYSTEM_HEADER_DIR onestep PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI datarootdir docdir htmldir SET_MAKE AWK LN_S LN RANLIB ac_ct_RANLIB ranlib_flags INSTALL INSTALL_PROGRAM INSTALL_DATA make_compare_target have_mktemp_command MAKEINFO BUILD_INFO GENERATED_MANPAGES FLEX BISON NM AR COLLECT2_LIBS GNAT_LIBEXC LDEXP_LIB TARGET_GETGROUPS_T LIBICONV LTLIBICONV LIBICONV_DEP manext objext gthread_flags extra_modes_file extra_opt_files USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT CROSS ALL SYSTEM_HEADER_DIR inhibit_libc CC_FOR_BUILD BUILD_CFLAGS BUILD_LDFLAGS STMP_FIXINC STMP_FIXPROTO collect2 LIBTOOL SED FGREP GREP LD DUMPBIN ac_ct_DUMPBIN OBJDUMP ac_ct_OBJDUMP ac_ct_AR STRIP ac_ct_STRIP lt_ECHO DSYMUTIL ac_ct_DSYMUTIL NMEDIT ac_ct_NMEDIT LIPO ac_ct_LIPO OTOOL ac_ct_OTOOL OTOOL64 ac_ct_OTOOL64 objdir enable_fast_install gcc_cv_as ORIGINAL_AS_FOR_TARGET gcc_cv_ld ORIGINAL_LD_FOR_TARGET gcc_cv_nm ORIGINAL_NM_FOR_TARGET gcc_cv_objdump gcc_cv_readelf libgcc_visibility GGC zlibdir zlibinc MAINT gcc_tooldir dollar slibdir subdirs srcdir all_compilers all_gtfiles all_lang_makefrags all_lang_makefiles all_languages all_selected_languages build_exeext build_install_headers_dir build_xm_file_list build_xm_include_list build_xm_defines build_file_translate check_languages cpp_install_dir xmake_file tmake_file extra_gcc_objs extra_headers_list extra_objs extra_parts extra_passes extra_programs float_h_file gcc_config_arguments gcc_gxx_include_dir host_exeext host_xm_file_list host_xm_include_list host_xm_defines out_host_hook_obj install lang_opt_files lang_specs_files lang_tree_files local_prefix md_file objc_boehm_gc out_file out_object_file thread_file tm_file_list tm_include_list tm_defines tm_p_file_list tm_p_include_list xm_file_list xm_include_list xm_defines c_target_objs cxx_target_objs fortran_target_objs target_cpu_default GMPLIBS GMPINC PPLLIBS PPLINC CLOOGLIBS CLOOGINC LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical build_libsubdir build_subdir host_subdir target_subdir GENINSRC CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT GNATBIND ac_ct_GNATBIND GNATMAKE ac_ct_GNATMAKE NO_MINUS_C_MINUS_O OUTPUT_OPTION CPP EGREP loose_warn strict_warn warn_cflags nocommon_flag TREEBROWSER valgrind_path valgrind_path_defines valgrind_command coverage_flags enable_multilib enable_decimal_float enable_fixed_point enable_shared TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE CROSS_SYSTEM_HEADER_DIR onestep PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI datarootdir docdir htmldir SET_MAKE AWK LN_S LN RANLIB ac_ct_RANLIB ranlib_flags INSTALL INSTALL_PROGRAM INSTALL_DATA make_compare_target have_mktemp_command MAKEINFO BUILD_INFO GENERATED_MANPAGES FLEX BISON NM AR COLLECT2_LIBS GNAT_LIBEXC LDEXP_LIB TARGET_GETGROUPS_T LIBICONV LTLIBICONV LIBICONV_DEP manext objext gthread_flags extra_modes_file extra_opt_files USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT CROSS ALL SYSTEM_HEADER_DIR inhibit_libc CC_FOR_BUILD BUILD_CFLAGS BUILD_LDFLAGS STMP_FIXINC STMP_FIXPROTO collect2 LIBTOOL SED FGREP GREP LD DUMPBIN ac_ct_DUMPBIN OBJDUMP ac_ct_OBJDUMP ac_ct_AR STRIP ac_ct_STRIP lt_ECHO DSYMUTIL ac_ct_DSYMUTIL NMEDIT ac_ct_NMEDIT LIPO ac_ct_LIPO OTOOL ac_ct_OTOOL OTOOL64 ac_ct_OTOOL64 objdir enable_fast_install gcc_cv_as ORIGINAL_AS_FOR_TARGET gcc_cv_ld ORIGINAL_LD_FOR_TARGET gcc_cv_nm ORIGINAL_NM_FOR_TARGET gcc_cv_objdump gcc_cv_readelf libgcc_visibility GGC zlibdir zlibinc MAINT gcc_tooldir dollar slibdir subdirs srcdir all_compilers all_gtfiles all_lang_makefrags all_lang_makefiles all_languages all_selected_languages build_exeext build_install_headers_dir build_xm_file_list build_xm_include_list build_xm_defines build_file_translate check_languages cpp_install_dir xmake_file tmake_file extra_gcc_objs extra_headers_list extra_objs extra_parts extra_passes extra_programs float_h_file gcc_config_arguments gcc_gxx_include_dir host_exeext host_xm_file_list host_xm_include_list host_xm_defines out_host_hook_obj install lang_opt_files lang_specs_files lang_tree_files local_prefix md_file objc_boehm_gc out_file out_object_file thread_file tm_file_list tm_include_list tm_defines tm_p_file_list tm_p_include_list xm_file_list xm_include_list xm_defines c_target_objs cxx_target_objs fortran_target_objs target_cpu_default GMPLIBS GMPINC PPLLIBS PPLINC CLOOGLIBS CLOOGINC DL_LIB LIBOBJS LTLIBOBJS' ac_subst_files='language_hooks' ac_pwd=`pwd` @@ -24839,6 +24839,142 @@ _ACEOF fi +# Check how to dlopen +DL_LIB= +saved_LIBS="$LIBS" +echo "$as_me:$LINENO: checking for library containing dlopen" >&5 +echo $ECHO_N "checking for library containing dlopen... $ECHO_C" >&6 +if test "${ac_cv_search_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_dlopen=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_dlopen="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_dlopen" = no; then + for ac_lib in dl; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_dlopen="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_dlopen" >&5 +echo "${ECHO_T}$ac_cv_search_dlopen" >&6 +if test "$ac_cv_search_dlopen" != no; then + test "$ac_cv_search_dlopen" = "none required" || LIBS="$ac_cv_search_dlopen $LIBS" + +fi + +case $ac_cv_search_dlopen in + no*) ;; + *) DL_LIB=$ac_cv_search_dlopen ;; +esac + +LIBS=$saved_LIBS + # Configure the subdirectories # AC_CONFIG_SUBDIRS($subdirs) @@ -25684,6 +25820,7 @@ s,@PPLLIBS@,$PPLLIBS,;t t s,@PPLINC@,$PPLINC,;t t s,@CLOOGLIBS@,$CLOOGLIBS,;t t s,@CLOOGINC@,$CLOOGINC,;t t +s,@DL_LIB@,$DL_LIB,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t /@language_hooks@/r $language_hooks diff --git a/gcc/configure.ac b/gcc/configure.ac index 9737d1a..dd41f11 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -3990,6 +3990,17 @@ if test "x${CLOOGLIBS}" != "x" ; then AC_DEFINE(HAVE_cloog, 1, [Define if cloog is in use.]) fi +# Check how to dlopen +DL_LIB= +saved_LIBS="$LIBS" +AC_SEARCH_LIBS([dlopen], [dl]) +case $ac_cv_search_dlopen in + no*) ;; + *) DL_LIB=$ac_cv_search_dlopen ;; +esac +AC_SUBST(DL_LIB) +LIBS=$saved_LIBS + # Configure the subdirectories # AC_CONFIG_SUBDIRS($subdirs) diff --git a/gcc/graphite.c b/gcc/graphite.c index b732b40..798b141 100644 --- a/gcc/graphite.c +++ b/gcc/graphite.c @@ -59,6 +59,110 @@ along with GCC; see the file COPYING3. If not see #include "cloog/cloog.h" #include "graphite.h" +#include +#define DYNSYMS \ + DYNSYM (cloog_block_alloc); \ + DYNSYM (cloog_block_list_free); \ + DYNSYM (cloog_block_list_malloc); \ + DYNSYM (cloog_clast_create); \ + DYNSYM (cloog_clast_free); \ + DYNSYM (cloog_domain_free); \ + DYNSYM (cloog_domain_matrix2domain); \ + DYNSYM (cloog_initialize); \ + DYNSYM (cloog_loop_malloc); \ + DYNSYM (cloog_matrix_alloc); \ + DYNSYM (cloog_matrix_copy); \ + DYNSYM (cloog_matrix_free); \ + DYNSYM (cloog_matrix_print); \ + DYNSYM (cloog_names_malloc); \ + DYNSYM (cloog_names_scalarize); \ + DYNSYM (cloog_options_free); \ + DYNSYM (cloog_options_malloc); \ + DYNSYM (cloog_program_dump_cloog); \ + DYNSYM (cloog_program_extract_scalars); \ + DYNSYM (cloog_program_free); \ + DYNSYM (cloog_program_generate); \ + DYNSYM (cloog_program_malloc); \ + DYNSYM (cloog_program_print); \ + DYNSYM (cloog_program_scatter); \ + DYNSYM (cloog_statement_alloc); \ + DYNSYM (ppl_finalize); \ + DYNSYM (pprint); \ + DYNSYM (stmt_block); \ + DYNSYM (stmt_for); \ + DYNSYM (stmt_guard); \ + DYNSYM (stmt_root); \ + DYNSYM (stmt_user); +static struct +{ + bool inited; + void *h; +#define DYNSYM(x) __typeof (x) *p_##x + DYNSYMS +#undef DYNSYM +} cloog_pointers; + +#define cloog_block_alloc (*cloog_pointers.p_cloog_block_alloc) +#define cloog_block_list_free (*cloog_pointers.p_cloog_block_list_free) +#define cloog_block_list_malloc (*cloog_pointers.p_cloog_block_list_malloc) +#define cloog_clast_create (*cloog_pointers.p_cloog_clast_create) +#define cloog_clast_free (*cloog_pointers.p_cloog_clast_free) +#define cloog_domain_free (*cloog_pointers.p_cloog_domain_free) +#define cloog_domain_matrix2domain (*cloog_pointers.p_cloog_domain_matrix2domain) +#define cloog_initialize (*cloog_pointers.p_cloog_initialize) +#define cloog_loop_malloc (*cloog_pointers.p_cloog_loop_malloc) +#define cloog_matrix_alloc (*cloog_pointers.p_cloog_matrix_alloc) +#define cloog_matrix_copy (*cloog_pointers.p_cloog_matrix_copy) +#define cloog_matrix_free (*cloog_pointers.p_cloog_matrix_free) +#define cloog_matrix_print (*cloog_pointers.p_cloog_matrix_print) +#define cloog_names_malloc (*cloog_pointers.p_cloog_names_malloc) +#define cloog_names_scalarize (*cloog_pointers.p_cloog_names_scalarize) +#define cloog_options_free (*cloog_pointers.p_cloog_options_free) +#define cloog_options_malloc (*cloog_pointers.p_cloog_options_malloc) +#define cloog_program_dump_cloog (*cloog_pointers.p_cloog_program_dump_cloog) +#define cloog_program_extract_scalars (*cloog_pointers.p_cloog_program_extract_scalars) +#define cloog_program_free (*cloog_pointers.p_cloog_program_free) +#define cloog_program_generate (*cloog_pointers.p_cloog_program_generate) +#define cloog_program_malloc (*cloog_pointers.p_cloog_program_malloc) +#define cloog_program_print (*cloog_pointers.p_cloog_program_print) +#define cloog_program_scatter (*cloog_pointers.p_cloog_program_scatter) +#define cloog_statement_alloc (*cloog_pointers.p_cloog_statement_alloc) +#define ppl_finalize (*cloog_pointers.p_ppl_finalize) +#define pprint (*cloog_pointers.p_pprint) +#define stmt_block (*cloog_pointers.p_stmt_block) +#define stmt_for (*cloog_pointers.p_stmt_for) +#define stmt_guard (*cloog_pointers.p_stmt_guard) +#define stmt_root (*cloog_pointers.p_stmt_root) +#define stmt_user (*cloog_pointers.p_stmt_user) + +#define cloog_finalize (*cloog_pointers.p_ppl_finalize) + +static bool +init_cloog_pointers (void) +{ + void *h; + + if (cloog_pointers.inited) + return cloog_pointers.h != NULL; + h = dlopen ("libcloog.so.0", RTLD_LAZY); + cloog_pointers.h = h; + if (h == NULL) + return false; +#define DYNSYM(x) \ + do \ + { \ + union { __typeof (cloog_pointers.p_##x) p; void *q; } u; \ + u.q = dlsym (h, #x); \ + if (u.q == NULL) \ + return false; \ + cloog_pointers.p_##x = u.p; \ + } \ + while (0) + DYNSYMS +#undef DYNSYM + return true; +} + static VEC (scop_p, heap) *current_scops; /* Converts a GMP constant V to a tree and returns it. */ @@ -4075,10 +4179,10 @@ clast_get_body_of_loop (struct clast_stmt *stmt) STMT. */ static tree -gcc_type_for_iv_of_clast_loop (struct clast_for *stmt_for) +gcc_type_for_iv_of_clast_loop (struct clast_for *stmt_fora) { - struct clast_user_stmt *stmt = clast_get_body_of_loop ((struct clast_stmt *) stmt_for); - const char *cloog_iv = stmt_for->iterator; + struct clast_user_stmt *stmt = clast_get_body_of_loop ((struct clast_stmt *) stmt_fora); + const char *cloog_iv = stmt_fora->iterator; CloogStatement *cs = stmt->statement; graphite_bb_p gbb = (graphite_bb_p) cloog_statement_usr (cs); @@ -6109,6 +6213,12 @@ graphite_transform_loops (void) if (number_of_loops () <= 1) return; + if (!init_cloog_pointers ()) + { + sorry ("Graphite loop optimizations cannot be used"); + return; + } + current_scops = VEC_alloc (scop_p, heap, 3); recompute_all_dominators ();