diff options
Diffstat (limited to 'lib/Core/Differentiator.cpp')
-rw-r--r-- | lib/Core/Differentiator.cpp | 54 |
1 files changed, 31 insertions, 23 deletions
diff --git a/lib/Core/Differentiator.cpp b/lib/Core/Differentiator.cpp index 95c08bda..553df337 100644 --- a/lib/Core/Differentiator.cpp +++ b/lib/Core/Differentiator.cpp @@ -109,35 +109,41 @@ Differentiator::Differentiator(std::unique_ptr<TimingSolver>* s, Differentiator::Bytes run(const std::uint64_t rev, const char* prog, - const Differentiator::TestArgs& argv) + const Differentiator::TestInps& inputs) { - int fildes[2]; + int ind[2], outd[2]; { - const auto err = pipe(fildes); + auto err = pipe(ind); + assert(!err); + err = pipe(outd); assert(!err); } posix_spawn_file_actions_t action; posix_spawn_file_actions_init(&action); - posix_spawn_file_actions_addclose(&action, fildes[0]); - posix_spawn_file_actions_adddup2(&action, fildes[1], 1); + posix_spawn_file_actions_adddup2(&action, ind[0], 0); + posix_spawn_file_actions_addclose(&action, ind[1]); + posix_spawn_file_actions_addclose(&action, outd[0]); + posix_spawn_file_actions_adddup2(&action, outd[1], 1); { pid_t pid; - std::vector<const char*> argp {prog}; - for (const auto& v : argv) - argp.push_back((const char *) v.data()); - argp.push_back(NULL); + std::vector<const char*> argv {prog}; + for (const auto& v : inputs.first) + argv.push_back((const char *) v.data()); + argv.push_back(NULL); std::ostringstream env; env << "KLEE_META=" << rev; char *const envp[] = {const_cast<char* const>(env.str().c_str()), NULL}; const auto err = posix_spawn(&pid, prog, &action, NULL, - const_cast<char* const *>(argp.data()), envp); + const_cast<char* const *>(argv.data()), envp); assert(!err); } - close(fildes[1]); + write(ind[0], inputs.second.data(), inputs.second.size()); + close(ind[0]); + close(outd[1]); char buffer[128]; // output buffer for concrete execution Differentiator::Bytes result; - for (unsigned char n; n = read(fildes[0], buffer, sizeof(buffer));) { + for (unsigned char n; n = read(outd[0], buffer, sizeof(buffer));) { assert(n >= 0); for (unsigned char i = 0; i < n; ++i) result.push_back(buffer[i]); @@ -156,14 +162,14 @@ logBytes(const Differentiator::Bytes& buffer) } void -logArgs(const Differentiator::TestArgs& args) +logInputs(const Differentiator::TestInps& inputs) { llvm::errs() << "Args:"; - for (const auto& s : args) { + for (const auto& s : inputs.first) { llvm::errs() << ' '; logBytes(s); } - llvm::errs() << '\n'; + llvm::errs() << "\nStdin: " << inputs.second.data() << '\n'; } void @@ -188,7 +194,7 @@ Differentiator::extract(ExecutionState* a, ExecutionState* b, const std::vector<const Array*>& objects, const std::vector<Bytes>& values) { - TestArgs argv; + TestInps inputs; TestOuts outputs; { std::map<std::uint8_t, Bytes> args; @@ -200,18 +206,20 @@ Differentiator::extract(ExecutionState* a, ExecutionState* b, } else if (isSymOut(name.substr(0, name.size() - 2))) { const auto rev = ((name[name.size() - 1] == 'a') ? a : b)->patchNo; outputs[rev].first[name.substr(4, name.size() - 6)] = values[i]; + } else if (name == "stdin") { + inputs.second = values[i]; } } uint8_t last = 0; for (const auto& [rev, arg] : args) { assert(rev == last); - argv.push_back(arg); + inputs.first.push_back(arg); last++; } } for (const auto& rev : this->revisions) - outputs[rev].second = run(rev, this->prog, argv); - this->tests[argv] = outputs; + outputs[rev].second = run(rev, this->prog, inputs); + this->tests[inputs] = outputs; std::map<std::string, Clusters> revOut; for (const auto& [rev, out] : outputs) { @@ -228,7 +236,7 @@ Differentiator::extract(ExecutionState* a, ExecutionState* b, for (std::uint64_t i : p.second) for (std::uint64_t j : q.second) if (i < j) - this->done.emplace(std::make_pair(i, j), &this->tests[argv]); + this->done.emplace(std::make_pair(i, j), &this->tests[inputs]); } } @@ -314,7 +322,7 @@ Differentiator::search(ExecutionState* latest) void Differentiator::log() { - std::vector<std::pair<const TestArgs, const Clusters>> clusterings; + std::vector<std::pair<const TestInps, const Clusters>> clusterings; for (auto& t : this->tests) { Clusters clusters; for (const auto& rev : this->revisions) { @@ -327,8 +335,8 @@ Differentiator::log() if (clusters.size() > 1) clusterings.push_back({std::move(t.first), std::move(clusters)}); } - for (const auto& [args, clusters] : clusterings) { - logArgs(args); + for (const auto& [inputs, clusters] : clusterings) { + logInputs(inputs); logClusters(clusters); llvm::errs() << '\n'; } |