From 7ea9eff40638643bbe8ae5466111e790daca7280 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Mon, 23 May 2022 21:47:42 +0200 Subject: [PATCH] interp: implement binary operators in markExternal* functions This is necessary for the next commit. The next commit would otherwise cause an issue with the following constant operation: i64 add (i64 ptrtoint (%runtime.machHeader* @_mh_execute_header to i64), i64 32) --- interp/memory.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/interp/memory.go b/interp/memory.go index d2396861..3a16b875 100644 --- a/interp/memory.go +++ b/interp/memory.go @@ -190,6 +190,16 @@ func (mv *memoryView) markExternal(llvmValue llvm.Value, mark uint8) error { if err != nil { return err } + case llvm.Add, llvm.Sub, llvm.Mul, llvm.UDiv, llvm.SDiv, llvm.URem, llvm.SRem, llvm.Shl, llvm.LShr, llvm.AShr, llvm.And, llvm.Or, llvm.Xor: + // Integer binary operators. Mark both operands. + err := mv.markExternal(llvmValue.Operand(0), mark) + if err != nil { + return err + } + err = mv.markExternal(llvmValue.Operand(1), mark) + if err != nil { + return err + } default: return fmt.Errorf("interp: unknown constant expression '%s'", instructionNameMap[llvmValue.Opcode()]) }