# HG changeset patch # User Rik # Date 1402777486 25200 # Node ID 5eca3080c7cdca8851c217bb0e369be1459389d8 # Parent 5b7b18d603ae07299ac5be59521b8833c6b182de# Parent 4a4edf0f2077451bdb7cb65fa13e9f58ee3fb84b maint: Merge Stefan's changesets onto default after verification. diff -r 5b7b18d603ae -r 5eca3080c7cd configure.ac --- a/configure.ac Fri Jun 13 11:28:03 2014 +0200 +++ b/configure.ac Sat Jun 14 13:24:46 2014 -0700 @@ -857,9 +857,13 @@ warn_llvm="Missing LLVM file TargetData.h. JIT compiler is disabled." fi + AC_CHECK_HEADERS([llvm/IR/Verifier.h]) + OCTAVE_LLVM_FUNCTION_ADDATTRIBUTE_API OCTAVE_LLVM_FUNCTION_ADDFNATTR_API OCTAVE_LLVM_CALLINST_ADDATTRIBUTE_API + OCTAVE_LLVM_RAW_FD_OSTREAM_API + OCTAVE_LLVM_LEGACY_PASSMANAGER_API AC_LANG_POP(C++) CPPFLAGS="$save_CPPFLAGS" CXXFLAGS="$save_CXXFLAGS" diff -r 5b7b18d603ae -r 5eca3080c7cd libinterp/corefcn/jit-typeinfo.cc --- a/libinterp/corefcn/jit-typeinfo.cc Fri Jun 13 11:28:03 2014 +0200 +++ b/libinterp/corefcn/jit-typeinfo.cc Sat Jun 14 13:24:46 2014 -0700 @@ -34,7 +34,12 @@ #include "jit-typeinfo.h" +#ifdef HAVE_LLVM_IR_VERIFIER_H +#include +#else #include +#endif + #include #ifdef HAVE_LLVM_IR_FUNCTION_H diff -r 5b7b18d603ae -r 5eca3080c7cd libinterp/corefcn/jit-util.h --- a/libinterp/corefcn/jit-util.h Fri Jun 13 11:28:03 2014 +0200 +++ b/libinterp/corefcn/jit-util.h Sat Jun 14 13:24:46 2014 -0700 @@ -42,8 +42,15 @@ { class Value; class Module; +#ifdef LEGACY_PASSMANAGER + namespace legacy { + class FunctionPassManager; + class PassManager; + } +#else class FunctionPassManager; class PassManager; +#endif class ExecutionEngine; class Function; class BasicBlock; diff -r 5b7b18d603ae -r 5eca3080c7cd libinterp/corefcn/pt-jit.cc --- a/libinterp/corefcn/pt-jit.cc Fri Jun 13 11:28:03 2014 +0200 +++ b/libinterp/corefcn/pt-jit.cc Sat Jun 14 13:24:46 2014 -0700 @@ -50,11 +50,22 @@ #include #include + +#ifdef HAVE_LLVM_IR_VERIFIER_H +#include +#else #include +#endif + #include #include #include + +#ifdef LEGACY_PASSMANAGER +#include +#else #include +#endif #ifdef HAVE_LLVM_IR_FUNCTION_H #include @@ -2053,10 +2064,15 @@ if (! engine) return false; +#ifdef LEGACY_PASSMANAGER + module_pass_manager = new llvm::legacy::PassManager (); + pass_manager = new llvm::legacy::FunctionPassManager (module); +#else module_pass_manager = new llvm::PassManager (); + pass_manager = new llvm::FunctionPassManager (module); +#endif module_pass_manager->add (llvm::createAlwaysInlinerPass ()); - pass_manager = new llvm::FunctionPassManager (module); #ifdef HAVE_LLVM_DATALAYOUT pass_manager->add (new llvm::DataLayout (*engine->getDataLayout ())); #else @@ -2171,8 +2187,13 @@ if (Vdebug_jit) { std::string error; +#ifdef RAW_FD_OSTREAM_ARG_IS_LLVM_SYS_FS + llvm::raw_fd_ostream fout ("test.bc", error, + llvm::sys::fs::F_Binary); +#else llvm::raw_fd_ostream fout ("test.bc", error, llvm::raw_fd_ostream::F_Binary); +#endif llvm::WriteBitcodeToFile (module, fout); } } diff -r 5b7b18d603ae -r 5eca3080c7cd libinterp/corefcn/pt-jit.h --- a/libinterp/corefcn/pt-jit.h Fri Jun 13 11:28:03 2014 +0200 +++ b/libinterp/corefcn/pt-jit.h Sat Jun 14 13:24:46 2014 -0700 @@ -386,8 +386,13 @@ size_t trip_count (const octave_value& bounds) const; llvm::Module *module; +#ifdef LEGACY_PASSMANAGER + llvm::legacy::PassManager *module_pass_manager; + llvm::legacy::FunctionPassManager *pass_manager; +#else llvm::PassManager *module_pass_manager; llvm::FunctionPassManager *pass_manager; +#endif llvm::ExecutionEngine *engine; }; diff -r 5b7b18d603ae -r 5eca3080c7cd m4/acinclude.m4 --- a/m4/acinclude.m4 Fri Jun 13 11:28:03 2014 +0200 +++ b/m4/acinclude.m4 Sat Jun 14 13:24:46 2014 -0700 @@ -1744,6 +1744,58 @@ fi ]) dnl +dnl Check for raw_fd_ostream API +dnl +AC_DEFUN([OCTAVE_LLVM_RAW_FD_OSTREAM_API], [ + AC_CACHE_CHECK([check LLVM::raw_fd_ostream arg type is llvm::sys:fs], + [octave_cv_raw_fd_ostream_arg_is_llvm_sys_fs], + [AC_LANG_PUSH(C++) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[ + #include + ]], [[ + std::string str; + llvm::raw_fd_ostream fout ("", str, llvm::sys::fs::F_Binary); + ]])], + octave_cv_raw_fd_ostream_arg_is_llvm_sys_fs=yes, + octave_cv_raw_fd_ostream_arg_is_llvm_sys_fs=no) + AC_LANG_POP(C++) + ]) + if test $octave_cv_raw_fd_ostream_arg_is_llvm_sys_fs = yes; then + AC_DEFINE(RAW_FD_OSTREAM_ARG_IS_LLVM_SYS_FS, 1, + [Define to 1 if LLVM::raw_fd_ostream arg type is llvm::sys:fs.]) + fi +]) +dnl +dnl Check for legacy::PassManager API +dnl +AC_DEFUN([OCTAVE_LLVM_LEGACY_PASSMANAGER_API], [ + AC_CACHE_CHECK([check for LLVM::legacy::PassManager], + [octave_cv_legacy_passmanager], + [AC_LANG_PUSH(C++) + save_LIBS="$LIBS" + LIBS="$LLVM_LIBS $LIBS" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[ + #include + ]], [[ + llvm::Module *module; + llvm::legacy::PassManager *module_pass_manager; + llvm::legacy::FunctionPassManager *pass_manager; + module_pass_manager = new llvm::legacy::PassManager (); + pass_manager = new llvm::legacy::FunctionPassManager (module); + ]])], + octave_cv_legacy_passmanager=yes, + octave_cv_legacy_passmanager=no) + LIBS="$save_LIBS" + AC_LANG_POP(C++) + ]) + if test $octave_cv_legacy_passmanager = yes; then + AC_DEFINE(LEGACY_PASSMANAGER, 1, + [Define to 1 if LLVM::legacy::PassManager exists.]) + fi +]) +dnl dnl Check for ar. dnl AC_DEFUN([OCTAVE_PROG_AR], [ diff -r 5b7b18d603ae -r 5eca3080c7cd scripts/plot/util/private/__go_draw_axes__.m --- a/scripts/plot/util/private/__go_draw_axes__.m Fri Jun 13 11:28:03 2014 +0200 +++ b/scripts/plot/util/private/__go_draw_axes__.m Sat Jun 14 13:24:46 2014 -0700 @@ -2115,6 +2115,11 @@ plot_stream, mirror, mono, axispos, tickdir, ticklength, fontname, fontspec, interpreter, scale, sgn, gnuplot_term) persistent warned_latex = false; + if (mirror) + mirror = "mirror"; + else + mirror = "nomirror"; + endif if (strcmpi (interpreter, "tex")) for n = 1 : numel (labels) labels{n} = __tex2enhanced__ (labels{n}, fontname, false, false); @@ -2140,100 +2145,52 @@ num_mtics = 5; endif colorspec = get_text_colorspec (color, mono); - if (strcmpi (ticmode, "manual") || strcmpi (labelmode, "manual")) + fprintf (plot_stream, "set format %s \"%s\";\n", ax, fmt); + if (strcmpi (ticmode, "manual")) if (isempty (tics)) fprintf (plot_stream, "unset %stics;\nunset m%stics;\n", ax, ax); - elseif (strcmpi (labelmode, "manual")) - if (ischar (labels)) - labels = cellstr (labels); + return + endif + fprintf (plot_stream, "set %stics %s %s %s %s (", ax, tickdir, + ticklength, axispos, mirror); + fprintf (plot_stream, " %.15g,", tics(1:end-1)); + fprintf (plot_stream, " %.15g) %s;\n", tics(end), fontspec); + else + fprintf (plot_stream, "set %stics %s %s %s %s %s %s;\n", ax, + tickdir, ticklength, axispos, mirror, colorspec, fontspec); + endif + if (strcmpi (labelmode, "manual")) + k = 1; + ntics = numel (tics); + nlabels = numel (labels); + fprintf (plot_stream, "set %stics add %s %s %s %s (", ax, + tickdir, ticklength, axispos, mirror); + labels = strrep (labels, "%", "%%"); + for i = 1:ntics + fprintf (plot_stream, " \"%s\" %.15g", labels{k++}, tics(i)); + if (i < ntics) + fputs (plot_stream, ", "); endif - if (isnumeric (labels)) - labels = num2str (real (labels(:))); - endif - if (ischar (labels)) - labels = permute (cellstr (labels), [2, 1]); - endif - if (iscellstr (labels)) + if (k > nlabels) k = 1; - ntics = numel (tics); - nlabels = numel (labels); - fprintf (plot_stream, "set format %s \"%%g\";\n", ax); - if (mirror) - fprintf (plot_stream, "set %stics %s %s %s mirror (", ax, - tickdir, ticklength, axispos); - else - fprintf (plot_stream, "set %stics %s %s %s nomirror (", ax, - tickdir, ticklength, axispos); - endif - - labels = strrep (labels, "%", "%%"); - for i = 1:ntics - fprintf (plot_stream, " \"%s\" %.15g", labels{k++}, tics(i)); - if (i < ntics) - fputs (plot_stream, ", "); - endif - if (k > nlabels) - k = 1; - endif - endfor - fprintf (plot_stream, ") %s %s;\n", colorspec, fontspec); - if (strcmp (mtics, "on")) - fprintf (plot_stream, "set m%stics %d;\n", ax, num_mtics); - else - fprintf (plot_stream, "unset m%stics;\n", ax); - endif - else - error ("__go_draw_axes__: unsupported type of ticklabel"); endif - else - fprintf (plot_stream, "set format %s \"%s\";\n", ax, fmt); - if (mirror) - fprintf (plot_stream, "set %stics %s %s %s mirror (", ax, tickdir, - ticklength, axispos); - else - fprintf (plot_stream, "set %stics %s %s %s nomirror (", ax, tickdir, - ticklength, axispos); - endif - fprintf (plot_stream, " %.15g,", tics(1:end-1)); - fprintf (plot_stream, " %.15g) %s;\n", tics(end), fontspec); - if (strcmp (mtics, "on")) - fprintf (plot_stream, "set m%stics %d;\n", ax, num_mtics); - else - fprintf (plot_stream, "unset m%stics;\n", ax); - endif - endif + endfor + fprintf (plot_stream, ") %s %s;\n", colorspec, fontspec); + endif + if (strcmp (mtics, "on")) + fprintf (plot_stream, "set m%stics %d;\n", ax, num_mtics); else - fprintf (plot_stream, "set format %s \"%s\";\n", ax, fmt); - if (mirror) - fprintf (plot_stream, "set %stics %s %s %s mirror %s %s;\n", ax, - axispos, tickdir, ticklength, colorspec, fontspec); - else - fprintf (plot_stream, "set %stics %s %s %s nomirror %s %s;\n", ax, - tickdir, ticklength, axispos, colorspec, fontspec); - endif - if (strcmp (mtics, "on")) - fprintf (plot_stream, "set m%stics %d;\n", ax, num_mtics); - else - fprintf (plot_stream, "unset m%stics;\n", ax); - endif + fprintf (plot_stream, "unset m%stics;\n", ax); endif endfunction function ticklabel = ticklabel_to_cell (ticklabel) - if (isnumeric (ticklabel)) - ## Use upto 5 significant digits - ticklabel = num2str (ticklabel(:), 5); - endif if (ischar (ticklabel)) - if (rows (ticklabel) == 1 && any (ticklabel == "|")) - ticklabel = ostrsplit (ticklabel, "|"); - else - ticklabel = cellstr (ticklabel); - endif - elseif (isempty (ticklabel)) - ticklabel = {""}; + ticklabel = cellstr (ticklabel); + elseif (iscellstr (ticklabel)) + ticklabel = ticklabel; else - ticklabel = ticklabel; + error ("__go_draw_axes__: unsupported type of ticklabel"); endif endfunction diff -r 5b7b18d603ae -r 5eca3080c7cd test/jit.tst --- a/test/jit.tst Fri Jun 13 11:28:03 2014 +0200 +++ b/test/jit.tst Sat Jun 14 13:24:46 2014 -0700 @@ -444,7 +444,7 @@ %! endwhile %! assert (i == 10); %! assert (a == 10); -%! jit_failure_count (0) +%! assert (jit_failure_count, 0); %!testif HAVE_LLVM %! jit_failure_count (0) @@ -487,7 +487,7 @@ %! test_compute_idom (); %! end_try_catch %! assert (! isempty (lasterr ())); -%! assert (jit_failure_count, 0); +%! assert (jit_failure_count, 1); %!function x = test_overload (a) %! while (1) @@ -560,7 +560,7 @@ %! test_undef (); %! end_try_catch %! assert (strncmp (lasterr (), "'XXX' undefined near", 20)); -%! assert (jit_failure_count, 0); +%! assert (jit_failure_count, 1); %!shared id %! id = @(x) x;