Skip to content

Commit 94216ca

Browse files
authored
Lazily IR-declare all function fwd declarations (#4420)
Instead of eagerly IR-declaring all such functions in root modules being compiled. This might reduce compile times in some cases, and is a cheap way to improve the situation wrt. issue #2782.
1 parent d94b125 commit 94216ca

4 files changed

Lines changed: 12 additions & 4 deletions

File tree

gen/declarations.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,9 @@ class CodegenVisitor : public Visitor {
284284

285285
void visit(FuncDeclaration *decl) override {
286286
// don't touch function aliases, they don't contribute any new symbols
287-
if (!decl->skipCodegen() && !decl->isFuncAliasDeclaration()) {
287+
if (!decl->skipCodegen() && !decl->isFuncAliasDeclaration() &&
288+
// skip fwd declarations (IR-declared lazily)
289+
decl->fbody) {
288290
DtoDefineFunction(decl);
289291
}
290292
}

tests/codegen/attr_callingconvention.d

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,16 @@ void fooinvokesexternCfoofoofoo()
5959
//////////////////////////////////////////////////////////
6060
/// Forward-declared function calls and invokes:
6161

62-
// CHECK-LABEL: declare x86_vectorcallcc void @{{.*}}forward_declared_function
63-
@callingConvention("vectorcall") void forward_declared_function();
64-
6562
// CHECK-LABEL: define{{.*}} @{{.*}}attr_callingconvention34foocalls_forward_declared_function
6663
void foocalls_forward_declared_function()
6764
{
6865
// CHECK: call x86_vectorcallcc void @{{.*}}attr_callingconvention25forward_declared_function
6966
forward_declared_function();
7067
}
7168

69+
// CHECK-LABEL: declare x86_vectorcallcc void @{{.*}}forward_declared_function
70+
@callingConvention("vectorcall") void forward_declared_function();
71+
7272
// CHECK-LABEL: define{{.*}} @{{.*}}attr_callingconvention36fooinvokes_forward_declared_function
7373
void fooinvokes_forward_declared_function()
7474
{

tests/compilable/gh2782.d

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// RUN: %ldc -c -singleobj %s %S/inputs/gh2782b.d
2+
3+
struct S {}
4+
extern(C) void foo(S);

tests/compilable/inputs/gh2782b.d

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
struct S {}
2+
extern(C) void foo(S);

0 commit comments

Comments
 (0)