summaryrefslogtreecommitdiffstats
path: root/compiler/driver/compiler_driver.cc
diff options
context:
space:
mode:
authorDave Allison <dallison@google.com>2014-04-08 23:08:12 +0000
committerDave Allison <dallison@google.com>2014-04-09 13:18:07 -0700
commitf9487c039efb4112616d438593a2ab02792e0304 (patch)
tree95f88645bec774d3e8df170bd0f40e4cd0911a34 /compiler/driver/compiler_driver.cc
parentb24b0e2bb128532945b31ea62715776d7751f84d (diff)
downloadart-f9487c039efb4112616d438593a2ab02792e0304.zip
art-f9487c039efb4112616d438593a2ab02792e0304.tar.gz
art-f9487c039efb4112616d438593a2ab02792e0304.tar.bz2
Revert "Revert "Use trampolines for calls to helpers""
This reverts commit 081f73e888b3c246cf7635db37b7f1105cf1a2ff. Change-Id: Ibd777f8ce73cf8ed6c4cb81d50bf6437ac28cb61 Conflicts: compiler/dex/quick/mir_to_lir.h
Diffstat (limited to 'compiler/driver/compiler_driver.cc')
-rw-r--r--compiler/driver/compiler_driver.cc41
1 files changed, 41 insertions, 0 deletions
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc
index b66082d..ba15d2a 100644
--- a/compiler/driver/compiler_driver.cc
+++ b/compiler/driver/compiler_driver.cc
@@ -22,6 +22,8 @@
#include <vector>
#include <unistd.h>
+#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"
@@ -504,6 +506,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();
}
@@ -615,6 +618,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;
@@ -1238,6 +1245,27 @@ 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 kArm:
+ // Intentional fall through.
+ 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,
@@ -2071,4 +2099,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