OpenASIP 2.2
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Protected Attributes | Static Private Member Functions | List of all members
POMDisassembler Class Reference

#include <POMDisassembler.hh>

Collaboration diagram for POMDisassembler:
Collaboration graph

Public Member Functions

 POMDisassembler (bool indices=false)
 
 POMDisassembler (const TTAProgram::Program &program, bool indices=false)
 
virtual ~POMDisassembler ()
 
virtual DisassemblyInstructioncreateInstruction (Word instructionIndex) const
 
virtual Word startAddress () const
 
virtual Word instructionCount () const
 
int labelCount (Word address) const
 
std::string label (Word address, int index) const
 
virtual TCEString disassembleInstruction (const TTAProgram::Instruction &instruction, int addr=-1)
 "Template methods" that can be overridden in the derived assemblers.
 
virtual TCEString disassembleProcedure (const TTAProgram::Procedure &proc)
 
virtual TCEString disassembleProcedures ()
 
virtual TCEString disassembleProgram ()
 
virtual TCEString codeSectionDescription (Word startAddress)
 
virtual TCEString dataSectionDescription (const TTAMachine::AddressSpace &aSpace, Word location)
 
virtual TCEString procedureDescription (const TTAProgram::Procedure &proc)
 
virtual TCEString destinationLabels (const TTAProgram::Procedure &proc, int instrIndex) const
 
virtual TCEString labelPositionDescription (TCEString labelStr) const
 
virtual TCEString dataDefDescription (const TTAProgram::DataDefinition &def)
 
virtual size_t instructionSize (const TTAProgram::Instruction &)
 Returns the size of the instruction in memory addresses, if known. Falls back to address per instruction.
 
virtual void setPrintAddresses (bool addresses)
 
virtual TCEString printAddress (const TTAProgram::Instruction &instr) const
 

Static Public Member Functions

static POMDisassemblerdisassembler (const TTAMachine::Machine &mach, const TTAProgram::Program &program)
 
static std::string disassemble (const TTAProgram::Move &move)
 
static std::string disassemble (const TTAProgram::Instruction &instruction, bool indices=false, int addr=-1)
 
static std::string disassemble (const TTAProgram::Procedure &proc, bool indices=false)
 
static std::string disassemble (const TTAProgram::Program &program, bool indices=false)
 
static TCEString disassembleFully (const TTAProgram::Program &program, bool indices=false)
 
static DisassemblyImmediatecreateInlineImmediate (const TTAProgram::Terminal &terminal, bool signExtend)
 

Protected Attributes

const TTAProgram::Programprogram_
 Program object model to disassemble.
 
bool printAddresses_
 True if instruction indices (addresses) should be printed at the end of lines.
 

Static Private Member Functions

static int labelCount (const TTAProgram::Program &program, Word address)
 
static std::string label (const TTAProgram::Program &, Word address, int index)
 
static DisassemblyInstructioncreateInstruction (const TTAProgram::Program &program, const TTAProgram::Instruction &instruction)
 
static DisassemblyMovecreateMove (const TTAProgram::Move &move)
 
static DisassemblyImmediateAssignmentcreateImmediateAssignment (const TTAProgram::Immediate &immediate)
 
static DisassemblyGuardcreateGuard (const TTAProgram::MoveGuard &guard)
 
static DisassemblyElementcreateTerminal (const TTAProgram::Terminal &terminal)
 
static DisassemblyElementcreateFUPort (const TTAProgram::Terminal &terminal)
 
static DisassemblyElementcreateRegister (const TTAProgram::Terminal &terminal)
 
static DisassemblyImmediateRegistercreateImmediateRegister (const TTAProgram::Terminal &terminal)
 
static bool isCallOrJump (const TTAProgram::Terminal &terminal)
 

Detailed Description

Program object model disassembler.

Definition at line 70 of file POMDisassembler.hh.

Constructor & Destructor Documentation

◆ POMDisassembler() [1/2]

POMDisassembler::POMDisassembler ( bool  printAddresses = false)
explicit

A constructor for disassembling pieces of a program which might not be attached to a Program object.

Parameters
printAddressesTrue in case instruction addresses should be printed at the end of instruction lines as comments.

Definition at line 115 of file POMDisassembler.cc.

115 :
117}
bool printAddresses_
True if instruction indices (addresses) should be printed at the end of lines.
const TTAProgram::Program & program_
Program object model to disassemble.
static NullProgram & instance()

◆ POMDisassembler() [2/2]

POMDisassembler::POMDisassembler ( const TTAProgram::Program program,
bool  printAddresses = false 
)
explicit

A constructor for disassembling whole programs.

Parameters
programProgram to disassemble.
printAddressesTrue in case instruction addresses should be printed at the end of instruction lines as comments.

Definition at line 104 of file POMDisassembler.cc.

104 :
105 program_(program), printAddresses_(printAddresses) {
106}
find Finds info of the inner loops in the program

◆ ~POMDisassembler()

POMDisassembler::~POMDisassembler ( )
virtual

The destructor.

Definition at line 123 of file POMDisassembler.cc.

123 {
124}

Member Function Documentation

◆ codeSectionDescription()

TCEString POMDisassembler::codeSectionDescription ( Word  startAddress)
virtual

Definition at line 917 of file POMDisassembler.cc.

917 {
918 TCEString output;
919 output << "CODE " << startAddress << " ;";
920 return output;
921}
virtual Word startAddress() const

References startAddress().

Referenced by disassembleProgram().

Here is the call graph for this function:

◆ createFUPort()

DisassemblyElement * POMDisassembler::createFUPort ( const TTAProgram::Terminal terminal)
staticprivate

Creates disassembly of a function unit port.

Parameters
terminalFunction unit terminal to disassemble.
Returns
Disassembly of the function unit terminal.

Definition at line 320 of file POMDisassembler.cc.

