You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdesdk/tdecachegrind/tdecachegrind/fixcost.h

172 lines
4.4 KiB

/*
* Part of KCacheGrind
*
* 2003, Josef Weidendorfer
*/
#ifndef FIXCOST_H
#define FIXCOST_H
/**
* Setting USE_FIXCOST to 1 enables a memory space hack:
* For some data, build up internal data model lazy by using
* the Fix*Cost classes, which are simple copies from input data.
*/
#define USE_FIXCOST 1
#include "tracedata.h"
#include "pool.h"
class PositionSpec
{
public:
PositionSpec()
{ fromLine = 0, toLine = 0, fromAddr = 0, toAddr = 0; }
PositionSpec(uint l1, uint l2, Addr a1, Addr a2)
{ fromLine = l1, toLine = l2, fromAddr = a1, toAddr = a2; }
bool isLineRegion() const { return (fromLine != toLine); }
bool isAddrRegion() const { return (fromAddr != toAddr); }
uint fromLine, toLine;
Addr fromAddr, toAddr;
};
/**
* A class holding an unchangable cost item of an input file.
*
* As there can be a lot of such cost items, we use our own
* allocator which uses FixPool
*/
class FixCost
{
public:
FixCost(TracePart*, FixPool*,
TraceFunctionSource*,
PositionSpec&,
TracePartFunction*,
FixString&);
void *operator new(size_t size, FixPool*);
void addTo(TraceCost*);
TracePart* part() const { return _part; }
bool isLineRegion() const { return _pos.isLineRegion(); }
bool isAddrRegion() const { return _pos.isAddrRegion(); }
uint fromLine() const { return _pos.fromLine; }
uint line() const { return _pos.fromLine; }
uint toLine() const { return _pos.toLine; }
Addr fromAddr() const { return _pos.fromAddr; }
Addr addr() const { return _pos.fromAddr; }
Addr toAddr() const { return _pos.toAddr; }
TraceFunctionSource* functionSource() const { return _functionSource; }
FixCost* nextCostOfPartFunction() const
{ return _nextCostOfPartFunction; }
private:
int _count;
SubCost* _cost;
PositionSpec _pos;
TracePart* _part;
TraceFunctionSource* _functionSource;
FixCost *_nextCostOfPartFunction;
};
/**
* A FixCallCost will be inserted into a
* - TracePartCall to keep source/target function info
* - TraceFunctionSourceFile to keep file info of call source
*/
class FixCallCost
{
public:
FixCallCost(TracePart*, FixPool*,
TraceFunctionSource*,
unsigned int line,
Addr addr,
TracePartCall*,
SubCost, FixString&);
void *operator new(size_t size, FixPool*);
void addTo(TraceCallCost*);
void setMax(TraceCost*);
TracePart* part() const { return _part; }
unsigned int line() const { return _line; }
Addr addr() const { return _addr; }
SubCost callCount() const { return _cost[_count]; }
TraceFunctionSource* functionSource() const { return _functionSource; }
FixCallCost* nextCostOfPartCall() const
{ return _nextCostOfPartCall; }
private:
// we use 1 SubCost more than _count: _cost[_count] is the call count
int _count;
SubCost* _cost;
unsigned int _line;
Addr _addr;
TracePart* _part;
TraceFunctionSource* _functionSource;
FixCallCost* _nextCostOfPartCall;
};
/**
* A class holding a jump (mostly) inside of a function
*/
class FixJump
{
public:
FixJump(TracePart*, FixPool*,
/* source position */
unsigned int line, Addr addr,
TracePartFunction*, TraceFunctionSource*,
/* target position */
unsigned int targetLine, Addr targetAddr,
TraceFunction*, TraceFunctionSource*,
bool isCondJump,
SubCost, SubCost);
void *operator new(size_t size, FixPool*);
void addTo(TraceJumpCost*);
TracePart* part() const { return _part; }
unsigned int line() const { return _line; }
Addr addr() const { return _addr; }
TraceFunctionSource* source() const { return _source; }
TraceFunction* targetFunction() const { return _targetFunction; }
unsigned int targetLine() const { return _targetLine; }
Addr targetAddr() const { return _targetAddr; }
TraceFunctionSource* targetSource() const { return _targetSource; }
bool isCondJump() { return _isCondJump; }
SubCost executedCount() const { return _cost[0]; }
SubCost followedCount() const
{ return _isCondJump ? _cost[1] : SubCost(0); }
FixJump* nextJumpOfPartFunction() const
{ return _nextJumpOfPartFunction; }
private:
bool _isCondJump;
SubCost* _cost;
unsigned int _line, _targetLine;
Addr _addr, _targetAddr;
TracePart* _part;
TraceFunctionSource *_source, *_targetSource;
TraceFunction* _targetFunction;
FixJump *_nextJumpOfPartFunction;
};
#endif