xref: /aosp_15_r20/external/zucchini/test_disassembler.h (revision a03ca8b91e029cd15055c20c78c2e087c84792e4)
1*a03ca8b9SKrzysztof Kosiński // Copyright 2017 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 #ifndef COMPONENTS_ZUCCHINI_TEST_DISASSEMBLER_H_
6*a03ca8b9SKrzysztof Kosiński #define COMPONENTS_ZUCCHINI_TEST_DISASSEMBLER_H_
7*a03ca8b9SKrzysztof Kosiński 
8*a03ca8b9SKrzysztof Kosiński #include <memory>
9*a03ca8b9SKrzysztof Kosiński #include <string>
10*a03ca8b9SKrzysztof Kosiński #include <vector>
11*a03ca8b9SKrzysztof Kosiński 
12*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/buffer_view.h"
13*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/disassembler.h"
14*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/image_utils.h"
15*a03ca8b9SKrzysztof Kosiński 
16*a03ca8b9SKrzysztof Kosiński namespace zucchini {
17*a03ca8b9SKrzysztof Kosiński 
18*a03ca8b9SKrzysztof Kosiński // A trivial Disassembler that reads injected references of 3 different types.
19*a03ca8b9SKrzysztof Kosiński // This is only meant for testing and is not a full implementation of a
20*a03ca8b9SKrzysztof Kosiński // disassembler. Reading reference ignores bounds, and writing references does
21*a03ca8b9SKrzysztof Kosiński // nothing.
22*a03ca8b9SKrzysztof Kosiński class TestDisassembler : public Disassembler {
23*a03ca8b9SKrzysztof Kosiński  public:
24*a03ca8b9SKrzysztof Kosiński   TestDisassembler(const ReferenceTypeTraits& traits1,
25*a03ca8b9SKrzysztof Kosiński                    const std::vector<Reference>& refs1,
26*a03ca8b9SKrzysztof Kosiński                    const ReferenceTypeTraits& traits2,
27*a03ca8b9SKrzysztof Kosiński                    const std::vector<Reference>& refs2,
28*a03ca8b9SKrzysztof Kosiński                    const ReferenceTypeTraits& traits3,
29*a03ca8b9SKrzysztof Kosiński                    const std::vector<Reference>& refs3);
30*a03ca8b9SKrzysztof Kosiński   TestDisassembler(const TestDisassembler&) = delete;
31*a03ca8b9SKrzysztof Kosiński   const TestDisassembler& operator=(const TestDisassembler&) = delete;
32*a03ca8b9SKrzysztof Kosiński   ~TestDisassembler() override;
33*a03ca8b9SKrzysztof Kosiński 
34*a03ca8b9SKrzysztof Kosiński   // Disassembler:
35*a03ca8b9SKrzysztof Kosiński   ExecutableType GetExeType() const override;
36*a03ca8b9SKrzysztof Kosiński   std::string GetExeTypeString() const override;
37*a03ca8b9SKrzysztof Kosiński   std::vector<ReferenceGroup> MakeReferenceGroups() const override;
38*a03ca8b9SKrzysztof Kosiński 
39*a03ca8b9SKrzysztof Kosiński   // Disassembler::ReaderFactory:
MakeReadRefs1(offset_t,offset_t)40*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadRefs1(offset_t /*lower*/,
41*a03ca8b9SKrzysztof Kosiński                                                  offset_t /*upper*/) {
42*a03ca8b9SKrzysztof Kosiński     return MakeReadRefs(0);
43*a03ca8b9SKrzysztof Kosiński   }
MakeReadRefs2(offset_t,offset_t)44*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadRefs2(offset_t /*lower*/,
45*a03ca8b9SKrzysztof Kosiński                                                  offset_t /*upper*/) {
46*a03ca8b9SKrzysztof Kosiński     return MakeReadRefs(1);
47*a03ca8b9SKrzysztof Kosiński   }
MakeReadRefs3(offset_t,offset_t)48*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadRefs3(offset_t /*lower*/,
49*a03ca8b9SKrzysztof Kosiński                                                  offset_t /*upper*/) {
50*a03ca8b9SKrzysztof Kosiński     return MakeReadRefs(2);
51*a03ca8b9SKrzysztof Kosiński   }
52*a03ca8b9SKrzysztof Kosiński 
53*a03ca8b9SKrzysztof Kosiński   // Disassembler::WriterFactory:
MakeWriteRefs1(MutableBufferView image)54*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteRefs1(MutableBufferView image) {
55*a03ca8b9SKrzysztof Kosiński     return MakeWriteRefs(image);
56*a03ca8b9SKrzysztof Kosiński   }
MakeWriteRefs2(MutableBufferView image)57*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteRefs2(MutableBufferView image) {
58*a03ca8b9SKrzysztof Kosiński     return MakeWriteRefs(image);
59*a03ca8b9SKrzysztof Kosiński   }
MakeWriteRefs3(MutableBufferView image)60*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteRefs3(MutableBufferView image) {
61*a03ca8b9SKrzysztof Kosiński     return MakeWriteRefs(image);
62*a03ca8b9SKrzysztof Kosiński   }
63*a03ca8b9SKrzysztof Kosiński 
64*a03ca8b9SKrzysztof Kosiński  private:
65*a03ca8b9SKrzysztof Kosiński   // Disassembler:
66*a03ca8b9SKrzysztof Kosiński   bool Parse(ConstBufferView image) override;
67*a03ca8b9SKrzysztof Kosiński 
68*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadRefs(int type);
69*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteRefs(MutableBufferView image);
70*a03ca8b9SKrzysztof Kosiński 
71*a03ca8b9SKrzysztof Kosiński   ReferenceTypeTraits traits_[3];
72*a03ca8b9SKrzysztof Kosiński   std::vector<Reference> refs_[3];
73*a03ca8b9SKrzysztof Kosiński };
74*a03ca8b9SKrzysztof Kosiński 
75*a03ca8b9SKrzysztof Kosiński }  // namespace zucchini
76*a03ca8b9SKrzysztof Kosiński 
77*a03ca8b9SKrzysztof Kosiński #endif  // COMPONENTS_ZUCCHINI_TEST_DISASSEMBLER_H_
78