320 {
321 const FunctionUnit* fu = &terminal.functionUnit();
322
323 const TTAProgram::TerminalFUPort& fuTerm =
324 dynamic_cast<const TerminalFUPort&>(terminal);
325
326 if (dynamic_cast<const UniversalFunctionUnit*>(fu) != NULL ||
327 (fu->machine()->isUniversalMachine() &&
328 dynamic_cast<const ControlUnit*>(fu) != NULL)) {
329
330 // The terminal is a UniversalFunctionUnit operation or
331 // a universal machine control unit operation.
332 if (&fuTerm.hintOperation() != &NullOperation::instance()) {
333 string operation = fuTerm.hintOperation().name();
334 HWOperation* hwOperation = fu->operation(operation);
335 FUPort* port = fu->operationPort(fuTerm.port().name());
336 int operand = hwOperation->io(*port);
337 return new DisassemblyOperand(
338 fuTerm.hintOperation().name(), operand);
339 }
340 return new DisassemblyControlUnitPort(fuTerm.port().name());
341 }
342
343 // if terminal contains any information about operation
344 if (fuTerm.isOpcodeSetting()) {
345 // check if that osal operation was found
346 if (&fuTerm.operation() == &NullOperation::instance()) {
347 throw InstanceNotFound(__FILE__, __LINE__, __func__,
348 (boost::format(
349 "Osal operation for operation code name '%s' was not found.")
350 % fuTerm.hwOperation()->name()).str());
351 }
352 // The terminal is an opcode setting port of an operation or.
353 // has additional info about opcode that terminal is bound.
354 return new DisassemblyFUOpcodePort(
355 fu->name(), fuTerm.port().name(), fuTerm.operation().name());
356 }
357
358 // The terminal is a generic function unit port.
359 return new DisassemblyFUPort(fu->name(), terminal.port().name());
360}
#define __func__
static NullOperation & instance()
virtual TCEString name() const
Definition Operation.cc:93
virtual Machine * machine() const
virtual TCEString name() const
virtual HWOperation * operation(const std::string &name) const
virtual FUPort * operationPort(const std::string &name) const
int io(const FUPort &port) const
const std::string & name() const
virtual bool isUniversalMachine() const
Definition Machine.cc:127
virtual std::string name() const
Definition Port.cc:141
virtual Operation & hintOperation() const
virtual Operation & operation() const
virtual const TTAMachine::Port & port() const
virtual bool isOpcodeSetting() const
virtual const TTAMachine::HWOperation * hwOperation() const
virtual const TTAMachine::FunctionUnit & functionUnit() const
Definition Terminal.cc:251
virtual const TTAMachine::Port & port() const
Definition Terminal.cc:378

References __func__, TTAProgram::Terminal::functionUnit(), TTAProgram::TerminalFUPort::hintOperation(), TTAProgram::TerminalFUPort::hwOperation(), NullOperation::instance(), TTAMachine::HWOperation::io(), TTAProgram::TerminalFUPort::isOpcodeSetting(), TTAMachine::Machine::isUniversalMachine(), TTAMachine::Component::machine(), TTAMachine::HWOperation::name(), TTAMachine::Component::name(), TTAMachine::Port::name(), Operation::name(), TTAProgram::TerminalFUPort::operation(), TTAMachine::FunctionUnit::operation(), TTAMachine::FunctionUnit::operationPort(), TTAProgram::Terminal::port(), and TTAProgram::TerminalFUPort::port().

Referenced by createTerminal().

Here is the call graph for this function:

◆ createGuard()

DisassemblyGuard * POMDisassembler::createGuard ( const TTAProgram::MoveGuard guard)
staticprivate

Creates disassembly of a move guard.

Parameters
guardMove guard to disassemble.
Returns
Disassembly of the move guard.

Definition at line 434 of file POMDisassembler.cc.

434 {
435
436 const Guard* guard = &moveGuard.guard();
437
438 DisassemblyElement* guarded = NULL;
439
440 // Check if the guarded element is a fu port.
441 const PortGuard* portGuard = dynamic_cast<const PortGuard*>(guard);
442 if (portGuard != NULL) {
443 string fuName = portGuard->port()->parentUnit()->name();
444 string portName = portGuard->port()->name();
445 guarded = new DisassemblyFUPort(fuName, portName);
446 }
447
448 // Check if the guarded element is a register.
449 const RegisterGuard* registerGuard =
450 dynamic_cast<const RegisterGuard*>(guard);
451 if (registerGuard != NULL) {
452
453 // Check if the register file is bool rf of a universal machine.
454 const RegisterFile* rf = registerGuard->registerFile();
456 dynamic_cast<const UniversalMachine*>(rf->machine());
457
458 if (machine != NULL && rf == &machine->booleanRegisterFile()) {
459 return new DisassemblySequentialGuard(moveGuard.isInverted());
460 } else {
461 string rfName = registerGuard->registerFile()->name();
462 int index = registerGuard->registerIndex();
463 guarded = new DisassemblyRegister(rfName, index);
464 }
465 }
466
467 // Check if the guard is unconditional.
468 if (moveGuard.isUnconditional()) {
469 // TODO: Disassemble unconditional guards.
470 assert(false);
471 }
472
473
474 return new DisassemblyGuard(guarded, moveGuard.isInverted());
475}
#define assert(condition)
TTAMachine::Machine * machine
the architecture definition of the estimated processor
FunctionUnit * parentUnit() const
Definition BaseFUPort.cc:96
FUPort * port() const
const RegisterFile * registerFile() const
const TTAMachine::Guard & guard() const
Definition MoveGuard.cc:86

References assert, TTAProgram::MoveGuard::guard(), TTAProgram::MoveGuard::isInverted(), TTAProgram::MoveGuard::isUnconditional(), TTAMachine::Component::machine(), machine, TTAMachine::Component::name(), TTAMachine::Port::name(), TTAMachine::BaseFUPort::parentUnit(), TTAMachine::PortGuard::port(), TTAMachine::RegisterGuard::registerFile(), and TTAMachine::RegisterGuard::registerIndex().

Referenced by createMove().

Here is the call graph for this function:

◆ createImmediateAssignment()

DisassemblyImmediateAssignment * POMDisassembler::createImmediateAssignment ( const TTAProgram::Immediate immediate)
staticprivate

Creates disassembly of an immediate assignment.

Definition at line 246 of file POMDisassembler.cc.

246 {
247 DisassemblyElement* destination = createTerminal(immediate.destination());
248 SimValue value = immediate.value().value();
249 bool signExt = immediate.destination().immediateUnit().signExtends();
250 return new DisassemblyImmediateAssignment(value, signExt, destination);
251}
static DisassemblyElement * createTerminal(const TTAProgram::Terminal &terminal)
TerminalImmediate & value() const
Definition Immediate.cc:103
const Terminal & destination() const
Definition Immediate.cc:92
virtual SimValue value() const
virtual const TTAMachine::ImmediateUnit & immediateUnit() const
Definition Terminal.cc:240

References createTerminal(), TTAProgram::Immediate::destination(), TTAProgram::Terminal::immediateUnit(), TTAMachine::ImmediateUnit::signExtends(), TTAProgram::Immediate::value(), and TTAProgram::TerminalImmediate::value().

Referenced by createInstruction(), and disassemble().

Here is the call graph for this function:

◆ createImmediateRegister()

DisassemblyImmediateRegister * POMDisassembler::createImmediateRegister ( const TTAProgram::Terminal terminal)
staticprivate

Creates disassembly of an immediate register.

Parameters
terminalImmediate register to disassemble.
Returns
Disassembly of the immediate register.

Definition at line 420 of file POMDisassembler.cc.

420 {
421 string immediateUnit = terminal.immediateUnit().name();
422 unsigned int index = terminal.index();
423 return new DisassemblyImmediateRegister(immediateUnit, index);
424}
virtual int index() const
Definition Terminal.cc:274

