mirror of
https://git.rtems.org/rtems-tools/
synced 2025-06-11 20:38:43 +08:00
137 lines
2.7 KiB
C++
137 lines
2.7 KiB
C++
/*! @file TargetBase.cc
|
|
* @brief TargetBase Implementation
|
|
*
|
|
* This file contains the implementation of the base class for
|
|
* functions supporting target unique functionallity.
|
|
*/
|
|
|
|
#include "TargetBase.h"
|
|
#include "qemu-traces.h"
|
|
|
|
#include <algorithm>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
namespace Target {
|
|
|
|
TargetBase::TargetBase(
|
|
std::string targetName
|
|
):
|
|
targetName_m( targetName )
|
|
{
|
|
int i;
|
|
std::string front = "";
|
|
|
|
for (i=0 ; targetName_m[i] && targetName_m[i] != '-' ; ) {
|
|
cpu_m[i] = targetName_m[i];
|
|
cpu_m[++i] = '\0';
|
|
}
|
|
if (targetName_m[i] == '-')
|
|
front = targetName_m + "-";
|
|
|
|
|
|
addr2line_m = front + "addr2line";
|
|
objdump_m = front + "objdump";
|
|
}
|
|
|
|
TargetBase::~TargetBase()
|
|
{
|
|
}
|
|
|
|
const char* TargetBase::getAddr2line() const
|
|
{
|
|
return addr2line_m.c_str();
|
|
}
|
|
|
|
const char* TargetBase::getCPU( void ) const
|
|
{
|
|
return cpu_m.c_str();
|
|
}
|
|
|
|
const char* TargetBase::getObjdump() const
|
|
{
|
|
return objdump_m.c_str();
|
|
}
|
|
|
|
const char* TargetBase::getTarget( void ) const
|
|
{
|
|
return targetName_m.c_str();
|
|
}
|
|
|
|
bool TargetBase::isBranch(
|
|
const char* const instruction
|
|
)
|
|
{
|
|
std::list <std::string>::iterator i;
|
|
|
|
if (branchInstructions.empty()) {
|
|
fprintf(
|
|
stderr,
|
|
"DETERMINE BRANCH INSTRUCTIONS FOR THIS ARCHITECTURE! -- fix me\n"
|
|
);
|
|
exit( -1 );
|
|
}
|
|
|
|
i = find(branchInstructions.begin(), branchInstructions.end(), instruction);
|
|
if ( i == branchInstructions.end() )
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool TargetBase::isBranchLine(
|
|
const char* const line
|
|
)
|
|
{
|
|
#define WARNING \
|
|
"WARNING: TargetBase::isBranchLine - (%d) " \
|
|
"Unable to find instruction in: %s\n"
|
|
const char *ch;
|
|
char instruction[120];
|
|
int result;
|
|
|
|
|
|
ch = &(line[0]);
|
|
|
|
// Increment to the first tab in the line
|
|
while ((*ch != '\t') && (*ch != '\0')) {
|
|
ch++;
|
|
}
|
|
if (*ch != '\t') {
|
|
fprintf( stderr, WARNING, 1, line );
|
|
return false;
|
|
}
|
|
ch++;
|
|
|
|
// Increment to the second tab in the line
|
|
while ((*ch != '\t') && (*ch != '\0'))
|
|
ch++;
|
|
if (*ch != '\t') {
|
|
fprintf( stderr, WARNING, 2, line) ;
|
|
return false;
|
|
}
|
|
ch++;
|
|
|
|
// Grab the instruction which is the next word in the buffer
|
|
// after the second tab.
|
|
result = sscanf( ch, "%s", instruction );
|
|
if (result != 1) {
|
|
fprintf( stderr, WARNING, 3, line );
|
|
return false;
|
|
}
|
|
|
|
return isBranch( instruction );
|
|
}
|
|
|
|
uint8_t TargetBase::qemuTakenBit(void)
|
|
{
|
|
return TRACE_OP_BR0;
|
|
}
|
|
|
|
uint8_t TargetBase::qemuNotTakenBit(void)
|
|
{
|
|
return TRACE_OP_BR1;
|
|
}
|
|
|
|
}
|