[pool-manager] Integration with aarch32.

Key points of this patch:
- renames LabelBase to LocationBase
- makes the Location class derive from LoctionBase
- moves the code for Location, Label and RawLiteral/Literal to a shared file
- moves ReferenceInfo out of Assembler
- removes all the old veneer pool and literal pool code
- updates the macro assembler to use the new pool manager
- updates existing tests that expect a certain behaviour from the pool manager
- adds new tests for corner cases that came up during integration
- adds tests for issues that the new pool manager addresses (literal_and_veneer_interaction_*)

Change-Id: Ied81401d40f88cb988ff95e85fe832851f171f77
diff --git a/src/aarch32/assembler-aarch32.cc b/src/aarch32/assembler-aarch32.cc
index 0d23884..98a2b93 100644
--- a/src/aarch32/assembler-aarch32.cc
+++ b/src/aarch32/assembler-aarch32.cc
@@ -1,4 +1,4 @@
-// Copyright 2015, VIXL authors
+// Copyright 2017, VIXL authors
 // All rights reserved.
 //
 // Redistribution and use in source and binary forms, with or without
@@ -80,67 +80,24 @@
 
 
 void Assembler::BindHelper(Label* label) {
-  BindLocationHelper(label);
-
-  if (label->IsInVeneerPool()) {
-    label->GetVeneerPoolManager()->RemoveLabel(label);
-  }
+  VIXL_ASSERT(!label->IsBound());
+  label->SetLocation(this, GetCursorOffset());
+  label->MarkBound();
 }
 
-
-void Assembler::BindLocationHelper(Location* location) {
-  VIXL_ASSERT(!location->IsBound());
-  location->Bind(GetCursorOffset());
-
-  for (Location::ForwardRefList::iterator ref = location->GetFirstForwardRef();
-       ref != location->GetEndForwardRef();
-       ref++) {
-    EncodeLocationFor(*ref, location);
-  }
-}
-
-
 uint32_t Assembler::Link(uint32_t instr,
                          Location* location,
                          const Location::EmitOperator& op,
-                         const struct ReferenceInfo* info) {
+                         const ReferenceInfo* info) {
   location->SetReferenced();
   if (location->IsBound()) {
     return op.Encode(instr, GetCursorOffset(), location);
   }
-  location->AddForwardRef(GetCursorOffset(), op, info->max_offset);
+  location->AddForwardRef(GetCursorOffset(), op, info);
   return instr;
 }
 
 
-void Assembler::EncodeLocationFor(const Location::ForwardReference& forward,
-                                  Location* location) {
-  const uint32_t from = forward.GetLocation();
-  const Location::EmitOperator& encoder = forward.GetEmitOperator();
-  if (encoder.IsUsingT32()) {
-    uint16_t* instr_ptr = buffer_.GetOffsetAddress<uint16_t*>(from);
-    if (Is16BitEncoding(instr_ptr[0])) {
-      // The Encode methods always deals with uint32_t types so we need
-      // to explicitely cast it.
-      uint32_t instr = static_cast<uint32_t>(instr_ptr[0]);
-      instr = encoder.Encode(instr, from, location);
-      // The Encode method should not ever set the top 16 bits.
-      VIXL_ASSERT((instr & ~0xffff) == 0);
-      instr_ptr[0] = static_cast<uint16_t>(instr);
-    } else {
-      uint32_t instr =
-          instr_ptr[1] | (static_cast<uint32_t>(instr_ptr[0]) << 16);
-      instr = encoder.Encode(instr, from, location);
-      instr_ptr[0] = static_cast<uint16_t>(instr >> 16);
-      instr_ptr[1] = static_cast<uint16_t>(instr);
-    }
-  } else {
-    uint32_t* instr_ptr = buffer_.GetOffsetAddress<uint32_t*>(from);
-    instr_ptr[0] = encoder.Encode(instr_ptr[0], from, location);
-  }
-}
-
-
 // Start of generated code.
 class Dt_L_imm6_1 : public EncodingValue {
   uint32_t type_;
@@ -1798,216 +1755,189 @@
   }
 }
 
