aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEtienne Pierre-doray <etiennep@chromium.org>2021-09-03 20:52:11 +0000
committerCopybara-Service <copybara-worker@google.com>2021-09-03 14:00:09 -0700
commit737d35c6383995ae4d474cd975aebf92aaf73393 (patch)
tree4094cc30a4a06288249ab04493c1e9c7b2b199bd
parent26518ffbdf042c4c35617be2446dac49590a89c2 (diff)
downloadzucchini-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.cc197
-rw-r--r--disassembler_elf.h44
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