diff options
Diffstat (limited to 'compiler/linker/linker_patch.h')
-rw-r--r-- | compiler/linker/linker_patch.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/compiler/linker/linker_patch.h b/compiler/linker/linker_patch.h index 8ed7fce0ff..133088240b 100644 --- a/compiler/linker/linker_patch.h +++ b/compiler/linker/linker_patch.h @@ -56,6 +56,7 @@ class LinkerPatch { kPackageTypeBssEntry, kStringRelative, kStringBssEntry, + kMethodTypeBssEntry, kCallEntrypoint, kBakerReadBarrierBranch, }; @@ -176,6 +177,16 @@ class LinkerPatch { return patch; } + static LinkerPatch MethodTypeBssEntryPatch(size_t literal_offset, + const DexFile* target_dex_file, + uint32_t pc_insn_offset, + uint32_t target_proto_idx) { + LinkerPatch patch(literal_offset, Type::kMethodTypeBssEntry, target_dex_file); + patch.proto_idx_ = target_proto_idx; + patch.pc_insn_offset_ = pc_insn_offset; + return patch; + } + static LinkerPatch CallEntrypointPatch(size_t literal_offset, uint32_t entrypoint_offset) { LinkerPatch patch(literal_offset, @@ -253,6 +264,16 @@ class LinkerPatch { return dex::StringIndex(string_idx_); } + const DexFile* TargetProtoDexFile() const { + DCHECK(patch_type_ == Type::kMethodTypeBssEntry); + return target_dex_file_; + } + + dex::ProtoIndex TargetProtoIndex() const { + DCHECK(patch_type_ == Type::kMethodTypeBssEntry); + return dex::ProtoIndex(proto_idx_); + } + uint32_t PcInsnOffset() const { DCHECK(patch_type_ == Type::kIntrinsicReference || patch_type_ == Type::kDataBimgRelRo || @@ -305,12 +326,14 @@ class LinkerPatch { uint32_t method_idx_; // Method index for Call/Method patches. uint32_t type_idx_; // Type index for Type patches. uint32_t string_idx_; // String index for String patches. + uint32_t proto_idx_; // Proto index for MethodType patches. uint32_t intrinsic_data_; // Data for IntrinsicObjects. uint32_t entrypoint_offset_; // Entrypoint offset in the Thread object. uint32_t baker_custom_value1_; static_assert(sizeof(method_idx_) == sizeof(cmp1_), "needed by relational operators"); static_assert(sizeof(type_idx_) == sizeof(cmp1_), "needed by relational operators"); static_assert(sizeof(string_idx_) == sizeof(cmp1_), "needed by relational operators"); + static_assert(sizeof(proto_idx_) == sizeof(cmp1_), "needed by relational operators"); static_assert(sizeof(intrinsic_data_) == sizeof(cmp1_), "needed by relational operators"); static_assert(sizeof(baker_custom_value1_) == sizeof(cmp1_), "needed by relational operators"); }; |