-static const struct Assembler::ReferenceInfo kAdrT1Info =
-    {k16BitT32InstructionSizeInBytes,
-     0,     // Min offset.
-     1020,  // Max offset.
-     4,     // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kAdrT3Info =
-    {k32BitT32InstructionSizeInBytes,
-     -4095,  // Min offset.
-     4095,   // Max offset.
-     1,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kAdrA1Info =
-    {kA32InstructionSizeInBytes,
-     -256,  // Min offset.
-     256,   // Max offset.
-     1,     // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kBT1Info =
-    {k16BitT32InstructionSizeInBytes,
-     -256,  // Min offset.
-     254,   // Max offset.
-     2,     // Alignment.
-     Assembler::ReferenceInfo::kDontAlignPc};
-static const struct Assembler::ReferenceInfo kBT2Info =
-    {k16BitT32InstructionSizeInBytes,
-     -2048,  // Min offset.
-     2046,   // Max offset.
-     2,      // Alignment.
-     Assembler::ReferenceInfo::kDontAlignPc};
-static const struct Assembler::ReferenceInfo kBT3Info =
-    {k32BitT32InstructionSizeInBytes,
-     -1048576,  // Min offset.
-     1048574,   // Max offset.
-     2,         // Alignment.
-     Assembler::ReferenceInfo::kDontAlignPc};
-static const struct Assembler::ReferenceInfo kBT4Info =
-    {k32BitT32InstructionSizeInBytes,
-     -16777216,  // Min offset.
-     16777214,   // Max offset.
-     2,          // Alignment.
-     Assembler::ReferenceInfo::kDontAlignPc};
-static const struct Assembler::ReferenceInfo kBA1Info =
-    {kA32InstructionSizeInBytes,
-     -33554432,  // Min offset.
-     33554428,   // Max offset.
-     4,          // Alignment.
-     Assembler::ReferenceInfo::kDontAlignPc};
-static const struct Assembler::ReferenceInfo kBlT1Info =
-    {k32BitT32InstructionSizeInBytes,
-     -16777216,  // Min offset.
-     16777214,   // Max offset.
-     2,          // Alignment.
-     Assembler::ReferenceInfo::kDontAlignPc};
-static const struct Assembler::ReferenceInfo kBlA1Info =
-    {kA32InstructionSizeInBytes,
-     -33554432,  // Min offset.
-     33554428,   // Max offset.
-     4,          // Alignment.
-     Assembler::ReferenceInfo::kDontAlignPc};
-static const struct Assembler::ReferenceInfo kBlxT2Info =
-    {k32BitT32InstructionSizeInBytes,
-     -16777216,  // Min offset.
-     16777212,   // Max offset.
-     4,          // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kBlxA2Info =
-    {kA32InstructionSizeInBytes,
-     -33554432,  // Min offset.
-     33554430,   // Max offset.
-     2,          // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kCbnzT1Info =
+static const struct ReferenceInfo kAdrT1Info = {k16BitT32InstructionSizeInBytes,
+                                                0,     // Min offset.
+                                                1020,  // Max offset.
+                                                4,     // Alignment.
+                                                ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kAdrT3Info = {k32BitT32InstructionSizeInBytes,
+                                                -4095,  // Min offset.
+                                                4095,   // Max offset.
+                                                1,      // Alignment.
+                                                ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kAdrA1Info = {kA32InstructionSizeInBytes,
+                                                -256,  // Min offset.
+                                                256,   // Max offset.
+                                                1,     // Alignment.
+                                                ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kBT1Info = {k16BitT32InstructionSizeInBytes,
+                                              -256,  // Min offset.
+                                              254,   // Max offset.
+                                              2,     // Alignment.
+                                              ReferenceInfo::kDontAlignPc};
+static const struct ReferenceInfo kBT2Info = {k16BitT32InstructionSizeInBytes,
+                                              -2048,  // Min offset.
+                                              2046,   // Max offset.
+                                              2,      // Alignment.
+                                              ReferenceInfo::kDontAlignPc};
+static const struct ReferenceInfo kBT3Info = {k32BitT32InstructionSizeInBytes,
+                                              -1048576,  // Min offset.
+                                              1048574,   // Max offset.
+                                              2,         // Alignment.
+                                              ReferenceInfo::kDontAlignPc};
+static const struct ReferenceInfo kBT4Info = {k32BitT32InstructionSizeInBytes,
+                                              -16777216,  // Min offset.
+                                              16777214,   // Max offset.
+                                              2,          // Alignment.
+                                              ReferenceInfo::kDontAlignPc};
+static const struct ReferenceInfo kBA1Info = {kA32InstructionSizeInBytes,
+                                              -33554432,  // Min offset.
+                                              33554428,   // Max offset.
+                                              4,          // Alignment.
+                                              ReferenceInfo::kDontAlignPc};
+static const struct ReferenceInfo kBlT1Info = {k32BitT32InstructionSizeInBytes,
+                                               -16777216,  // Min offset.
+                                               16777214,   // Max offset.
+                                               2,          // Alignment.
+                                               ReferenceInfo::kDontAlignPc};
+static const struct ReferenceInfo kBlA1Info = {kA32InstructionSizeInBytes,
+                                               -33554432,  // Min offset.
+                                               33554428,   // Max offset.
+                                               4,          // Alignment.
+                                               ReferenceInfo::kDontAlignPc};
+static const struct ReferenceInfo kBlxT2Info = {k32BitT32InstructionSizeInBytes,
+                                                -16777216,  // Min offset.
+                                                16777212,   // Max offset.
+                                                4,          // Alignment.
+                                                ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kBlxA2Info = {kA32InstructionSizeInBytes,
+                                                -33554432,  // Min offset.
+                                                33554430,   // Max offset.
+                                                2,          // Alignment.
+                                                ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kCbnzT1Info =
     {k16BitT32InstructionSizeInBytes,
      0,    // Min offset.
      126,  // Max offset.
      2,    // Alignment.
-     Assembler::ReferenceInfo::kDontAlignPc};
-static const struct Assembler::ReferenceInfo kCbzT1Info =
-    {k16BitT32InstructionSizeInBytes,
-     0,    // Min offset.
-     126,  // Max offset.
-     2,    // Alignment.
-     Assembler::ReferenceInfo::kDontAlignPc};
-static const struct Assembler::ReferenceInfo kLdrT1Info =
-    {k16BitT32InstructionSizeInBytes,
-     0,     // Min offset.
-     1020,  // Max offset.
-     4,     // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kLdrT2Info =
+     ReferenceInfo::kDontAlignPc};
+static const struct ReferenceInfo kCbzT1Info = {k16BitT32InstructionSizeInBytes,
+                                                0,    // Min offset.
+                                                126,  // Max offset.
+                                                2,    // Alignment.
+                                                ReferenceInfo::kDontAlignPc};
+static const struct ReferenceInfo kLdrT1Info = {k16BitT32InstructionSizeInBytes,
+                                                0,     // Min offset.
+                                                1020,  // Max offset.
+                                                4,     // Alignment.
+                                                ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kLdrT2Info = {k32BitT32InstructionSizeInBytes,
+                                                -4095,  // Min offset.
+                                                4095,   // Max offset.
+                                                1,      // Alignment.
+                                                ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kLdrA1Info = {kA32InstructionSizeInBytes,
+                                                -4095,  // Min offset.
+                                                4095,   // Max offset.
+                                                1,      // Alignment.
+                                                ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kLdrbT1Info =
     {k32BitT32InstructionSizeInBytes,
      -4095,  // Min offset.
      4095,   // Max offset.
      1,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kLdrA1Info =
-    {kA32InstructionSizeInBytes,
-     -4095,  // Min offset.
-     4095,   // Max offset.
-     1,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kLdrbT1Info =
-    {k32BitT32InstructionSizeInBytes,
-     -4095,  // Min offset.
-     4095,   // Max offset.
-     1,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kLdrbA1Info =
-    {kA32InstructionSizeInBytes,
-     -4095,  // Min offset.
-     4095,   // Max offset.
-     1,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kLdrdT1Info =
+     ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kLdrbA1Info = {kA32InstructionSizeInBytes,
+                                                 -4095,  // Min offset.
+                                                 4095,   // Max offset.
+                                                 1,      // Alignment.
+                                                 ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kLdrdT1Info =
     {k32BitT32InstructionSizeInBytes,
      -1020,  // Min offset.
      1020,   // Max offset.
      4,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kLdrdA1Info =
-    {kA32InstructionSizeInBytes,
-     -255,  // Min offset.
-     255,   // Max offset.
-     1,     // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kLdrhT1Info =
+     ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kLdrdA1Info = {kA32InstructionSizeInBytes,
+                                                 -255,  // Min offset.
+                                                 255,   // Max offset.
+                                                 1,     // Alignment.
+                                                 ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kLdrhT1Info =
     {k32BitT32InstructionSizeInBytes,
      -4095,  // Min offset.
      4095,   // Max offset.
      1,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kLdrhA1Info =
-    {kA32InstructionSizeInBytes,
-     -255,  // Min offset.
-     255,   // Max offset.
-     1,     // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kLdrsbT1Info =
+     ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kLdrhA1Info = {kA32InstructionSizeInBytes,
+                                                 -255,  // Min offset.
+                                                 255,   // Max offset.
+                                                 1,     // Alignment.
+                                                 ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kLdrsbT1Info =
     {k32BitT32InstructionSizeInBytes,
      -4095,  // Min offset.
      4095,   // Max offset.
      1,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kLdrsbA1Info =
-    {kA32InstructionSizeInBytes,
-     -255,  // Min offset.
-     255,   // Max offset.
-     1,     // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kLdrshT1Info =
+     ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kLdrsbA1Info = {kA32InstructionSizeInBytes,
+                                                  -255,  // Min offset.
+                                                  255,   // Max offset.
+                                                  1,     // Alignment.
+                                                  ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kLdrshT1Info =
     {k32BitT32InstructionSizeInBytes,
      -4095,  // Min offset.
      4095,   // Max offset.
      1,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kLdrshA1Info =
-    {kA32InstructionSizeInBytes,
-     -255,  // Min offset.
-     255,   // Max offset.
-     1,     // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kPldT1Info =
-    {k32BitT32InstructionSizeInBytes,
-     -4095,  // Min offset.
-     4095,   // Max offset.
-     1,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kPldA1Info =
-    {kA32InstructionSizeInBytes,
-     -4095,  // Min offset.
-     4095,   // Max offset.
-     1,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kPliT3Info =
-    {k32BitT32InstructionSizeInBytes,
-     -4095,  // Min offset.
-     4095,   // Max offset.
-     1,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kPliA1Info =
-    {kA32InstructionSizeInBytes,
-     -4095,  // Min offset.
-     4095,   // Max offset.
-     1,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kVldrT1Info =
+     ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kLdrshA1Info = {kA32InstructionSizeInBytes,
+                                                  -255,  // Min offset.
+                                                  255,   // Max offset.
+                                                  1,     // Alignment.
+                                                  ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kPldT1Info = {k32BitT32InstructionSizeInBytes,
+                                                -4095,  // Min offset.
+                                                4095,   // Max offset.
+                                                1,      // Alignment.
+                                                ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kPldA1Info = {kA32InstructionSizeInBytes,
+                                                -4095,  // Min offset.
+                                                4095,   // Max offset.
+                                                1,      // Alignment.
+                                                ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kPliT3Info = {k32BitT32InstructionSizeInBytes,
+                                                -4095,  // Min offset.
+                                                4095,   // Max offset.
+                                                1,      // Alignment.
+                                                ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kPliA1Info = {kA32InstructionSizeInBytes,
+                                                -4095,  // Min offset.
+                                                4095,   // Max offset.
+                                                1,      // Alignment.
+                                                ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kVldrT1Info =
     {k32BitT32InstructionSizeInBytes,
      -1020,  // Min offset.
      1020,   // Max offset.
      4,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kVldrA1Info =
-    {kA32InstructionSizeInBytes,
-     -1020,  // Min offset.
-     1020,   // Max offset.
-     4,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kVldrT2Info =
+     ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kVldrA1Info = {kA32InstructionSizeInBytes,
+                                                 -1020,  // Min offset.
+                                                 1020,   // Max offset.
+                                                 4,      // Alignment.
+                                                 ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kVldrT2Info =
     {k32BitT32InstructionSizeInBytes,
      -1020,  // Min offset.
      1020,   // Max offset.
      4,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
-static const struct Assembler::ReferenceInfo kVldrA2Info =
-    {kA32InstructionSizeInBytes,
-     -1020,  // Min offset.
-     1020,   // Max offset.
-     4,      // Alignment.
-     Assembler::ReferenceInfo::kAlignPc};
+     ReferenceInfo::kAlignPc};
+static const struct ReferenceInfo kVldrA2Info = {kA32InstructionSizeInBytes,
+                                                 -1020,  // Min offset.
+                                                 1020,   // Max offset.
+                                                 4,      // Alignment.
+                                                 ReferenceInfo::kAlignPc};
 
 
 void Assembler::adc(Condition cond,