aboutsummaryrefslogtreecommitdiff
path: root/disassembler_dex.h
diff options
context:
space:
mode:
Diffstat (limited to 'disassembler_dex.h')
-rw-r--r--disassembler_dex.h88
1 files changed, 88 insertions, 0 deletions
diff --git a/disassembler_dex.h b/disassembler_dex.h
index 7bbe5d1..3032d14 100644
--- a/disassembler_dex.h
+++ b/disassembler_dex.h
@@ -8,6 +8,7 @@
#include <stdint.h>
#include <map>
+#include <memory>
#include <string>
#include <vector>
@@ -24,6 +25,56 @@ namespace zucchini {
class DisassemblerDex : public Disassembler {
public:
+ // Pools follow canonical order.
+ enum ReferencePool : uint8_t {
+ kStringId,
+ kTypeId,
+ kProtoId,
+ kFieldId,
+ kMethodId,
+ kClassDef,
+ kTypeList,
+ kCode,
+ kStringData,
+ kNumPools
+ };
+
+ // Types are grouped and ordered by target ReferencePool. This is required by
+ // Zucchini-apply, which visits references by type order and sequentially
+ // handles pools in the same order. Type-pool association is established in
+ // MakeReferenceGroups(), and verified by a unit test.
+ enum ReferenceType : uint8_t {
+ kFieldIdToNameStringId, // kStringId
+ kCodeToStringId16,
+ kCodeToStringId32,
+
+ kFieldIdToClassTypeId, // kTypeId
+ kFieldIdToTypeId,
+ kCodeToTypeId,
+
+ kCodeToFieldId, // kFieldId
+
+ kCodeToMethodId, // kMethodId
+
+ kCodeToRelCode16, // kCode
+ kCodeToRelCode32,
+
+ kStringIdToStringData, // kStringData
+
+ // TODO(ckitagawa): Extract the following kinds of pointers.
+ // kProtoToShortyStringId,
+ // kProtoToReturnTypeId,
+ // kProtoToParamsTypeList,
+ // kMethodToClassTypeId,
+ // kMethodToProtoId,
+ // kMethodToNameStringId,
+ // kTypeListToTypeId,
+ // kClassDefToClassTypeId,
+ // kClassDefToSuperclassTypeId,
+ // kClassDefToInterfaceTypeList,
+ kNumTypes
+ };
+
DisassemblerDex();
~DisassemblerDex() override;
@@ -36,6 +87,43 @@ class DisassemblerDex : public Disassembler {
std::string GetExeTypeString() const override;
std::vector<ReferenceGroup> MakeReferenceGroups() const override;
+ // Functions that return reference readers. These follow canonical order of
+ // *locations* (unlike targets for ReferenceType). This allows functions with
+ // similar parsing logic to appear togeter.
+ std::unique_ptr<ReferenceReader> MakeReadStringIdToStringData(offset_t lo,
+ offset_t hi);
+ std::unique_ptr<ReferenceReader> MakeReadFieldToClassTypeId16(offset_t lo,
+ offset_t hi);
+ std::unique_ptr<ReferenceReader> MakeReadFieldToTypeId16(offset_t lo,
+ offset_t hi);
+ std::unique_ptr<ReferenceReader> MakeReadFieldToNameStringId32(offset_t lo,
+ offset_t hi);
+ std::unique_ptr<ReferenceReader> MakeReadCodeToStringId16(offset_t lo,
+ offset_t hi);
+ std::unique_ptr<ReferenceReader> MakeReadCodeToStringId32(offset_t lo,
+ offset_t hi);
+ std::unique_ptr<ReferenceReader> MakeReadCodeToTypeId16(offset_t lo,
+ offset_t hi);
+ std::unique_ptr<ReferenceReader> MakeReadCodeToFieldId16(offset_t lo,
+ offset_t hi);
+ std::unique_ptr<ReferenceReader> MakeReadCodeToMethodId16(offset_t lo,
+ offset_t hi);
+ std::unique_ptr<ReferenceReader> MakeReadCodeToRelCode16(offset_t lo,
+ offset_t hi);
+ std::unique_ptr<ReferenceReader> MakeReadCodeToRelCode32(offset_t lo,
+ offset_t hi);
+
+ // Functions that return reference writers. Different readers may share a
+ // common writer. Therefore these loosely follow canonical order of locations,
+ std::unique_ptr<ReferenceWriter> MakeWriteStringId16(MutableBufferView image);
+ std::unique_ptr<ReferenceWriter> MakeWriteStringId32(MutableBufferView image);
+ std::unique_ptr<ReferenceWriter> MakeWriteTypeId16(MutableBufferView image);
+ std::unique_ptr<ReferenceWriter> MakeWriteFieldId16(MutableBufferView image);
+ std::unique_ptr<ReferenceWriter> MakeWriteMethodId16(MutableBufferView image);
+ std::unique_ptr<ReferenceWriter> MakeWriteRelCode16(MutableBufferView image);
+ std::unique_ptr<ReferenceWriter> MakeWriteRelCode32(MutableBufferView image);
+ std::unique_ptr<ReferenceWriter> MakeWriteAbs32(MutableBufferView image);
+
private:
friend Disassembler;
using MapItemMap = std::map<uint16_t, const dex::MapItem*>;