views:

82

answers:

2

I'm attempting to modify a MIPS simulator to display the contents of its registers during run time. My question refers to the way in which I plan to do this. So...

I have a file, file1.cpp and file2.cpp. There is a local public variable in file1.cpp called

typedef long ValueGPR;
ValueGPR reg[33];

that I want to access in file2.cpp. Each of these files have a header file. File2.cpp contains a function which iteratively tracks the execution of a program instruction by instruction making this the perfect place to insert a printf("REG[%d]:%d\n",i,reg[i]); statement or something like that but reg is a local variable in file1.cpp. How do I stitch together something that will allow me to access this reg variable?

This is what both files actually look like (after thinking about this a bit more): "File1.h"

typedef long ValueGPR;
...
class ThreadContext {
    ...
    public:
        ValueGPR reg[33];
        ...
    ...
}
...

"File2.cpp"

...
#include ".../ThreadContext.h"
...
long ExecutionFlow::exeInst(void) {
    ...
    //ADD PRINTF OF reg[1] - reg[32] HERE
    ...
}
...
+4  A: 

I would move the typedef into file1.h along with the following declaration:

extern ValueGPR reg[];

Leave the ValueGPR reg[33]; in file1.cpp.

Cogwheel - Matthew Orlando
+1  A: 

Cogwheel's answer is correct, but your comment indicates some possibility of confusion, so perhaps it's better to clarify a bit:

file1.h:

#ifndef FILE1_H_INCLUDED
#define FILE1_H_INCLUDED

typedef long ValueGPR;
extern ValueGPR reg[];
#define NUM_REGS 33

#endif

file1.c:

#include "file1.h"

ValueGPR reg[NUM_REGS];

file2.c:

#include "file1.h"

/* ... */
for (i=0; i<NUM_REGS; i++)
    show(reg[i]);

Edit: Given the additional point that reg is really a member of a class, the code above clearly won't work, though the general idea remains the same. For a class member, you'd need to deal with the class as a whole, not just the reg itself. Taking a wild stab at what things might look like, you could have something like:

file1.h:

// include guard here

class CPU_state { 
public:
    typedef long ValueGPR;
    static const int num_regs = 33;
    ValueGPR reg[num_regs];

    //or, preferably:

    // std::vector<ValueGPR> regs;
    // CPU_state() : regs(num_regs) {}
    // ...
};

extern CPU_state cpu;

file1.cpp:

#include "file1.h"
CPU_state cpu;

file2.cpp:

#include "file1.h"

for (int i=0; i<cpu.num_regs; i++)
    show(cpu.reg[i]);

If you might create more than one CPU at a time, then you'll probably need to pass a pointer or reference to a CPU_state (or whatever you call it) rather than relying on a global instance like this code uses.

Jerry Coffin
I've tried this with error. I think is has to do with the fact that reg is contained within a class inside of file1.h I forgot to mention this important detail...
Dan Snyder
So, the file1.h file already had a "typedef CPU_state cpu" line, but when I append "extern" to this line I am told that there are multiple storage classes in this declaration. Any ideas?
Dan Snyder
@Dan: you probably don't want it to be a typedef, just `extern CPU_state cpu;`.
Jerry Coffin
It turns out that there was already an oject defined within file2.cpp which allowed me to access the reg variable I was after.
Dan Snyder