diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index 6802d56d..6fd1d4c5 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -47,6 +47,7 @@ func TestCompiler(t *testing.T) { "basic.go", "pointer.go", "slice.go", + "string.go", "float.go", } diff --git a/compiler/testdata/string.go b/compiler/testdata/string.go new file mode 100644 index 00000000..3c574d8f --- /dev/null +++ b/compiler/testdata/string.go @@ -0,0 +1,21 @@ +package main + +func stringLen(s string) int { + return len(s) +} + +func stringIndex(s string, index int) byte { + return s[index] +} + +func stringCompareEqual(s1, s2 string) bool { + return s1 == s2 +} + +func stringCompareUnequal(s1, s2 string) bool { + return s1 != s2 +} + +func stringCompareLarger(s1, s2 string) bool { + return s1 > s2 +} diff --git a/compiler/testdata/string.ll b/compiler/testdata/string.ll new file mode 100644 index 00000000..7344a2e5 --- /dev/null +++ b/compiler/testdata/string.ll @@ -0,0 +1,57 @@ +; ModuleID = 'string.go' +source_filename = "string.go" +target datalayout = "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-f80:32-n8:16:32-S128" +target triple = "i686--linux" + +declare noalias nonnull i8* @runtime.alloc(i32, i8*, i8*) + +define hidden void @main.init(i8* %context, i8* %parentHandle) unnamed_addr { +entry: + ret void +} + +define hidden i32 @main.stringLen(i8* %s.data, i32 %s.len, i8* %context, i8* %parentHandle) unnamed_addr { +entry: + ret i32 %s.len +} + +define hidden i8 @main.stringIndex(i8* %s.data, i32 %s.len, i32 %index, i8* %context, i8* %parentHandle) unnamed_addr { +entry: + %.not = icmp ult i32 %index, %s.len + br i1 %.not, label %lookup.next, label %lookup.throw + +lookup.throw: ; preds = %entry + call void @runtime.lookupPanic(i8* undef, i8* null) + unreachable + +lookup.next: ; preds = %entry + %0 = getelementptr inbounds i8, i8* %s.data, i32 %index + %1 = load i8, i8* %0, align 1 + ret i8 %1 +} + +declare void @runtime.lookupPanic(i8*, i8*) + +define hidden i1 @main.stringCompareEqual(i8* %s1.data, i32 %s1.len, i8* %s2.data, i32 %s2.len, i8* %context, i8* %parentHandle) unnamed_addr { +entry: + %0 = call i1 @runtime.stringEqual(i8* %s1.data, i32 %s1.len, i8* %s2.data, i32 %s2.len, i8* undef, i8* null) + ret i1 %0 +} + +declare i1 @runtime.stringEqual(i8*, i32, i8*, i32, i8*, i8*) + +define hidden i1 @main.stringCompareUnequal(i8* %s1.data, i32 %s1.len, i8* %s2.data, i32 %s2.len, i8* %context, i8* %parentHandle) unnamed_addr { +entry: + %0 = call i1 @runtime.stringEqual(i8* %s1.data, i32 %s1.len, i8* %s2.data, i32 %s2.len, i8* undef, i8* null) + %1 = xor i1 %0, true + ret i1 %1 +} + +define hidden i1 @main.stringCompareLarger(i8* %s1.data, i32 %s1.len, i8* %s2.data, i32 %s2.len, i8* %context, i8* %parentHandle) unnamed_addr { +entry: + %0 = call i1 @runtime.stringLess(i8* %s1.data, i32 %s1.len, i8* %s2.data, i32 %s2.len, i8* undef, i8* null) + %1 = xor i1 %0, true + ret i1 %1 +} + +declare i1 @runtime.stringLess(i8*, i32, i8*, i32, i8*, i8*)