// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifdef UNSAFE_BUFFERS_BUILD // TODO(crbug.com/40285824): Remove this and convert code to safer constructs. #pragma allow_unsafe_buffers #endif #ifndef COMPONENTS_ZUCCHINI_REL32_UTILS_H_ #define COMPONENTS_ZUCCHINI_REL32_UTILS_H_ #include <algorithm> #include <array> #include <deque> #include <memory> #include <optional> #include "base/logging.h" #include "components/zucchini/address_translator.h" #include "components/zucchini/arm_utils.h" #include "components/zucchini/buffer_view.h" #include "components/zucchini/image_utils.h" #include "components/zucchini/io_utils.h" namespace zucchini { // Reader that emits x86 / x64 References (locations and target) from a list of // valid locations, constrained by a portion of an image. class Rel32ReaderX86 : public ReferenceReader { … }; // Writer for x86 / x64 rel32 References. class Rel32WriterX86 : public ReferenceWriter { … }; // Reader that emits x86 / x64 References (locations and target) of a spcific // type from a list of valid locations, constrained by a portion of an image. template <class ADDR_TRAITS> class Rel32ReaderArm : public ReferenceReader { … }; // Writer for ARM rel32 References of a specific type. template <class ADDR_TRAITS> class Rel32WriterArm : public ReferenceWriter { … }; // Copier that makes |*dst_it| similar to |*src_it| (both assumed to point to // rel32 instructions of type ADDR_TRAITS) by copying the displacement (i.e., // payload bits) from |src_it| to |dst_it|. If successful, updates |*dst_it|, // and returns true. Otherwise returns false. Note that alignment is not an // issue since the displacement is not translated to target RVA! template <class ADDR_TRAITS> bool ArmCopyDisp(ConstBufferView src_view, offset_t src_idx, MutableBufferView dst_view, offset_t dst_idx) { … } // Outputs error message (throttled) on ArmCopyDisp failure. void OutputArmCopyDispFailure(uint32_t addr_type); // Mixer for ARM rel32 References of a specific type. template <class ADDR_TRAITS> class Rel32MixerArm : public ReferenceMixer { … }; } // namespace zucchini #endif // COMPONENTS_ZUCCHINI_REL32_UTILS_H_