Author: Antonio Cuni <[email protected]>
Branch:
Changeset: r44908:8d6cdc44d544
Date: 2011-06-13 17:35 +0200
http://bitbucket.org/pypy/pypy/changeset/8d6cdc44d544/
Log: don't add a dependency on libffi unless we enable _ffi
diff --git a/pypy/config/pypyoption.py b/pypy/config/pypyoption.py
--- a/pypy/config/pypyoption.py
+++ b/pypy/config/pypyoption.py
@@ -84,6 +84,7 @@
"_rawffi": [("objspace.usemodules.struct", True)],
"cpyext": [("translation.secondaryentrypoints", "cpyext"),
("translation.shared", sys.platform == "win32")],
+ "_ffi": [("translation.jit_ffi", True)],
}
module_import_dependencies = {
diff --git a/pypy/config/test/test_pypyoption.py
b/pypy/config/test/test_pypyoption.py
--- a/pypy/config/test/test_pypyoption.py
+++ b/pypy/config/test/test_pypyoption.py
@@ -73,3 +73,7 @@
fn = prefix + "." + path + ".txt"
yield check_file_exists, fn
+def test__ffi_opt():
+ config = get_pypy_config(translating=True)
+ config.objspace.usemodules._ffi = True
+ assert config.translation.jit_ffi
diff --git a/pypy/config/translationoption.py b/pypy/config/translationoption.py
--- a/pypy/config/translationoption.py
+++ b/pypy/config/translationoption.py
@@ -117,6 +117,8 @@
ChoiceOption("jit_profiler", "integrate profiler support into the JIT",
["off", "oprofile"],
default="off"),
+ # jit_ffi is automatically turned on by withmod-_ffi (which is enabled by
default)
+ BoolOption("jit_ffi", "optimize libffi calls", default=False,
cmdline=None),
# misc
BoolOption("verbose", "Print extra information", default=False),
diff --git a/pypy/jit/metainterp/optimizeopt/__init__.py
b/pypy/jit/metainterp/optimizeopt/__init__.py
--- a/pypy/jit/metainterp/optimizeopt/__init__.py
+++ b/pypy/jit/metainterp/optimizeopt/__init__.py
@@ -15,7 +15,7 @@
('virtualize', OptVirtualize),
('string', OptString),
('heap', OptHeap),
- ('ffi', OptFfiCall),
+ ('ffi', None),
('unroll', None)]
# no direct instantiation of unroll
unroll_all_opts = unrolling_iterable(ALL_OPTS)
@@ -25,10 +25,9 @@
ALL_OPTS_NAMES = ':'.join([name for name, _ in ALL_OPTS])
PARAMETERS['enable_opts'] = ALL_OPTS_NAMES
-def optimize_loop_1(metainterp_sd, loop, enable_opts,
+def build_opt_chain(metainterp_sd, enable_opts,
inline_short_preamble=True, retraced=False):
- """Optimize loop.operations to remove internal overheadish operations.
- """
+ config = metainterp_sd.config
optimizations = []
unroll = 'unroll' in enable_opts
for name, opt in unroll_all_opts:
@@ -40,6 +39,11 @@
# FIXME: Workaround to disable string optimisation
# during preamble but to keep it during the loop
optimizations.append(o)
+ elif name == 'ffi' and config.translation.jit_ffi:
+ # we cannot put the class directly in the unrolling_iterable,
+ # because we do not want it to be seen at all (to avoid to
+ # introduce a dependency on libffi in case we do not need it)
+ optimizations.append(OptFfiCall())
if ('rewrite' not in enable_opts or 'virtualize' not in enable_opts
or 'heap' not in enable_opts):
@@ -48,6 +52,17 @@
if inline_short_preamble:
optimizations = [OptInlineShortPreamble(retraced)] + optimizations
+ return optimizations, unroll
+
+
+def optimize_loop_1(metainterp_sd, loop, enable_opts,
+ inline_short_preamble=True, retraced=False):
+ """Optimize loop.operations to remove internal overheadish operations.
+ """
+
+ optimizations, unroll = build_opt_chain(metainterp_sd, enable_opts,
+ inline_short_preamble, retraced)
+
if unroll:
optimize_unroll(metainterp_sd, loop, optimizations)
else:
diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -1272,6 +1272,11 @@
self.profiler = ProfilerClass()
self.profiler.cpu = cpu
self.warmrunnerdesc = warmrunnerdesc
+ if warmrunnerdesc:
+ import pdb;pdb.set_trace()
+ else:
+ from pypy.config.pypyoption import get_pypy_config
+ self.config = get_pypy_config(translating=True)
backendmodule = self.cpu.__module__
backendmodule = backendmodule.split('.')[-2]
diff --git a/pypy/jit/metainterp/test/test_optimizeopt.py
b/pypy/jit/metainterp/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/test/test_optimizeopt.py
@@ -5,7 +5,7 @@
BaseTest)
import pypy.jit.metainterp.optimizeopt.optimizer as optimizeopt
import pypy.jit.metainterp.optimizeopt.virtualize as virtualize
-from pypy.jit.metainterp.optimizeopt import optimize_loop_1, ALL_OPTS_DICT
+from pypy.jit.metainterp.optimizeopt import optimize_loop_1, ALL_OPTS_DICT,
build_opt_chain
from pypy.jit.metainterp.optimizeutil import InvalidLoop
from pypy.jit.metainterp.history import AbstractDescr, ConstInt, BoxInt
from pypy.jit.metainterp.history import TreeLoop, LoopToken
@@ -15,6 +15,7 @@
from pypy.jit.tool.oparser import pure_parse
from pypy.jit.metainterp.test.test_optimizebasic import equaloplists
from pypy.jit.metainterp.optimizeutil import args_dict
+from pypy.config.pypyoption import get_pypy_config
class Fake(object):
failargs_limit = 1000
@@ -27,6 +28,43 @@
self.profiler = EmptyProfiler()
self.options = Fake()
self.globaldata = Fake()
+ self.config = get_pypy_config(translating=True)
+ self.config.translation.jit_ffi = True
+
+
+def test_build_opt_chain():
+ def check(chain, expected_names):
+ names = [opt.__class__.__name__ for opt in chain]
+ assert names == expected_names
+ #
+ metainterp_sd = FakeMetaInterpStaticData(None)
+ chain, _ = build_opt_chain(metainterp_sd, "", inline_short_preamble=False)
+ check(chain, ["OptSimplify"])
+ #
+ chain, _ = build_opt_chain(metainterp_sd, "")
+ check(chain, ["OptInlineShortPreamble", "OptSimplify"])
+ #
+ chain, _ = build_opt_chain(metainterp_sd, "")
+ check(chain, ["OptInlineShortPreamble", "OptSimplify"])
+ #
+ chain, _ = build_opt_chain(metainterp_sd, "heap:intbounds")
+ check(chain, ["OptInlineShortPreamble", "OptIntBounds", "OptHeap",
"OptSimplify"])
+ #
+ chain, unroll = build_opt_chain(metainterp_sd, "unroll")
+ check(chain, ["OptInlineShortPreamble", "OptSimplify"])
+ assert unroll
+ #
+ chain, _ = build_opt_chain(metainterp_sd, "aaa:bbb",
inline_short_preamble=False)
+ check(chain, ["OptSimplify"])
+ #
+ chain, _ = build_opt_chain(metainterp_sd, "ffi",
inline_short_preamble=False)
+ check(chain, ["OptFfiCall", "OptSimplify"])
+ #
+ metainterp_sd.config = get_pypy_config(translating=True)
+ assert not metainterp_sd.config.translation.jit_ffi
+ chain, _ = build_opt_chain(metainterp_sd, "ffi",
inline_short_preamble=False)
+ check(chain, ["OptSimplify"])
+
def test_store_final_boxes_in_guard():
from pypy.jit.metainterp.compile import ResumeGuardDescr
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit