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)
Этот коммит содержится в:
Ayke van Laethem 2022-05-23 21:47:42 +02:00 коммит произвёл Ron Evans
родитель 80d94115dc
коммит 7ea9eff406

Просмотреть файл

@ -190,6 +190,16 @@ func (mv *memoryView) markExternal(llvmValue llvm.Value, mark uint8) error {
if err != nil { if err != nil {
return err 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: default:
return fmt.Errorf("interp: unknown constant expression '%s'", instructionNameMap[llvmValue.Opcode()]) return fmt.Errorf("interp: unknown constant expression '%s'", instructionNameMap[llvmValue.Opcode()])
} }