Use trampolines for calls to helpers

This is an ARM specific optimization to the compiler
that uses trampoline islands to make calls to runtime
helper functions.  The intention is to reduce the size
of the generated code (by 2 bytes per call) without
affecting performance.

By default this is on when generating an OAT file.  It is
off when compiling to memory.

To switch this off in dex2oat, use the command line option:
--no-helper-trampolines

Enhances disassembler to print the trampoline entry on the
BL instruction like this:

0xb6a850c0: f7ffff9e  bl      -196 (0xb6a85000)  ; pTestSuspend

Bug: 12607709
Change-Id: I9202bdb7cf21252ad807bd48701f1f6ce8e3d0fe
diff --git a/compiler/compiled_method.h b/compiler/compiled_method.h
index 90ae6ee..d9edc6b 100644
--- a/compiler/compiled_method.h
+++ b/compiler/compiled_method.h
@@ -23,6 +23,7 @@
 #include "instruction_set.h"
 #include "utils.h"
 #include "UniquePtr.h"
+#include "final_relocations.h"
 
 namespace llvm {
   class Function;
@@ -31,12 +32,14 @@
 namespace art {
 
 class CompilerDriver;
+class OatWriter;
 
 class CompiledCode {
  public:
   // For Quick to supply an code blob
   CompiledCode(CompilerDriver* compiler_driver, InstructionSet instruction_set,
-               const std::vector<uint8_t>& quick_code);
+               const std::vector<uint8_t>& quick_code,
+               const FinalRelocations* relocations);
 
   // For Portable to supply an ELF object
   CompiledCode(CompilerDriver* compiler_driver, InstructionSet instruction_set,
@@ -78,6 +81,13 @@
   const std::vector<uint32_t>& GetOatdataOffsetsToCompliledCodeOffset() const;
   void AddOatdataOffsetToCompliledCodeOffset(uint32_t offset);
 
+  // Apply all the final relocations to the quick code sequence.
+  void ApplyFinalRelocations(const OatWriter *writer, uint32_t address) {
+    if (final_relocations_.get() != nullptr) {
+      final_relocations_->Apply(&(*quick_code_)[0], writer, address);
+    }
+  }
+
  private:
   CompilerDriver* const compiler_driver_;
 
@@ -97,6 +107,10 @@
   // OatWriter and then used by the ElfWriter to add relocations so
   // that MCLinker can update the values to the location in the linked .so.
   std::vector<uint32_t> oatdata_offsets_to_compiled_code_offset_;
+
+  // Set of relocations to apply as the final pass.  This happens
+  // only when the the final oat file addresses are known.
+  UniquePtr<const FinalRelocations> final_relocations_;
 };
 
 class CompiledMethod : public CompiledCode {
@@ -111,7 +125,8 @@
                  const std::vector<uint8_t>& mapping_table,
                  const std::vector<uint8_t>& vmap_table,
                  const std::vector<uint8_t>& native_gc_map,
-                 const std::vector<uint8_t>* cfi_info);
+                 const std::vector<uint8_t>* cfi_info,
+                 const FinalRelocations* relocations);
 
   // Constructs a CompiledMethod for the QuickJniCompiler.
   CompiledMethod(CompilerDriver& driver,