Commit c9743660 authored by Kevin Modzelewski's avatar Kevin Modzelewski

Merge branch 'virtualenv_test'

parents 4a9c756a 290ba05a
...@@ -7,3 +7,6 @@ ...@@ -7,3 +7,6 @@
[submodule "test/integration/django"] [submodule "test/integration/django"]
path = test/integration/django path = test/integration/django
url = https://github.com/django/django url = https://github.com/django/django
[submodule "test/integration/virtualenv"]
path = test/integration/virtualenv
url = https://github.com/dropbox/virtualenv
...@@ -202,6 +202,7 @@ add_test(NAME analysis_unittest COMMAND analysis_unittest) ...@@ -202,6 +202,7 @@ add_test(NAME analysis_unittest COMMAND analysis_unittest)
add_test(NAME pyston_defaults COMMAND ${PYTHON_EXE} ${CMAKE_SOURCE_DIR}/tools/tester.py -R ./pyston -j${TEST_THREADS} -a=-S -k ${CMAKE_SOURCE_DIR}/test/tests) add_test(NAME pyston_defaults COMMAND ${PYTHON_EXE} ${CMAKE_SOURCE_DIR}/tools/tester.py -R ./pyston -j${TEST_THREADS} -a=-S -k ${CMAKE_SOURCE_DIR}/test/tests)
# we pass -I to cpython tests and skip failing ones b/c they are slooow otherwise # we pass -I to cpython tests and skip failing ones b/c they are slooow otherwise
add_test(NAME pyston_defaults_cpython_tests COMMAND ${PYTHON_EXE} ${CMAKE_SOURCE_DIR}/tools/tester.py -R ./pyston -j${TEST_THREADS} -a=-S -a=-I -k --exit-code-only --skip-failing ${CMAKE_SOURCE_DIR}/test/cpython) add_test(NAME pyston_defaults_cpython_tests COMMAND ${PYTHON_EXE} ${CMAKE_SOURCE_DIR}/tools/tester.py -R ./pyston -j${TEST_THREADS} -a=-S -a=-I -k --exit-code-only --skip-failing ${CMAKE_SOURCE_DIR}/test/cpython)
add_test(NAME pyston_defaults_integration_tests COMMAND ${PYTHON_EXE} ${CMAKE_SOURCE_DIR}/tools/tester.py -R ./pyston -j${TEST_THREADS} -a=-S -k --exit-code-only --skip-failing ${CMAKE_SOURCE_DIR}/test/integration)
add_test(NAME pyston_max_compilation_tier COMMAND ${PYTHON_EXE} ${CMAKE_SOURCE_DIR}/tools/tester.py -R ./pyston -j${TEST_THREADS} -a=-O -a=-S -k ${CMAKE_SOURCE_DIR}/test/tests) add_test(NAME pyston_max_compilation_tier COMMAND ${PYTHON_EXE} ${CMAKE_SOURCE_DIR}/tools/tester.py -R ./pyston -j${TEST_THREADS} -a=-O -a=-S -k ${CMAKE_SOURCE_DIR}/test/tests)
add_test(NAME pyston_experimental_pypa_parser COMMAND ${PYTHON_EXE} ${CMAKE_SOURCE_DIR}/tools/tester.py -a=-x -R ./pyston -j${TEST_THREADS} -a=-n -a=-S -k ${CMAKE_SOURCE_DIR}/test/tests) add_test(NAME pyston_experimental_pypa_parser COMMAND ${PYTHON_EXE} ${CMAKE_SOURCE_DIR}/tools/tester.py -a=-x -R ./pyston -j${TEST_THREADS} -a=-n -a=-S -k ${CMAKE_SOURCE_DIR}/test/tests)
......
...@@ -492,7 +492,7 @@ check: ...@@ -492,7 +492,7 @@ check:
$(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_dbg -j$(TEST_THREADS) -k -a=-S $(TESTS_DIR) $(ARGS) $(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_dbg -j$(TEST_THREADS) -k -a=-S $(TESTS_DIR) $(ARGS)
@# we pass -I to cpython tests & skip failing ones because they are sloooow otherwise @# we pass -I to cpython tests & skip failing ones because they are sloooow otherwise
$(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_dbg -j$(TEST_THREADS) -k -a=-S -a=-I --exit-code-only --skip-failing $(TEST_DIR)/cpython $(ARGS) $(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_dbg -j$(TEST_THREADS) -k -a=-S -a=-I --exit-code-only --skip-failing $(TEST_DIR)/cpython $(ARGS)
$(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_dbg -j$(TEST_THREADS) -k -a=-S --exit-code-only -t60 $(TEST_DIR)/integration $(ARGS) $(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_dbg -j$(TEST_THREADS) -k -a=-S --exit-code-only --skip-failing -t60 $(TEST_DIR)/integration $(ARGS)
$(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_dbg -j$(TEST_THREADS) -k -a=-n -a=-x -a=-S $(TESTS_DIR) $(ARGS) $(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_dbg -j$(TEST_THREADS) -k -a=-n -a=-x -a=-S $(TESTS_DIR) $(ARGS)
@# skip -O for dbg @# skip -O for dbg
...@@ -509,7 +509,7 @@ check: ...@@ -509,7 +509,7 @@ check:
$(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_release -j$(TEST_THREADS) -k -a=-S $(TESTS_DIR) $(ARGS) $(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_release -j$(TEST_THREADS) -k -a=-S $(TESTS_DIR) $(ARGS)
@# we pass -I to cpython tests and skip failing ones because they are sloooow otherwise @# we pass -I to cpython tests and skip failing ones because they are sloooow otherwise
$(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_release -j$(TEST_THREADS) -k -a=-S -a=-I --exit-code-only --skip-failing $(TEST_DIR)/cpython $(ARGS) $(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_release -j$(TEST_THREADS) -k -a=-S -a=-I --exit-code-only --skip-failing $(TEST_DIR)/cpython $(ARGS)
$(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_release -j$(TEST_THREADS) -k -a=-S --exit-code-only -t60 $(TEST_DIR)/integration $(ARGS) $(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_release -j$(TEST_THREADS) -k -a=-S --exit-code-only --skip-failing -t60 $(TEST_DIR)/integration $(ARGS)
@# skip -n for dbg @# skip -n for dbg
$(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_release -j$(TEST_THREADS) -k -a=-O -a=-x -a=-S $(TESTS_DIR) $(ARGS) $(PYTHON) $(TOOLS_DIR)/tester.py -R pyston_release -j$(TEST_THREADS) -k -a=-O -a=-x -a=-S $(TESTS_DIR) $(ARGS)
...@@ -954,7 +954,7 @@ check$1 test$1: $(PYTHON_EXE_DEPS) pyston$1 ext_pyston ...@@ -954,7 +954,7 @@ check$1 test$1: $(PYTHON_EXE_DEPS) pyston$1 ext_pyston
$(PYTHON) $(TOOLS_DIR)/tester.py -R pyston$1 -j$(TEST_THREADS) -a=-S -k $(TESTS_DIR) $(ARGS) $(PYTHON) $(TOOLS_DIR)/tester.py -R pyston$1 -j$(TEST_THREADS) -a=-S -k $(TESTS_DIR) $(ARGS)
@# we pass -I to cpython tests and skip failing ones because they are sloooow otherwise @# we pass -I to cpython tests and skip failing ones because they are sloooow otherwise
$(PYTHON) $(TOOLS_DIR)/tester.py -R pyston$1 -j$(TEST_THREADS) -a=-S -a=-I -k --exit-code-only --skip-failing $(TEST_DIR)/cpython $(ARGS) $(PYTHON) $(TOOLS_DIR)/tester.py -R pyston$1 -j$(TEST_THREADS) -a=-S -a=-I -k --exit-code-only --skip-failing $(TEST_DIR)/cpython $(ARGS)
$(PYTHON) $(TOOLS_DIR)/tester.py -R pyston$1 -j$(TEST_THREADS) -k -a=-S --exit-code-only -t=60 $(TEST_DIR)/integration $(ARGS) $(PYTHON) $(TOOLS_DIR)/tester.py -R pyston$1 -j$(TEST_THREADS) -k -a=-S --exit-code-only --skip-failing -t=60 $(TEST_DIR)/integration $(ARGS)
$(PYTHON) $(TOOLS_DIR)/tester.py -a=-x -R pyston$1 -j$(TEST_THREADS) -a=-n -a=-S -k $(TESTS_DIR) $(ARGS) $(PYTHON) $(TOOLS_DIR)/tester.py -a=-x -R pyston$1 -j$(TEST_THREADS) -a=-n -a=-S -k $(TESTS_DIR) $(ARGS)
$(PYTHON) $(TOOLS_DIR)/tester.py -R pyston$1 -j$(TEST_THREADS) -a=-O -a=-S -k $(TESTS_DIR) $(ARGS) $(PYTHON) $(TOOLS_DIR)/tester.py -R pyston$1 -j$(TEST_THREADS) -a=-O -a=-S -k $(TESTS_DIR) $(ARGS)
......
...@@ -4,9 +4,11 @@ opcode module - potentially shared between dis and other modules which ...@@ -4,9 +4,11 @@ opcode module - potentially shared between dis and other modules which
operate on bytecodes (e.g. peephole optimizers). operate on bytecodes (e.g. peephole optimizers).
""" """
# Pyston change: disable this module # Pyston change: disable this module.
raise NotImplementedError() # distutils does 'import opcode; foo(opcode.__file__)' to determine where the standard
# library lives, so still have to provide this file as an importable module.
"""
__all__ = ["cmp_op", "hasconst", "hasname", "hasjrel", "hasjabs", __all__ = ["cmp_op", "hasconst", "hasname", "hasjrel", "hasjabs",
"haslocal", "hascompare", "hasfree", "opname", "opmap", "haslocal", "hascompare", "hasfree", "opname", "opmap",
"HAVE_ARGUMENT", "EXTENDED_ARG"] "HAVE_ARGUMENT", "EXTENDED_ARG"]
...@@ -193,3 +195,4 @@ def_op('SET_ADD', 146) ...@@ -193,3 +195,4 @@ def_op('SET_ADD', 146)
def_op('MAP_ADD', 147) def_op('MAP_ADD', 147)
del def_op, name_op, jrel_op, jabs_op del def_op, name_op, jrel_op, jabs_op
"""
...@@ -61,7 +61,7 @@ ICSlotRewrite::ICSlotRewrite(ICInfo* ic, const char* debug_name) : ic(ic), debug ...@@ -61,7 +61,7 @@ ICSlotRewrite::ICSlotRewrite(ICInfo* ic, const char* debug_name) : ic(ic), debug
assembler = new Assembler(buf, ic->getSlotSize()); assembler = new Assembler(buf, ic->getSlotSize());
assembler->nop(); assembler->nop();
if (VERBOSITY() >= 2) if (VERBOSITY() >= 4)
printf("starting %s icentry\n", debug_name); printf("starting %s icentry\n", debug_name);
} }
...@@ -86,7 +86,7 @@ void ICSlotRewrite::commit(CommitHook* hook) { ...@@ -86,7 +86,7 @@ void ICSlotRewrite::commit(CommitHook* hook) {
} }
} }
if (!still_valid) { if (!still_valid) {
if (VERBOSITY() >= 2) if (VERBOSITY() >= 3)
printf("not committing %s icentry since a dependency got updated before commit\n", debug_name); printf("not committing %s icentry since a dependency got updated before commit\n", debug_name);
return; return;
} }
...@@ -165,14 +165,14 @@ ICSlotInfo* ICInfo::pickEntryForRewrite(const char* debug_name) { ...@@ -165,14 +165,14 @@ ICSlotInfo* ICInfo::pickEntryForRewrite(const char* debug_name) {
if (sinfo.num_inside) if (sinfo.num_inside)
continue; continue;
if (VERBOSITY() >= 3) { if (VERBOSITY() >= 4) {
printf("committing %s icentry to in-use slot %d at %p\n", debug_name, i, start_addr); printf("committing %s icentry to in-use slot %d at %p\n", debug_name, i, start_addr);
} }
next_slot_to_try = i + 1; next_slot_to_try = i + 1;
return &sinfo; return &sinfo;
} }
if (VERBOSITY() >= 3) if (VERBOSITY() >= 4)
printf("not committing %s icentry since there are no available slots\n", debug_name); printf("not committing %s icentry since there are no available slots\n", debug_name);
return NULL; return NULL;
} }
...@@ -259,7 +259,7 @@ void ICInfo::clear(ICSlotInfo* icentry) { ...@@ -259,7 +259,7 @@ void ICInfo::clear(ICSlotInfo* icentry) {
uint8_t* start = (uint8_t*)start_addr + icentry->idx * getSlotSize(); uint8_t* start = (uint8_t*)start_addr + icentry->idx * getSlotSize();
if (VERBOSITY() >= 3) if (VERBOSITY() >= 4)
printf("clearing patchpoint %p, slot at %p\n", start_addr, start); printf("clearing patchpoint %p, slot at %p\n", start_addr, start);
std::unique_ptr<Assembler> writer(new Assembler(start, getSlotSize())); std::unique_ptr<Assembler> writer(new Assembler(start, getSlotSize()));
......
...@@ -185,12 +185,12 @@ static void optimizeIR(llvm::Function* f, EffortLevel effort) { ...@@ -185,12 +185,12 @@ static void optimizeIR(llvm::Function* f, EffortLevel effort) {
bool changed = fpm.run(*f); bool changed = fpm.run(*f);
if (!changed) { if (!changed) {
if (VERBOSITY("irgen")) if (VERBOSITY("irgen") >= 2)
printf("done after %d optimization iterations\n", i - 1); printf("done after %d optimization iterations\n", i - 1);
break; break;
} }
if (VERBOSITY("irgen") >= 1) { if (VERBOSITY("irgen") >= 2) {
fprintf(stderr, "after optimization %d:\n", i); fprintf(stderr, "after optimization %d:\n", i);
printf("\033[36m"); printf("\033[36m");
fflush(stdout); fflush(stdout);
...@@ -266,7 +266,7 @@ static std::vector<std::pair<CFGBlock*, CFGBlock*>> computeBlockTraversalOrder(c ...@@ -266,7 +266,7 @@ static std::vector<std::pair<CFGBlock*, CFGBlock*>> computeBlockTraversalOrder(c
} }
assert(best != NULL); assert(best != NULL);
if (VERBOSITY("irgen") >= 1) if (VERBOSITY("irgen") >= 2)
printf("Giving up and adding block %d to the order\n", best->idx); printf("Giving up and adding block %d to the order\n", best->idx);
in_queue.insert(best); in_queue.insert(best);
rtn.push_back(std::make_pair(best, (CFGBlock*)NULL)); rtn.push_back(std::make_pair(best, (CFGBlock*)NULL));
...@@ -457,7 +457,7 @@ static void emitBBs(IRGenState* irstate, TypeAnalysis* types, const OSREntryDesc ...@@ -457,7 +457,7 @@ static void emitBBs(IRGenState* irstate, TypeAnalysis* types, const OSREntryDesc
phi_type->debugName().c_str()); phi_type->debugName().c_str());
} }
if (VERBOSITY("irgen")) if (VERBOSITY("irgen") >= 2)
v->setName("prev_" + p.first.str()); v->setName("prev_" + p.first.str());
(*osr_syms)[p.first] = new ConcreteCompilerVariable(phi_type, v, true); (*osr_syms)[p.first] = new ConcreteCompilerVariable(phi_type, v, true);
...@@ -507,11 +507,11 @@ static void emitBBs(IRGenState* irstate, TypeAnalysis* types, const OSREntryDesc ...@@ -507,11 +507,11 @@ static void emitBBs(IRGenState* irstate, TypeAnalysis* types, const OSREntryDesc
CFGBlock* block = traversal_order[_i].first; CFGBlock* block = traversal_order[_i].first;
CFGBlock* pred = traversal_order[_i].second; CFGBlock* pred = traversal_order[_i].second;
if (VERBOSITY("irgen") >= 2) if (VERBOSITY("irgen") >= 3)
printf("processing block %d\n", block->idx); printf("processing block %d\n", block->idx);
if (!blocks.count(block)) { if (!blocks.count(block)) {
if (VERBOSITY("irgen") >= 2) if (VERBOSITY("irgen") >= 3)
printf("Skipping this block\n"); printf("Skipping this block\n");
// created_phis[block] = NULL; // created_phis[block] = NULL;
// ending_symbol_tables[block] = NULL; // ending_symbol_tables[block] = NULL;
...@@ -872,7 +872,7 @@ static void emitBBs(IRGenState* irstate, TypeAnalysis* types, const OSREntryDesc ...@@ -872,7 +872,7 @@ static void emitBBs(IRGenState* irstate, TypeAnalysis* types, const OSREntryDesc
} }
static void computeBlockSetClosure(BlockSet& blocks) { static void computeBlockSetClosure(BlockSet& blocks) {
if (VERBOSITY("irgen") >= 1) { if (VERBOSITY("irgen") >= 2) {
printf("Initial:"); printf("Initial:");
for (CFGBlock* b : blocks) { for (CFGBlock* b : blocks) {
printf(" %d", b->idx); printf(" %d", b->idx);
...@@ -898,7 +898,7 @@ static void computeBlockSetClosure(BlockSet& blocks) { ...@@ -898,7 +898,7 @@ static void computeBlockSetClosure(BlockSet& blocks) {
} }
} }
if (VERBOSITY("irgen") >= 1) { if (VERBOSITY("irgen") >= 2) {
printf("Ending:"); printf("Ending:");
for (CFGBlock* b : blocks) { for (CFGBlock* b : blocks) {
printf(" %d", b->idx); printf(" %d", b->idx);
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "core/stats.h" #include "core/stats.h"
#include "core/types.h" #include "core/types.h"
#include "core/util.h" #include "core/util.h"
#include "runtime/capi.h"
#include "runtime/objmodel.h" #include "runtime/objmodel.h"
#include "runtime/types.h" #include "runtime/types.h"
...@@ -169,7 +170,7 @@ static void compileIR(CompiledFunction* cf, EffortLevel effort) { ...@@ -169,7 +170,7 @@ static void compileIR(CompiledFunction* cf, EffortLevel effort) {
} }
} }
if (VERBOSITY("irgen") >= 1) { if (VERBOSITY("irgen") >= 2) {
printf("Compiled function to %p\n", cf->code); printf("Compiled function to %p\n", cf->code);
} }
...@@ -199,7 +200,7 @@ CompiledFunction* compileFunction(CLFunction* f, FunctionSpecialization* spec, E ...@@ -199,7 +200,7 @@ CompiledFunction* compileFunction(CLFunction* f, FunctionSpecialization* spec, E
llvm::raw_string_ostream ss(s); llvm::raw_string_ostream ss(s);
if (spec) { if (spec) {
ss << "\033[34;1mJIT'ing " << name << " with signature ("; ss << "\033[34;1mJIT'ing " << source->parent_module->fn << ":" << name << " with signature (";
for (int i = 0; i < spec->arg_types.size(); i++) { for (int i = 0; i < spec->arg_types.size(); i++) {
if (i > 0) if (i > 0)
ss << ", "; ss << ", ";
...@@ -209,8 +210,8 @@ CompiledFunction* compileFunction(CLFunction* f, FunctionSpecialization* spec, E ...@@ -209,8 +210,8 @@ CompiledFunction* compileFunction(CLFunction* f, FunctionSpecialization* spec, E
ss << ") -> "; ss << ") -> ";
ss << spec->rtn_type->debugName(); ss << spec->rtn_type->debugName();
} else { } else {
ss << "\033[34;1mDoing OSR-entry partial compile of " << name << ", starting with backedge to block " ss << "\033[34;1mDoing OSR-entry partial compile of " << source->parent_module->fn << ":" << name
<< entry_descriptor->backedge->target->idx; << ", starting with backedge to block " << entry_descriptor->backedge->target->idx;
} }
ss << " at effort level " << (int)effort; ss << " at effort level " << (int)effort;
ss << "\033[0m"; ss << "\033[0m";
...@@ -371,6 +372,13 @@ Box* eval(Box* boxedCode) { ...@@ -371,6 +372,13 @@ Box* eval(Box* boxedCode) {
if (globals && globals->cls == attrwrapper_cls && unwrapAttrWrapper(globals) == module) if (globals && globals->cls == attrwrapper_cls && unwrapAttrWrapper(globals) == module)
globals = NULL; globals = NULL;
if (boxedCode->cls == unicode_cls) {
boxedCode = PyUnicode_AsUTF8String(boxedCode);
if (!boxedCode)
throwCAPIException();
// cf.cf_flags |= PyCF_SOURCE_IS_UTF8
}
// TODO error message if parse fails or if it isn't an expr // TODO error message if parse fails or if it isn't an expr
// TODO should have a cleaner interface that can parse the Expression directly // TODO should have a cleaner interface that can parse the Expression directly
// TODO this memory leaks // TODO this memory leaks
...@@ -393,6 +401,18 @@ Box* eval(Box* boxedCode) { ...@@ -393,6 +401,18 @@ Box* eval(Box* boxedCode) {
} }
Box* exec(Box* boxedCode, Box* globals, Box* locals) { Box* exec(Box* boxedCode, Box* globals, Box* locals) {
if (isSubclass(boxedCode->cls, tuple_cls)) {
RELEASE_ASSERT(!globals, "");
RELEASE_ASSERT(!locals, "");
BoxedTuple* t = static_cast<BoxedTuple*>(boxedCode);
RELEASE_ASSERT(t->size() >= 2 && t->size() <= 3, "%ld", t->size());
boxedCode = t->elts[0];
globals = t->elts[1];
if (t->size() >= 3)
locals = t->elts[2];
}
if (globals == None) if (globals == None)
globals = NULL; globals = NULL;
...@@ -428,8 +448,15 @@ Box* exec(Box* boxedCode, Box* globals, Box* locals) { ...@@ -428,8 +448,15 @@ Box* exec(Box* boxedCode, Box* globals, Box* locals) {
PyDict_SetItemString(globals, "__builtins__", builtins_module); PyDict_SetItemString(globals, "__builtins__", builtins_module);
} }
if (boxedCode->cls == unicode_cls) {
boxedCode = PyUnicode_AsUTF8String(boxedCode);
if (!boxedCode)
throwCAPIException();
// cf.cf_flags |= PyCF_SOURCE_IS_UTF8
}
// TODO same issues as in `eval` // TODO same issues as in `eval`
RELEASE_ASSERT(boxedCode->cls == str_cls, ""); RELEASE_ASSERT(boxedCode->cls == str_cls, "%s", boxedCode->cls->tp_name);
const char* code = static_cast<BoxedString*>(boxedCode)->s.data(); const char* code = static_cast<BoxedString*>(boxedCode)->s.data();
AST_Module* parsedModule = parse_string(code); AST_Module* parsedModule = parse_string(code);
AST_Suite* parsedSuite = new AST_Suite(std::move(parsedModule->interned_strings)); AST_Suite* parsedSuite = new AST_Suite(std::move(parsedModule->interned_strings));
...@@ -553,7 +580,7 @@ void* compilePartialFunc(OSRExit* exit) { ...@@ -553,7 +580,7 @@ void* compilePartialFunc(OSRExit* exit) {
static StatCounter stat_reopt("reopts"); static StatCounter stat_reopt("reopts");
extern "C" CompiledFunction* reoptCompiledFuncInternal(CompiledFunction* cf) { extern "C" CompiledFunction* reoptCompiledFuncInternal(CompiledFunction* cf) {
if (VERBOSITY("irgen") >= 1) if (VERBOSITY("irgen") >= 2)
printf("In reoptCompiledFunc, %p, %ld\n", cf, cf->times_called); printf("In reoptCompiledFunc, %p, %ld\n", cf, cf->times_called);
stat_reopt.log(); stat_reopt.log();
......
...@@ -67,7 +67,7 @@ public: ...@@ -67,7 +67,7 @@ public:
AliasResult _alias(const Location& LocA, const Location& LocB) { AliasResult _alias(const Location& LocA, const Location& LocB) {
AliasResult base = AliasAnalysis::alias(LocA, LocB); AliasResult base = AliasAnalysis::alias(LocA, LocB);
if (VERBOSITY("opt.aa") >= 2) { if (VERBOSITY("opt.aa") >= 4) {
indent(); indent();
errs() << "_alias():\n"; errs() << "_alias():\n";
// cast<Instruction>(LocA.Ptr)->getParent()->dump(); // cast<Instruction>(LocA.Ptr)->getParent()->dump();
...@@ -97,12 +97,12 @@ public: ...@@ -97,12 +97,12 @@ public:
continue; continue;
const Value* bc_base = *BI->op_begin(); const Value* bc_base = *BI->op_begin();
if (VERBOSITY("opt.aa") >= 2) { if (VERBOSITY("opt.aa") >= 4) {
indent(); indent();
errs() << "loc " << i << " is bitcast, recursing\n"; errs() << "loc " << i << " is bitcast, recursing\n";
} }
AliasResult bc_base_aliases = alias(locs[i ^ 1], Location(bc_base, locs[i].Size)); AliasResult bc_base_aliases = alias(locs[i ^ 1], Location(bc_base, locs[i].Size));
if (VERBOSITY("opt.aa") >= 2) { if (VERBOSITY("opt.aa") >= 4) {
indent(); indent();
bc_base->dump(); bc_base->dump();
indent(); indent();
...@@ -122,12 +122,12 @@ public: ...@@ -122,12 +122,12 @@ public:
assert(baseA); assert(baseA);
assert(baseB); assert(baseB);
if (VERBOSITY("opt.aa") >= 2) { if (VERBOSITY("opt.aa") >= 4) {
indent(); indent();
errs() << "2 geps, recursing\n"; errs() << "2 geps, recursing\n";
} }
AliasResult bases_alias = alias(Location(baseA), Location(baseB)); AliasResult bases_alias = alias(Location(baseA), Location(baseB));
if (VERBOSITY("opt.aa") >= 2) { if (VERBOSITY("opt.aa") >= 4) {
indent(); indent();
errs() << "2gep base aliases: " << bases_alias << '\n'; errs() << "2gep base aliases: " << bases_alias << '\n';
indent(); indent();
...@@ -146,7 +146,7 @@ public: ...@@ -146,7 +146,7 @@ public:
bool accumA = GIa->accumulateConstantOffset(*DL, offsetA); bool accumA = GIa->accumulateConstantOffset(*DL, offsetA);
bool accumB = GIb->accumulateConstantOffset(*DL, offsetB); bool accumB = GIb->accumulateConstantOffset(*DL, offsetB);
if (accumA && accumB) { if (accumA && accumB) {
if (VERBOSITY("opt.aa") >= 2) { if (VERBOSITY("opt.aa") >= 4) {
indent(); indent();
errs() << offsetA << ' ' << LocA.Size << ' ' << offsetB << ' ' << LocB.Size << '\n'; errs() << offsetA << ' ' << LocA.Size << ' ' << offsetB << ' ' << LocB.Size << '\n';
} }
...@@ -184,12 +184,12 @@ public: ...@@ -184,12 +184,12 @@ public:
const Value* gep_base = GI->getPointerOperand(); const Value* gep_base = GI->getPointerOperand();
assert(gep_base); assert(gep_base);
if (VERBOSITY("opt.aa") >= 2) { if (VERBOSITY("opt.aa") >= 4) {
indent(); indent();
errs() << "loc " << i << " is gep, recursing\n"; errs() << "loc " << i << " is gep, recursing\n";
} }
AliasResult gep_base_aliases = alias(locs[i ^ 1], Location(gep_base)); AliasResult gep_base_aliases = alias(locs[i ^ 1], Location(gep_base));
if (VERBOSITY("opt.aa") >= 2) { if (VERBOSITY("opt.aa") >= 4) {
indent(); indent();
gep_base->dump(); gep_base->dump();
indent(); indent();
...@@ -222,13 +222,13 @@ public: ...@@ -222,13 +222,13 @@ public:
} }
AliasResult alias(const Location& LocA, const Location& LocB) override { AliasResult alias(const Location& LocA, const Location& LocB) override {
if (VERBOSITY("opt.aa") >= 2 && depth == 0 && isa<Instruction>(LocA.Ptr)) { if (VERBOSITY("opt.aa") >= 4 && depth == 0 && isa<Instruction>(LocA.Ptr)) {
cast<Instruction>(LocA.Ptr)->getParent()->dump(); cast<Instruction>(LocA.Ptr)->getParent()->dump();
} }
depth++; depth++;
AliasResult rtn = _alias(LocA, LocB); AliasResult rtn = _alias(LocA, LocB);
if (VERBOSITY("opt.aa") >= 2) { if (VERBOSITY("opt.aa") >= 4) {
indent(); indent();
errs() << "alias():\n"; errs() << "alias():\n";
indent(); indent();
...@@ -250,7 +250,7 @@ public: ...@@ -250,7 +250,7 @@ public:
if (!CS.getCalledFunction()) if (!CS.getCalledFunction())
return base; return base;
if (VERBOSITY("opt.aa") >= 2) { if (VERBOSITY("opt.aa") >= 4) {
errs() << "getModRefInfo():\n"; errs() << "getModRefInfo():\n";
CS->dump(); CS->dump();
Loc.Ptr->dump(); Loc.Ptr->dump();
...@@ -269,7 +269,7 @@ public: ...@@ -269,7 +269,7 @@ public:
if (escapes != EscapeAnalysis::Escaped) { if (escapes != EscapeAnalysis::Escaped) {
StatCounter num_improved("opt_modref_noescape"); StatCounter num_improved("opt_modref_noescape");
num_improved.log(); num_improved.log();
if (VERBOSITY("opt.aa") >= 2) { if (VERBOSITY("opt.aa") >= 4) {
errs() << "Was able to show that " << *CS.getInstruction() << " can't modify " << *Loc.Ptr << '\n'; errs() << "Was able to show that " << *CS.getInstruction() << " can't modify " << *Loc.Ptr << '\n';
} }
return NoModRef; return NoModRef;
......
...@@ -71,7 +71,7 @@ void StackmapJITEventListener::NotifyObjectEmitted(const llvm::object::ObjectFil ...@@ -71,7 +71,7 @@ void StackmapJITEventListener::NotifyObjectEmitted(const llvm::object::ObjectFil
uint64_t stackmap_address = L.getSectionLoadAddress(name); uint64_t stackmap_address = L.getSectionLoadAddress(name);
assert(stackmap_address > 0); assert(stackmap_address > 0);
if (VERBOSITY() >= 2) if (VERBOSITY() >= 3)
printf("Found the stackmaps at stackmap_address 0x%lx\n", stackmap_address); printf("Found the stackmaps at stackmap_address 0x%lx\n", stackmap_address);
assert(cur_map == NULL); assert(cur_map == NULL);
...@@ -102,27 +102,27 @@ void StackmapJITEventListener::NotifyObjectEmitted(const llvm::object::ObjectFil ...@@ -102,27 +102,27 @@ void StackmapJITEventListener::NotifyObjectEmitted(const llvm::object::ObjectFil
int nconstants = *ptr.u32++; int nconstants = *ptr.u32++;
int nrecords = *ptr.u32++; int nrecords = *ptr.u32++;
if (VERBOSITY() >= 2) if (VERBOSITY() >= 3)
printf("%d functions\n", nfunctions); printf("%d functions\n", nfunctions);
for (int i = 0; i < nfunctions; i++) { for (int i = 0; i < nfunctions; i++) {
const StackMap::StackSizeRecord& size_record = *ptr.size_record++; const StackMap::StackSizeRecord& size_record = *ptr.size_record++;
cur_map->stack_size_records.push_back(size_record); cur_map->stack_size_records.push_back(size_record);
if (VERBOSITY() >= 2) if (VERBOSITY() >= 3)
printf("function %d: offset 0x%lx, stack size 0x%lx\n", i, size_record.offset, printf("function %d: offset 0x%lx, stack size 0x%lx\n", i, size_record.offset,
size_record.stack_size); size_record.stack_size);
} }
if (VERBOSITY() >= 2) if (VERBOSITY() >= 3)
printf("%d constants\n", nconstants); printf("%d constants\n", nconstants);
for (int i = 0; i < nconstants; i++) { for (int i = 0; i < nconstants; i++) {
uint64_t constant = *ptr.u64++; uint64_t constant = *ptr.u64++;
if (VERBOSITY() >= 2) if (VERBOSITY() >= 3)
printf("Constant %d: %ld\n", i, constant); printf("Constant %d: %ld\n", i, constant);
cur_map->constants.push_back(constant); cur_map->constants.push_back(constant);
} }
if (VERBOSITY() >= 2) if (VERBOSITY() >= 3)
printf("%d records\n", nrecords); printf("%d records\n", nrecords);
for (int i = 0; i < nrecords; i++) { for (int i = 0; i < nrecords; i++) {
...@@ -135,7 +135,7 @@ void StackmapJITEventListener::NotifyObjectEmitted(const llvm::object::ObjectFil ...@@ -135,7 +135,7 @@ void StackmapJITEventListener::NotifyObjectEmitted(const llvm::object::ObjectFil
int numlocations = *ptr.u16++; int numlocations = *ptr.u16++;
if (VERBOSITY() >= 2) if (VERBOSITY() >= 3)
printf("Stackmap record %ld at 0x%x has %d locations:\n", record->id, record->offset, numlocations); printf("Stackmap record %ld at 0x%x has %d locations:\n", record->id, record->offset, numlocations);
for (int j = 0; j < numlocations; j++) { for (int j = 0; j < numlocations; j++) {
assert(sizeof(StackMap::Record::Location) == sizeof(*ptr.u64)); assert(sizeof(StackMap::Record::Location) == sizeof(*ptr.u64));
...@@ -148,7 +148,7 @@ void StackmapJITEventListener::NotifyObjectEmitted(const llvm::object::ObjectFil ...@@ -148,7 +148,7 @@ void StackmapJITEventListener::NotifyObjectEmitted(const llvm::object::ObjectFil
"%rax", "%rdx", "%rcx", "%rbx", "%rsi", "%rdi", "%rbp", "%rsp", "%rax", "%rdx", "%rcx", "%rbx", "%rsi", "%rdi", "%rbp", "%rsp",
"%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
}; };
if (VERBOSITY() >= 2) { if (VERBOSITY() >= 3) {
if (r.type == 1) { if (r.type == 1) {
printf("Location %d: type %d (reg), reg %d (%s), offset %d\n", j, r.type, r.regnum, printf("Location %d: type %d (reg), reg %d (%s), offset %d\n", j, r.type, r.regnum,
dwarf_reg_names[r.regnum], r.offset); dwarf_reg_names[r.regnum], r.offset);
...@@ -164,7 +164,7 @@ void StackmapJITEventListener::NotifyObjectEmitted(const llvm::object::ObjectFil ...@@ -164,7 +164,7 @@ void StackmapJITEventListener::NotifyObjectEmitted(const llvm::object::ObjectFil
const StackMap::Record::LiveOut& r = *ptr.record_liveout++; const StackMap::Record::LiveOut& r = *ptr.record_liveout++;
record->live_outs.push_back(r); record->live_outs.push_back(r);
if (VERBOSITY() >= 2) { if (VERBOSITY() >= 3) {
printf("Live out %d: reg #%d (?), size %d\n", i, r.regnum, r.size); printf("Live out %d: reg #%d (?), size %d\n", i, r.regnum, r.size);
} }
} }
......
...@@ -182,7 +182,7 @@ public: ...@@ -182,7 +182,7 @@ public:
Addr, Size, llvm::DILineInfoSpecifier(llvm::DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath, Addr, Size, llvm::DILineInfoSpecifier(llvm::DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath,
llvm::DILineInfoSpecifier::FunctionNameKind::LinkageName)); llvm::DILineInfoSpecifier::FunctionNameKind::LinkageName));
#endif #endif
if (VERBOSITY() >= 2) { if (VERBOSITY() >= 3) {
for (int i = 0; i < lines.size(); i++) { for (int i = 0; i < lines.size(); i++) {
printf("%s:%d, %s: %lx\n", lines[i].second.FileName.c_str(), lines[i].second.Line, printf("%s:%d, %s: %lx\n", lines[i].second.FileName.c_str(), lines[i].second.Line,
lines[i].second.FunctionName.c_str(), lines[i].first); lines[i].second.FunctionName.c_str(), lines[i].first);
...@@ -213,7 +213,7 @@ public: ...@@ -213,7 +213,7 @@ public:
eh_frame_addr = L.getSectionLoadAddress(name); eh_frame_addr = L.getSectionLoadAddress(name);
eh_frame_size = sec.getSize(); eh_frame_size = sec.getSize();
if (VERBOSITY()) if (VERBOSITY() >= 2)
printf("eh_frame: %lx %lx\n", eh_frame_addr, eh_frame_size); printf("eh_frame: %lx %lx\n", eh_frame_addr, eh_frame_size);
found_eh_frame = true; found_eh_frame = true;
} else if (name == ".text") { } else if (name == ".text") {
...@@ -221,7 +221,7 @@ public: ...@@ -221,7 +221,7 @@ public:
text_addr = L.getSectionLoadAddress(name); text_addr = L.getSectionLoadAddress(name);
text_size = sec.getSize(); text_size = sec.getSize();
if (VERBOSITY()) if (VERBOSITY() >= 2)
printf("text: %lx %lx\n", text_addr, text_size); printf("text: %lx %lx\n", text_addr, text_size);
found_text = true; found_text = true;
} }
...@@ -239,7 +239,7 @@ public: ...@@ -239,7 +239,7 @@ public:
dyn_info->u.rti.segbase = eh_frame_addr; dyn_info->u.rti.segbase = eh_frame_addr;
parseEhFrame(eh_frame_addr, eh_frame_size, &dyn_info->u.rti.table_data, &dyn_info->u.rti.table_len); parseEhFrame(eh_frame_addr, eh_frame_size, &dyn_info->u.rti.table_data, &dyn_info->u.rti.table_len);
if (VERBOSITY()) if (VERBOSITY() >= 2)
printf("dyn_info = %p, table_data = %p\n", dyn_info, (void*)dyn_info->u.rti.table_data); printf("dyn_info = %p, table_data = %p\n", dyn_info, (void*)dyn_info->u.rti.table_data);
_U_dyn_register(dyn_info); _U_dyn_register(dyn_info);
......
...@@ -40,6 +40,7 @@ bool USE_STRIPPED_STDLIB = true; // always true ...@@ -40,6 +40,7 @@ bool USE_STRIPPED_STDLIB = true; // always true
bool ENABLE_INTERPRETER = true; bool ENABLE_INTERPRETER = true;
bool ENABLE_PYPA_PARSER = true; bool ENABLE_PYPA_PARSER = true;
bool USE_REGALLOC_BASIC = true; bool USE_REGALLOC_BASIC = true;
bool PAUSE_AT_ABORT = false;
int OSR_THRESHOLD_INTERPRETER = 200; int OSR_THRESHOLD_INTERPRETER = 200;
int REOPT_THRESHOLD_INTERPRETER = 100; int REOPT_THRESHOLD_INTERPRETER = 100;
......
...@@ -37,7 +37,7 @@ extern int OSR_THRESHOLD_T2, REOPT_THRESHOLD_T2; ...@@ -37,7 +37,7 @@ extern int OSR_THRESHOLD_T2, REOPT_THRESHOLD_T2;
extern int SPECULATION_THRESHOLD; extern int SPECULATION_THRESHOLD;
extern bool SHOW_DISASM, FORCE_INTERPRETER, FORCE_OPTIMIZE, PROFILE, DUMPJIT, TRAP, USE_STRIPPED_STDLIB, extern bool SHOW_DISASM, FORCE_INTERPRETER, FORCE_OPTIMIZE, PROFILE, DUMPJIT, TRAP, USE_STRIPPED_STDLIB,
CONTINUE_AFTER_FATAL, ENABLE_INTERPRETER, ENABLE_PYPA_PARSER, USE_REGALLOC_BASIC; CONTINUE_AFTER_FATAL, ENABLE_INTERPRETER, ENABLE_PYPA_PARSER, USE_REGALLOC_BASIC, PAUSE_AT_ABORT;
extern bool ENABLE_ICS, ENABLE_ICGENERICS, ENABLE_ICGETITEMS, ENABLE_ICSETITEMS, ENABLE_ICDELITEMS, ENABLE_ICBINEXPS, extern bool ENABLE_ICS, ENABLE_ICGENERICS, ENABLE_ICGETITEMS, ENABLE_ICSETITEMS, ENABLE_ICDELITEMS, ENABLE_ICBINEXPS,
ENABLE_ICNONZEROS, ENABLE_ICCALLSITES, ENABLE_ICSETATTRS, ENABLE_ICGETATTRS, ENALBE_ICDELATTRS, ENABLE_ICGETGLOBALS, ENABLE_ICNONZEROS, ENABLE_ICCALLSITES, ENABLE_ICSETATTRS, ENABLE_ICGETATTRS, ENALBE_ICDELATTRS, ENABLE_ICGETGLOBALS,
......
...@@ -127,7 +127,7 @@ void registerGCManagedBytes(size_t bytes) { ...@@ -127,7 +127,7 @@ void registerGCManagedBytes(size_t bytes) {
Heap global_heap; Heap global_heap;
bool _doFree(GCAllocation* al, std::list<Box*, StlCompatAllocator<Box*>>* weakly_referenced) { bool _doFree(GCAllocation* al, std::list<Box*, StlCompatAllocator<Box*>>* weakly_referenced) {
if (VERBOSITY() >= 2) if (VERBOSITY() >= 4)
printf("Freeing %p\n", al->user_data); printf("Freeing %p\n", al->user_data);
#ifndef NVALGRIND #ifndef NVALGRIND
......
...@@ -80,7 +80,7 @@ static int main(int argc, char** argv) { ...@@ -80,7 +80,7 @@ static int main(int argc, char** argv) {
bool stats = false; bool stats = false;
bool unbuffered = false; bool unbuffered = false;
const char* command = NULL; const char* command = NULL;
while ((code = getopt(argc, argv, "+OqdIibpjtrsSvnxc:Fu")) != -1) { while ((code = getopt(argc, argv, "+OqdIibpjtrsSvnxc:FuP")) != -1) {
if (code == 'O') if (code == 'O')
FORCE_OPTIMIZE = true; FORCE_OPTIMIZE = true;
else if (code == 't') else if (code == 't')
...@@ -113,6 +113,8 @@ static int main(int argc, char** argv) { ...@@ -113,6 +113,8 @@ static int main(int argc, char** argv) {
USE_REGALLOC_BASIC = false; USE_REGALLOC_BASIC = false;
} else if (code == 'x') { } else if (code == 'x') {
ENABLE_PYPA_PARSER = false; ENABLE_PYPA_PARSER = false;
} else if (code == 'P') {
PAUSE_AT_ABORT = true;
} else if (code == 'F') { } else if (code == 'F') {
CONTINUE_AFTER_FATAL = true; CONTINUE_AFTER_FATAL = true;
} else if (code == 'c') { } else if (code == 'c') {
......
...@@ -78,7 +78,8 @@ extern "C" Box* dir(Box* obj) { ...@@ -78,7 +78,8 @@ extern "C" Box* dir(Box* obj) {
} }
extern "C" Box* vars(Box* obj) { extern "C" Box* vars(Box* obj) {
RELEASE_ASSERT(obj, "Don't support 0-arg vars() calls yet"); if (!obj)
return fastLocalsToBoxedLocals();
return makeAttrWrapper(obj); return makeAttrWrapper(obj);
} }
......
...@@ -182,6 +182,12 @@ extern "C" void abort() { ...@@ -182,6 +182,12 @@ extern "C" void abort() {
alarm(0); alarm(0);
} }
if (PAUSE_AT_ABORT) {
printf("PID %d about to call libc abort; pausing for a debugger...\n", getpid());
while (true) {
sleep(1);
}
}
libc_abort(); libc_abort();
__builtin_unreachable(); __builtin_unreachable();
} }
......
Subproject commit ee62ccfda4950352bcad9612f0951fb38d805350
# expected: fail
# - jit issue
import os
import sys
import subprocess
import shutil
VIRTUALENV_SCRIPT = os.path.dirname(__file__) + "/virtualenv/virtualenv.py"
if os.path.exists("test_env"):
print "Removing the existing 'test_env/' directory"
subprocess.check_call(["rm", "-rf", "test_env"])
# shutil follows symlinks to directories, and deletes whatever those contain.
# shutil.rmtree("test_env")
args = [sys.executable, VIRTUALENV_SCRIPT, "-p", sys.executable, "test_env"]
print "Running", args
subprocess.check_call(args)
sh_script = """
set -e
. test_env/bin/activate
set -ux
python -c 'import __future__'
python -c 'import sys; print sys.executable'
pip install bcrypt==1.1.0
python -c 'import bcrypt; assert bcrypt.__version__ == "1.1.0"; assert bcrypt.hashpw("password1", "$2a$12$0123456789012345678901").endswith("I1hdtg4K"); print "bcrypt seems to work"'
""".strip()
# print sh_script
subprocess.check_call(["sh", "-c", sh_script])
...@@ -3,3 +3,7 @@ a = 5 ...@@ -3,3 +3,7 @@ a = 5
print a""" print a"""
exec "" exec ""
# Exec of a unicode encodes as utf8:
exec u"print repr('\u0180')"
print repr(eval(u"'\u0180'"))
...@@ -125,3 +125,9 @@ def show(obj, msg): ...@@ -125,3 +125,9 @@ def show(obj, msg):
print msg print msg
return obj return obj
exec show("print 'in exec'", "body") in show(None, "globals"), show(None, "locals") exec show("print 'in exec'", "body") in show(None, "globals"), show(None, "locals")
g = {}
l = {}
exec ("a=1; print a", g, l)
print g.keys(), l.keys()
# fail-if: '-O' not in EXTRA_JIT_ARGS
# - wip
# Regression test: make sure we can handle variables that are only defined
# on excluded parts of an osr compilation
def f():
if True:
for i in xrange(20000):
pass
else:
a = 1
f()
def f2():
if True:
for i in xrange(20000):
pass
else:
a = 1
if False:
print a
f2()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment