diff --git a/compiler/compiler/condition.go b/compiler/compiler/condition.go index 862c069..e8f88b7 100644 --- a/compiler/compiler/condition.go +++ b/compiler/compiler/condition.go @@ -91,6 +91,19 @@ func (c *Compiler) compileOperatorNode(v *parser.OperatorNode) value.Value { IsVariable: false, } } + if v.Operator == parser.OP_EQ { + leftPtr := c.contextBlock.NewExtractValue(leftLLVM, 1) + rightPtr := c.contextBlock.NewExtractValue(rightLLVM, 1) + // Compare two strings + cmpRet := c.contextBlock.NewCall(c.osFuncs.Strcmp.Value.(llvmValue.Named), leftPtr, rightPtr) + + return value.Value{ + Value: c.contextBlock.NewICmp(getConditionLLVMpred(v.Operator), cmpRet, constant.NewInt(llvmTypes.I64, 0)), + Type: types.Bool, + IsVariable: false, + } + + } panic("string does not implement operation " + v.Operator) } diff --git a/compiler/compiler/external_funcs.go b/compiler/compiler/external_funcs.go index 32c4fe7..116718d 100644 --- a/compiler/compiler/external_funcs.go +++ b/compiler/compiler/external_funcs.go @@ -18,6 +18,7 @@ type OSFuncs struct { Strcpy value.Value Strncpy value.Value Strndup value.Value + Strcmp value.Value Exit value.Value } @@ -32,13 +33,13 @@ func (c *Compiler) createExternalPackage() { osPkg := NewPkg("os") c.osFuncs.Malloc = osPkg.setExternal("malloc", c.module.NewFunc("malloc", llvmTypes.NewPointer(i8.LLVM()), - ir.NewParam("", i64.LLVM()), + ir.NewParam("size", i64.LLVM()), ), false) c.osFuncs.Realloc = osPkg.setExternal("realloc", c.module.NewFunc("realloc", llvmTypes.NewPointer(i8.LLVM()), - ir.NewParam("", llvmTypes.NewPointer(i8.LLVM())), - ir.NewParam("", i64.LLVM()), + ir.NewParam("ptr", llvmTypes.NewPointer(i8.LLVM())), + ir.NewParam("size", i64.LLVM()), ), false) c.osFuncs.Memcpy = osPkg.setExternal("memcpy", c.module.NewFunc("memcpy", @@ -56,26 +57,32 @@ func (c *Compiler) createExternalPackage() { c.osFuncs.Strcpy = osPkg.setExternal("strcpy", c.module.NewFunc("strcpy", llvmTypes.NewPointer(i8.LLVM()), - ir.NewParam("", llvmTypes.NewPointer(i8.LLVM())), - ir.NewParam("", llvmTypes.NewPointer(i8.LLVM())), + ir.NewParam("dst", llvmTypes.NewPointer(i8.LLVM())), + ir.NewParam("src", llvmTypes.NewPointer(i8.LLVM())), ), false) c.osFuncs.Strncpy = osPkg.setExternal("strncpy", c.module.NewFunc("strncpy", llvmTypes.NewPointer(i8.LLVM()), - ir.NewParam("", llvmTypes.NewPointer(i8.LLVM())), - ir.NewParam("", llvmTypes.NewPointer(i8.LLVM())), - ir.NewParam("", i64.LLVM()), + ir.NewParam("dst", llvmTypes.NewPointer(i8.LLVM())), + ir.NewParam("src", llvmTypes.NewPointer(i8.LLVM())), + ir.NewParam("n", i64.LLVM()), ), false) c.osFuncs.Strndup = osPkg.setExternal("strndup", c.module.NewFunc("strndup", llvmTypes.NewPointer(i8.LLVM()), - ir.NewParam("", llvmTypes.NewPointer(i8.LLVM())), - ir.NewParam("", i64.LLVM()), + ir.NewParam("str", llvmTypes.NewPointer(i8.LLVM())), + ir.NewParam("n", i64.LLVM()), + ), false) + + c.osFuncs.Strcmp = osPkg.setExternal("strcmp", c.module.NewFunc("strcmp", + i64.LLVM(), + ir.NewParam("lhs", llvmTypes.NewPointer(i8.LLVM())), + ir.NewParam("rhs", llvmTypes.NewPointer(i8.LLVM())), ), false) c.osFuncs.Exit = osPkg.setExternal("exit", c.module.NewFunc("syscall_exit", llvmTypes.Void, - ir.NewParam("", i8.LLVM()), + ir.NewParam("exit_code", i8.LLVM()), ), false) c.packages["os"] = osPkg