This removes the embedding of pointers of jump tables (uintptr of []byte) used by BrTable operations. That is the last usage of unsafe.Pointer in compiler implementations. Alternatively, we treat jump tables as asm.StaticConst and emit them into the constPool already implemented and used by various places. Notably, now the native code compiled by compilers can be reusable across multiple processes, meaning that they are independent of any runtime pointers. Signed-off-by: Takeshi Yoneda <takeshi@tetrate.io>
301 lines
18 KiB
Go
301 lines
18 KiB
Go
package compiler
|
|
|
|
import (
|
|
"github.com/tetratelabs/wazero/internal/wazeroir"
|
|
)
|
|
|
|
// compiler is the interface of architecture-specific native code compiler,
|
|
// and this is responsible for compiling native code for all wazeroir operations.
|
|
type compiler interface {
|
|
// String is for debugging purpose.
|
|
String() string
|
|
// compilePreamble is called before compiling any wazeroir operation.
|
|
// This is used, for example, to initialize the reserved registers, etc.
|
|
compilePreamble() error
|
|
// compile generates the byte slice of native code.
|
|
// stackPointerCeil is the max stack pointer that the target function would reach.
|
|
compile() (code []byte, stackPointerCeil uint64, err error)
|
|
// compileHostFunction adds the trampoline code from which native code can jump into the host function.
|
|
// TODO: maybe we wouldn't need to have trampoline for host functions.
|
|
compileHostFunction() error
|
|
// compileLabel notify compilers of the beginning of a label.
|
|
// Return true if the compiler decided to skip the entire label.
|
|
// See wazeroir.OperationLabel
|
|
compileLabel(o *wazeroir.OperationLabel) (skipThisLabel bool)
|
|
// compileUnreachable adds instruction to perform wazeroir.OperationUnreachable.
|
|
compileUnreachable() error
|
|
// compileSwap adds instruction to perform wazeroir.OperationSwap.
|
|
compileSwap(o *wazeroir.OperationSwap) error
|
|
// compileGlobalGet adds instructions to perform wazeroir.OperationGlobalGet.
|
|
compileGlobalGet(o *wazeroir.OperationGlobalGet) error
|
|
// compileGlobalSet adds instructions to perform wazeroir.OperationGlobalSet.
|
|
compileGlobalSet(o *wazeroir.OperationGlobalSet) error
|
|
// compileBr adds instructions to perform wazeroir.OperationBr.
|
|
compileBr(o *wazeroir.OperationBr) error
|
|
// compileBrIf adds instructions to perform wazeroir.OperationBrIf.
|
|
compileBrIf(o *wazeroir.OperationBrIf) error
|
|
// compileBrTable adds instructions to perform wazeroir.OperationBrTable.
|
|
compileBrTable(o *wazeroir.OperationBrTable) error
|
|
// compileCall adds instructions to perform wazeroir.OperationCall.
|
|
compileCall(o *wazeroir.OperationCall) error
|
|
// compileCallIndirect adds instructions to perform wazeroir.OperationCallIndirect.
|
|
compileCallIndirect(o *wazeroir.OperationCallIndirect) error
|
|
// compileDrop adds instructions to perform wazeroir.OperationDrop.
|
|
compileDrop(o *wazeroir.OperationDrop) error
|
|
// compileSelect adds instructions to perform wazeroir.OperationSelect.
|
|
compileSelect() error
|
|
// compilePick adds instructions to perform wazeroir.OperationPick.
|
|
compilePick(o *wazeroir.OperationPick) error
|
|
// compileAdd adds instructions to perform wazeroir.OperationAdd.
|
|
compileAdd(o *wazeroir.OperationAdd) error
|
|
// compileSub adds instructions to perform wazeroir.OperationSub.
|
|
compileSub(o *wazeroir.OperationSub) error
|
|
// compileMul adds instructions to perform wazeroir.OperationMul.
|
|
compileMul(o *wazeroir.OperationMul) error
|
|
// compileClz adds instructions to perform wazeroir.OperationClz.
|
|
compileClz(o *wazeroir.OperationClz) error
|
|
// compileCtz adds instructions to perform wazeroir.OperationCtz.
|
|
compileCtz(o *wazeroir.OperationCtz) error
|
|
// compilePopcnt adds instructions to perform wazeroir.OperationPopcnt.
|
|
compilePopcnt(o *wazeroir.OperationPopcnt) error
|
|
// compileDiv adds instructions to perform wazeroir.OperationDiv.
|
|
compileDiv(o *wazeroir.OperationDiv) error
|
|
// compileRem adds instructions to perform wazeroir.OperationRem.
|
|
compileRem(o *wazeroir.OperationRem) error
|
|
// compileAnd adds instructions to perform wazeroir.OperationAnd.
|
|
compileAnd(o *wazeroir.OperationAnd) error
|
|
// compileOr adds instructions to perform wazeroir.OperationOr.
|
|
compileOr(o *wazeroir.OperationOr) error
|
|
// compileXor adds instructions to perform wazeroir.OperationXor.
|
|
compileXor(o *wazeroir.OperationXor) error
|
|
// compileShl adds instructions to perform wazeroir.OperationShl.
|
|
compileShl(o *wazeroir.OperationShl) error
|
|
// compileShr adds instructions to perform wazeroir.OperationShr.
|
|
compileShr(o *wazeroir.OperationShr) error
|
|
// compileRotl adds instructions to perform wazeroir.OperationRotl.
|
|
compileRotl(o *wazeroir.OperationRotl) error
|
|
// compileRotr adds instructions to perform wazeroir.OperationRotr.
|
|
compileRotr(o *wazeroir.OperationRotr) error
|
|
// compileNeg adds instructions to perform wazeroir.OperationAbs.
|
|
compileAbs(o *wazeroir.OperationAbs) error
|
|
// compileNeg adds instructions to perform wazeroir.OperationNeg.
|
|
compileNeg(o *wazeroir.OperationNeg) error
|
|
// compileCeil adds instructions to perform wazeroir.OperationCeil.
|
|
compileCeil(o *wazeroir.OperationCeil) error
|
|
// compileFloor adds instructions to perform wazeroir.OperationFloor.
|
|
compileFloor(o *wazeroir.OperationFloor) error
|
|
// compileTrunc adds instructions to perform wazeroir.OperationTrunc.
|
|
compileTrunc(o *wazeroir.OperationTrunc) error
|
|
// compileNearest adds instructions to perform wazeroir.OperationNearest.
|
|
compileNearest(o *wazeroir.OperationNearest) error
|
|
// compileSqrt adds instructions perform wazeroir.OperationSqrt.
|
|
compileSqrt(o *wazeroir.OperationSqrt) error
|
|
// compileMin adds instructions perform wazeroir.OperationMin.
|
|
compileMin(o *wazeroir.OperationMin) error
|
|
// compileMax adds instructions perform wazeroir.OperationMax.
|
|
compileMax(o *wazeroir.OperationMax) error
|
|
// compileCopysign adds instructions to perform wazeroir.OperationCopysign.
|
|
compileCopysign(o *wazeroir.OperationCopysign) error
|
|
// compileI32WrapFromI64 adds instructions to perform wazeroir.OperationI32WrapFromI64.
|
|
compileI32WrapFromI64() error
|
|
// compileITruncFromF adds instructions to perform wazeroir.OperationITruncFromF.
|
|
compileITruncFromF(o *wazeroir.OperationITruncFromF) error
|
|
// compileFConvertFromI adds instructions to perform wazeroir.OperationFConvertFromI.
|
|
compileFConvertFromI(o *wazeroir.OperationFConvertFromI) error
|
|
// compileF32DemoteFromF64 adds instructions to perform wazeroir.OperationF32DemoteFromF64.
|
|
compileF32DemoteFromF64() error
|
|
// compileF64PromoteFromF32 adds instructions to perform wazeroir.OperationF64PromoteFromF32.
|
|
compileF64PromoteFromF32() error
|
|
// compileI32ReinterpretFromF32 adds instructions to perform wazeroir.OperationI32ReinterpretFromF32.
|
|
compileI32ReinterpretFromF32() error
|
|
// compileI64ReinterpretFromF64 adds instructions to perform wazeroir.OperationI64ReinterpretFromF64.
|
|
compileI64ReinterpretFromF64() error
|
|
// compileF32ReinterpretFromI32 adds instructions to perform wazeroir.OperationF32ReinterpretFromI32.
|
|
compileF32ReinterpretFromI32() error
|
|
// compileF64ReinterpretFromI64 adds instructions to perform wazeroir.OperationF64ReinterpretFromI64.
|
|
compileF64ReinterpretFromI64() error
|
|
// compileExtend adds instructions to perform wazeroir.OperationExtend.
|
|
compileExtend(o *wazeroir.OperationExtend) error
|
|
// compileEq adds instructions to perform wazeroir.OperationEq.
|
|
compileEq(o *wazeroir.OperationEq) error
|
|
// compileEq adds instructions to perform wazeroir.OperationNe.
|
|
compileNe(o *wazeroir.OperationNe) error
|
|
// compileEq adds instructions to perform wazeroir.OperationEqz.
|
|
compileEqz(o *wazeroir.OperationEqz) error
|
|
// compileLt adds instructions to perform wazeroir.OperationLt.
|
|
compileLt(o *wazeroir.OperationLt) error
|
|
// compileGt adds instructions to perform wazeroir.OperationGt.
|
|
compileGt(o *wazeroir.OperationGt) error
|
|
// compileLe adds instructions to perform wazeroir.OperationLe.
|
|
compileLe(o *wazeroir.OperationLe) error
|
|
// compileLe adds instructions to perform wazeroir.OperationGe.
|
|
compileGe(o *wazeroir.OperationGe) error
|
|
// compileLoad adds instructions to perform wazeroir.OperationLoad.
|
|
compileLoad(o *wazeroir.OperationLoad) error
|
|
// compileLoad8 adds instructions to perform wazeroir.OperationLoad8.
|
|
compileLoad8(o *wazeroir.OperationLoad8) error
|
|
// compileLoad16 adds instructions to perform wazeroir.OperationLoad16.
|
|
compileLoad16(o *wazeroir.OperationLoad16) error
|
|
// compileLoad32 adds instructions to perform wazeroir.OperationLoad32.
|
|
compileLoad32(o *wazeroir.OperationLoad32) error
|
|
// compileStore adds instructions to perform wazeroir.OperationStore.
|
|
compileStore(o *wazeroir.OperationStore) error
|
|
// compileStore8 adds instructions to perform wazeroir.OperationStore8.
|
|
compileStore8(o *wazeroir.OperationStore8) error
|
|
// compileStore16 adds instructions to perform wazeroir.OperationStore16.
|
|
compileStore16(o *wazeroir.OperationStore16) error
|
|
// compileStore32 adds instructions to perform wazeroir.OperationStore32.
|
|
compileStore32(o *wazeroir.OperationStore32) error
|
|
// compileMemorySize adds instruction to perform wazeroir.OperationMemoryGrow.
|
|
compileMemoryGrow() error
|
|
// compileMemorySize adds instruction to perform wazeroir.OperationMemorySize.
|
|
compileMemorySize() error
|
|
// compileConstI32 adds instruction to perform wazeroir.OperationConstI32.
|
|
compileConstI32(o *wazeroir.OperationConstI32) error
|
|
// compileConstI64 adds instruction to perform wazeroir.OperationConstI64.
|
|
compileConstI64(o *wazeroir.OperationConstI64) error
|
|
// compileConstF32 adds instruction to perform wazeroir.OperationConstF32.
|
|
compileConstF32(o *wazeroir.OperationConstF32) error
|
|
// compileConstF64 adds instruction to perform wazeroir.OperationConstF64.
|
|
compileConstF64(o *wazeroir.OperationConstF64) error
|
|
// compileSignExtend32From8 adds instructions to perform wazeroir.OperationSignExtend32From8.
|
|
compileSignExtend32From8() error
|
|
// compileSignExtend32From16 adds instructions to perform wazeroir.OperationSignExtend32From16.
|
|
compileSignExtend32From16() error
|
|
// compileSignExtend64From8 adds instructions to perform wazeroir.OperationSignExtend64From8.
|
|
compileSignExtend64From8() error
|
|
// compileSignExtend64From16 adds instructions to perform wazeroir.OperationSignExtend64From16.
|
|
compileSignExtend64From16() error
|
|
// compileSignExtend64From32 adds instructions to perform wazeroir.OperationSignExtend64From32.
|
|
compileSignExtend64From32() error
|
|
// compileMemoryInit adds instructions to perform wazeroir.OperationMemoryInit.
|
|
compileMemoryInit(*wazeroir.OperationMemoryInit) error
|
|
// compileDataDrop adds instructions to perform wazeroir.OperationDataDrop.
|
|
compileDataDrop(*wazeroir.OperationDataDrop) error
|
|
// compileMemoryCopy adds instructions to perform wazeroir.OperationMemoryCopy.
|
|
compileMemoryCopy() error
|
|
// compileMemoryFill adds instructions to perform wazeroir.OperationMemoryFill.
|
|
compileMemoryFill() error
|
|
// compileTableInit adds instructions to perform wazeroir.OperationTableInit.
|
|
compileTableInit(*wazeroir.OperationTableInit) error
|
|
// compileTableCopy adds instructions to perform wazeroir.OperationTableCopy.
|
|
compileTableCopy(*wazeroir.OperationTableCopy) error
|
|
// compileElemDrop adds instructions to perform wazeroir.OperationElemDrop.
|
|
compileElemDrop(*wazeroir.OperationElemDrop) error
|
|
// compileRefFunc adds instructions to perform wazeroir.OperationRefFunc.
|
|
compileRefFunc(*wazeroir.OperationRefFunc) error
|
|
// compileTableGet adds instructions to perform wazeroir.OperationTableGet.
|
|
compileTableGet(*wazeroir.OperationTableGet) error
|
|
// compileTableSet adds instructions to perform wazeroir.OperationTableSet.
|
|
compileTableSet(*wazeroir.OperationTableSet) error
|
|
// compileTableGrow adds instructions to perform wazeroir.OperationTableGrow.
|
|
compileTableGrow(*wazeroir.OperationTableGrow) error
|
|
// compileTableSize adds instructions to perform wazeroir.OperationTableSize.
|
|
compileTableSize(*wazeroir.OperationTableSize) error
|
|
// compileTableFill adds instructions to perform wazeroir.OperationTableFill.
|
|
compileTableFill(*wazeroir.OperationTableFill) error
|
|
// compileV128Const adds instructions to perform wazeroir.OperationV128Const.
|
|
compileV128Const(*wazeroir.OperationV128Const) error
|
|
// compileV128Add adds instructions to perform wazeroir.OperationV128Add.
|
|
compileV128Add(o *wazeroir.OperationV128Add) error
|
|
// compileV128Sub adds instructions to perform wazeroir.OperationV128Sub.
|
|
// compileV128Sub adds instructions to perform wazeroir.OperationV128Sub.
|
|
compileV128Sub(o *wazeroir.OperationV128Sub) error
|
|
// compileV128Load adds instructions to perform wazeroir.OperationV128Load.
|
|
compileV128Load(o *wazeroir.OperationV128Load) error
|
|
// compileV128LoadLane adds instructions to perform wazeroir.OperationV128LoadLane.
|
|
compileV128LoadLane(o *wazeroir.OperationV128LoadLane) error
|
|
// compileV128Store adds instructions to perform wazeroir.OperationV128Store.
|
|
compileV128Store(o *wazeroir.OperationV128Store) error
|
|
// compileV128StoreLane adds instructions to perform wazeroir.OperationV128StoreLane.
|
|
compileV128StoreLane(o *wazeroir.OperationV128StoreLane) error
|
|
// compileV128ExtractLane adds instructions to perform wazeroir.OperationV128ExtractLane.
|
|
compileV128ExtractLane(o *wazeroir.OperationV128ExtractLane) error
|
|
// compileV128ReplaceLane adds instructions to perform wazeroir.OperationV128ReplaceLane.
|
|
compileV128ReplaceLane(o *wazeroir.OperationV128ReplaceLane) error
|
|
// compileV128Splat adds instructions to perform wazeroir.OperationV128Splat.
|
|
compileV128Splat(o *wazeroir.OperationV128Splat) error
|
|
// compileV128Shuffle adds instructions to perform wazeroir.OperationV128Shuffle.
|
|
compileV128Shuffle(o *wazeroir.OperationV128Shuffle) error
|
|
// compileV128Swizzle adds instructions to perform wazeroir.OperationV128Swizzle.
|
|
compileV128Swizzle(o *wazeroir.OperationV128Swizzle) error
|
|
// compileV128AnyTrue adds instructions to perform wazeroir.OperationV128AnyTrue.
|
|
compileV128AnyTrue(o *wazeroir.OperationV128AnyTrue) error
|
|
// compileV128AllTrue adds instructions to perform wazeroir.OperationV128AllTrue.
|
|
compileV128AllTrue(o *wazeroir.OperationV128AllTrue) error
|
|
// compileV128BitMask adds instructions to perform wazeroir.OperationV128BitMask.
|
|
compileV128BitMask(*wazeroir.OperationV128BitMask) error
|
|
// compileV128And adds instructions to perform wazeroir.OperationV128And.
|
|
compileV128And(*wazeroir.OperationV128And) error
|
|
// compileV128Not adds instructions to perform wazeroir.OperationV128Not.
|
|
compileV128Not(*wazeroir.OperationV128Not) error
|
|
// compileV128Or adds instructions to perform wazeroir.OperationV128Or.
|
|
compileV128Or(*wazeroir.OperationV128Or) error
|
|
// compileV128Xor adds instructions to perform wazeroir.OperationV128Xor.
|
|
compileV128Xor(*wazeroir.OperationV128Xor) error
|
|
// compileV128Bitselect adds instructions to perform wazeroir.OperationV128Bitselect.
|
|
compileV128Bitselect(*wazeroir.OperationV128Bitselect) error
|
|
// compileV128AndNot adds instructions to perform wazeroir.OperationV128AndNot.
|
|
compileV128AndNot(*wazeroir.OperationV128AndNot) error
|
|
// compileV128Shr adds instructions to perform wazeroir.OperationV128Shr.
|
|
compileV128Shr(*wazeroir.OperationV128Shr) error
|
|
// compileV128Shl adds instructions to perform wazeroir.OperationV128Shl.
|
|
compileV128Shl(*wazeroir.OperationV128Shl) error
|
|
// compileV128Cmp adds instructions to perform wazeroir.OperationV128Cmp.
|
|
compileV128Cmp(*wazeroir.OperationV128Cmp) error
|
|
// compileV128AddSat adds instructions to perform wazeroir.OperationV128AddSat.
|
|
compileV128AddSat(*wazeroir.OperationV128AddSat) error
|
|
// compileV128SubSat adds instructions to perform wazeroir.OperationV128SubSat.
|
|
compileV128SubSat(*wazeroir.OperationV128SubSat) error
|
|
// compileV128Mul adds instructions to perform wazeroir.OperationV128Mul.
|
|
compileV128Mul(*wazeroir.OperationV128Mul) error
|
|
// compileV128Div adds instructions to perform wazeroir.OperationV128Div.
|
|
compileV128Div(*wazeroir.OperationV128Div) error
|
|
// compileV128Neg adds instructions to perform wazeroir.OperationV128Neg.
|
|
compileV128Neg(*wazeroir.OperationV128Neg) error
|
|
// compileV128Sqrt adds instructions to perform wazeroir.OperationV128Sqrt.
|
|
compileV128Sqrt(*wazeroir.OperationV128Sqrt) error
|
|
// compileV128Abs adds instructions to perform wazeroir.OperationV128Abs.
|
|
compileV128Abs(*wazeroir.OperationV128Abs) error
|
|
// compileV128Popcnt adds instructions to perform wazeroir.OperationV128Popcnt.
|
|
compileV128Popcnt(*wazeroir.OperationV128Popcnt) error
|
|
// compileV128Min adds instructions to perform wazeroir.OperationV128Min.
|
|
compileV128Min(*wazeroir.OperationV128Min) error
|
|
// compileV128Max adds instructions to perform wazeroir.OperationV128Max.
|
|
compileV128Max(*wazeroir.OperationV128Max) error
|
|
// compileV128AvgrU adds instructions to perform wazeroir.OperationV128AvgrU.
|
|
compileV128AvgrU(*wazeroir.OperationV128AvgrU) error
|
|
// compileV128Pmin adds instructions to perform wazeroir.OperationV128Pmin.
|
|
compileV128Pmin(*wazeroir.OperationV128Pmin) error
|
|
// compileV128Pmax adds instructions to perform wazeroir.OperationV128Pmax.
|
|
compileV128Pmax(*wazeroir.OperationV128Pmax) error
|
|
// compileV128Ceil adds instructions to perform wazeroir.OperationV128Ceil.
|
|
compileV128Ceil(*wazeroir.OperationV128Ceil) error
|
|
// compileV128Floor adds instructions to perform wazeroir.OperationV128Floor.
|
|
compileV128Floor(*wazeroir.OperationV128Floor) error
|
|
// compileV128Trunc adds instructions to perform wazeroir.OperationV128Trunc.
|
|
compileV128Trunc(*wazeroir.OperationV128Trunc) error
|
|
// compileV128Nearest adds instructions to perform wazeroir.OperationV128Nearest.
|
|
compileV128Nearest(*wazeroir.OperationV128Nearest) error
|
|
// compileV128Extend adds instructions to perform wazeroir.OperationV128Extend.
|
|
compileV128Extend(*wazeroir.OperationV128Extend) error
|
|
// compileV128ExtMul adds instructions to perform wazeroir.OperationV128ExtMul.
|
|
compileV128ExtMul(*wazeroir.OperationV128ExtMul) error
|
|
// compileV128Q15mulrSatS adds instructions to perform wazeroir.OperationV128Q15mulrSatS.
|
|
compileV128Q15mulrSatS(*wazeroir.OperationV128Q15mulrSatS) error
|
|
// compileV128ExtAddPairwise adds instructions to perform wazeroir.OperationV128ExtAddPairwise.
|
|
compileV128ExtAddPairwise(o *wazeroir.OperationV128ExtAddPairwise) error
|
|
// compileV128FloatPromote adds instructions to perform wazeroir.OperationV128FloatPromote.
|
|
compileV128FloatPromote(o *wazeroir.OperationV128FloatPromote) error
|
|
// compileV128FloatDemote adds instructions to perform wazeroir.OperationV128FloatDemote.
|
|
compileV128FloatDemote(o *wazeroir.OperationV128FloatDemote) error
|
|
// compileV128FConvertFromI adds instructions to perform wazeroir.OperationV128FConvertFromI.
|
|
compileV128FConvertFromI(o *wazeroir.OperationV128FConvertFromI) error
|
|
// compileV128Dot adds instructions to perform wazeroir.OperationV128Dot.
|
|
compileV128Dot(o *wazeroir.OperationV128Dot) error
|
|
// compileV128Narrow adds instructions to perform wazeroir.OperationV128Narrow.
|
|
compileV128Narrow(o *wazeroir.OperationV128Narrow) error
|
|
// compileV128ITruncSatFromF adds instructions to perform wazeroir.OperationV128ITruncSatFromF.
|
|
compileV128ITruncSatFromF(o *wazeroir.OperationV128ITruncSatFromF) error
|
|
}
|