diff options
| author | 2016-03-30 13:23:58 +0100 | |
|---|---|---|
| committer | 2016-06-21 15:11:57 +0100 | |
| commit | dbb7f5bef10138ade0fb202da1d61f562b2df649 (patch) | |
| tree | f0aa4b390c534b215a6e000c865783cdd9852353 /compiler/compiled_method.h | |
| parent | b94b5706f0b8e2e1c7e1db22274f9f4bae0c4b5a (diff) | |
Improve HLoadClass code generation.
For classes in the boot image, use either direct pointers
or PC-relative addresses. For other classes, use PC-relative
access to the dex cache arrays for AOT and direct address of
the type's dex cache slot for JIT.
For aosp_flounder-userdebug:
- 32-bit boot.oat: -252KiB (-0.3%)
- 64-bit boot.oat: -412KiB (-0.4%)
- 32-bit dalvik cache total: -392KiB (-0.4%)
- 64-bit dalvik-cache total: -2312KiB (-1.0%)
(contains more files than the 32-bit dalvik cache)
For aosp_flounder-userdebug forced to compile PIC:
- 32-bit boot.oat: -124KiB (-0.2%)
- 64-bit boot.oat: -420KiB (-0.5%)
- 32-bit dalvik cache total: -136KiB (-0.1%)
- 64-bit dalvik-cache total: -1136KiB (-0.5%)
(contains more files than the 32-bit dalvik cache)
Bug: 27950288
Change-Id: I4da991a4b7e53c63c92558b97923d18092acf139
Diffstat (limited to 'compiler/compiled_method.h')
| -rw-r--r-- | compiler/compiled_method.h | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/compiler/compiled_method.h b/compiler/compiled_method.h index 9479ff38be..2a81804f64 100644 --- a/compiler/compiled_method.h +++ b/compiler/compiled_method.h @@ -174,6 +174,7 @@ class LinkerPatch { kCall, kCallRelative, // NOTE: Actual patching is instruction_set-dependent. kType, + kTypeRelative, // NOTE: Actual patching is instruction_set-dependent. kString, kStringRelative, // NOTE: Actual patching is instruction_set-dependent. kDexCacheArray, // NOTE: Actual patching is instruction_set-dependent. @@ -215,6 +216,16 @@ class LinkerPatch { return patch; } + static LinkerPatch RelativeTypePatch(size_t literal_offset, + const DexFile* target_dex_file, + uint32_t pc_insn_offset, + uint32_t target_type_idx) { + LinkerPatch patch(literal_offset, Type::kTypeRelative, target_dex_file); + patch.type_idx_ = target_type_idx; + patch.pc_insn_offset_ = pc_insn_offset; + return patch; + } + static LinkerPatch StringPatch(size_t literal_offset, const DexFile* target_dex_file, uint32_t target_string_idx) { @@ -258,6 +269,7 @@ class LinkerPatch { bool IsPcRelative() const { switch (GetType()) { case Type::kCallRelative: + case Type::kTypeRelative: case Type::kStringRelative: case Type::kDexCacheArray: return true; @@ -274,12 +286,12 @@ class LinkerPatch { } const DexFile* TargetTypeDexFile() const { - DCHECK(patch_type_ == Type::kType); + DCHECK(patch_type_ == Type::kType || patch_type_ == Type::kTypeRelative); return target_dex_file_; } uint32_t TargetTypeIndex() const { - DCHECK(patch_type_ == Type::kType); + DCHECK(patch_type_ == Type::kType || patch_type_ == Type::kTypeRelative); return type_idx_; } @@ -304,7 +316,9 @@ class LinkerPatch { } uint32_t PcInsnOffset() const { - DCHECK(patch_type_ == Type::kStringRelative || patch_type_ == Type::kDexCacheArray); + DCHECK(patch_type_ == Type::kTypeRelative || + patch_type_ == Type::kStringRelative || + patch_type_ == Type::kDexCacheArray); return pc_insn_offset_; } |