Skip to content

Commit a7bfcbf

Browse files
committed
add test for user_init with stack-variables
1 parent a08c212 commit a7bfcbf

File tree

2 files changed

+124
-16
lines changed

2 files changed

+124
-16
lines changed

src/codegen/tests/initialization_test/complex_initializers.rs

+111-16
Original file line numberDiff line numberDiff line change
@@ -148,18 +148,10 @@ fn init_functions_generated_for_programs() {
148148
ret void
149149
}
150150
151-
define void @__user_init_PLC_PRG(%PLC_PRG* %0) {
152-
entry:
153-
%self = alloca %PLC_PRG*, align 8
154-
store %PLC_PRG* %0, %PLC_PRG** %self, align 8
155-
ret void
156-
}
157-
158151
define void @__init___Test() {
159152
entry:
160153
call void @__init_plc_prg(%PLC_PRG* @PLC_PRG_instance)
161154
call void @__user_init_PLC_PRG(%PLC_PRG* @PLC_PRG_instance)
162-
call void @__user_init_PLC_PRG(%PLC_PRG* @PLC_PRG_instance)
163155
ret void
164156
}
165157
"#);
@@ -567,7 +559,6 @@ fn nested_initializer_pous() {
567559
}
568560

569561
#[test]
570-
#[ignore = "initializing references in same POU not yet supported"]
571562
fn local_address() {
572563
let res = generate_to_string(
573564
"Test",
@@ -584,12 +575,50 @@ fn local_address() {
584575
)
585576
.unwrap();
586577

587-
insta::assert_snapshot!(res, @r###""###);
578+
insta::assert_snapshot!(res, @r#"
579+
; ModuleID = '<internal>'
580+
source_filename = "<internal>"
581+
582+
%foo = type { i16, i16* }
583+
584+
@__foo__init = constant %foo zeroinitializer
585+
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 0, void ()* @__init___Test, i8* null }]
586+
587+
define void @foo(%foo* %0) {
588+
entry:
589+
%i = getelementptr inbounds %foo, %foo* %0, i32 0, i32 0
590+
%pi = getelementptr inbounds %foo, %foo* %0, i32 0, i32 1
591+
ret void
592+
}
593+
594+
define void @__init_foo(%foo* %0) {
595+
entry:
596+
%self = alloca %foo*, align 8
597+
store %foo* %0, %foo** %self, align 8
598+
%deref = load %foo*, %foo** %self, align 8
599+
%pi = getelementptr inbounds %foo, %foo* %deref, i32 0, i32 1
600+
%deref1 = load %foo*, %foo** %self, align 8
601+
%i = getelementptr inbounds %foo, %foo* %deref1, i32 0, i32 0
602+
store i16* %i, i16** %pi, align 8
603+
ret void
604+
}
605+
606+
define void @__user_init_foo(%foo* %0) {
607+
entry:
608+
%self = alloca %foo*, align 8
609+
store %foo* %0, %foo** %self, align 8
610+
ret void
611+
}
612+
613+
define void @__init___Test() {
614+
entry:
615+
ret void
616+
}
617+
"#);
588618
}
589619

590620
#[test]
591-
#[ignore = "initializing references in same POU not yet supported"]
592-
fn tmpo() {
621+
fn user_init_called_for_variables_on_stack() {
593622
let result = generate_to_string(
594623
"Test",
595624
vec![SourceCode::from(
@@ -599,17 +628,83 @@ fn tmpo() {
599628
i : INT;
600629
pi: REF_TO INT;
601630
END_VAR
631+
METHOD FB_INIT
632+
pi := ADR(i);
633+
END_METHOD
602634
END_FUNCTION_BLOCK
603635
604-
ACTION foo.init
605-
pi := REF(i);
606-
END_ACTION
636+
FUNCTION main
637+
VAR
638+
fb: foo;
639+
END_VAR
640+
fb();
641+
END_FUNCTION
607642
"#,
608643
)],
609644
)
610645
.unwrap();
611646

612-
insta::assert_snapshot!(result, @r###""###);
647+
insta::assert_snapshot!(result, @r#"
648+
; ModuleID = '<internal>'
649+
source_filename = "<internal>"
650+
651+
%foo = type { i16, i16* }
652+
653+
@__foo__init = constant %foo zeroinitializer
654+
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 0, void ()* @__init___Test, i8* null }]
655+
656+
define void @foo(%foo* %0) {
657+
entry:
658+
%i = getelementptr inbounds %foo, %foo* %0, i32 0, i32 0
659+
%pi = getelementptr inbounds %foo, %foo* %0, i32 0, i32 1
660+
ret void
661+
}
662+
663+
define void @foo__FB_INIT(%foo* %0) {
664+
entry:
665+
%i = getelementptr inbounds %foo, %foo* %0, i32 0, i32 0
666+
%pi = getelementptr inbounds %foo, %foo* %0, i32 0, i32 1
667+
store i16* %i, i16** %pi, align 8
668+
ret void
669+
}
670+
671+
define void @main() {
672+
entry:
673+
%fb = alloca %foo, align 8
674+
%0 = bitcast %foo* %fb to i8*
675+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %0, i8* align 1 bitcast (%foo* @__foo__init to i8*), i64 ptrtoint (%foo* getelementptr (%foo, %foo* null, i32 1) to i64), i1 false)
676+
call void @__init_foo(%foo* %fb)
677+
call void @__user_init_foo(%foo* %fb)
678+
call void @foo(%foo* %fb)
679+
ret void
680+
}
681+
682+
; Function Attrs: argmemonly nofree nounwind willreturn
683+
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg) #0
684+
685+
define void @__init_foo(%foo* %0) {
686+
entry:
687+
%self = alloca %foo*, align 8
688+
store %foo* %0, %foo** %self, align 8
689+
ret void
690+
}
691+
692+
define void @__user_init_foo(%foo* %0) {
693+
entry:
694+
%self = alloca %foo*, align 8
695+
store %foo* %0, %foo** %self, align 8
696+
%deref = load %foo*, %foo** %self, align 8
697+
call void @foo__FB_INIT(%foo* %deref)
698+
ret void
699+
}
700+
701+
define void @__init___Test() {
702+
entry:
703+
ret void
704+
}
705+
706+
attributes #0 = { argmemonly nofree nounwind willreturn }
707+
"#);
613708
}
614709

615710
#[test]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// RUN: (%COMPILE %s && %RUN) | %CHECK %s
2+
FUNCTION_BLOCK foo
3+
METHOD FB_INIT
4+
printf('FB_INIT called$N');
5+
END_METHOD
6+
END_FUNCTION_BLOCK
7+
8+
FUNCTION main
9+
VAR
10+
fb: foo;
11+
END_VAR
12+
// CHECK: FB_INIT called
13+
END_FUNCTION

0 commit comments

Comments
 (0)