diff options
author | Etienne Pierre-doray <etiennep@chromium.org> | 2021-09-03 20:52:11 +0000 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2021-09-03 14:00:09 -0700 |
commit | 737d35c6383995ae4d474cd975aebf92aaf73393 (patch) | |
tree | 4094cc30a4a06288249ab04493c1e9c7b2b199bd | |
parent | 26518ffbdf042c4c35617be2446dac49590a89c2 (diff) | |
download | zucchini-737d35c6383995ae4d474cd975aebf92aaf73393.tar.gz |
[zucchini]: Simplify DisassemblerElfArm read/write functions.
Use template read/write functions instead of repeated versions.
Change-Id: Ie87d307ebd7b297fe802216fe07aa820d7b1fa4d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3082253
Reviewed-by: Samuel Huang <huangs@chromium.org>
Commit-Queue: Etienne Pierre-Doray <etiennep@chromium.org>
Cr-Commit-Position: refs/heads/main@{#918237}
NOKEYCHECK=True
GitOrigin-RevId: d64aec31e8bb5e1acb9a2da1e6e92fbd5e59d5f6
-rw-r--r-- | disassembler_elf.cc | 197 | ||||
-rw-r--r-- | disassembler_elf.h | 44 |
2 files changed, 57 insertions, 184 deletions
diff --git a/disassembler_elf.cc b/disassembler_elf.cc index 94dc12a..22a29ba 100644 --- a/disassembler_elf.cc +++ b/disassembler_elf.cc @@ -596,6 +596,24 @@ std::unique_ptr<ReferenceWriter> DisassemblerElfArm<Traits>::MakeWriteAbs32( image, AbsoluteAddress(Traits::kBitness, 0), this->translator_); } +template <class TRAITS> +template <class ADDR_TRAITS> +std::unique_ptr<ReferenceReader> DisassemblerElfArm<TRAITS>::MakeReadRel32( + offset_t lower, + offset_t upper) { + return std::make_unique<Rel32ReaderArm<ADDR_TRAITS>>( + this->translator_, this->image_, + this->rel32_locations_table_[ADDR_TRAITS::addr_type], lower, upper); +} + +template <class TRAITS> +template <class ADDR_TRAITS> +std::unique_ptr<ReferenceWriter> DisassemblerElfArm<TRAITS>::MakeWriteRel32( + MutableBufferView image) { + return std::make_unique<Rel32WriterArm<ADDR_TRAITS>>(this->translator_, + image); +} + /******** DisassemblerElfAArch32 ********/ DisassemblerElfAArch32::DisassemblerElfAArch32() = default; @@ -616,24 +634,34 @@ std::vector<ReferenceGroup> DisassemblerElfAArch32::MakeReferenceGroups() &DisassemblerElfAArch32::MakeWriteAbs32}, {ReferenceTypeTraits{4, TypeTag(AArch32ReferenceType::kRel32_A24), PoolTag(ArmReferencePool::kPoolRel32)}, - &DisassemblerElfAArch32::MakeReadRel32A24, - &DisassemblerElfAArch32::MakeWriteRel32A24}, + &DisassemblerElfAArch32::MakeReadRel32< + AArch32Rel32Translator::AddrTraits_A24>, + &DisassemblerElfAArch32::MakeWriteRel32< + AArch32Rel32Translator::AddrTraits_A24>}, {ReferenceTypeTraits{2, TypeTag(AArch32ReferenceType::kRel32_T8), PoolTag(ArmReferencePool::kPoolRel32)}, - &DisassemblerElfAArch32::MakeReadRel32T8, - &DisassemblerElfAArch32::MakeWriteRel32T8}, + &DisassemblerElfAArch32::MakeReadRel32< + AArch32Rel32Translator::AddrTraits_T8>, + &DisassemblerElfAArch32::MakeWriteRel32< + AArch32Rel32Translator::AddrTraits_T8>}, {ReferenceTypeTraits{2, TypeTag(AArch32ReferenceType::kRel32_T11), PoolTag(ArmReferencePool::kPoolRel32)}, - &DisassemblerElfAArch32::MakeReadRel32T11, - &DisassemblerElfAArch32::MakeWriteRel32T11}, + &DisassemblerElfAArch32::MakeReadRel32< + AArch32Rel32Translator::AddrTraits_T11>, + &DisassemblerElfAArch32::MakeWriteRel32< + AArch32Rel32Translator::AddrTraits_T11>}, {ReferenceTypeTraits{4, TypeTag(AArch32ReferenceType::kRel32_T20), PoolTag(ArmReferencePool::kPoolRel32)}, - &DisassemblerElfAArch32::MakeReadRel32T20, - &DisassemblerElfAArch32::MakeWriteRel32T20}, + &DisassemblerElfAArch32::MakeReadRel32< + AArch32Rel32Translator::AddrTraits_T20>, + &DisassemblerElfAArch32::MakeWriteRel32< + AArch32Rel32Translator::AddrTraits_T20>}, {ReferenceTypeTraits{4, TypeTag(AArch32ReferenceType::kRel32_T24), PoolTag(ArmReferencePool::kPoolRel32)}, - &DisassemblerElfAArch32::MakeReadRel32T24, - &DisassemblerElfAArch32::MakeWriteRel32T24}, + &DisassemblerElfAArch32::MakeReadRel32< + AArch32Rel32Translator::AddrTraits_T24>, + &DisassemblerElfAArch32::MakeWriteRel32< + AArch32Rel32Translator::AddrTraits_T24>}, }; } @@ -673,86 +701,6 @@ bool DisassemblerElfAArch32::IsExecSectionThumb2( return num < den * kAArch32BitCondAlwaysDensityThreshold; } -std::unique_ptr<ReferenceReader> DisassemblerElfAArch32::MakeReadRel32A24( - offset_t lower, - offset_t upper) { - return std::make_unique< - Rel32ReaderArm<AArch32Rel32Translator::AddrTraits_A24>>( - translator_, image_, - rel32_locations_table_[AArch32Rel32Translator::ADDR_A24], lower, upper); -} - -std::unique_ptr<ReferenceWriter> DisassemblerElfAArch32::MakeWriteRel32A24( - MutableBufferView image) { - return std::make_unique< - Rel32WriterArm<AArch32Rel32Translator::AddrTraits_A24>>(translator_, - image); -} - -std::unique_ptr<ReferenceReader> DisassemblerElfAArch32::MakeReadRel32T8( - offset_t lower, - offset_t upper) { - return std::make_unique< - Rel32ReaderArm<AArch32Rel32Translator::AddrTraits_T8>>( - translator_, image_, - rel32_locations_table_[AArch32Rel32Translator::ADDR_T8], lower, upper); -} - -std::unique_ptr<ReferenceWriter> DisassemblerElfAArch32::MakeWriteRel32T8( - MutableBufferView image) { - return std::make_unique< - Rel32WriterArm<AArch32Rel32Translator::AddrTraits_T8>>(translator_, - image); -} - -std::unique_ptr<ReferenceReader> DisassemblerElfAArch32::MakeReadRel32T11( - offset_t lower, - offset_t upper) { - return std::make_unique< - Rel32ReaderArm<AArch32Rel32Translator::AddrTraits_T11>>( - translator_, image_, - rel32_locations_table_[AArch32Rel32Translator::ADDR_T11], lower, upper); -} - -std::unique_ptr<ReferenceWriter> DisassemblerElfAArch32::MakeWriteRel32T11( - MutableBufferView image) { - return std::make_unique< - Rel32WriterArm<AArch32Rel32Translator::AddrTraits_T11>>(translator_, - image); -} - -std::unique_ptr<ReferenceReader> DisassemblerElfAArch32::MakeReadRel32T20( - offset_t lower, - offset_t upper) { - return std::make_unique< - Rel32ReaderArm<AArch32Rel32Translator::AddrTraits_T20>>( - translator_, image_, - rel32_locations_table_[AArch32Rel32Translator::ADDR_T20], lower, upper); -} - -std::unique_ptr<ReferenceWriter> DisassemblerElfAArch32::MakeWriteRel32T20( - MutableBufferView image) { - return std::make_unique< - Rel32WriterArm<AArch32Rel32Translator::AddrTraits_T20>>(translator_, - image); -} - -std::unique_ptr<ReferenceReader> DisassemblerElfAArch32::MakeReadRel32T24( - offset_t lower, - offset_t upper) { - return std::make_unique< - Rel32ReaderArm<AArch32Rel32Translator::AddrTraits_T24>>( - translator_, image_, - rel32_locations_table_[AArch32Rel32Translator::ADDR_T24], lower, upper); -} - -std::unique_ptr<ReferenceWriter> DisassemblerElfAArch32::MakeWriteRel32T24( - MutableBufferView image) { - return std::make_unique< - Rel32WriterArm<AArch32Rel32Translator::AddrTraits_T24>>(translator_, - image); -} - /******** DisassemblerElfAArch64 ********/ DisassemblerElfAArch64::DisassemblerElfAArch64() = default; @@ -774,16 +722,22 @@ std::vector<ReferenceGroup> DisassemblerElfAArch64::MakeReferenceGroups() &DisassemblerElfAArch64::MakeWriteAbs32}, {ReferenceTypeTraits{4, TypeTag(AArch64ReferenceType::kRel32_Immd14), PoolTag(ArmReferencePool::kPoolRel32)}, - &DisassemblerElfAArch64::MakeReadRel32Immd14, - &DisassemblerElfAArch64::MakeWriteRel32Immd14}, + &DisassemblerElfAArch64::MakeReadRel32< + AArch64Rel32Translator::AddrTraits_Immd14>, + &DisassemblerElfAArch64::MakeWriteRel32< + AArch64Rel32Translator::AddrTraits_Immd14>}, {ReferenceTypeTraits{4, TypeTag(AArch64ReferenceType::kRel32_Immd19), PoolTag(ArmReferencePool::kPoolRel32)}, - &DisassemblerElfAArch64::MakeReadRel32Immd19, - &DisassemblerElfAArch64::MakeWriteRel32Immd19}, + &DisassemblerElfAArch64::MakeReadRel32< + AArch64Rel32Translator::AddrTraits_Immd19>, + &DisassemblerElfAArch64::MakeWriteRel32< + AArch64Rel32Translator::AddrTraits_Immd19>}, {ReferenceTypeTraits{4, TypeTag(AArch64ReferenceType::kRel32_Immd26), PoolTag(ArmReferencePool::kPoolRel32)}, - &DisassemblerElfAArch64::MakeReadRel32Immd26, - &DisassemblerElfAArch64::MakeWriteRel32Immd26}, + &DisassemblerElfAArch64::MakeReadRel32< + AArch64Rel32Translator::AddrTraits_Immd26>, + &DisassemblerElfAArch64::MakeWriteRel32< + AArch64Rel32Translator::AddrTraits_Immd26>}, }; } @@ -793,57 +747,6 @@ DisassemblerElfAArch64::MakeRel32Finder( return std::make_unique<Rel32FinderAArch64>(image_, translator_); } -std::unique_ptr<ReferenceReader> DisassemblerElfAArch64::MakeReadRel32Immd14( - offset_t lower, - offset_t upper) { - return std::make_unique< - Rel32ReaderArm<AArch64Rel32Translator::AddrTraits_Immd14>>( - translator_, this->image_, - rel32_locations_table_[AArch64Rel32Translator::ADDR_IMMD14], lower, - upper); -} - -std::unique_ptr<ReferenceWriter> DisassemblerElfAArch64::MakeWriteRel32Immd14( - MutableBufferView image) { - return std::make_unique< - Rel32WriterArm<AArch64Rel32Translator::AddrTraits_Immd14>>(translator_, - image); -} - -std::unique_ptr<ReferenceReader> DisassemblerElfAArch64::MakeReadRel32Immd19( - offset_t lower, - offset_t upper) { - return std::make_unique< - Rel32ReaderArm<AArch64Rel32Translator::AddrTraits_Immd19>>( - translator_, this->image_, - rel32_locations_table_[AArch64Rel32Translator::ADDR_IMMD19], lower, - upper); -} - -std::unique_ptr<ReferenceWriter> DisassemblerElfAArch64::MakeWriteRel32Immd19( - MutableBufferView image) { - return std::make_unique< - Rel32WriterArm<AArch64Rel32Translator::AddrTraits_Immd19>>(translator_, - image); -} - -std::unique_ptr<ReferenceReader> DisassemblerElfAArch64::MakeReadRel32Immd26( - offset_t lower, - offset_t upper) { - return std::make_unique< - Rel32ReaderArm<AArch64Rel32Translator::AddrTraits_Immd26>>( - translator_, this->image_, - rel32_locations_table_[AArch64Rel32Translator::ADDR_IMMD26], lower, - upper); -} - -std::unique_ptr<ReferenceWriter> DisassemblerElfAArch64::MakeWriteRel32Immd26( - MutableBufferView image) { - return std::make_unique< - Rel32WriterArm<AArch64Rel32Translator::AddrTraits_Immd26>>(translator_, - image); -} - // Explicit instantiation for supported classes. template class DisassemblerElfArm<ElfAArch32Traits>; template class DisassemblerElfArm<ElfAArch64Traits>; diff --git a/disassembler_elf.h b/disassembler_elf.h index 0bd11a6..b29e89f 100644 --- a/disassembler_elf.h +++ b/disassembler_elf.h @@ -296,6 +296,13 @@ class DisassemblerElfArm : public DisassemblerElf<TRAITS> { std::unique_ptr<ReferenceReader> MakeReadAbs32(offset_t lo, offset_t hi); std::unique_ptr<ReferenceWriter> MakeWriteAbs32(MutableBufferView image); + // Specialized Read/Write functions for different rel32 address types. + template <class ADDR_TRAITS> + std::unique_ptr<ReferenceReader> MakeReadRel32(offset_t lower, + offset_t upper); + template <class ADDR_TRAITS> + std::unique_ptr<ReferenceWriter> MakeWriteRel32(MutableBufferView image); + protected: // Sorted file offsets of rel32 locations for each rel32 address type. std::deque<offset_t> @@ -322,27 +329,6 @@ class DisassemblerElfAArch32 : public DisassemblerElfArm<ElfAArch32Traits> { // or THUMB2 mode, this function implements heuristics to distinguish between // the two. Returns true if section is THUMB2 mode; otherwise return false. bool IsExecSectionThumb2(const typename Traits::Elf_Shdr& section) const; - - // Specialized Read/Write functions for different rel32 address types. - std::unique_ptr<ReferenceReader> MakeReadRel32A24(offset_t lower, - offset_t upper); - std::unique_ptr<ReferenceWriter> MakeWriteRel32A24(MutableBufferView image); - - std::unique_ptr<ReferenceReader> MakeReadRel32T8(offset_t lower, - offset_t upper); - std::unique_ptr<ReferenceWriter> MakeWriteRel32T8(MutableBufferView image); - - std::unique_ptr<ReferenceReader> MakeReadRel32T11(offset_t lower, - offset_t upper); - std::unique_ptr<ReferenceWriter> MakeWriteRel32T11(MutableBufferView image); - - std::unique_ptr<ReferenceReader> MakeReadRel32T20(offset_t lower, - offset_t upper); - std::unique_ptr<ReferenceWriter> MakeWriteRel32T20(MutableBufferView image); - - std::unique_ptr<ReferenceReader> MakeReadRel32T24(offset_t lower, - offset_t upper); - std::unique_ptr<ReferenceWriter> MakeWriteRel32T24(MutableBufferView image); }; // Disassembler for ELF with AArch64 (AKA ARM64). @@ -360,22 +346,6 @@ class DisassemblerElfAArch64 : public DisassemblerElfArm<ElfAArch64Traits> { // DisassemblerElfArm: std::unique_ptr<typename Traits::Rel32FinderUse> MakeRel32Finder( const typename Traits::Elf_Shdr& section) override; - - // Specialized Read/Write functions for different rel32 address types. - std::unique_ptr<ReferenceReader> MakeReadRel32Immd14(offset_t lower, - offset_t upper); - std::unique_ptr<ReferenceWriter> MakeWriteRel32Immd14( - MutableBufferView image); - - std::unique_ptr<ReferenceReader> MakeReadRel32Immd19(offset_t lower, - offset_t upper); - std::unique_ptr<ReferenceWriter> MakeWriteRel32Immd19( - MutableBufferView image); - - std::unique_ptr<ReferenceReader> MakeReadRel32Immd26(offset_t lower, - offset_t upper); - std::unique_ptr<ReferenceWriter> MakeWriteRel32Immd26( - MutableBufferView image); }; } // namespace zucchini |