Page MenuHomeFreeBSD

libdtrace: Permit taking the address of an identifier without type info
ClosedPublic

Authored by markj on Jul 19 2025, 12:17 AM.
Tags
None
Referenced Files
Unknown Object (File)
Thu, Oct 9, 11:34 PM
Unknown Object (File)
Thu, Oct 9, 11:34 PM
Unknown Object (File)
Thu, Oct 9, 11:34 PM
Unknown Object (File)
Thu, Oct 9, 7:46 PM
Unknown Object (File)
Wed, Oct 1, 1:04 PM
Unknown Object (File)
Wed, Oct 1, 2:54 AM
Unknown Object (File)
Tue, Sep 30, 8:18 AM
Unknown Object (File)
Wed, Sep 24, 8:11 AM
Subscribers

Details

Summary

Symbols defined using assembler directives lack type info, but in this
case one ought to be able to cast a pointer to the symbol and
dereference the pointer to get a value. Without this change, D
disallows this trick since it requires all identifiers to have a type.

Relax the rules slightly and allow an identifier to have type "void" if
we know we're just taking its address.

As a result, the following dtrace invocation works:

dtrace -n 'tick-1s {printf("%d", *(int *)&`ticks);}'

In particular, since commit b2b974f7ef4c ("clock: Simplify subr_ticks
and rename"), "ticks" does not have any type info associated with it, so
its value couldn't be printed. This trick provides a workaround and is
probably generally useful.

Add a regression test which exercises this functionality.

MFC after: 1 month

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Not Applicable
Unit
Tests Not Applicable