References TTAProgram::Terminal::immediateUnit(), TTAProgram::Terminal::index(), and TTAMachine::Component::name().

Referenced by createTerminal().

Here is the call graph for this function:

◆ createInlineImmediate()

DisassemblyImmediate * POMDisassembler::createInlineImmediate ( const TTAProgram::Terminal terminal,
bool  signExtend 
)
static

Creates disassembly of an immediate value.

Parameters
terminalImmediate value to disassemble.
signExtendIf the immediate should be considered signed or unsigned.
Returns
Disassembly of the immediate value.

Definition at line 296 of file POMDisassembler.cc.

297 {
299 dynamic_cast<const TTAProgram::TerminalProgramOperation*>(&terminal)) {
300 if (!tpo->isAddressKnown())
301 return new DisassemblyImmediate(NullSimValue::instance(), false);
302 }
303 try {
304 return new DisassemblyImmediate(
305 terminal.value(), signExtend);
306 } catch (Exception& e) {
307 return new DisassemblyImmediate(
308 NullSimValue::instance(), signExtend);
309 }
310}
static SimValue & instance()
Definition SimValue.cc:1642
virtual SimValue value() const
Definition Terminal.cc:178

References NullSimValue::instance(), and TTAProgram::Terminal::value().

Referenced by createMove(), TTAProgram::TerminalImmediate::toString(), and TTAProgram::TerminalLaneIDImmediate::toString().

Here is the call graph for this function:

◆ createInstruction() [1/2]

DisassemblyInstruction * POMDisassembler::createInstruction ( const TTAProgram::Program program,
const TTAProgram::Instruction instruction 
)
staticprivate

Returns disassembly of an instruction at the given index.

The client is responsible for destroying the instruction object.

Parameters
programParent program of the instruction.
indexIndex of the instruction to disassemble.
Returns
Disassembly of the instruction at given index.

Definition at line 155 of file POMDisassembler.cc.

156 {
157
159
160 const Machine::BusNavigator& navigator =
161 program.targetProcessor().busNavigator();
162
163 // The instruction disassembly is created by one bus at a time.
164 for (int i = 0; i < navigator.count(); i++) {
165
166 Bus* bus = navigator.item(i);
167 string busName = bus->name();
168 bool isUsed = false;
169
170 // Check for move.
171 for (int i = 0; i < instruction.moveCount(); i++) {
172 if (&instruction.move(i).bus() == bus) {
173 disassembly->addMove(createMove(instruction.move(i)));
174 isUsed = true;
175 }
176 }
177
178 if (!isUsed) {
179 disassembly->addMove(new DisassemblyNOP);
180 }
181 }
182
183 // Add disassembly of long immediates in immediate slots.
184 for (int i = 0; i < instruction.immediateCount(); i++) {
185 disassembly->addLongImmediate(
186 createImmediateAssignment(instruction.immediate(i)));
187 }
188
189 return disassembly;
190}
void addLongImmediate(DisassemblyImmediateAssignment *longImm)
void addMove(DisassemblyInstructionSlot *move)
static DisassemblyMove * createMove(const TTAProgram::Move &move)
static DisassemblyImmediateAssignment * createImmediateAssignment(const TTAProgram::Immediate &immediate)
ComponentType * item(int index) const
Move & move(int i) const
Immediate & immediate(int i) const
const TTAMachine::Bus & bus() const
Definition Move.cc:373

References DisassemblyInstruction::addLongImmediate(), DisassemblyInstruction::addMove(), TTAProgram::Move::bus(), TTAMachine::Machine::Navigator< ComponentType >::count(), createImmediateAssignment(), createMove(), TTAProgram::Instruction::immediate(), TTAProgram::Instruction::immediateCount(), TTAMachine::Machine::Navigator< ComponentType >::item(), TTAProgram::Instruction::move(), TTAProgram::Instruction::moveCount(), TTAMachine::Component::name(), and program.

Here is the call graph for this function:

◆ createInstruction() [2/2]

DisassemblyInstruction * POMDisassembler::createInstruction ( Word  index) const
virtual

Returns disassembly of an instruction at the given index.

The client is responsible for destroying the instruction object.

Parameters
indexIndex of the instruction to disassemble.
Returns
Disassembly of the instruction at given index.

Definition at line 137 of file POMDisassembler.cc.

137 {
138
139 const Instruction& instruction = program_.instructionAt(index);
140 return createInstruction(program_, instruction);
141}
virtual DisassemblyInstruction * createInstruction(Word instructionIndex) const
Instruction & instructionAt(InstructionAddress address) const
Definition Program.cc:374

References createInstruction(), TTAProgram::Program::instructionAt(), and program_.

Referenced by createInstruction(), disassemble(), and DisassemblyGridTable::GetValue().

Here is the call graph for this function:

◆ createMove()

DisassemblyMove * POMDisassembler::createMove ( const TTAProgram::Move move)
staticprivate

Creates disassembly of a move.

Parameters
moveMove to disassemble.
Returns
Disassembly of the move.

Definition at line 200 of file POMDisassembler.cc.

200 {
201
202 // Disassemble move terminals.
203 DisassemblyElement* destinationDis = createTerminal(move.destination());
204 DisassemblyElement* sourceDis = NULL;
205
206 if (move.source().isImmediate()) {
207
208 // Special case: if the move source is an inline immediate, and
209 // the move destination is call/jump operand, the inline immediate
210 // is disassembled as label if possible.
211 if (isCallOrJump(move.destination()) &&
212 move.isInInstruction() && move.parent().isInProcedure() &&
213 move.parent().parent().isInProgram() &&
215 move.parent().parent().parent(),
216 move.source().value().uLongWordValue()) > 0) {
217
218 LongWord immediate = move.source().value().uLongWordValue();
219 std::string codelabel = label(
220 move.parent().parent().parent(), immediate, 0);
221 sourceDis = new DisassemblyLabel(codelabel);
222 } else {
223 sourceDis =
225 move.source(), move.bus().signExtends());
226 }
227 } else {
228 sourceDis = createTerminal(move.source());
229 }
230
231 DisassemblyMove* disassembly = NULL;
232 if (!move.isUnconditional()) {
233 DisassemblyGuard* guardDis = createGuard(move.guard());
234 disassembly = new DisassemblyMove(sourceDis, destinationDis, guardDis);
235 } else {
236 disassembly = new DisassemblyMove(sourceDis, destinationDis);
237 }
238 return disassembly;
239}
unsigned long LongWord
Definition BaseType.hh:49
static DisassemblyImmediate * createInlineImmediate(const TTAProgram::Terminal &terminal, bool signExtend)
int labelCount(Word address) const
static bool isCallOrJump(const TTAProgram::Terminal &terminal)
std::string label(Word address, int index) const
static DisassemblyGuard * createGuard(const TTAProgram::MoveGuard &guard)
ULongWord uLongWordValue() const
Definition SimValue.cc:1027
bool signExtends() const
Definition Bus.cc:171
virtual bool isInProgram() const
virtual Program & parent() const
CodeSnippet & parent() const
MoveGuard & guard() const
Definition Move.cc:345
bool isUnconditional() const
Definition Move.cc:154
Instruction & parent() const
Definition Move.cc:115
Terminal & source() const
Definition Move.cc:302
bool isInInstruction() const
Definition Move.cc:144
Terminal & destination() const
Definition Move.cc:323
virtual bool isImmediate() const
Definition Terminal.cc:63

