Skip to content
This repository has been archived by the owner on Jul 29, 2024. It is now read-only.

Commit

Permalink
Fix IR for reference to none (#145)
Browse files Browse the repository at this point in the history
  • Loading branch information
gavrilikhin-d authored Apr 28, 2024
1 parent b6f7f41 commit 027783a
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/ir/to_ir.rs
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ impl<'llvm, C: Context<'llvm>> ToIR<'llvm, C> for ClassData {
fn to_ir(&self, context: &mut C) -> Self::IR {
trace!(target: "to_ir", "{self}");

if self.is_none() {
if self.is_none() || self.is_any_reference() && self.generics()[0].is_none() {
return context.types().none().into();
} else if self.is_bool() {
return context.types().bool().into();
Expand Down
10 changes: 10 additions & 0 deletions src/tests/snapshots/ppl__tests__reference_to_none.hir.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
source: src/tests/mod.rs
expression: hir
---
fn foo <$arg0: Reference<None>> -> None:
let $tmp@19: None = println "foo"
return ($tmp@19:None)

let x: None = none
foo (&x:Reference<None>)
84 changes: 84 additions & 0 deletions src/tests/snapshots/ppl__tests__reference_to_none.ir.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
---
source: src/tests/mod.rs
expression: ir
---
; ModuleID = 'main'
source_filename = "src/main.ppl"

%"Type<String>" = type { %String, %Integer }
%String = type { ptr }
%Integer = type { ptr }

@"Type<String>" = private global %"Type<String>" zeroinitializer
@0 = private unnamed_addr constant [7 x i8] c"String\00", align 1
@1 = private unnamed_addr constant [4 x i8] c"foo\00", align 1

define private void @initialize() !dbg !3 {
%1 = alloca %"Type<String>", align 8, !dbg !7
%"Type<String>.name" = getelementptr inbounds %"Type<String>", ptr %1, i32 0, i32 0, !dbg !7
%2 = call %String @string_from_c_string_and_length(ptr @0, i64 6), !dbg !8
store %String %2, ptr %"Type<String>.name", align 8, !dbg !8
%"Type<String>.size" = getelementptr inbounds %"Type<String>", ptr %1, i32 0, i32 1, !dbg !8
%3 = call %Integer @integer_from_i64(i64 8), !dbg !8
store %Integer %3, ptr %"Type<String>.size", align 8, !dbg !8
%4 = load %"Type<String>", ptr %1, align 8, !dbg !8
store %"Type<String>" %4, ptr @"Type<String>", align 8, !dbg !8
br label %return, !dbg !8

return: ; preds = %0
ret void
}

declare %String @string_from_c_string_and_length(ptr, i64)

declare %Integer @integer_from_i64(i64)

define void @main.execute() !dbg !9 {
call void @initialize(), !dbg !10
call void @initialize.1(), !dbg !11
call void @"foo <:Reference<None>>"(), !dbg !12
br label %return, !dbg !12

return: ; preds = %0
ret void
}

define void @"foo <:Reference<None>>"() !dbg !13 {
%1 = call %String @string_from_c_string_and_length(ptr @1, i64 3), !dbg !14
call void @"println <:String>"(%String %1), !dbg !14
br label %return, !dbg !15

return: ; preds = %0
ret void
}

declare void @"println <:String>"(%String)

define private void @initialize.1() !dbg !16 {
br label %return, !dbg !17

return: ; preds = %0
ret void
}

!llvm.module.flags = !{!0}
!llvm.dbg.cu = !{!1}

!0 = !{i32 2, !"Debug Info Version", i32 3}
!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2, producer: "ppl", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, sysroot: "/")
!2 = !DIFile(filename: "src/main.ppl", directory: ".")
!3 = distinct !DISubprogram(name: "initialize", linkageName: "initialize", scope: !2, file: !2, line: 3, type: !4, spFlags: DISPFlagDefinition, unit: !1)
!4 = !DISubroutineType(types: !5)
!5 = !{!6}
!6 = !DIBasicType(name: "i32", size: 32, encoding: DW_ATE_signed)
!7 = !DILocation(line: 3, column: 5, scope: !3)
!8 = !DILocation(line: 0, scope: !3)
!9 = distinct !DISubprogram(name: "main.execute", linkageName: "main.execute", scope: !2, file: !2, type: !4, spFlags: DISPFlagDefinition, unit: !1)
!10 = !DILocation(line: 3, column: 5, scope: !9)
!11 = !DILocation(line: 2, column: 8, scope: !9)
!12 = !DILocation(line: 3, column: 4, scope: !9)
!13 = distinct !DISubprogram(name: "foo <:Reference<None>>", linkageName: "foo <:Reference<None>>", scope: !9, file: !2, type: !4, spFlags: DISPFlagDefinition, unit: !1)
!14 = !DILocation(line: 0, column: 27, scope: !13)
!15 = !DILocation(line: 0, column: 19, scope: !13)
!16 = distinct !DISubprogram(name: "initialize.1", linkageName: "initialize.1", scope: !9, file: !2, line: 2, type: !4, spFlags: DISPFlagDefinition, unit: !1)
!17 = !DILocation(line: 2, column: 8, scope: !16)
5 changes: 5 additions & 0 deletions src/tests/snapshots/ppl__tests__reference_to_none.run.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
source: src/tests/mod.rs
expression: run_log
---
foo

0 comments on commit 027783a

Please sign in to comment.