xref: /aosp_15_r20/external/zucchini/fuzzers/fuzz_utils.cc (revision a03ca8b91e029cd15055c20c78c2e087c84792e4)
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ński void 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