aboutsummaryrefslogtreecommitdiff
path: root/disassembler_elf.cc
diff options
context:
space:
mode:
Diffstat (limited to 'disassembler_elf.cc')
-rw-r--r--disassembler_elf.cc197
1 files changed, 50 insertions, 147 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>;