References TTAProgram::Move::bus(), createGuard(), createInlineImmediate(), createTerminal(), TTAProgram::Move::destination(), TTAProgram::Move::guard(), isCallOrJump(), TTAProgram::Terminal::isImmediate(), TTAProgram::Move::isInInstruction(), TTAProgram::Instruction::isInProcedure(), TTAProgram::CodeSnippet::isInProgram(), TTAProgram::Move::isUnconditional(), label(), labelCount(), TTAProgram::CodeSnippet::parent(), TTAProgram::Instruction::parent(), TTAProgram::Move::parent(), TTAMachine::Bus::signExtends(), TTAProgram::Move::source(), SimValue::uLongWordValue(), and TTAProgram::Terminal::value().

Referenced by createInstruction(), disassemble(), and disassemble().

Here is the call graph for this function:

◆ createRegister()

DisassemblyElement * POMDisassembler::createRegister ( const TTAProgram::Terminal terminal)
staticprivate

Creates disassembly of a register.

Parameters
terminalRegister to disassemble.
Returns
Disassembly of the register.
Exceptions
WrongSubclassThe terminal was not register.

Definition at line 370 of file POMDisassembler.cc.

370 {
371 const RegisterFile* rf = &terminal.registerFile();
372
373 if (rf == NULL) {
374 throw WrongSubclass(__FILE__, __LINE__, __func__,
375 "Not register terminal.");
376 }
377
379 dynamic_cast<const UniversalMachine*>(rf->machine());
380
381 if (machine != NULL) {
382
383 if (rf == &machine->booleanRegisterFile()) {
384 // universal bool register
385 return new DisassemblyBoolRegister();
386 }
387
388
389 // The register is a UnboundedRegisterFile register of a universal
390 // machine.
391 const UnboundedRegisterFile* universalRF =
392 dynamic_cast<const UnboundedRegisterFile*>(rf);
393
394 if (universalRF == &machine->integerRegisterFile()) {
395 // universal int register
396 return new DisassemblyIntRegister(terminal.index());
397 }
398
399 if (universalRF == &machine->doubleRegisterFile()) {
400 // universal floating point register
401 return new DisassemblyFPRegister(terminal.index());
402 }
403
404 // Unknown universal machine register type.
405 throw WrongSubclass(
406 __FILE__, __LINE__, __func__,
407 "Unknown universal machine register type.");
408 }
409
410 return new DisassemblyRegister(rf->name(), terminal.index());
411}
virtual const TTAMachine::RegisterFile & registerFile() const
Definition Terminal.cc:225

References __func__, TTAProgram::Terminal::index(), TTAMachine::Component::machine(), machine, TTAMachine::Component::name(), and TTAProgram::Terminal::registerFile().

Referenced by createTerminal().

Here is the call graph for this function:

◆ createTerminal()

DisassemblyElement * POMDisassembler::createTerminal ( const TTAProgram::Terminal terminal)
staticprivate

Creates disassembly of a move terminal.

Determines the terminal type, an uses appropriate function to create disassembly of the terminal.

Parameters
terminalMove terminal to disassemble.
Returns
Disassembly of the move terminal.
Exceptions
WrongSubclassThe terminal type was unknown.

Definition at line 265 of file POMDisassembler.cc.

265 {
266 assert (
267 !terminal.isImmediate() &&
268 "Should handle immediate as a special case due to depending on "
269 "extension mode!");
270
271 if (terminal.isFUPort()) {
272 return createFUPort(terminal);
273 }
274
275 if (terminal.isGPR()) {
276 return createRegister(terminal);
277 }
278
279 if (terminal.isImmediateRegister()) {
280 return createImmediateRegister(terminal);
281 }
282
283 // Unkown terminal type.
284 throw WrongSubclass(__FILE__, __LINE__, __func__,
285 "Unknown terminal type.");
286}
static DisassemblyImmediateRegister * createImmediateRegister(const TTAProgram::Terminal &terminal)
static DisassemblyElement * createRegister(const TTAProgram::Terminal &terminal)
static DisassemblyElement * createFUPort(const TTAProgram::Terminal &terminal)
virtual bool isGPR() const
Definition Terminal.cc:107
virtual bool isImmediateRegister() const
Definition Terminal.cc:97
virtual bool isFUPort() const
Definition Terminal.cc:118

References __func__, assert, createFUPort(), createImmediateRegister(), createRegister(), TTAProgram::Terminal::isFUPort(), TTAProgram::Terminal::isGPR(), TTAProgram::Terminal::isImmediate(), and TTAProgram::Terminal::isImmediateRegister().

Referenced by createImmediateAssignment(), and createMove().

Here is the call graph for this function:

◆ dataDefDescription()

TCEString POMDisassembler::dataDefDescription ( const TTAProgram::DataDefinition def)
virtual

Definition at line 933 of file POMDisassembler.cc.

934 {
935
936 std::ostringstream output;
937 output << "DA " << std::dec << def.size();
938 if (def.isInitialized()) {
939 for (int mau = 0; mau < def.size(); mau++) {
940 output << endl << "1:0x" << std::hex << def.MAU(mau);
941 }
942 }
943 output << " ;" << endl;
944 return output.str();
945}
virtual bool isInitialized() const
virtual MinimumAddressableUnit MAU(int index) const

References TTAProgram::DataDefinition::isInitialized(), TTAProgram::DataDefinition::MAU(), and TTAProgram::DataDefinition::size().

Referenced by disassembleProgram().

Here is the call graph for this function:

◆ dataSectionDescription()

TCEString POMDisassembler::dataSectionDescription ( const TTAMachine::AddressSpace aSpace,
Word  location 
)
virtual

Definition at line 924 of file POMDisassembler.cc.

925 {
926 TCEString output;
927 output << "DATA " << aSpace.name() << " "
928 << location << " ;";
929 return output;
930}

References TTAMachine::Component::name().

Referenced by disassembleProgram().

Here is the call graph for this function:

◆ destinationLabels()

TCEString POMDisassembler::destinationLabels ( const TTAProgram::Procedure proc,
int  instrIndex 
) const
virtual

Definition at line 840 of file POMDisassembler.cc.

