Home | History | Annotate | Download | only in optimizing
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ART_COMPILER_OPTIMIZING_INTRINSIC_OBJECTS_H_
     18 #define ART_COMPILER_OPTIMIZING_INTRINSIC_OBJECTS_H_
     19 
     20 #include "base/bit_field.h"
     21 #include "base/bit_utils.h"
     22 #include "base/mutex.h"
     23 
     24 namespace art {
     25 
     26 class ClassLinker;
     27 template <class MirrorType> class ObjPtr;
     28 class MemberOffset;
     29 class Thread;
     30 
     31 namespace mirror {
     32 class Object;
     33 template <class T> class ObjectArray;
     34 }  // namespace mirror
     35 
     36 class IntrinsicObjects {
     37  public:
     38   enum class PatchType {
     39     kIntegerValueOfObject,
     40     kIntegerValueOfArray,
     41 
     42     kLast = kIntegerValueOfArray
     43   };
     44 
     45   static uint32_t EncodePatch(PatchType patch_type, uint32_t index = 0u) {
     46     DCHECK(patch_type == PatchType::kIntegerValueOfObject || index == 0u);
     47     return PatchTypeField::Encode(static_cast<uint32_t>(patch_type)) | IndexField::Encode(index);
     48   }
     49 
     50   static PatchType DecodePatchType(uint32_t intrinsic_data) {
     51     return static_cast<PatchType>(PatchTypeField::Decode(intrinsic_data));
     52   }
     53 
     54   static uint32_t DecodePatchIndex(uint32_t intrinsic_data) {
     55     return IndexField::Decode(intrinsic_data);
     56   }
     57 
     58   static ObjPtr<mirror::ObjectArray<mirror::Object>> AllocateBootImageLiveObjects(
     59       Thread* self,
     60       ClassLinker* class_linker) REQUIRES_SHARED(Locks::mutator_lock_);
     61 
     62   // Functions for retrieving data for Integer.valueOf().
     63   static ObjPtr<mirror::ObjectArray<mirror::Object>> GetIntegerValueOfCache(
     64       ObjPtr<mirror::ObjectArray<mirror::Object>> boot_image_live_objects)
     65       REQUIRES_SHARED(Locks::mutator_lock_);
     66   static ObjPtr<mirror::Object> GetIntegerValueOfObject(
     67       ObjPtr<mirror::ObjectArray<mirror::Object>> boot_image_live_objects,
     68       uint32_t index) REQUIRES_SHARED(Locks::mutator_lock_);
     69   static MemberOffset GetIntegerValueOfArrayDataOffset(
     70       ObjPtr<mirror::ObjectArray<mirror::Object>> boot_image_live_objects)
     71       REQUIRES_SHARED(Locks::mutator_lock_);
     72 
     73  private:
     74   static constexpr size_t kPatchTypeBits =
     75       MinimumBitsToStore(static_cast<uint32_t>(PatchType::kLast));
     76   static constexpr size_t kIndexBits = BitSizeOf<uint32_t>() - kPatchTypeBits;
     77   using PatchTypeField = BitField<uint32_t, 0u, kPatchTypeBits>;
     78   using IndexField = BitField<uint32_t, kPatchTypeBits, kIndexBits>;
     79 };
     80 
     81 }  // namespace art
     82 
     83 #endif  // ART_COMPILER_OPTIMIZING_INTRINSIC_OBJECTS_H_
     84