Move payload data structures to dex_instruction.h.

Change-Id: Ib46aab7bac70b008bf8569e3e9e30caa31320255
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index f9a2833..2c0fef1 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -1886,35 +1886,29 @@
   DecodedInstruction dec_insn(insn);
 
   // Read the payload
-  struct PACKED Payload {
-    uint16_t ident_;
-    uint16_t elem_width_;
-    uint32_t num_elems_;
-    uint8_t data_[];
-  };
-
   int32_t payload_offset = static_cast<int32_t>(dex_pc) +
                            static_cast<int32_t>(dec_insn.vB);
 
-  Payload const* payload =
-    reinterpret_cast<Payload const*>(code_item_->insns_ + payload_offset);
+  const Instruction::ArrayDataPayload* payload =
+    reinterpret_cast<const Instruction::ArrayDataPayload*>(
+        code_item_->insns_ + payload_offset);
 
-  uint32_t size_in_bytes = payload->elem_width_ * payload->num_elems_;
+  uint32_t size_in_bytes = payload->element_width * payload->element_count;
 
   // Load and check the array
   llvm::Value* array_addr = EmitLoadDalvikReg(dec_insn.vA, kObject, kAccurate);
 
   EmitGuard_NullPointerException(dex_pc, array_addr);
 
-  if (payload->num_elems_ > 0) {
+  if (payload->element_count > 0) {
     // Test: Is array length big enough?
-    llvm::Constant* last_index = irb_.getJInt(payload->num_elems_ - 1);
+    llvm::Constant* last_index = irb_.getJInt(payload->element_count - 1);
 
     EmitGuard_ArrayIndexOutOfBoundsException(dex_pc, array_addr, last_index);
 
     // Get array data field
     llvm::Value* data_field_offset_value =
-      irb_.getPtrEquivInt(Array::DataOffset(payload->elem_width_).Int32Value());
+      irb_.getPtrEquivInt(Array::DataOffset(payload->element_width).Int32Value());
 
     llvm::Value* data_field_addr =
       irb_.CreatePtrDisp(array_addr, data_field_offset_value,
@@ -1923,7 +1917,7 @@
     // Emit payload to bitcode constant pool
     std::vector<llvm::Constant*> const_pool_data;
     for (uint32_t i = 0; i < size_in_bytes; ++i) {
-      const_pool_data.push_back(irb_.getInt8(payload->data_[i]));
+      const_pool_data.push_back(irb_.getInt8(payload->data[i]));
     }
 
     llvm::Constant* const_pool_data_array_value = llvm::ConstantArray::get(
@@ -1985,27 +1979,21 @@
 
   DecodedInstruction dec_insn(insn);
 
-  struct PACKED Payload {
-    uint16_t ident_;
-    uint16_t num_cases_;
-    int32_t first_key_;
-    int32_t targets_[];
-  };
-
   int32_t payload_offset = static_cast<int32_t>(dex_pc) +
                            static_cast<int32_t>(dec_insn.vB);
 
-  Payload const* payload =
-    reinterpret_cast<Payload const*>(code_item_->insns_ + payload_offset);
+  const Instruction::PackedSwitchPayload* payload =
+    reinterpret_cast<const Instruction::PackedSwitchPayload*>(
+        code_item_->insns_ + payload_offset);
 
   llvm::Value* value = EmitLoadDalvikReg(dec_insn.vA, kInt, kAccurate);
 
   llvm::SwitchInst* sw =
-    irb_.CreateSwitch(value, GetNextBasicBlock(dex_pc), payload->num_cases_);
+    irb_.CreateSwitch(value, GetNextBasicBlock(dex_pc), payload->case_count);
 
-  for (uint16_t i = 0; i < payload->num_cases_; ++i) {
-    sw->addCase(irb_.getInt32(payload->first_key_ + i),
-                GetBasicBlock(dex_pc + payload->targets_[i]));
+  for (uint16_t i = 0; i < payload->case_count; ++i) {
+    sw->addCase(irb_.getInt32(payload->first_key + i),
+                GetBasicBlock(dex_pc + payload->targets[i]));
   }
 }
 
@@ -2015,27 +2003,22 @@
 
   DecodedInstruction dec_insn(insn);
 
-  struct PACKED Payload {
-    uint16_t ident_;
-    uint16_t num_cases_;
-    int32_t keys_and_targets_[];
-  };
-
   int32_t payload_offset = static_cast<int32_t>(dex_pc) +
                            static_cast<int32_t>(dec_insn.vB);
 
-  Payload const* payload =
-    reinterpret_cast<Payload const*>(code_item_->insns_ + payload_offset);
+  const Instruction::SparseSwitchPayload* payload =
+    reinterpret_cast<const Instruction::SparseSwitchPayload*>(
+        code_item_->insns_ + payload_offset);
 
-  int32_t const* keys = payload->keys_and_targets_;
-  int32_t const* targets = payload->keys_and_targets_ + payload->num_cases_;
+  const int32_t* keys = payload->GetKeys();
+  const int32_t* targets = payload->GetTargets();
 
   llvm::Value* value = EmitLoadDalvikReg(dec_insn.vA, kInt, kAccurate);
 
   llvm::SwitchInst* sw =
-    irb_.CreateSwitch(value, GetNextBasicBlock(dex_pc), payload->num_cases_);
+    irb_.CreateSwitch(value, GetNextBasicBlock(dex_pc), payload->case_count);
 
-  for (size_t i = 0; i < payload->num_cases_; ++i) {
+  for (size_t i = 0; i < payload->case_count; ++i) {
     sw->addCase(irb_.getInt32(keys[i]), GetBasicBlock(dex_pc + targets[i]));
   }
 }
diff --git a/src/dex_file.h b/src/dex_file.h
index aeb7e89..29ce087 100644
--- a/src/dex_file.h
+++ b/src/dex_file.h
@@ -307,15 +307,6 @@
     DISALLOW_COPY_AND_ASSIGN(AnnotationItem);
   };
 
-  struct PACKED Payload {
-    uint16_t ident; // kPackedSwitchSignature, kSparseSwitchSignature, or kArrayDataSignature.
-    uint16_t element_width;
-    uint32_t element_count;
-    uint8_t data[];
-   private:
-    DISALLOW_COPY_AND_ASSIGN(Payload);
-  };
-
   typedef std::pair<const DexFile*, const DexFile::ClassDef*> ClassPathEntry;
   typedef std::vector<const DexFile*> ClassPath;
 
diff --git a/src/dex_instruction.h b/src/dex_instruction.h
index 278a61d..b33b001 100644
--- a/src/dex_instruction.h
+++ b/src/dex_instruction.h
@@ -38,6 +38,42 @@
     kArrayDataSignature = 0x0300,
   };
 
+  struct PACKED PackedSwitchPayload {
+    const uint16_t ident;
+    const uint16_t case_count;
+    const int32_t first_key;
+    const int32_t targets[];
+   private:
+    DISALLOW_COPY_AND_ASSIGN(PackedSwitchPayload);
+  };
+
+  struct PACKED SparseSwitchPayload {
+    const uint16_t ident;
+    const uint16_t case_count;
+    const int32_t keys_and_targets[];
+
+   public:
+    const int32_t* GetKeys() const {
+      return keys_and_targets;
+    }
+
+    const int32_t* GetTargets() const {
+      return keys_and_targets + case_count;
+    }
+
+   private:
+    DISALLOW_COPY_AND_ASSIGN(SparseSwitchPayload);
+  };
+
+  struct PACKED ArrayDataPayload {
+    const uint16_t ident;
+    const uint16_t element_width;
+    const uint32_t element_count;
+    const uint8_t data[];
+   private:
+    DISALLOW_COPY_AND_ASSIGN(ArrayDataPayload);
+  };
+
   enum Code {
 #define INSTRUCTION_ENUM(opcode, cname, p, f, r, i, a, v) cname = opcode,
 #include "dex_instruction_list.h"
diff --git a/src/oat/runtime/support_fillarray.cc b/src/oat/runtime/support_fillarray.cc
index 6f40177..7227f6b 100644
--- a/src/oat/runtime/support_fillarray.cc
+++ b/src/oat/runtime/support_fillarray.cc
@@ -35,7 +35,8 @@
  *  ubyte  data[size*width] table of data values (may contain a single-byte
  *                          padding at the end)
  */
-extern "C" int artHandleFillArrayDataFromCode(Array* array, const DexFile::Payload* payload,
+extern "C" int artHandleFillArrayDataFromCode(Array* array,
+                                              const Instruction::ArrayDataPayload* payload,
                                               Thread* self, Method** sp) {
   FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
   DCHECK_EQ(payload->ident, static_cast<uint16_t>(Instruction::kArrayDataSignature));