841 {
842
843 std::stringstream stringStream;
844 InstructionAddress addr = proc.startAddress().location() + instrIndex;
845 const int lc = POMDisassembler::labelCount(proc.parent(), addr);
846 for (int labelIndex = 0; labelIndex < lc; ++labelIndex) {
847 stringStream
849 proc.parent(), addr, labelIndex))
850 << std::endl;
851 }
852 return stringStream.str();
853}
UInt32 InstructionAddress
Definition BaseType.hh:175
virtual TCEString labelPositionDescription(TCEString labelStr) const
InstructionAddress location() const
virtual Address startAddress() const

References label(), labelCount(), labelPositionDescription(), TTAProgram::Address::location(), TTAProgram::CodeSnippet::parent(), and TTAProgram::CodeSnippet::startAddress().

Referenced by disassembleProcedure().

Here is the call graph for this function:

◆ disassemble() [1/4]

std::string POMDisassembler::disassemble ( const TTAProgram::Instruction instruction,
bool  printAddresses = false,
int  addr = -1 
)
static

Static helper function to create disassembly string from an instruction.

Parameters
instructionInstruction to disassemble.
printAddressesPrint the instruction's index as comment.
Returns
Disassembly of the instruction.

Definition at line 688 of file POMDisassembler.cc.

689 {
690
691 std::string disasm = "";
692 if (!instruction.isInProcedure() ||
693 !instruction.parent().isInProgram()) {
694
695 // a "free instruction" that is not connected to any program
696 // traverse the moves instead of the buses
697
699 // The instruction disassembly is created by one move at a time.
700 for (int i = 0; i < instruction.moveCount(); i++) {
701
702 const Move& move = instruction.move(i);
703 const Bus* bus = &move.bus();
704 string busName = move.bus().name();
705 bool isUsed = false;
706
707 // Check for long immediate.
708 for (int i = 0; i < instruction.immediateCount(); i++) {
709 if (&instruction.instructionTemplate() !=
711 instruction.instructionTemplate().usesSlot(busName)) {
712 dInstruction->addMove(
713 createImmediateAssignment(instruction.immediate(i)));
714 isUsed = true;
715 }
716 }
717
718 // Check for move.
719 for (int i = 0; i < instruction.moveCount(); i++) {
720 if (&instruction.move(i).bus() == bus) {
721 dInstruction->addMove(createMove(instruction.move(i)));
722 isUsed = true;
723 }
724 }
725
726 if (!isUsed) {
727 dInstruction->addMove(new DisassemblyNOP);
728 }
729 }
730
731 // Add disassembly of long immediates in immediate slots.
732 for (int i = 0; i < instruction.immediateCount(); i++) {
733 dInstruction->addLongImmediate(
734 createImmediateAssignment(instruction.immediate(i)));
735 }
736
737 disasm = dInstruction->toString() + " # 'free instruction'";
738 delete dInstruction;
739 dInstruction = NULL;
740 } else {
741
742 const Program& program = instruction.parent().parent();
743 DisassemblyInstruction* dInstruction =
744 createInstruction(program, instruction);
745
746 disasm = dInstruction->toString();
747 delete dInstruction;
748 dInstruction = NULL;
749
750 // check for partially scheduled code, that is, moves that refer to
751 // the unversal machine even though the target machine is not
752 // a universal machine
753 const TTAMachine::Machine* mach =
754 dynamic_cast<UniversalMachine*>(&program.targetProcessor());
755
756 if (mach == NULL) {
757 // we have either mixed code or parallel code, let's check if this
758 // instruction has a move scheduled to universal machine's bus,
759 // in which case it's mixed code and the sequential move did not
760 // get printed with createInstruction()
761 for (int i = 0; i < instruction.moveCount(); ++i) {
762 const TTAProgram::Move& m = instruction.move(i);
763 if (dynamic_cast<UniversalMachine*>(m.bus().machine()) != NULL) {
764 // found unscheduled move, add it only as a comment to the
765 // disassembly to make the output compilable with TCEAssembler
766 disasm += "\t# unscheduled: ";
767 disasm += POMDisassembler::disassemble(m);
768 }
769 }
770 } else {
771 // a sequential program
772 }
773
774 if (printAddresses) {
775 disasm +=
776 "\t# @" +
778 addr != -1 ? addr : instruction.address().location());
779 }
780 }
781 // to display source filename and line number
782 // check for source code filename, we just use the file filename,
783 // assume the all the move belong the same file
784 TCEString fileNameStr = "";
785 for (int i = 0; i < instruction.moveCount(); ++i) {
786 const TTAProgram::Move& m = instruction.move(i);
787 if (m.hasSourceFileName()) {
788 fileNameStr += m.sourceFileName();
789 break;
790 }
791 }
792
793 if (fileNameStr != "")
794 disasm += "\t# file: " + fileNameStr;
795
796 // check for soure code line number info
797 TCEString lineNumberStr = "";
798 for (int i = 0; i < instruction.moveCount(); ++i) {
799 const TTAProgram::Move& m = instruction.move(i);
800 if (m.hasSourceLineNumber()) {
801 if (lineNumberStr != "") {
802 lineNumberStr += ", ";
803 }
804 lineNumberStr +=
806 }
807 }
808
809 if (lineNumberStr != "")
810 disasm += "\t# slines: " + lineNumberStr;
811
812 return disasm;
813}
static std::string toString(const T &source)
static std::string disassemble(const TTAProgram::Move &move)
virtual bool usesSlot(const std::string &slotName) const
static NullInstructionTemplate & instance()
const TTAMachine::InstructionTemplate & instructionTemplate() const
bool hasSourceLineNumber() const
Definition Move.cc:445
int sourceLineNumber() const
Definition Move.cc:459
bool hasSourceFileName() const
Definition Move.cc:478
std::string sourceFileName() const
Definition Move.cc:488

References DisassemblyInstruction::addLongImmediate(), DisassemblyInstruction::addMove(), TTAProgram::Instruction::address(), TTAProgram::Move::bus(), createImmediateAssignment(), createInstruction(), createMove(), disassemble(), TTAProgram::Move::hasSourceFileName(), TTAProgram::Move::hasSourceLineNumber(), TTAProgram::Instruction::immediate(), TTAProgram::Instruction::immediateCount(), TTAMachine::NullInstructionTemplate::instance(), TTAProgram::Instruction::instructionTemplate(), TTAProgram::Instruction::isInProcedure(), TTAProgram::CodeSnippet::isInProgram(), TTAProgram::Address::location(), TTAMachine::Component::machine(), TTAProgram::Instruction::move(), TTAProgram::Instruction::moveCount(), TTAMachine::Component::name(), TTAProgram::CodeSnippet::parent(), TTAProgram::Instruction::parent(), program, TTAProgram::Move::sourceFileName(), TTAProgram::Move::sourceLineNumber(), DisassemblyInstruction::toString(), Conversion::toString(), and TTAMachine::InstructionTemplate::usesSlot().

Here is the call graph for this function:

◆ disassemble() [2/4]

