Lines Matching refs:dex
28 namespace dex { namespace
30 Reader::Reader(const dex::u1* image, size_t size) : image_(image), size_(size) { in Reader()
32 header_ = ptr<dex::Header>(0); in Reader()
37 dex_ir_->magic = slicer::MemView(header_, sizeof(dex::Header::magic)); in Reader()
40 slicer::ArrayView<const dex::ClassDef> Reader::ClassDefs() const { in ClassDefs()
41 return section<dex::ClassDef>(header_->class_defs_off, in ClassDefs()
45 slicer::ArrayView<const dex::StringId> Reader::StringIds() const { in StringIds()
46 return section<dex::StringId>(header_->string_ids_off, in StringIds()
50 slicer::ArrayView<const dex::TypeId> Reader::TypeIds() const { in TypeIds()
51 return section<dex::TypeId>(header_->type_ids_off, in TypeIds()
55 slicer::ArrayView<const dex::FieldId> Reader::FieldIds() const { in FieldIds()
56 return section<dex::FieldId>(header_->field_ids_off, in FieldIds()
60 slicer::ArrayView<const dex::MethodId> Reader::MethodIds() const { in MethodIds()
61 return section<dex::MethodId>(header_->method_ids_off, in MethodIds()
65 slicer::ArrayView<const dex::ProtoId> Reader::ProtoIds() const { in ProtoIds()
66 return section<dex::ProtoId>(header_->proto_ids_off, in ProtoIds()
70 slicer::ArrayView<const dex::MethodHandle> Reader::MethodHandles() const { in MethodHandles()
71 const dex::MapList* ml = DexMapList(); in MethodHandles()
73 slicer::ArrayView<const dex::MethodHandle> ret; in MethodHandles()
78 const dex::MapItem* mi = nullptr; in MethodHandles()
80 if(ml->list[i].type == dex::kMethodHandleItem){ in MethodHandles()
87 slicer::ArrayView<const dex::MethodHandle> ret; in MethodHandles()
91 return section<dex::MethodHandle>(mi->offset, mi->size); in MethodHandles()
94 const dex::MapList* Reader::DexMapList() const { in DexMapList()
95 return dataPtr<dex::MapList>(header_->map_off); in DexMapList()
98 const char* Reader::GetStringMUTF8(dex::u4 index) const { in GetStringMUTF8()
99 if (index == dex::kNoIndex) { in GetStringMUTF8()
102 const dex::u1* strData = GetStringData(index); in GetStringMUTF8()
103 dex::ReadULeb128(&strData); in GetStringMUTF8()
114 void Reader::CreateClassIr(dex::u4 index) { in CreateClassIr()
121 dex::u4 Reader::FindClassIndex(const char* class_descriptor) const { in FindClassIndex()
124 for (dex::u4 i = 0; i < classes.size(); ++i) { in FindClassIndex()
131 return dex::kNoIndex; in FindClassIndex()
146 ir::Class* Reader::GetClass(dex::u4 index) { in GetClass()
147 SLICER_CHECK_NE(index, dex::kNoIndex); in GetClass()
163 ir::Type* Reader::GetType(dex::u4 index) { in GetType()
164 SLICER_CHECK_NE(index, dex::kNoIndex); in GetType()
180 ir::FieldDecl* Reader::GetFieldDecl(dex::u4 index) { in GetFieldDecl()
181 SLICER_CHECK_NE(index, dex::kNoIndex); in GetFieldDecl()
195 ir::MethodHandle* Reader::GetMethodHandle(dex::u4 index){ in GetMethodHandle()
196 SLICER_CHECK_NE(index, dex::kNoIndex); in GetMethodHandle()
213 ir::MethodDecl* Reader::GetMethodDecl(dex::u4 index) { in GetMethodDecl()
214 SLICER_CHECK_NE(index, dex::kNoIndex); in GetMethodDecl()
230 ir::Proto* Reader::GetProto(dex::u4 index) { in GetProto()
231 SLICER_CHECK_NE(index, dex::kNoIndex); in GetProto()
247 ir::String* Reader::GetString(dex::u4 index) { in GetString()
248 SLICER_CHECK_NE(index, dex::kNoIndex); in GetString()
262 ir::Class* Reader::ParseClass(dex::u4 index) { in ParseClass()
273 if (dex_class_def.superclass_idx != dex::kNoIndex) { in ParseClass()
277 if (dex_class_def.source_file_idx != dex::kNoIndex) { in ParseClass()
282 const dex::u1* class_data = dataPtr<dex::u1>(dex_class_def.class_data_off); in ParseClass()
284 dex::u4 static_fields_count = dex::ReadULeb128(&class_data); in ParseClass()
285 dex::u4 instance_fields_count = dex::ReadULeb128(&class_data); in ParseClass()
286 dex::u4 direct_methods_count = dex::ReadULeb128(&class_data); in ParseClass()
287 dex::u4 virtual_methods_count = dex::ReadULeb128(&class_data); in ParseClass()
289 dex::u4 base_index = dex::kNoIndex; in ParseClass()
290 for (dex::u4 i = 0; i < static_fields_count; ++i) { in ParseClass()
295 base_index = dex::kNoIndex; in ParseClass()
296 for (dex::u4 i = 0; i < instance_fields_count; ++i) { in ParseClass()
301 base_index = dex::kNoIndex; in ParseClass()
302 for (dex::u4 i = 0; i < direct_methods_count; ++i) { in ParseClass()
307 base_index = dex::kNoIndex; in ParseClass()
308 for (dex::u4 i = 0; i < virtual_methods_count; ++i) { in ParseClass()
321 ir::AnnotationsDirectory* Reader::ExtractAnnotations(dex::u4 offset) { in ExtractAnnotations()
333 auto dex_annotations = dataPtr<dex::AnnotationsDirectoryItem>(offset); in ExtractAnnotations()
338 const dex::u1* ptr = reinterpret_cast<const dex::u1*>(dex_annotations + 1); in ExtractAnnotations()
340 for (dex::u4 i = 0; i < dex_annotations->fields_size; ++i) { in ExtractAnnotations()
344 for (dex::u4 i = 0; i < dex_annotations->methods_size; ++i) { in ExtractAnnotations()
348 for (dex::u4 i = 0; i < dex_annotations->parameters_size; ++i) { in ExtractAnnotations()
355 ir::Annotation* Reader::ExtractAnnotationItem(dex::u4 offset) { in ExtractAnnotationItem()
361 auto dexAnnotationItem = dataPtr<dex::AnnotationItem>(offset); in ExtractAnnotationItem()
362 const dex::u1* ptr = dexAnnotationItem->annotation; in ExtractAnnotationItem()
369 ir::AnnotationSet* Reader::ExtractAnnotationSet(dex::u4 offset) { in ExtractAnnotationSet()
381 auto dex_annotation_set = dataPtr<dex::AnnotationSetItem>(offset); in ExtractAnnotationSet()
382 for (dex::u4 i = 0; i < dex_annotation_set->size; ++i) { in ExtractAnnotationSet()
391 ir::AnnotationSetRefList* Reader::ExtractAnnotationSetRefList(dex::u4 offset) { in ExtractAnnotationSetRefList()
394 auto dex_annotation_set_ref_list = dataPtr<dex::AnnotationSetRefList>(offset); in ExtractAnnotationSetRefList()
397 for (dex::u4 i = 0; i < dex_annotation_set_ref_list->size; ++i) { in ExtractAnnotationSetRefList()
398 dex::u4 entry_offset = dex_annotation_set_ref_list->list[i].annotations_off; in ExtractAnnotationSetRefList()
409 ir::FieldAnnotation* Reader::ParseFieldAnnotation(const dex::u1** pptr) { in ParseFieldAnnotation()
410 auto dex_field_annotation = reinterpret_cast<const dex::FieldAnnotationsItem*>(*pptr); in ParseFieldAnnotation()
419 *pptr += sizeof(dex::FieldAnnotationsItem); in ParseFieldAnnotation()
423 ir::MethodAnnotation* Reader::ParseMethodAnnotation(const dex::u1** pptr) { in ParseMethodAnnotation()
425 reinterpret_cast<const dex::MethodAnnotationsItem*>(*pptr); in ParseMethodAnnotation()
434 *pptr += sizeof(dex::MethodAnnotationsItem); in ParseMethodAnnotation()
438 ir::ParamAnnotation* Reader::ParseParamAnnotation(const dex::u1** pptr) { in ParseParamAnnotation()
440 reinterpret_cast<const dex::ParameterAnnotationsItem*>(*pptr); in ParseParamAnnotation()
449 *pptr += sizeof(dex::ParameterAnnotationsItem); in ParseParamAnnotation()
453 ir::EncodedField* Reader::ParseEncodedField(const dex::u1** pptr, dex::u4* base_index) { in ParseEncodedField()
456 auto field_index = dex::ReadULeb128(pptr); in ParseEncodedField()
457 SLICER_CHECK_NE(field_index, dex::kNoIndex); in ParseEncodedField()
458 if (*base_index != dex::kNoIndex) { in ParseEncodedField()
465 ir_encoded_field->access_flags = dex::ReadULeb128(pptr); in ParseEncodedField()
473 static T ParseIntValue(const dex::u1** pptr, size_t size) { in ParseIntValue()
496 static T ParseFloatValue(const dex::u1** pptr, size_t size) { in ParseFloatValue()
502 for (dex::u1* p = reinterpret_cast<dex::u1*>(&value) + start_byte; size > 0; in ParseFloatValue()
509 ir::EncodedValue* Reader::ParseEncodedValue(const dex::u1** pptr) { in ParseEncodedValue()
514 dex::u1 header = *(*pptr)++; in ParseEncodedValue()
515 dex::u1 type = header & dex::kEncodedValueTypeMask; in ParseEncodedValue()
516 dex::u1 arg = header >> dex::kEncodedValueArgShift; in ParseEncodedValue()
521 case dex::kEncodedByte: in ParseEncodedValue()
525 case dex::kEncodedShort: in ParseEncodedValue()
529 case dex::kEncodedChar: in ParseEncodedValue()
533 case dex::kEncodedInt: in ParseEncodedValue()
537 case dex::kEncodedLong: in ParseEncodedValue()
541 case dex::kEncodedFloat: in ParseEncodedValue()
545 case dex::kEncodedDouble: in ParseEncodedValue()
549 case dex::kEncodedString: { in ParseEncodedValue()
550 dex::u4 index = ParseIntValue<dex::u4>(pptr, arg + 1); in ParseEncodedValue()
554 case dex::kEncodedType: { in ParseEncodedValue()
555 dex::u4 index = ParseIntValue<dex::u4>(pptr, arg + 1); in ParseEncodedValue()
559 case dex::kEncodedField: { in ParseEncodedValue()
560 dex::u4 index = ParseIntValue<dex::u4>(pptr, arg + 1); in ParseEncodedValue()
564 case dex::kEncodedMethod: { in ParseEncodedValue()
565 dex::u4 index = ParseIntValue<dex::u4>(pptr, arg + 1); in ParseEncodedValue()
569 case dex::kEncodedEnum: { in ParseEncodedValue()
570 dex::u4 index = ParseIntValue<dex::u4>(pptr, arg + 1); in ParseEncodedValue()
574 case dex::kEncodedArray: in ParseEncodedValue()
579 case dex::kEncodedAnnotation: in ParseEncodedValue()
584 case dex::kEncodedNull: in ParseEncodedValue()
588 case dex::kEncodedBoolean: in ParseEncodedValue()
602 ir::Annotation* Reader::ParseAnnotation(const dex::u1** pptr) { in ParseAnnotation()
605 dex::u4 type_index = dex::ReadULeb128(pptr); in ParseAnnotation()
606 dex::u4 elements_count = dex::ReadULeb128(pptr); in ParseAnnotation()
609 ir_annotation->visibility = dex::kVisibilityEncoded; in ParseAnnotation()
611 for (dex::u4 i = 0; i < elements_count; ++i) { in ParseAnnotation()
614 ir_element->name = GetString(dex::ReadULeb128(pptr)); in ParseAnnotation()
623 ir::EncodedArray* Reader::ParseEncodedArray(const dex::u1** pptr) { in ParseEncodedArray()
626 dex::u4 count = dex::ReadULeb128(pptr); in ParseEncodedArray()
627 for (dex::u4 i = 0; i < count; ++i) { in ParseEncodedArray()
634 ir::EncodedArray* Reader::ExtractEncodedArray(dex::u4 offset) { in ExtractEncodedArray()
642 auto ptr = dataPtr<dex::u1>(offset); in ExtractEncodedArray()
648 ir::DebugInfo* Reader::ExtractDebugInfo(dex::u4 offset) { in ExtractDebugInfo()
654 const dex::u1* ptr = dataPtr<dex::u1>(offset); in ExtractDebugInfo()
656 ir_debug_info->line_start = dex::ReadULeb128(&ptr); in ExtractDebugInfo()
659 dex::u4 param_count = dex::ReadULeb128(&ptr); in ExtractDebugInfo()
660 for (dex::u4 i = 0; i < param_count; ++i) { in ExtractDebugInfo()
661 dex::u4 name_index = dex::ReadULeb128(&ptr) - 1; in ExtractDebugInfo()
663 (name_index == dex::kNoIndex) ? nullptr : GetString(name_index); in ExtractDebugInfo()
674 dex::u1 opcode = 0; in ExtractDebugInfo()
675 while ((opcode = *ptr++) != dex::DBG_END_SEQUENCE) { in ExtractDebugInfo()
677 case dex::DBG_ADVANCE_PC: in ExtractDebugInfo()
679 dex::ReadULeb128(&ptr); in ExtractDebugInfo()
682 case dex::DBG_ADVANCE_LINE: in ExtractDebugInfo()
684 dex::ReadSLeb128(&ptr); in ExtractDebugInfo()
687 case dex::DBG_START_LOCAL: { in ExtractDebugInfo()
689 dex::ReadULeb128(&ptr); in ExtractDebugInfo()
691 dex::u4 name_index = dex::ReadULeb128(&ptr) - 1; in ExtractDebugInfo()
692 if (name_index != dex::kNoIndex) { in ExtractDebugInfo()
696 dex::u4 type_index = dex::ReadULeb128(&ptr) - 1; in ExtractDebugInfo()
697 if (type_index != dex::kNoIndex) { in ExtractDebugInfo()
702 case dex::DBG_START_LOCAL_EXTENDED: { in ExtractDebugInfo()
704 dex::ReadULeb128(&ptr); in ExtractDebugInfo()
706 dex::u4 name_index = dex::ReadULeb128(&ptr) - 1; in ExtractDebugInfo()
707 if (name_index != dex::kNoIndex) { in ExtractDebugInfo()
711 dex::u4 type_index = dex::ReadULeb128(&ptr) - 1; in ExtractDebugInfo()
712 if (type_index != dex::kNoIndex) { in ExtractDebugInfo()
716 dex::u4 sig_index = dex::ReadULeb128(&ptr) - 1; in ExtractDebugInfo()
717 if (sig_index != dex::kNoIndex) { in ExtractDebugInfo()
722 case dex::DBG_END_LOCAL: in ExtractDebugInfo()
723 case dex::DBG_RESTART_LOCAL: in ExtractDebugInfo()
725 dex::ReadULeb128(&ptr); in ExtractDebugInfo()
728 case dex::DBG_SET_FILE: { in ExtractDebugInfo()
729 dex::u4 name_index = dex::ReadULeb128(&ptr) - 1; in ExtractDebugInfo()
730 if (name_index != dex::kNoIndex) { in ExtractDebugInfo()
742 ir::Code* Reader::ExtractCode(dex::u4 offset) { in ExtractCode()
749 auto dex_code = dataPtr<dex::Code>(offset); in ExtractCode()
758 slicer::ArrayView<const dex::u2>(dex_code->insns, dex_code->insns_size); in ExtractCode()
769 dex::u4 aligned_count = (dex_code->insns_size + 1) / 2 * 2; in ExtractCode()
771 reinterpret_cast<const dex::TryBlock*>(dex_code->insns + aligned_count); in ExtractCode()
773 reinterpret_cast<const dex::u1*>(tries + dex_code->tries_size); in ExtractCode()
776 slicer::ArrayView<const dex::TryBlock>(tries, dex_code->tries_size); in ExtractCode()
781 dex::u4 handlers_count = dex::ReadULeb128(&ptr); in ExtractCode()
784 for (dex::u4 handler_index = 0; handler_index < handlers_count; ++handler_index) { in ExtractCode()
785 int catch_count = dex::ReadSLeb128(&ptr); in ExtractCode()
788 dex::u4 type_index = dex::ReadULeb128(&ptr); in ExtractCode()
792 dex::ReadULeb128(&ptr); in ExtractCode()
797 dex::ReadULeb128(&ptr); in ExtractCode()
809 ir::EncodedMethod* Reader::ParseEncodedMethod(const dex::u1** pptr, dex::u4* base_index) { in ParseEncodedMethod()
812 auto method_index = dex::ReadULeb128(pptr); in ParseEncodedMethod()
813 SLICER_CHECK_NE(method_index, dex::kNoIndex); in ParseEncodedMethod()
814 if (*base_index != dex::kNoIndex) { in ParseEncodedMethod()
821 ir_encoded_method->access_flags = dex::ReadULeb128(pptr); in ParseEncodedMethod()
823 dex::u4 code_offset = dex::ReadULeb128(pptr); in ParseEncodedMethod()
832 ir::Type* Reader::ParseType(dex::u4 index) { in ParseType()
842 ir::FieldDecl* Reader::ParseFieldDecl(dex::u4 index) { in ParseFieldDecl()
854 ir::MethodHandle* Reader::ParseMethodHandle(dex::u4 index){ in ParseMethodHandle()
870 ir::MethodDecl* Reader::ParseMethodDecl(dex::u4 index) { in ParseMethodDecl()
882 ir::TypeList* Reader::ExtractTypeList(dex::u4 offset) { in ExtractTypeList()
892 auto dex_type_list = dataPtr<dex::TypeList>(offset); in ExtractTypeList()
895 for (dex::u4 i = 0; i < dex_type_list->size; ++i) { in ExtractTypeList()
903 ir::Proto* Reader::ParseProto(dex::u4 index) { in ParseProto()
918 ir::String* Reader::ParseString(dex::u4 index) { in ParseString()
923 dex::ReadULeb128(&cstr); in ParseString()
935 void Reader::ParseInstructions(slicer::ArrayView<const dex::u2> code) { in ParseInstructions()
936 const dex::u2* ptr = code.begin(); in ParseInstructions()
938 auto dex_instr = dex::DecodeInstruction(ptr); in ParseInstructions()
940 dex::u4 index = dex::kNoIndex; in ParseInstructions()
941 dex::u4 index2 = dex::kNoIndex; in ParseInstructions()
942 switch (dex::GetFormatFromOpcode(dex_instr.opcode)) { in ParseInstructions()
943 case dex::k20bc: in ParseInstructions()
944 case dex::k21c: in ParseInstructions()
945 case dex::k31c: in ParseInstructions()
946 case dex::k35c: in ParseInstructions()
947 case dex::k3rc: in ParseInstructions()
951 case dex::k45cc: in ParseInstructions()
952 case dex::k4rcc: in ParseInstructions()
957 case dex::k22c: in ParseInstructions()
966 case dex::kIndexStringRef: in ParseInstructions()
970 case dex::kIndexTypeRef: in ParseInstructions()
974 case dex::kIndexFieldRef: in ParseInstructions()
978 case dex::kIndexMethodRef: in ParseInstructions()
982 case dex::kIndexMethodAndProtoRef: in ParseInstructions()
987 case dex::kIndexMethodHandleRef: in ParseInstructions()
995 auto isize = dex::GetWidthFromBytecode(ptr); in ParseInstructions()
1004 SLICER_CHECK_GT(size_, dex::Header::kV40Size); in ValidateHeader()
1011 header_->header_size == dex::Header::kV40Size || in ValidateHeader()
1012 header_->header_size == dex::Header::kV41Size); in ValidateHeader()
1013 SLICER_CHECK_EQ(header_->endian_tag, dex::kEndianConstant); in ValidateHeader()
1054 auto map_list = ptr<dex::MapList>(header_->map_off); in ValidateHeader()
1057 sizeof(dex::u4) + sizeof(dex::MapItem) * map_list->size; in ValidateHeader()