The magic Delphi ReturnAddress intrinsic


I could not find any official place where ReturnAddress is documented even though it is used at quite a few places in the RTL, VCL, FMX and 3rd party libraries like DUnitX, Spring4D, JCL, ReportBuilder, TeeChart.
I tried searching it in the contexts of Delphi 2007, Delphi 2009, but there is only a [] different System.ObjAuto.TParameters.ReturnAddress documented in XE2 and higher.

procedure Abort;
raise EAbort.CreateRes(@SOperationAborted) at ReturnAddress;

There is a (usually broken*) ReturnAddr function used in various places of the RTL/VCL/FMX and (therefore wrongfully copied) in many other peoples code.

function ReturnAddr: Pointer;
// From classes.pas
MOV EAX,[EBP+4] // sysutils.pas says [EBP-4], but this works !

See the above link; I think this was fixed in Delphi XE, but the issue is still open.

Related to the above is the documented ExceptAddr.
I’ve used this in my ExceptionHelperUnit to build a GetStackTrace function in the example gist below.
I found these posts documenting the behaviour of the above intrinsic functions and more:

[WayBack] Undocumented Delphi routines – Chee Wee’s blog: IT solutions for Singapore and companies worldwide
[WayBack] delphi – Undocumented intrinsic routines – Stack Overflow

[WayBack] Delphi sorcery: New language feature in XE7
[WayBack]  What’s New in Carpathia Beta 1

[WayBack] exception – What does `at ReturnAddress` mean in Delphi? – Stack Overflow

*[WayBack] QualityCentral Report #71294: Almost all occurrences of ReturnAddr are broken (Status: Open)


.gist table { margin-bottom: 0; }

Comments are closed.