StackMap: Always load and store unalign.
Now that we can have a mix of Quick and Optimized code in an .oat
file, a CodeInfo object is not necessarily word aligned.
Change-Id: Ic6c5d1a2c6e20363436726a0708b0764b5a76caf
diff --git a/compiler/optimizing/stack_map_stream.h b/compiler/optimizing/stack_map_stream.h
index 63a0286..e1a5afe 100644
--- a/compiler/optimizing/stack_map_stream.h
+++ b/compiler/optimizing/stack_map_stream.h
@@ -105,8 +105,8 @@
+ ComputeStackMapsSize()
+ ComputeDexRegisterMapsSize()
+ ComputeInlineInfoSize();
- // On ARM, CodeInfo data must be 4-byte aligned.
- return RoundUp(size, kWordAlignment);
+ // Note: use RoundUp to word-size here if you want CodeInfo objects to be word aligned.
+ return size;
}
size_t ComputeStackMaskSize() const {
diff --git a/runtime/stack_map.h b/runtime/stack_map.h
index 0db589f..961772c 100644
--- a/runtime/stack_map.h
+++ b/runtime/stack_map.h
@@ -632,27 +632,27 @@
}
uint32_t GetOverallSize() const {
- return region_.Load<uint32_t>(kOverallSizeOffset);
+ return region_.LoadUnaligned<uint32_t>(kOverallSizeOffset);
}
void SetOverallSize(uint32_t size) {
- region_.Store<uint32_t>(kOverallSizeOffset, size);
+ region_.StoreUnaligned<uint32_t>(kOverallSizeOffset, size);
}
uint32_t GetStackMaskSize() const {
- return region_.Load<uint32_t>(kStackMaskSizeOffset);
+ return region_.LoadUnaligned<uint32_t>(kStackMaskSizeOffset);
}
void SetStackMaskSize(uint32_t size) {
- region_.Store<uint32_t>(kStackMaskSizeOffset, size);
+ region_.StoreUnaligned<uint32_t>(kStackMaskSizeOffset, size);
}
size_t GetNumberOfStackMaps() const {
- return region_.Load<uint32_t>(kNumberOfStackMapsOffset);
+ return region_.LoadUnaligned<uint32_t>(kNumberOfStackMapsOffset);
}
void SetNumberOfStackMaps(uint32_t number_of_stack_maps) {
- region_.Store<uint32_t>(kNumberOfStackMapsOffset, number_of_stack_maps);
+ region_.StoreUnaligned<uint32_t>(kNumberOfStackMapsOffset, number_of_stack_maps);
}
// Get the size of one stack map of this CodeInfo object, in bytes.