Skip to content

Commit 77806f1

Browse files
leonbettv8-internal-scoped@luci-project-accounts.iam.gserviceaccount.com
authored andcommitted
[wasm] Support call_ref
This CL adds support for the call_ref instruction. Bug: 474940922 Change-Id: If708e70dc9fcdd2f53f218f85e93c3d807a5ab9a Reviewed-on: https://chrome-internal-review.googlesource.com/c/v8/fuzzilli/+/9330021 Commit-Queue: Leon Bettscheider <bettscheider@google.com> Reviewed-by: Matthias Liedtke <mliedtke@google.com>
1 parent 3eca2fd commit 77806f1

16 files changed

Lines changed: 173 additions & 8 deletions

Sources/Fuzzilli/Base/ProgramBuilder.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4783,6 +4783,22 @@ public class ProgramBuilder {
47834783
).outputs)
47844784
}
47854785

4786+
@discardableResult
4787+
public func wasmCallRef(
4788+
functionRef: Variable, functionArgs: [Variable]
4789+
) -> [Variable] {
4790+
let signatureDef = b.getWasmTypeDef(for: b.type(of: functionRef))
4791+
let signature = b.type(of: signatureDef).wasmFunctionSignatureDefSignature
4792+
return Array(
4793+
b.emit(
4794+
WasmCallRef(
4795+
parameterCount: signature.parameterTypes.count,
4796+
outputCount: signature.outputTypes.count),
4797+
withInputs: functionArgs + [functionRef],
4798+
types: signature.parameterTypes + [.wasmFuncRef()]
4799+
).outputs)
4800+
}
4801+
47864802
public func wasmReturnCallDirect(function: Variable, functionArgs: [Variable]) {
47874803
let signature = b.type(of: function).wasmFunctionDefSignature!
47884804
assert(

Sources/Fuzzilli/CodeGen/CodeGeneratorWeights.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ public let codeGeneratorWeights = [
363363
"WasmJsCallGenerator": 30,
364364
"WasmCallIndirectGenerator": 5,
365365
"WasmCallDirectGenerator": 10,
366+
"WasmCallRefGenerator": 10,
366367
"WasmReturnCallDirectGenerator": 10,
367368
"WasmReturnCallIndirectGenerator": 10,
368369

Sources/Fuzzilli/CodeGen/WasmCodeGenerators.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,26 @@ public let WasmCodeGenerators: [CodeGenerator] = [
10211021
function.wasmCallDirect(function: functionVar, functionArgs: functionArgs)
10221022
},
10231023

1024+
CodeGenerator(
1025+
"WasmCallRefGenerator", inContext: .single(.wasmFunction),
1026+
inputs: .required(.wasmFunctionDef())
1027+
) { b, functionVar in
1028+
let function = b.currentWasmModule.currentWasmFunction
1029+
let functionRef =
1030+
b.findVariable {
1031+
let varType = b.type(of: $0)
1032+
return varType.Is(.wasmFuncRef())
1033+
&& varType.Is(.wasmRef(.Index(), nullability: false))
1034+
} ?? function.wasmRefFunc(functionVar)
1035+
1036+
let signatureDef = b.getWasmTypeDef(for: b.type(of: functionRef))
1037+
let signature = b.type(of: signatureDef).wasmFunctionSignatureDefSignature
1038+
1039+
let functionArgs = b.randomWasmArguments(forWasmSignature: signature, generate: true)
1040+
guard let functionArgs else { return }
1041+
function.wasmCallRef(functionRef: functionRef, functionArgs: functionArgs)
1042+
},
1043+
10241044
CodeGenerator("WasmReturnCallDirectGenerator", inContext: .single(.wasmFunction)) {
10251045
b in
10261046
let function = b.currentWasmModule.currentWasmFunction

Sources/Fuzzilli/FuzzIL/Instruction.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1484,6 +1484,11 @@ extension Instruction: ProtobufConvertible {
14841484
$0.parameterCount = Int32(op.parameterCount)
14851485
$0.outputCount = Int32(op.numOutputs)
14861486
}
1487+
case .wasmCallRef(let op):
1488+
$0.wasmCallRef = Fuzzilli_Protobuf_WasmCallRef.with {
1489+
$0.parameterCount = Int32(op.parameterCount)
1490+
$0.outputCount = Int32(op.numOutputs)
1491+
}
14871492
case .wasmReturnCallDirect(let op):
14881493
$0.wasmReturnCallDirect = Fuzzilli_Protobuf_WasmReturnCallDirect.with {
14891494
$0.parameterCount = Int32(op.parameterCount)
@@ -2733,6 +2738,9 @@ extension Instruction: ProtobufConvertible {
27332738
case .wasmCallDirect(let p):
27342739
op = WasmCallDirect(
27352740
parameterCount: Int(p.parameterCount), outputCount: Int(p.outputCount))
2741+
case .wasmCallRef(let p):
2742+
op = WasmCallRef(
2743+
parameterCount: Int(p.parameterCount), outputCount: Int(p.outputCount))
27362744
case .wasmReturnCallDirect(let p):
27372745
op = WasmReturnCallDirect(parameterCount: Int(p.parameterCount))
27382746
case .wasmReturnCallIndirect(let p):

Sources/Fuzzilli/FuzzIL/JSTyper.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,6 +1070,13 @@ public struct JSTyper: Analyzer {
10701070
for (output, outputType) in zip(instr.outputs, signature.outputTypes) {
10711071
setType(of: output, to: outputType)
10721072
}
1073+
case .wasmCallRef(_):
1074+
let functionRef = instr.inputs.last!
1075+
let typeDesc = getTypeDescription(of: functionRef) as! WasmSignatureTypeDescription
1076+
let signature = typeDesc.signature
1077+
for (output, outputType) in zip(instr.outputs, signature.outputTypes) {
1078+
setType(of: output, to: outputType)
1079+
}
10731080
// Functions that can be called through a table are also already added by the wasmDefineTable instruction.
10741081
// No need to analyze this and add them to the DynamicObjectGroupManager.
10751082
case .wasmArrayNewFixed(_),

Sources/Fuzzilli/FuzzIL/Opcodes.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,4 +381,5 @@ enum Opcode {
381381
case wasmBranchOnCastFail(WasmBranchOnCastFail)
382382
case wasmRefFunc(WasmRefFunc)
383383
case wasmRefAsNonNull(WasmRefAsNonNull)
384+
case wasmCallRef(WasmCallRef)
384385
}

Sources/Fuzzilli/FuzzIL/WasmOperations.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,6 +1012,19 @@ final class WasmCallDirect: WasmOperation {
10121012
var parameterCount: Int { numInputs - 1 }
10131013
}
10141014

1015+
final class WasmCallRef: WasmOperation {
1016+
override var opcode: Opcode { .wasmCallRef(self) }
1017+
1018+
init(parameterCount: Int, outputCount: Int) {
1019+
// The inputs are the function reference and the function arguments.
1020+
super.init(
1021+
numInputs: 1 + parameterCount, numOutputs: outputCount, requiredContext: [.wasmFunction]
1022+
)
1023+
}
1024+
1025+
var parameterCount: Int { numInputs - 1 }
1026+
}
1027+
10151028
final class WasmReturnCallDirect: WasmOperation {
10161029
override var opcode: Opcode { .wasmReturnCallDirect(self) }
10171030

Sources/Fuzzilli/Lifting/FuzzILLifter.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,6 +1219,15 @@ public class FuzzILLifter: Lifter {
12191219
w.emit("\(outputs) <- WasmCallDirect \(inputs)")
12201220
}
12211221

1222+
case .wasmCallRef(_):
1223+
let inputs = instr.inputs.map(lift).joined(separator: ", ")
1224+
if instr.outputs.isEmpty {
1225+
w.emit("WasmCallRef \(inputs)")
1226+
} else {
1227+
let outputs = instr.outputs.map(lift).joined(separator: ", ")
1228+
w.emit("\(outputs) <- WasmCallRef \(inputs)")
1229+
}
1230+
12221231
case .wasmReturnCallDirect(_):
12231232
let inputs = instr.inputs.map(lift).joined(separator: ", ")
12241233
w.emit("WasmReturnCallDirect \(inputs)")

Sources/Fuzzilli/Lifting/JavaScriptLifter.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,6 +1911,7 @@ public class JavaScriptLifter: Lifter {
19111911
.wasmTableGrow(_),
19121912
.wasmCallIndirect(_),
19131913
.wasmCallDirect(_),
1914+
.wasmCallRef(_),
19141915
.wasmReturnCallDirect(_),
19151916
.wasmReturnCallIndirect(_),
19161917
.wasmMemoryLoad(_),

Sources/Fuzzilli/Lifting/WasmLifter.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1950,6 +1950,11 @@ public class WasmLifter {
19501950
let functionRef = wasmInstruction.input(0)
19511951
return Data([0x10])
19521952
+ Leb128.unsignedEncode(try resolveIdx(ofType: .function, for: functionRef))
1953+
case .wasmCallRef(_):
1954+
let functionRef = wasmInstruction.inputs.last!
1955+
let typeDesc = typer.getTypeDescription(of: functionRef)
1956+
let sigIndex = typeDescToIndex[typeDesc]!
1957+
return Data([0x14]) + Leb128.unsignedEncode(sigIndex)
19531958
case .wasmReturnCallDirect(_):
19541959
let functionRef = wasmInstruction.input(0)
19551960
return Data([0x12])

0 commit comments

Comments
 (0)