1*a03ca8b9SKrzysztof Kosiński // Copyright 2019 The Chromium Authors. All rights reserved. 2*a03ca8b9SKrzysztof Kosiński // Use of this source code is governed by a BSD-style license that can be 3*a03ca8b9SKrzysztof Kosiński // found in the LICENSE file. 4*a03ca8b9SKrzysztof Kosiński 5*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/fuzzers/fuzz_utils.h" 6*a03ca8b9SKrzysztof Kosiński 7*a03ca8b9SKrzysztof Kosiński #include <map> 8*a03ca8b9SKrzysztof Kosiński #include <memory> 9*a03ca8b9SKrzysztof Kosiński #include <vector> 10*a03ca8b9SKrzysztof Kosiński 11*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/disassembler.h" 12*a03ca8b9SKrzysztof Kosiński 13*a03ca8b9SKrzysztof Kosiński namespace zucchini { 14*a03ca8b9SKrzysztof Kosiński ReadAndWriteReferences(std::unique_ptr<zucchini::Disassembler> disassembler,std::vector<uint8_t> * mutable_data)15*a03ca8b9SKrzysztof Kosińskivoid ReadAndWriteReferences( 16*a03ca8b9SKrzysztof Kosiński std::unique_ptr<zucchini::Disassembler> disassembler, 17*a03ca8b9SKrzysztof Kosiński std::vector<uint8_t>* mutable_data) { 18*a03ca8b9SKrzysztof Kosiński zucchini::MutableBufferView mutable_image(mutable_data->data(), 19*a03ca8b9SKrzysztof Kosiński disassembler->size()); 20*a03ca8b9SKrzysztof Kosiński std::vector<zucchini::Reference> references; 21*a03ca8b9SKrzysztof Kosiński auto groups = disassembler->MakeReferenceGroups(); 22*a03ca8b9SKrzysztof Kosiński std::map<zucchini::PoolTag, std::vector<zucchini::Reference>> 23*a03ca8b9SKrzysztof Kosiński references_of_pool; 24*a03ca8b9SKrzysztof Kosiński for (const auto& group : groups) { 25*a03ca8b9SKrzysztof Kosiński auto reader = group.GetReader(disassembler.get()); 26*a03ca8b9SKrzysztof Kosiński std::vector<zucchini::Reference>* refs = 27*a03ca8b9SKrzysztof Kosiński &references_of_pool[group.pool_tag()]; 28*a03ca8b9SKrzysztof Kosiński for (auto ref = reader->GetNext(); ref.has_value(); 29*a03ca8b9SKrzysztof Kosiński ref = reader->GetNext()) { 30*a03ca8b9SKrzysztof Kosiński refs->push_back(ref.value()); 31*a03ca8b9SKrzysztof Kosiński } 32*a03ca8b9SKrzysztof Kosiński } 33*a03ca8b9SKrzysztof Kosiński for (const auto& group : groups) { 34*a03ca8b9SKrzysztof Kosiński auto writer = group.GetWriter(mutable_image, disassembler.get()); 35*a03ca8b9SKrzysztof Kosiński for (const auto& ref : references_of_pool[group.pool_tag()]) 36*a03ca8b9SKrzysztof Kosiński writer->PutNext(ref); 37*a03ca8b9SKrzysztof Kosiński } 38*a03ca8b9SKrzysztof Kosiński } 39*a03ca8b9SKrzysztof Kosiński 40*a03ca8b9SKrzysztof Kosiński } // namespace zucchini 41