Skip to content

Commit e335bb5

Browse files
LiedtkeV8-internal LUCI CQ
authored andcommitted
[wasm] Remove parameter and return types from WasmJsCall
Bug: 445356784 Change-Id: I0eb33e4e3f800919b5c92bf6ce48ded45d372ac5 Reviewed-on: https://chrome-internal-review.googlesource.com/c/v8/fuzzilli/+/9108176 Auto-Submit: Matthias Liedtke <mliedtke@google.com> Reviewed-by: Manos Koukoutos <manoskouk@google.com> Commit-Queue: Matthias Liedtke <mliedtke@google.com>
1 parent 52e4ba5 commit e335bb5

File tree

9 files changed

+43
-40
lines changed

9 files changed

+43
-40
lines changed

Sources/Fuzzilli/Base/ProgramBuilder.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3802,8 +3802,9 @@ public class ProgramBuilder {
38023802

38033803
@discardableResult
38043804
public func wasmJsCall(function: Variable, withArgs args: [Variable], withWasmSignature signature: WasmSignature) -> Variable? {
3805-
let instr = b.emit(WasmJsCall(signature: signature), withInputs: [function] + args,
3806-
types: [.function() | .object(ofGroup: "WasmSuspendingObject")] + signature.parameterTypes)
3805+
let signatureDef = b.wasmDefineAdHocSignatureType(signature: signature)
3806+
let instr = b.emit(WasmJsCall(parameterCount: signature.parameterTypes.count, outputCount: signature.outputTypes.count), withInputs: [signatureDef, function] + args,
3807+
types: [.wasmTypeDef(), .function() | .object(ofGroup: "WasmSuspendingObject")] + signature.parameterTypes)
38073808
if signature.outputTypes.isEmpty {
38083809
assert(!instr.hasOutputs)
38093810
return nil

Sources/Fuzzilli/FuzzIL/Instruction.swift

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,8 +1131,8 @@ extension Instruction: ProtobufConvertible {
11311131
$0.wasmReturn = Fuzzilli_Protobuf_WasmReturn()
11321132
case .wasmJsCall(let op):
11331133
$0.wasmJsCall = Fuzzilli_Protobuf_WasmJsCall.with {
1134-
$0.parameterTypes = op.functionSignature.parameterTypes.map(ILTypeToWasmTypeEnum)
1135-
$0.outputTypes = op.functionSignature.outputTypes.map(ILTypeToWasmTypeEnum)
1134+
$0.parameterCount = Int32(op.parameterCount)
1135+
$0.outputCount = Int32(op.outputCount)
11361136
}
11371137
case .wasmi32CompareOp(let op):
11381138
$0.wasmi32CompareOp = Fuzzilli_Protobuf_Wasmi32CompareOp.with { $0.compareOperator = Int32(op.compareOpKind.rawValue) }
@@ -2287,9 +2287,7 @@ extension Instruction: ProtobufConvertible {
22872287
case .wasmReturn(_):
22882288
op = WasmReturn(returnCount: inouts.count)
22892289
case .wasmJsCall(let p):
2290-
let parameters = p.parameterTypes.map(WasmTypeEnumToILType)
2291-
let outputs = p.outputTypes.map(WasmTypeEnumToILType)
2292-
op = WasmJsCall(signature: parameters => outputs)
2290+
op = WasmJsCall(parameterCount: Int(p.parameterCount), outputCount: Int(p.outputCount))
22932291

22942292
// Wasm Numerical Operations
22952293
case .wasmi32CompareOp(let p):

Sources/Fuzzilli/FuzzIL/JSTyper.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -803,14 +803,15 @@ public struct JSTyper: Analyzer {
803803
registerWasmMemoryUse(for: instr.input(0))
804804
setType(of: instr.output, to: isMemory64 ? .wasmi64 : .wasmi32)
805805
case .wasmJsCall(let op):
806-
let sigOutputTypes = op.functionSignature.outputTypes
806+
let wasmSignature = type(of: instr.input(0)).wasmFunctionSignatureDefSignature
807+
let sigOutputTypes = wasmSignature.outputTypes
807808
assert(sigOutputTypes.count < 2, "multi-return js calls are not supported")
808809
if !sigOutputTypes.isEmpty {
809810
setType(of: instr.output, to: sigOutputTypes[0])
810811
}
811-
let definingInstruction = defUseAnalyzer.definition(of: instr.input(0))
812+
let definingInstruction = defUseAnalyzer.definition(of: instr.input(1))
812813
// Here we query the typer for the signature of the instruction as that is the correct "JS" Signature instead of taking the call-site specific converted wasm signature.
813-
dynamicObjectGroupManager.addWasmFunction(withSignature: type(of: instr.input(0)).signature ?? Signature.forUnknownFunction, forDefinition: definingInstruction, forVariable: instr.input(0))
814+
dynamicObjectGroupManager.addWasmFunction(withSignature: type(of: instr.input(1)).signature ?? Signature.forUnknownFunction, forDefinition: definingInstruction, forVariable: instr.input(1))
814815
case .beginWasmFunction(let op):
815816
wasmTypeBeginBlock(instr, op.signature)
816817
case .endWasmFunction(let op):

Sources/Fuzzilli/FuzzIL/WasmOperations.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,12 +1225,12 @@ final class WasmDropDataSegment: WasmOperation {
12251225
final class WasmJsCall: WasmOperation {
12261226
override var opcode: Opcode { .wasmJsCall(self) }
12271227

1228-
let functionSignature: WasmSignature
1229-
1230-
init(signature: WasmSignature) {
1231-
self.functionSignature = signature
1232-
super.init(numInputs: 1 + signature.parameterTypes.count, numOutputs: signature.outputTypes.count, requiredContext: [.wasmFunction])
1228+
init(parameterCount: Int, outputCount: Int) {
1229+
super.init(numInputs: 2 + parameterCount, numOutputs: outputCount, requiredContext: [.wasmFunction])
12331230
}
1231+
1232+
var parameterCount: Int { numInputs - 2 }
1233+
var outputCount: Int { numOutputs }
12341234
}
12351235

12361236
final class WasmSelect: WasmOperation {

Sources/Fuzzilli/Lifting/FuzzILLifter.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,13 +1046,13 @@ public class FuzzILLifter: Lifter {
10461046

10471047
case .wasmJsCall(let op):
10481048
var arguments: [Variable] = []
1049-
for i in 0..<op.functionSignature.parameterTypes.count {
1050-
arguments.append(instr.input(i + 1))
1049+
for i in 0..<op.parameterCount {
1050+
arguments.append(instr.input(i + 2))
10511051
}
1052-
if op.functionSignature.outputTypes.isEmpty {
1053-
w.emit("WasmJsCall(\(op.functionSignature)) \(instr.input(0)) [\(liftCallArguments(arguments[...]))]")
1052+
if op.outputCount == 0 {
1053+
w.emit("WasmJsCall \(instr.input(1)) [\(liftCallArguments(arguments[...]))]")
10541054
} else {
1055-
w.emit("\(output()) <- WasmJsCall(\(op.functionSignature)) \(instr.input(0)) [\(liftCallArguments(arguments[...]))]")
1055+
w.emit("\(output()) <- WasmJsCall \(instr.input(1)) [\(liftCallArguments(arguments[...]))]")
10561056
}
10571057

10581058
case .wasmCallIndirect(let op):

Sources/Fuzzilli/Lifting/WasmLifter.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1483,8 +1483,9 @@ public class WasmLifter {
14831483
// Special handling for functions, we only expect them in WasmJSCalls, and WasmDefineTable instructions right now.
14841484
// We can treat the suspendingObjects as function imports.
14851485
if inputType.Is(.function()) || inputType.Is(.object(ofGroup: "WasmSuspendingObject")) {
1486-
if case .wasmJsCall(let op) = instr.op.opcode {
1487-
importIfNeeded(.import(type: .function(nil), variable: input, signature: op.functionSignature))
1486+
if case .wasmJsCall(_) = instr.op.opcode {
1487+
let wasmSignature = typer.type(of: instr.input(0)).wasmFunctionSignatureDefSignature
1488+
importIfNeeded(.import(type: .function(nil), variable: input, signature: wasmSignature))
14881489
} else if case .wasmDefineTable(let op) = instr.op.opcode {
14891490
// Find the signature in the defined entries
14901491
let sig = op.definedEntries[idx].signature
@@ -1887,9 +1888,9 @@ public class WasmLifter {
18871888
let dstTableIdx = try resolveIdx(ofType: .table, for: wasmInstruction.input(0))
18881889
let srcTableIdx = try resolveIdx(ofType: .table, for: wasmInstruction.input(1))
18891890
return Data([0xFC, 0x0e]) + Leb128.unsignedEncode(dstTableIdx) + Leb128.unsignedEncode(srcTableIdx)
1890-
case .wasmJsCall(let op):
1891+
case .wasmJsCall(_):
18911892
// We filter first, such that we get the index of functions only.
1892-
let wasmSignature = op.functionSignature
1893+
let wasmSignature = typer.type(of: wasmInstruction.input(0)).wasmFunctionSignatureDefSignature
18931894

18941895
// This has somewhat special handling as we might have multiple imports for this variable, we also need to get the right index that matches that signature that we expect here.
18951896
// TODO(cffsmith): consider adding that signature matching feature to resolveIdx.
@@ -1900,7 +1901,7 @@ public class WasmLifter {
19001901
return false
19011902
}
19021903
}).firstIndex(where: {
1903-
wasmInstruction.input(0) == $0.getImport()!.variable && wasmSignature == $0.getImport()!.signature
1904+
wasmInstruction.input(1) == $0.getImport()!.variable && wasmSignature == $0.getImport()!.signature
19041905
}) {
19051906
return Data([0x10]) + Leb128.unsignedEncode(index)
19061907
} else {

Sources/Fuzzilli/Protobuf/operations.pb.swift

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4208,9 +4208,9 @@ public struct Fuzzilli_Protobuf_WasmJsCall: Sendable {
42084208
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
42094209
// methods supported on all messages.
42104210

4211-
public var parameterTypes: [Fuzzilli_Protobuf_WasmILType] = []
4211+
public var parameterCount: Int32 = 0
42124212

4213-
public var outputTypes: [Fuzzilli_Protobuf_WasmILType] = []
4213+
public var outputCount: Int32 = 0
42144214

42154215
public var unknownFields = SwiftProtobuf.UnknownStorage()
42164216

@@ -11759,34 +11759,34 @@ extension Fuzzilli_Protobuf_EndWasmFunction: SwiftProtobuf.Message, SwiftProtobu
1175911759

1176011760
extension Fuzzilli_Protobuf_WasmJsCall: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
1176111761
public static let protoMessageName: String = _protobuf_package + ".WasmJsCall"
11762-
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}parameterTypes\0\u{1}outputTypes\0")
11762+
public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}parameterCount\0\u{1}outputCount\0")
1176311763

1176411764
public mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
1176511765
while let fieldNumber = try decoder.nextFieldNumber() {
1176611766
// The use of inline closures is to circumvent an issue where the compiler
1176711767
// allocates stack space for every case branch when no optimizations are
1176811768
// enabled. https://github.com/apple/swift-protobuf/issues/1034
1176911769
switch fieldNumber {
11770-
case 1: try { try decoder.decodeRepeatedMessageField(value: &self.parameterTypes) }()
11771-
case 2: try { try decoder.decodeRepeatedMessageField(value: &self.outputTypes) }()
11770+
case 1: try { try decoder.decodeSingularInt32Field(value: &self.parameterCount) }()
11771+
case 2: try { try decoder.decodeSingularInt32Field(value: &self.outputCount) }()
1177211772
default: break
1177311773
}
1177411774
}
1177511775
}
1177611776

1177711777
public func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
11778-
if !self.parameterTypes.isEmpty {
11779-
try visitor.visitRepeatedMessageField(value: self.parameterTypes, fieldNumber: 1)
11778+
if self.parameterCount != 0 {
11779+
try visitor.visitSingularInt32Field(value: self.parameterCount, fieldNumber: 1)
1178011780
}
11781-
if !self.outputTypes.isEmpty {
11782-
try visitor.visitRepeatedMessageField(value: self.outputTypes, fieldNumber: 2)
11781+
if self.outputCount != 0 {
11782+
try visitor.visitSingularInt32Field(value: self.outputCount, fieldNumber: 2)
1178311783
}
1178411784
try unknownFields.traverse(visitor: &visitor)
1178511785
}
1178611786

1178711787
public static func ==(lhs: Fuzzilli_Protobuf_WasmJsCall, rhs: Fuzzilli_Protobuf_WasmJsCall) -> Bool {
11788-
if lhs.parameterTypes != rhs.parameterTypes {return false}
11789-
if lhs.outputTypes != rhs.outputTypes {return false}
11788+
if lhs.parameterCount != rhs.parameterCount {return false}
11789+
if lhs.outputCount != rhs.outputCount {return false}
1179011790
if lhs.unknownFields != rhs.unknownFields {return false}
1179111791
return true
1179211792
}

Sources/Fuzzilli/Protobuf/operations.proto

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -939,8 +939,8 @@ message EndWasmFunction {
939939
}
940940

941941
message WasmJsCall {
942-
repeated WasmILType parameterTypes = 1;
943-
repeated WasmILType outputTypes = 2;
942+
int32 parameterCount = 1;
943+
int32 outputCount = 2;
944944
}
945945

946946
message Wasmi32CompareOp {

Tests/FuzzilliTests/WasmTests.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6539,7 +6539,8 @@ class WasmSpliceTests: XCTestCase {
65396539
module.addWasmFunction(with: [] => []) { function, label, args in
65406540
let argument = function.consti32(1337)
65416541
let signature = ProgramBuilder.convertJsSignatureToWasmSignature([.number] => .integer, availableTypes: WeightedList([(.wasmi32, 1)]))
6542-
splicePoint = b.indexOfNextInstruction()
6542+
// +1 for the wasm-gc signature type that is created implicitly.
6543+
splicePoint = b.indexOfNextInstruction() + 1
65436544
function.wasmJsCall(function: f, withArgs: [argument], withWasmSignature: signature)
65446545
return []
65456546
}
@@ -6583,7 +6584,8 @@ class WasmSpliceTests: XCTestCase {
65836584
module.addWasmFunction(with: [] => []) { function, label, args in
65846585
let argument = function.consti32(1337)
65856586
let signature = ProgramBuilder.convertJsSignatureToWasmSignature([.number] => .integer, availableTypes: WeightedList([(.wasmi32, 1)]))
6586-
splicePoint = b.indexOfNextInstruction()
6587+
// +1 for the wasm-gc signature type that is created implicitly.
6588+
splicePoint = b.indexOfNextInstruction() + 1
65876589
function.wasmJsCall(function: f, withArgs: [argument], withWasmSignature: signature)
65886590
return []
65896591
}

0 commit comments

Comments
 (0)