/* Compute and record all the resources provided by this call. */
void analyze(trace::Call *call) {
+ /* If there are no side effects, this call provides nothing. */
+ if (call->flags & trace::CALL_FLAG_NO_SIDE_EFFECTS) {
+ return;
+ }
+
+ /* Similarly, calls that swap buffers don't have other side effects. */
+ if (call->flags & trace::CALL_FLAG_SWAP_RENDERTARGET &&
+ call->flags & trace::CALL_FLAG_END_FRAME) {
+ return;
+ }
+
+ /* By default, assume this call affects the state somehow. */
resources["state"].insert(call->no);
}
/* In pass 1, analyze which calls are needed. */
trace::Call *call;
while ((call = p.parse_call())) {
+
+ /* There's no use doing any work past the last call requested
+ * by the user. */
+ if (call->no > options->calls.getLast())
+ break;
+
/* If requested, ignore all calls not belonging to the specified thread. */
if (options->thread != -1 && call->thread_id != options->thread)
continue;
required = analyzer.get_required();
while ((call = p.parse_call())) {
+
+ /* There's no use doing any work past the last call requested
+ * by the user. */
+ if (call->no > options->calls.getLast())
+ break;
+
if (required->find(call->no) != required->end()) {
writer.writeCall(call);
}
};
-CallSet::CallSet(const char *string)
+CallSet::CallSet(const char *string): limits(std::numeric_limits<CallNo>::min(), std::numeric_limits<CallNo>::max())
{
if (*string == '@') {
FileCallSetParser parser(*this, &string[1]);
}
-CallSet::CallSet(CallFlags freq) {
+CallSet::CallSet(CallFlags freq): limits(std::numeric_limits<CallNo>::min(), std::numeric_limits<CallNo>::max()) {
if (freq != FREQUENCY_NONE) {
CallNo start = std::numeric_limits<CallNo>::min();
CallNo stop = std::numeric_limits<CallNo>::max();
#define _TRACE_CALLSET_HPP_
+#include <limits>
#include <list>
#include "trace_model.hpp"
// A collection of call ranges
class CallSet
{
+ private:
+ CallRange limits;
+
public:
// TODO: use binary tree to speed up lookups
typedef std::list< CallRange > RangeList;
RangeList ranges;
- CallSet() {}
+ CallSet(): limits(std::numeric_limits<CallNo>::min(), std::numeric_limits<CallNo>::max()) {}
CallSet(CallFlags freq);
if (range.start <= range.stop &&
range.freq != FREQUENCY_NONE) {
+ if (empty()) {
+ limits.start = range.start;
+ limits.stop = range.stop;
+ } else {
+ if (range.start < limits.start)
+ limits.start = range.start;
+ if (range.stop > limits.stop)
+ limits.stop = range.stop;
+ }
+
RangeList::iterator it = ranges.begin();
while (it != ranges.end() && it->start < range.start) {
++it;
contains(const trace::Call &call) {
return contains(call.no, call.flags);
}
+
+ CallNo getFirst() {
+ return limits.start;
+ }
+
+ CallNo getLast() {
+ return limits.stop;
+ }
};