Thread overview
Disabling All Inlining in DMD Debug Builds
Oct 24, 2022
Jack Stouffer
Oct 24, 2022
Imperatorn
Oct 24, 2022
ryuukk_
Oct 25, 2022
Per Nordlöw
Oct 25, 2022
ryuukk_
Oct 25, 2022
Jack Stouffer
October 24, 2022

I use

pragma(inline, true)
function definition

all over my code. And by default, DMD inlines these functions even in debug builds, which normally is great. I have a custom dynamic array container and if the indexing operator overload function wasn't inlined the debug build would have a ~10x slowdown and become un-testable in many ways.

What sucks about this is that stepping through the code in a debugger is way worse because the the "step-over" operation no longer works properly. Maybe this is a bug in the PDB output, but trying to step over an inlined function call still takes you into the inlined function body as if it were a step-in.

So is there a way to tell DMD to ignore these pragmas in certain builds?

October 24, 2022

On Monday, 24 October 2022 at 19:28:34 UTC, Jack Stouffer wrote:

>

I use

pragma(inline, true)
function definition

all over my code. And by default, DMD inlines these functions even in debug builds, which normally is great. I have a custom dynamic array container and if the indexing operator overload function wasn't inlined the debug build would have a ~10x slowdown and become un-testable in many ways.

What sucks about this is that stepping through the code in a debugger is way worse because the the "step-over" operation no longer works properly. Maybe this is a bug in the PDB output, but trying to step over an inlined function call still takes you into the inlined function body as if it were a step-in.

So is there a way to tell DMD to ignore these pragmas in certain builds?

Search and replace pragma(inline, true) with //pragma(inline, true) ;)

October 24, 2022

On Monday, 24 October 2022 at 19:28:34 UTC, Jack Stouffer wrote:

>

I use

pragma(inline, true)
function definition

all over my code. And by default, DMD inlines these functions even in debug builds, which normally is great. I have a custom dynamic array container and if the indexing operator overload function wasn't inlined the debug build would have a ~10x slowdown and become un-testable in many ways.

What sucks about this is that stepping through the code in a debugger is way worse because the the "step-over" operation no longer works properly. Maybe this is a bug in the PDB output, but trying to step over an inlined function call still takes you into the inlined function body as if it were a step-in.

So is there a way to tell DMD to ignore these pragmas in certain builds?

This is ugly, but that works

version(DebugFast) pragma(inline, true);
void my_function()
{
}

But that'll only inline if you build with DEBUG_FAST, wich is not what you want

I wish we could do version(DebugFast | Release)

October 25, 2022

On Monday, 24 October 2022 at 20:43:45 UTC, ryuukk_ wrote:

>

I wish we could do version(DebugFast | Release)

Moreover, I've been using, for instance,

version(D_Coverage) {} else pragma(inline, true);
void foo() {}

to get correct coverage inclusion of foo(). Is this still neeed?

October 25, 2022

On Tuesday, 25 October 2022 at 08:14:26 UTC, Per Nordlöw wrote:

>

On Monday, 24 October 2022 at 20:43:45 UTC, ryuukk_ wrote:

>

I wish we could do version(DebugFast | Release)

Moreover, I've been using, for instance,

version(D_Coverage) {} else pragma(inline, true);
void foo() {}

to get correct coverage inclusion of foo(). Is this still neeed?

The 'else' is easy to miss when reading that code

There must be a better solution than that, version is just too rigid

Looks like OP opened an issue about it: https://issues.dlang.org/show_bug.cgi?id=23435

October 25, 2022

On Tuesday, 25 October 2022 at 08:14:26 UTC, Per Nordlöw wrote:

>

On Monday, 24 October 2022 at 20:43:45 UTC, ryuukk_ wrote:

>

I wish we could do version(DebugFast | Release)

Moreover, I've been using, for instance,

version(D_Coverage) {} else pragma(inline, true);
void foo() {}

to get correct coverage inclusion of foo(). Is this still neeed?

This looks like a workable solution for now. Thanks