diff options
author | 2022-01-11 14:07:00 +0000 | |
---|---|---|
committer | 2022-01-28 02:21:28 +0000 | |
commit | 2d62882195eb97358fb8a1fd147d52a36cd3c581 (patch) | |
tree | ebe435e6b50c3f0a3c5ce197e666481285510a93 /compiler/optimizing | |
parent | b484f0fa93d9388741b806640cd91f85debdf142 (diff) |
Add bss support for inlining BCP DexFiles for single image
This CL extends the .bss metadata section to allow for BCP methods
to be inlined into other DexFiles, even when requiring a bss entry.
Test: ART tests, compiling and launching top 100 apps
Bug: 154012332
Change-Id: Ib541e69a9c52b3fad003d286a5b57060770e1395
Diffstat (limited to 'compiler/optimizing')
-rw-r--r-- | compiler/optimizing/code_generator_arm64.cc | 4 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_arm_vixl.cc | 4 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_x86.cc | 8 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_x86_64.cc | 8 | ||||
-rw-r--r-- | compiler/optimizing/inliner.cc | 11 | ||||
-rw-r--r-- | compiler/optimizing/sharpening.cc | 1 |
6 files changed, 25 insertions, 11 deletions
diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc index 548b2d42bd..037c81a696 100644 --- a/compiler/optimizing/code_generator_arm64.cc +++ b/compiler/optimizing/code_generator_arm64.cc @@ -283,7 +283,9 @@ class LoadClassSlowPathARM64 : public SlowPathCodeARM64 { InvokeRuntimeCallingConvention calling_convention; if (must_resolve_type) { DCHECK(IsSameDexFile(cls_->GetDexFile(), arm64_codegen->GetGraph()->GetDexFile()) || - arm64_codegen->GetCompilerOptions().WithinOatFile(&cls_->GetDexFile())); + arm64_codegen->GetCompilerOptions().WithinOatFile(&cls_->GetDexFile()) || + ContainsElement(Runtime::Current()->GetClassLinker()->GetBootClassPath(), + &cls_->GetDexFile())); dex::TypeIndex type_index = cls_->GetTypeIndex(); __ Mov(calling_convention.GetRegisterAt(0).W(), type_index.index_); if (cls_->NeedsAccessCheck()) { diff --git a/compiler/optimizing/code_generator_arm_vixl.cc b/compiler/optimizing/code_generator_arm_vixl.cc index bafa89fd32..2104f79eaf 100644 --- a/compiler/optimizing/code_generator_arm_vixl.cc +++ b/compiler/optimizing/code_generator_arm_vixl.cc @@ -531,7 +531,9 @@ class LoadClassSlowPathARMVIXL : public SlowPathCodeARMVIXL { InvokeRuntimeCallingConventionARMVIXL calling_convention; if (must_resolve_type) { DCHECK(IsSameDexFile(cls_->GetDexFile(), arm_codegen->GetGraph()->GetDexFile()) || - arm_codegen->GetCompilerOptions().WithinOatFile(&cls_->GetDexFile())); + arm_codegen->GetCompilerOptions().WithinOatFile(&cls_->GetDexFile()) || + ContainsElement(Runtime::Current()->GetClassLinker()->GetBootClassPath(), + &cls_->GetDexFile())); dex::TypeIndex type_index = cls_->GetTypeIndex(); __ Mov(calling_convention.GetRegisterAt(0), type_index.index_); if (cls_->NeedsAccessCheck()) { diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index 0efd51cedf..4025684bda 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -290,7 +290,9 @@ class LoadClassSlowPathX86 : public SlowPathCode { InvokeRuntimeCallingConvention calling_convention; if (must_resolve_type) { DCHECK(IsSameDexFile(cls_->GetDexFile(), x86_codegen->GetGraph()->GetDexFile()) || - x86_codegen->GetCompilerOptions().WithinOatFile(&cls_->GetDexFile())); + x86_codegen->GetCompilerOptions().WithinOatFile(&cls_->GetDexFile()) || + ContainsElement(Runtime::Current()->GetClassLinker()->GetBootClassPath(), + &cls_->GetDexFile())); dex::TypeIndex type_index = cls_->GetTypeIndex(); __ movl(calling_convention.GetRegisterAt(0), Immediate(type_index.index_)); if (cls_->NeedsAccessCheck()) { @@ -5474,7 +5476,9 @@ void CodeGeneratorX86::RecordMethodBssEntryPatch(HInvoke* invoke) { ? invoke->AsInvokeInterface()->GetSpecialInputIndex() : invoke->AsInvokeStaticOrDirect()->GetSpecialInputIndex(); DCHECK(IsSameDexFile(GetGraph()->GetDexFile(), *invoke->GetMethodReference().dex_file) || - GetCompilerOptions().WithinOatFile(invoke->GetMethodReference().dex_file)); + GetCompilerOptions().WithinOatFile(invoke->GetMethodReference().dex_file) || + ContainsElement(Runtime::Current()->GetClassLinker()->GetBootClassPath(), + invoke->GetMethodReference().dex_file)); HX86ComputeBaseMethodAddress* method_address = invoke->InputAt(index)->AsX86ComputeBaseMethodAddress(); // Add the patch entry and bind its label at the end of the instruction. diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc index 1016652478..bbbaa82851 100644 --- a/compiler/optimizing/code_generator_x86_64.cc +++ b/compiler/optimizing/code_generator_x86_64.cc @@ -274,7 +274,9 @@ class LoadClassSlowPathX86_64 : public SlowPathCode { // Custom calling convention: RAX serves as both input and output. if (must_resolve_type) { DCHECK(IsSameDexFile(cls_->GetDexFile(), x86_64_codegen->GetGraph()->GetDexFile()) || - x86_64_codegen->GetCompilerOptions().WithinOatFile(&cls_->GetDexFile())); + x86_64_codegen->GetCompilerOptions().WithinOatFile(&cls_->GetDexFile()) || + ContainsElement(Runtime::Current()->GetClassLinker()->GetBootClassPath(), + &cls_->GetDexFile())); dex::TypeIndex type_index = cls_->GetTypeIndex(); __ movl(CpuRegister(RAX), Immediate(type_index.index_)); if (cls_->NeedsAccessCheck()) { @@ -1241,7 +1243,9 @@ void CodeGeneratorX86_64::RecordBootImageMethodPatch(HInvoke* invoke) { void CodeGeneratorX86_64::RecordMethodBssEntryPatch(HInvoke* invoke) { DCHECK(IsSameDexFile(GetGraph()->GetDexFile(), *invoke->GetMethodReference().dex_file) || - GetCompilerOptions().WithinOatFile(invoke->GetMethodReference().dex_file)); + GetCompilerOptions().WithinOatFile(invoke->GetMethodReference().dex_file) || + ContainsElement(Runtime::Current()->GetClassLinker()->GetBootClassPath(), + invoke->GetMethodReference().dex_file)); method_bss_entry_patches_.emplace_back(invoke->GetMethodReference().dex_file, invoke->GetMethodReference().index); __ Bind(&method_bss_entry_patches_.back().label); diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc index ac71ce9b8a..4cce9f7607 100644 --- a/compiler/optimizing/inliner.cc +++ b/compiler/optimizing/inliner.cc @@ -1717,11 +1717,12 @@ static bool CanEncodeInlinedMethodInStackMap(const DexFile& outer_dex_file, // Inline across dexfiles if the callee's DexFile is: // 1) in the bootclasspath, or if (callee->GetDeclaringClass()->GetClassLoader() == nullptr) { - // There are cases in which the BCP DexFiles are within the OatFile as far as the compiler - // options are concerned, but they have their own OatWriter (and therefore not in the same - // OatFile). Then, we request the BSS check for all BCP DexFiles. - // TODO(solanes): Add .bss support for BCP. - *out_needs_bss_check = true; + // In multi-image, each BCP DexFile has their own OatWriter. Since they don't cooperate with + // each other, we request the BSS check for them. + // TODO(solanes): Add .bss support for BCP multi-image. + const bool is_multi_image = codegen->GetCompilerOptions().IsBootImage() || + codegen->GetCompilerOptions().IsBootImageExtension(); + *out_needs_bss_check = is_multi_image; return true; } diff --git a/compiler/optimizing/sharpening.cc b/compiler/optimizing/sharpening.cc index 1fd76f7029..eb4c20690f 100644 --- a/compiler/optimizing/sharpening.cc +++ b/compiler/optimizing/sharpening.cc @@ -283,6 +283,7 @@ HLoadClass::LoadKind HSharpening::ComputeLoadClassKind( // We actually cannot reference this class, we're forced to bail. // We cannot reference this class with Bss, as the entrypoint will lookup the class // in the caller's dex file, but that dex file does not reference the class. + // TODO(solanes, 154012332): Add the support for the cross-dex cases. return HLoadClass::LoadKind::kInvalid; } } |