I found a workaround later. First I thought I've exceeded number of allowed
self variables, but it turned on that the problem was rather too complex
expression to read a memory in network order (I wanted to print TCP
sequence and ack numbers).
The following piece of D code demonstrates the error:
--- 8< ---
#define WORD(_x_) (((uint8_t *)(_x_))[0] * 256 + ((uint8_t *)(_x_))[1])
#define DWORD(_x_) WORD(_x_) * 65536 + WORD((uint8_t *)(_x_) + 2)
#define READ_DWORD(_x_, _dest_) _dest_ = WORD(_x_) << 16; \
_dest_ += WORD((uint8_t *)(_x_) + 2);
BEGIN {
x = &`utsname;
trace(x);
/* result = DWORD(x); */
READ_DWORD(x, result);
trace(result);
}
--- >8 ---
In this form, the script compiles. An attempt to use macro DWORD, e.g. by
uncommenting the line "result = DWORD(x);" leads to compilation failure:
pfexec /usr/sbin/dtrace -C -s ./insuff_regs.d
dtrace: failed to compile script ./insuff_regs.d: Insufficient registers to
generate code
Vita
On Wed, 10 Sep 2008, Mike Shapiro wrote:
> Date: Wed, 10 Sep 2008 08:52:52 -0700
> From: Mike Shapiro <[EMAIL PROTECTED]>
> To: Vita Batrla <[EMAIL PROTECTED]>
> Cc: [email protected]
> Subject: Re: [dtrace-discuss] Insufficient registers to generate code
>
> On Wed, Sep 10, 2008 at 11:16:04AM +0200, Vita Batrla wrote:
>> My D-Trace script at one point started to generate this error:
>>
>> dtrace: failed to compile script /dev/fd/10: Insufficient registers to
>> generate code
>>
>> I couldn't find more information about this error message (except source
>> code reference). What is the cause of the error and how do I avoid it?
>> Thanks,
>>
>> Vita
>
> You've exceeded a limit in the compiler. If you post the script
> or send it to me, I will suggest a work-around.
>
> -Mike
>
> --
> Mike Shapiro, Sun Microsystems Fishworks. blogs.sun.com/mws/
>
_______________________________________________
dtrace-discuss mailing list
[email protected]