diff options
| author | 2014-04-07 17:34:12 +0000 | |
|---|---|---|
| committer | 2014-04-07 17:34:13 +0000 | |
| commit | 12c0273fd394d72ae93424784b1450daea417472 (patch) | |
| tree | 0410f0225424213516270a3796731d174c00d90c /compiler/driver/compiler_driver.cc | |
| parent | 1415359a4ca80a78507173103274a06cd85d223d (diff) | |
| parent | 754ddad084ccb610d0cf486f6131bdc69bae5bc6 (diff) | |
Merge "Use trampolines for calls to helpers"
Diffstat (limited to 'compiler/driver/compiler_driver.cc')
| -rw-r--r-- | compiler/driver/compiler_driver.cc | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index a241d51468..8bf3b0486a 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -24,6 +24,8 @@ #include <unistd.h> #include <utility> +#include "arch/arm/final_relocations_arm.h" +#include "base/hex_dump.h" #include "base/stl_util.h" #include "base/timing_logger.h" #include "class_linker.h" @@ -506,6 +508,7 @@ void CompilerDriver::CompileAll(jobject class_loader, UniquePtr<ThreadPool> thread_pool(new ThreadPool("Compiler driver thread pool", thread_count_ - 1)); PreCompile(class_loader, dex_files, thread_pool.get(), timings); Compile(class_loader, dex_files, thread_pool.get(), timings); + PostCompile(); if (dump_stats_) { stats_->Dump(); } @@ -617,6 +620,10 @@ void CompilerDriver::PreCompile(jobject class_loader, const std::vector<const De UpdateImageClasses(timings); } +void CompilerDriver::PostCompile() { + BuildEntrypointTrampolineCode(); +} + bool CompilerDriver::IsImageClass(const char* descriptor) const { if (!IsImage()) { return true; @@ -1240,6 +1247,25 @@ bool CompilerDriver::IsSafeCast(const DexCompilationUnit* mUnit, uint32_t dex_pc return result; } +uint32_t CompilerDriver::AddEntrypointTrampoline(uint32_t entrypoint) { + return entrypoint_trampolines_.AddEntrypoint(Thread::Current(), entrypoint); +} + + +void CompilerDriver::BuildEntrypointTrampolineCode() { + const auto& table = entrypoint_trampolines_.GetTrampolineTable(); + for (uint32_t offset : table) { + switch (instruction_set_) { + case kThumb2: + BuildArmEntrypointTrampolineCall(ThreadOffset<4>(offset)); + break; + default: + UNIMPLEMENTED(FATAL) << "No entrypoint trampolines for this architecture"; + } + } +} + + void CompilerDriver::AddCodePatch(const DexFile* dex_file, uint16_t referrer_class_def_idx, uint32_t referrer_method_idx, @@ -2150,4 +2176,17 @@ bool CompilerDriver::SkipCompilation(const std::string& method_name) { } return !compile; } + +FinalEntrypointRelocationSet* CompilerDriver::AllocateFinalEntrypointRelocationSet( + CompilationUnit* cu) const { + switch (instruction_set_) { + case kArm: + case kThumb2: + return new FinalEntrypointRelocationSetArm(this); + default: + UNIMPLEMENTED(FATAL) << "Cannot allocate FinalEntrypointRelocationSet for non-ARM"; + return nullptr; + } +} + } // namespace art |