For Programmers: Free Programming Magazines  


Home > Archive > Compilers > June 2006 > compiler smarts: register variables and catching exceptions









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author compiler smarts: register variables and catching exceptions
andrew_nuss@yahoo.com

2006-06-24, 8:23 am

Hi,

Assuming that either (1) my compiler supports the observance of the
register keyword for a pointer variable (buffer) or (2) my pointer
variables are so frequently used in the body of a function that my
compiler decides that it should use a consistent register for these
variables (as if it had obeyed the register hint), my question is what
happens with exceptions. For example, I want to catch a
SpecialException, and in the catch block, cleanup the data in the
pointer variables and resume looping, as follows:

void main ()
{
// allocate stacks and create stack pointers
// to hold int data and use registers
// for the stack tops

// give an explicit hint to use registers
// but most likely the -fast compiler
// mode would to the same thing

register int* sp1 = ...;
register int* sp2 = ...;
register int* sp3 = ...;
register int* sp4 = ...;

do {

try {
// tight inner loop
// which works thru opcodes
do {
int opcode = ...;
switch (opcode) {

// the many cases of this switch
// are lightweight and manipulate
// the sp1...sp4 registers' data

// some of the cases
// can call functions, some
// inlined, some not, which
// throw SpecialException
}
} while (true);

} catch (SpecialException& e) {

// handling to cleanup the data
// in the four stacks and resume
// processing back to the inner loop

for (int* p = base1; p != sp1; p++) {
int val = *p++;
... manipulate val
}
... manipulate sp1

for (int* p = base2; p != sp2; p++) {
int val = *p++;
... manipulate val
}
... manipulate sp2

etc.
}
} while (true);
}

My concern is that the compiler, when it sees that the catch block
manipulates the stack pointer variables, will refuse to put them in
registers because of the difficulty in knowing how to restore
registers in preparing the catch block to have access to local
variables of scope. I.e. it will just restore the frame and decide
that sp1...sp4 must live in the frame since they are accessed in the
catch block. NOTE: the try block switch cases can throw a
SpecialException directly or indirectly thru inlined or non inlined
functions.

Is my concern valid? Will C++ compilers refuse to put sp1...sp4 into
registers? Is there a workaround?

Thanks,
Andy
[It may or may not be a problem, depending on how clever the compiler
is. These days, most compilers ignore register declarations because
they can figure out better than most programmers what variables would
benefit from being in registers. -John]

Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com