@@ -148,18 +148,10 @@ fn init_functions_generated_for_programs() {
148
148
ret void
149
149
}
150
150
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
-
158
151
define void @__init___Test() {
159
152
entry:
160
153
call void @__init_plc_prg(%PLC_PRG* @PLC_PRG_instance)
161
154
call void @__user_init_PLC_PRG(%PLC_PRG* @PLC_PRG_instance)
162
- call void @__user_init_PLC_PRG(%PLC_PRG* @PLC_PRG_instance)
163
155
ret void
164
156
}
165
157
"# ) ;
@@ -567,7 +559,6 @@ fn nested_initializer_pous() {
567
559
}
568
560
569
561
#[ test]
570
- #[ ignore = "initializing references in same POU not yet supported" ]
571
562
fn local_address ( ) {
572
563
let res = generate_to_string (
573
564
"Test" ,
@@ -584,12 +575,50 @@ fn local_address() {
584
575
)
585
576
. unwrap ( ) ;
586
577
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
+ "# ) ;
588
618
}
589
619
590
620
#[ test]
591
- #[ ignore = "initializing references in same POU not yet supported" ]
592
- fn tmpo ( ) {
621
+ fn user_init_called_for_variables_on_stack ( ) {
593
622
let result = generate_to_string (
594
623
"Test" ,
595
624
vec ! [ SourceCode :: from(
@@ -599,17 +628,83 @@ fn tmpo() {
599
628
i : INT;
600
629
pi: REF_TO INT;
601
630
END_VAR
631
+ METHOD FB_INIT
632
+ pi := ADR(i);
633
+ END_METHOD
602
634
END_FUNCTION_BLOCK
603
635
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
607
642
"# ,
608
643
) ] ,
609
644
)
610
645
. unwrap ( ) ;
611
646
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
+ "# ) ;
613
708
}
614
709
615
710
#[ test]
0 commit comments