@@ -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" ]
571562fn 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]
0 commit comments