std::string POMDisassembler::disassemble ( const TTAProgram::Move move)
static

Static helper function to create disassembly string from a move.

Parameters
moveMove to disassemble.
Returns
Disassembly of the instruction.

Definition at line 629 of file POMDisassembler.cc.

629 {
630
631 // special handling for calls: find out the procedure name to make
632 // the disassembly a bit more readable
633 if (move.isCall()) {
634 if (move.source().isInstructionAddress()) {
635
636 DisassemblyMove* dMove = createMove(move);
637 std::string disasm = "";
638 disasm = dMove->toString();
639
640 Procedure* proc = NULL;
641 try {
642 proc = dynamic_cast<TTAProgram::Procedure*>(
644 } catch (...) {
645 // proc stays NULL if something goes wrong.
646 }
647
648 std::string procName =
649 proc != NULL ? proc->name() : "unknown_proc";
650 return (boost::format("%s -> %s.call.1")
651 % procName
652 % move.destination().functionUnit().name()).str();
653 }
654
655 if (move.source().isCodeSymbolReference()) {
656 return (boost::format("%s -> %s.call.1")
657 % move.source().toString()
658 % move.destination().functionUnit().name()).str();
659 }
660 } else if (move.isJump() && move.source().isCodeSymbolReference()) {
661 // A jump to a procedure, converted from a call.
662 return (boost::format("%s -> %s.jump.1")
663 % move.source().toString()
664 % move.destination().functionUnit().name()).str();
665 }
666
667 DisassemblyMove* dMove = createMove(move);
668 std::string disasm = "";
669 disasm = dMove->toString();
670 delete dMove;
671 return disasm;
672}
virtual std::string toString() const
bool isJump() const
Definition Move.cc:164
bool isCall() const
Definition Move.cc:190
TCEString name() const
Definition Procedure.hh:66
virtual bool isCodeSymbolReference() const
Definition Terminal.cc:154
virtual const InstructionReference & instructionReference() const
Definition Terminal.cc:188
virtual bool isInstructionAddress() const
Definition Terminal.cc:87
virtual TCEString toString() const =0

References createMove(), TTAProgram::Move::destination(), TTAProgram::Terminal::functionUnit(), TTAProgram::InstructionReference::instruction(), TTAProgram::Terminal::instructionReference(), TTAProgram::Move::isCall(), TTAProgram::Terminal::isCodeSymbolReference(), TTAProgram::Terminal::isInstructionAddress(), TTAProgram::Move::isJump(), TTAMachine::Component::name(), TTAProgram::Procedure::name(), TTAProgram::Instruction::parent(), TTAProgram::Move::source(), DisassemblyMove::toString(), and TTAProgram::Terminal::toString().

Referenced by TTAProgram::CodeSnippet::add(), TTAProgram::Instruction::address(), SimpleBrokerDirector::assign(), SimProgramBuilder::build(), SimulatorFrontend::compareState(), TTAProgram::ProgramWriter::createCodeSection(), ControlFlowGraph::createControlFlowEdge(), ControlFlowGraph::directJump(), ProgramDependenceGraph::disassemble(), disassemble(), disassembleInstruction(), TTAProgram::CodeSnippet::disassembly(), llvm::LLVMTCEBuilder::doFinalization(), ControlFlowGraph::findNextIndex(), main(), CriticalPathBBMoveNodeSelector::mightBeReady(), DataDependenceGraph::nodeOfMove(), SimProgramBuilder::processInstruction(), DataDependenceGraphBuilder::processTriggerPO(), BFUnscheduleFromBody::returnOriginal(), BFUnscheduleMove::returnOriginal(), BFShareOperandLate::revert(), BFOptimization::rmLC(), TTAProgram::Instruction::toString(), TTAProgram::Move::toString(), MoveNode::toString(), and TTAProgram::Program::toString().

Here is the call graph for this function:

◆ disassemble() [3/4]

std::string POMDisassembler::disassemble ( const TTAProgram::Procedure proc,
bool  printAddresses = false 
)
static

Static helper function to create a disassembly string from a procedure.

Parameters
procProcedure to disassemble.
printAddressesPrint the instruction addresses as comment.
Returns
Disassembly of the procedure in a string.
Exceptions
ExceptionCan leak exceptions if the traversed program is malformed, etc.
Deprecated:
Use obj.disassembleProcedure(proc) instead.

Definition at line 1011 of file POMDisassembler.cc.

1012 {
1013 POMDisassembler disasm(printAddresses);
1014 return disasm.disassembleProcedure(proc);
1015}

References disassembleProcedure().

Here is the call graph for this function:

◆ disassemble() [4/4]

std::string POMDisassembler::disassemble ( const TTAProgram::Program program,
bool  printAddresses = false 
)
static

Static helper function to create a disassembly string from a program.

Parameters
programProgram to disassemble.
printAddressesPrint the instruction addresses as comment.
Returns
Disassembly of the program in a string.
Exceptions
ExceptionCan leak exceptions if the traversed program is malformed, etc.
Deprecated:
Use obj.disassembleProcedures() instead.

Definition at line 826 of file POMDisassembler.cc.

827 {
828 POMDisassembler disasm(program, printAddresses);
829 return disasm.disassembleProcedures();
830}

References disassembleProcedures(), and program.

Here is the call graph for this function:

◆ disassembleFully()

TCEString POMDisassembler::disassembleFully ( const TTAProgram::Program program,
bool  printAddresses = false 
)
static

Static helper function to create a disassembly string from a whole program including section markers and data memory initializations.

Parameters
programProgram to disassemble.
printAddressesIf the instruction addresses should be printed.
Returns
Disassembly of the program in a string.
Exceptions
ExceptionCan leak exceptions if the traversed program is malformed, etc.
Deprecated:
Use obj.disassembleProgram() instead.

Definition at line 910 of file POMDisassembler.cc.

911 {
912 POMDisassembler disasm(program, printAddresses);
913 return disasm.disassembleProgram();
914}

References disassembleProgram(), and program.

Here is the call graph for this function:

◆ disassembleInstruction()

TCEString POMDisassembler::disassembleInstruction ( const TTAProgram::Instruction instruction,
int  addr = -1 
)
virtual

"Template methods" that can be overridden in the derived assemblers.

Definition at line 675 of file POMDisassembler.cc.

676 {
677 return POMDisassembler::disassemble(instruction, printAddresses_, addr);
678}

References disassemble(), and printAddresses_.

Referenced by SimulatorFrontend::disassembleInstruction(), disassembleProcedure(), and SimulatorFrontend::programLocationDescription().

Here is the call graph for this function:

◆ disassembleProcedure()

TCEString POMDisassembler::disassembleProcedure ( const TTAProgram::Procedure proc)
virtual

Definition at line 861 of file POMDisassembler.cc.

861 {
862
863 std::stringstream stringStream;
864
865 const TTAProgram::Instruction* currentInstruction = NULL;
866 stringStream << procedureDescription(proc) << std::endl;
867
868 for (int instrIndex = 0, iCount = proc.instructionCount();
869 instrIndex < iCount; ++instrIndex) {
870 currentInstruction = &proc.instructionAtIndex(instrIndex);
871
872 stringStream << destinationLabels(proc, instrIndex);
873
874 InstructionAddress addr = proc.startAddress().location() + instrIndex;
875
876 // Do not print "implicit instructions" of OTAs.
877 if (currentInstruction->size() > 0) {
878 stringStream << "\t" <<
879 disassembleInstruction(*currentInstruction, addr) << std::endl;
880 }
881 }
882 return stringStream.str();
883}
virtual TCEString procedureDescription(const TTAProgram::Procedure &proc)
virtual TCEString disassembleInstruction(const TTAProgram::Instruction &instruction, int addr=-1)
"Template methods" that can be overridden in the derived assemblers.
virtual TCEString destinationLabels(const TTAProgram::Procedure &proc, int instrIndex) const
virtual int instructionCount() const
virtual Instruction & instructionAtIndex(int index) const

References destinationLabels(), disassembleInstruction(), TTAProgram::CodeSnippet::instructionAtIndex(), TTAProgram::CodeSnippet::instructionCount(), TTAProgram::Address::location(), procedureDescription(), TTAProgram::Instruction::size(), and TTAProgram::CodeSnippet::startAddress().

Referenced by disassemble(), and disassembleProcedures().

Here is the call graph for this function:

◆ disassembleProcedures()

TCEString POMDisassembler::disassembleProcedures ( )
virtual

Definition at line 886 of file POMDisassembler.cc.

886 {
887
888 std::stringstream stringStream;
889
890 for (int procIndex = 0; procIndex < program_.procedureCount();
891 ++procIndex) {
892 const Procedure& proc = program_.procedureAtIndex(procIndex);
893 stringStream << disassembleProcedure(proc);
894 }
895 return stringStream.str();
896}
virtual TCEString disassembleProcedure(const TTAProgram::Procedure &proc)
const Procedure & procedureAtIndex(int index) const
Definition Program.cc:508
int procedureCount() const
Definition Program.cc:610

References disassembleProcedure(), TTAProgram::Program::procedureAtIndex(), TTAProgram::Program::procedureCount(), and program_.

Referenced by disassemble(), and disassembleProgram().

Here is the call graph for this function:

◆ disassembleProgram()

TCEString POMDisassembler::disassembleProgram ( )
virtual

Create a disassembly string from the whole program including module headers, section markers and data memory initializations.

Returns
Disassembly of the program in a string.
Exceptions
ExceptionCan leak exceptions if the traversed program is malformed, etc.

Definition at line 956 of file POMDisassembler.cc.

956 {
957
958 std::stringstream output;
959 Word first = startAddress();
960
961 output << codeSectionDescription(first) << endl << endl;
962 output << disassembleProcedures() << endl << endl;
963
964 // Write data memory initializations.
965 for (int i = 0; i < program_.dataMemoryCount(); i++) {
966
968 const TTAMachine::AddressSpace& aSpace = mem.addressSpace();
969
970 if (mem.dataDefinitionCount() == 0) continue;
971
972 output << dataSectionDescription(
973 aSpace, mem.dataDefinition(0).startAddress().location()) << endl;
974
975 // Definitions are put in a map to order them.
976 // TODO: the indexing API of DataMemory could be used for this?
977 // TODO: does this handle "holes" correctly or assume fully
978 // "connected regions" always?
979 // TODO: this does not handle UDATA at all!
980 std::map<Word, const TTAProgram::DataDefinition*> definitions;
981 for (int d = 0; d < mem.dataDefinitionCount(); d++) {
982 const TTAProgram::DataDefinition& def = mem.dataDefinition(d);
983 definitions[def.startAddress().location()] = &def;
984 }
985
986 std::map<Word, const TTAProgram::DataDefinition*>::iterator iter =
987 definitions.begin();
988
989 for (; iter != definitions.end(); iter++) {
990 const TTAProgram::DataDefinition* def = (*iter).second;
991 output << dataDefDescription(*def) << endl;
992 }
993 }
994 output << endl;
995
996 return output.str();
997}
virtual TCEString dataDefDescription(const TTAProgram::DataDefinition &def)
virtual TCEString disassembleProcedures()
virtual TCEString dataSectionDescription(const TTAMachine::AddressSpace &aSpace, Word location)
virtual TCEString codeSectionDescription(Word startAddress)
virtual Address startAddress() const
DataDefinition & dataDefinition(Address address) const
Definition DataMemory.cc:79
int dataDefinitionCount() const
const TTAMachine::AddressSpace & addressSpace() const
DataMemory & dataMemory(int index) const
Definition Program.cc:967
int dataMemoryCount() const
Definition Program.cc:942

References TTAProgram::DataMemory::addressSpace(), codeSectionDescription(), dataDefDescription(), TTAProgram::DataMemory::dataDefinition(), TTAProgram::DataMemory::dataDefinitionCount(), TTAProgram::Program::dataMemory(), TTAProgram::Program::dataMemoryCount(), dataSectionDescription(), disassembleProcedures(), TTAProgram::Address::location(), program_, TTAProgram::DataDefinition::startAddress(), and startAddress().

Referenced by disassembleFully().

Here is the call graph for this function:

◆ disassembler()

POMDisassembler * POMDisassembler::disassembler ( const TTAMachine::Machine mach,
const TTAProgram::Program program 
)
static

A factor for building a correct type of disassembler for the target.

Definition at line 1022 of file POMDisassembler.cc.

1024 {
1025 return new POMDisassembler(program);
1026}

References program.

Referenced by TTAProgram::Program::finalize(), and SimulatorFrontend::initializeDisassembler().

◆ instructionCount()

Word POMDisassembler::instructionCount ( ) const
virtual

Returns number of instructions in the program.

Returns
Instruction count.

Definition at line 495 of file POMDisassembler.cc.

495 {
496 Word count = 0;
497 unsigned procedureCount = program_.procedureCount();
498 for (unsigned i = 0; i < procedureCount; i++) {
499 const Procedure& procedure = program_.procedure(i);
500 count = count + procedure.instructionCount();
501 }
502 return count;
503}
Procedure & procedure(int index) const
Definition Program.cc:622

References TTAProgram::CodeSnippet::instructionCount(), TTAProgram::Program::procedure(), TTAProgram::Program::procedureCount(), and program_.

Here is the call graph for this function:

◆ instructionSize()

virtual size_t POMDisassembler::instructionSize ( const TTAProgram::Instruction )
inlinevirtual

Returns the size of the instruction in memory addresses, if known. Falls back to address per instruction.

Definition at line 119 of file POMDisassembler.hh.

120 { return 1; }

Referenced by TTAProgram::Program::finalize().

◆ isCallOrJump()

bool POMDisassembler::isCallOrJump ( const TTAProgram::Terminal terminal)
staticprivate

Checks if the terminal is a control unit jump or call operand.

Parameters
terminalTerminal to check.
Returns
True, if the terminal is a control unit jump or call operand, false otherwise.

Definition at line 595 of file POMDisassembler.cc.

595 {
596
597 if (!terminal.isFUPort()) {
598 return false;
599 }
600
601 const FunctionUnit* fu = &terminal.functionUnit();
602
603 if (dynamic_cast<const ControlUnit*>(fu) == NULL) {
604 return false;
605 }
606
607 if (!terminal.isOpcodeSetting()) {
608 return false;
609 }
610
611 string operationName =
613
614 if (operationName == "call" || operationName == "jump") {
615 return true;
616 }
617
618 return false;
619}
static std::string stringToLower(const std::string &source)
virtual bool isOpcodeSetting() const
Definition Terminal.cc:285
virtual Operation & operation() const
Definition Terminal.cc:319

References TTAProgram::Terminal::functionUnit(), TTAProgram::Terminal::isFUPort(), TTAProgram::Terminal::isOpcodeSetting(), Operation::name(), TTAProgram::Terminal::operation(), and StringTools::stringToLower().

Referenced by createMove().

Here is the call graph for this function:

◆ label() [1/2]

std::string POMDisassembler::label ( const TTAProgram::Program program,
Word  address,
int  index 
)
staticprivate

Returns instruction label with the given index.

Parameters
addressInstruction address.
programProgram to search label for.
Returns
Instruction label with the given index and address.
Exceptions
OutOfRangeThe address or index is out of range.

Definition at line 563 of file POMDisassembler.cc.

564 {
565 if (index == 0 && labelCount(program, address) == 1) {
566 for (int i = 0; i < program.procedureCount(); i++) {
567 if (program.procedure(i).startAddress().location() == address) {
568 return program.procedure(i).name();
569 }
570 }
571 }
572
573 if (index > labelCount(program, address)) {
574 throw OutOfRange(
575 __FILE__, __LINE__, __func__, "No label in requested index: " +
576 Conversion::toString(index));
577 }
578
579 Address iaddr(address, program.startAddress().space());
580
581 const CodeLabel& label =
582 program.globalScopeConst().globalCodeLabel(iaddr, index);
583
584 return label.name();
585}
std::string name() const
Definition Label.cc:74

References __func__, label(), labelCount(), TTAProgram::Label::name(), program, and Conversion::toString().

Here is the call graph for this function:

◆ label() [2/2]

std::string POMDisassembler::label ( Word  address,
int  index 
) const

Returns instruction label with the given index.

Parameters
addressInstruction address.
Returns
Instruction label with the given index and address.
Exceptions
OutOfRangeThe address or index is out of range.

Definition at line 550 of file POMDisassembler.cc.

550 {
551 return label(program_, address, index);
552}

References label(), and program_.

Referenced by createMove(), destinationLabels(), label(), and label().

Here is the call graph for this function:

◆ labelCount() [1/2]

int POMDisassembler::labelCount ( const TTAProgram::Program program,
Word  address 
)
staticprivate

Returns number of labels at the given address.

Parameters
addressInstruction address.
Returns
Instruction label count.

Definition at line 523 of file POMDisassembler.cc.

523 {
524
525 Address iaddr(address, program.startAddress().space());
526 const GlobalScope& scope = program.globalScopeConst();
527 unsigned labelCount = scope.globalCodeLabelCount(iaddr);
528
529 if (labelCount > 0) {
530 return labelCount;
531 }
532
533 for (int i = 0; i < program.procedureCount(); i++) {
534 if (program.procedure(i).startAddress().location() == address) {
535 return 1;
536 }
537 }
538
539 return 0;
540}
int globalCodeLabelCount(Address address) const

References TTAProgram::GlobalScope::globalCodeLabelCount(), labelCount(), and program.

Here is the call graph for this function:

◆ labelCount() [2/2]

int POMDisassembler::labelCount ( Word  address) const

Returns number of labels at the given address.

Parameters
addressInstruction address.
Returns
Instruction label count.

Definition at line 512 of file POMDisassembler.cc.

512 {
513 return labelCount(program_, address);
514}

References labelCount(), and program_.

Referenced by createMove(), destinationLabels(), label(), labelCount(), and labelCount().

Here is the call graph for this function:

◆ labelPositionDescription()

TCEString POMDisassembler::labelPositionDescription ( TCEString  labelStr) const
virtual

Definition at line 856 of file POMDisassembler.cc.

856 {
857 return labelStr + ":";
858}

Referenced by destinationLabels().

◆ printAddress()

TCEString POMDisassembler::printAddress ( const TTAProgram::Instruction instr) const
virtual

Definition at line 1030 of file POMDisassembler.cc.

1030 {
1031 return TCEString("\t# @") << instr.address().location();
1032}
Address address() const

References TTAProgram::Instruction::address(), and TTAProgram::Address::location().

Here is the call graph for this function:

◆ procedureDescription()

TCEString POMDisassembler::procedureDescription ( const TTAProgram::Procedure proc)
virtual

Definition at line 833 of file POMDisassembler.cc.

833 {
834 TCEString output;
835 output << ":procedure " << proc.name() << ";";
836 return output;
837}

References TTAProgram::Procedure::name().

Referenced by disassembleProcedure().

Here is the call graph for this function:

◆ setPrintAddresses()

virtual void POMDisassembler::setPrintAddresses ( bool  addresses)
inlinevirtual

Definition at line 125 of file POMDisassembler.hh.

126 { printAddresses_ = addresses; }

References printAddresses_.

◆ startAddress()

Word POMDisassembler::startAddress ( ) const
virtual

Returns start address of the program.

Returns
Start address of the program.

Definition at line 483 of file POMDisassembler.cc.

483 {
484 unsigned int address = program_.startAddress().location();
485 return address;
486}
Address startAddress() const
Definition Program.cc:286

References TTAProgram::Address::location(), program_, and TTAProgram::Program::startAddress().

Referenced by codeSectionDescription(), disassembleProgram(), and main().

Here is the call graph for this function:

Member Data Documentation

◆ printAddresses_

bool POMDisassembler::printAddresses_
protected

True if instruction indices (addresses) should be printed at the end of lines.

Definition at line 134 of file POMDisassembler.hh.

Referenced by disassembleInstruction(), and setPrintAddresses().

◆ program_

const TTAProgram::Program& POMDisassembler::program_
protected

Program object model to disassemble.

Definition at line 132 of file POMDisassembler.hh.

Referenced by createInstruction(), disassembleProcedures(), disassembleProgram(), instructionCount(), label(), labelCount(), and startAddress().


The documentation for this class was generated from the following files: