14e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier/* 24e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier * Copyright (C) 2014 The Android Open Source Project 34e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier * 44e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 54e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier * you may not use this file except in compliance with the License. 64e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier * You may obtain a copy of the License at 74e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier * 84e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 94e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier * 104e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier * Unless required by applicable law or agreed to in writing, software 114e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 124e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier * See the License for the specific language governing permissions and 144e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier * limitations under the License. 154e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier */ 164e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier 174e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier#ifndef ART_RUNTIME_VERIFY_OBJECT_INL_H_ 184e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier#define ART_RUNTIME_VERIFY_OBJECT_INL_H_ 194e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier 204e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier#include "verify_object.h" 214e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier 224e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier#include "gc/heap.h" 234e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier#include "mirror/object-inl.h" 244e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier 254e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartiernamespace art { 264e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier 274e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartierinline void VerifyObject(mirror::Object* obj) { 284e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyObjectSupport > kVerifyObjectModeDisabled && obj != nullptr) { 294e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (kVerifyObjectSupport > kVerifyObjectModeFast) { 304e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier // Slow object verification, try the heap right away. 314e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier Runtime::Current()->GetHeap()->VerifyObjectBody(obj); 324e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } else { 334e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier // Fast object verification, only call the heap if our quick sanity tests fail. The heap will 344e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier // print the diagnostic message. 354e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier bool failed = !IsAligned<kObjectAlignment>(obj); 364e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (!failed) { 374e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier mirror::Class* c = obj->GetClass<kVerifyNone>(); 38afe4998fc15b8de093d6b282c9782d7182829e36Mathieu Chartier failed = failed || !IsAligned<kObjectAlignment>(c); 39afe4998fc15b8de093d6b282c9782d7182829e36Mathieu Chartier failed = failed || !VerifyClassClass(c); 404e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 414e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (UNLIKELY(failed)) { 424e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier Runtime::Current()->GetHeap()->VerifyObjectBody(obj); 434e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 444e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 454e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 464e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier} 474e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier 484e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartierinline bool VerifyClassClass(mirror::Class* c) { 494e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier if (UNLIKELY(c == nullptr)) { 504e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier return false; 514e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier } 524e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier // Note: We pass in flags to ensure that the accessors don't call VerifyObject. 534e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier mirror::Class* c_c = c->GetClass<kVerifyNone>(); 544e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier return c_c != nullptr && c_c == c_c->GetClass<kVerifyNone>(); 554e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier} 564e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier 574e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier} // namespace art 584e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier 594e30541a92381fb280cd0be9a1763b713ee4d64cMathieu Chartier#endif // ART_RUNTIME_VERIFY_OBJECT_INL_H_ 60