Ulrich Lauther <[EMAIL PROTECTED]> writes:

> : __builtin_return_address(0) should always work
>
> the parameter was "3". I now tried to first call __builtin_frame_address()
> and when that returns 0 to reduce the parameter. But then 
> __builtin_frame_address crashes.

Both "functions" assume that the code is compiled with a frame
pointer. They will both fail the same way if that's not the case.

> : With non-zero parameter, the work __builtin_return_address()
> : has to do to work correctly (and not crash) is so complicated,
> : that you should abandon all hope.
>
> But it seems to work without optimization;

Yes: so long as all code begins with 'pushq %rbp', you are ok.

> and without problems on an Intel processor 

Only when -fno-omit-frame-pointer is in effect, which it happens
to almost always be on x86, because otherwise x86 stack becomes
un-debuggable. On x86_64 debugger can easily unwind stack without
frame pointer (using unwind descriptors), so -O effectively turns
on -fomit-frame-pointer, and __builtin_{frame,return}_address() 
stop working.

> and on Suns.

SPARC is one of the easier platforms to unwind stack on.

> I need it to store the program counter at the time
> when a piece of memory is allocated for reporting later on memory leaks and
> their origin in my memory manager.

If it's your own memory manager, just pass the info (e.g. file,
line) into the allocation routine(s).

Alternatively, compile with '-O2 -fno-omit-frame-pointer'

> Is there another reliable way to access the program counter?

Yes: don't use __builtin_..._address() with parameter other than 0,
and use unwind descriptors to find callers. This latter part will
likely require a couple thousand lines of code (to decode dwarf3
info). Look in binutils-1.16.x/binutils/readelf.c
display_debug_frames() to get an idea of what's involved.

Cheers,
-- 
In order to understand recursion you must first understand recursion.
Remove /-nsp/ for email.
_______________________________________________
help-gplusplus mailing list
help-gplusplus@gnu.org
http://lists.gnu.org/mailman/listinfo/help-gplusplus

Reply via email to