On 15/02/2023 14:18, Jonny Grant wrote:
Hi
Has GCC considered an improvement to "compile out" from the builtin printf the strings? That being to change it to just be something like puts("file /app/example.cpp:4")
I had a look, but couldn't find it being asked before.
This is just a short example to demonstrate.
It would be useful to see the exact string in the debugger "file /app/example.cpp:4", also it saves a few lines of asm.
https://godbolt.org/z/aKz3o6aPd
int main()
{
__builtin_printf("file %s:%d", __FILE__, __LINE__);
}
.LC0:
.string "/app/example.cpp"
.LC1:
.string "file %s:%d"
main:
subq $8, %rsp
movl $4, %edx
movl $.LC0, %esi
xorl %eax, %eax
movl $.LC1, %edi
call printf
xorl %eax, %eax
addq $8, %rsp
ret
We already do when the printf contains simply the format string and no
additional arguments.
I guess it might be possible to handle cases where all the arguments are
constant, but even that has its problems, eg:
- can we guarantee identical output to the platform printf?
- does it cause string bloat (what if there were 30 or so such
statements in your program all identical except for the line number)?
- does it even happen often enough to be worth adding (and maintaining)
support? Nothing comes for free in a compiler and the optimisations
have to be worth-while in the real world.
R.