summaryrefslogtreecommitdiff
path: root/dexlayout/dex_ir_builder.cc
diff options
context:
space:
mode:
Diffstat (limited to 'dexlayout/dex_ir_builder.cc')
-rw-r--r--dexlayout/dex_ir_builder.cc49
1 files changed, 46 insertions, 3 deletions
diff --git a/dexlayout/dex_ir_builder.cc b/dexlayout/dex_ir_builder.cc
index 947d3d5297..433f1003a8 100644
--- a/dexlayout/dex_ir_builder.cc
+++ b/dexlayout/dex_ir_builder.cc
@@ -170,6 +170,7 @@ class BuilderMaps {
void AddAnnotationsFromMapListSection(const DexFile& dex_file,
uint32_t start_offset,
uint32_t count);
+ void AddHiddenapiClassDataFromMapListSection(const DexFile& dex_file, uint32_t offset);
void CheckAndSetRemainingOffsets(const DexFile& dex_file, const Options& options);
@@ -408,6 +409,10 @@ void BuilderMaps::CheckAndSetRemainingOffsets(const DexFile& dex_file, const Opt
case DexFile::kDexTypeAnnotationsDirectoryItem:
header_->AnnotationsDirectoryItems().SetOffset(item->offset_);
break;
+ case DexFile::kDexTypeHiddenapiClassData:
+ header_->HiddenapiClassDatas().SetOffset(item->offset_);
+ AddHiddenapiClassDataFromMapListSection(dex_file, item->offset_);
+ break;
default:
LOG(ERROR) << "Unknown map list item type.";
}
@@ -624,6 +629,44 @@ void BuilderMaps::AddAnnotationsFromMapListSection(const DexFile& dex_file,
}
}
+void BuilderMaps::AddHiddenapiClassDataFromMapListSection(const DexFile& dex_file,
+ uint32_t offset) {
+ const DexFile::HiddenapiClassData* hiddenapi_class_data =
+ dex_file.GetHiddenapiClassDataAtOffset(offset);
+ DCHECK(hiddenapi_class_data == dex_file.GetHiddenapiClassData());
+
+ for (auto& class_def : header_->ClassDefs()) {
+ uint32_t index = class_def->GetIndex();
+ ClassData* class_data = class_def->GetClassData();
+ const uint8_t* ptr = hiddenapi_class_data->GetFlagsPointer(index);
+
+ std::unique_ptr<HiddenapiFlagsMap> flags = nullptr;
+ if (ptr != nullptr) {
+ DCHECK(class_data != nullptr);
+ flags = std::make_unique<HiddenapiFlagsMap>();
+ for (const dex_ir::FieldItem& field : *class_data->StaticFields()) {
+ flags->emplace(&field, DecodeUnsignedLeb128(&ptr));
+ }
+ for (const dex_ir::FieldItem& field : *class_data->InstanceFields()) {
+ flags->emplace(&field, DecodeUnsignedLeb128(&ptr));
+ }
+ for (const dex_ir::MethodItem& method : *class_data->DirectMethods()) {
+ flags->emplace(&method, DecodeUnsignedLeb128(&ptr));
+ }
+ for (const dex_ir::MethodItem& method : *class_data->VirtualMethods()) {
+ flags->emplace(&method, DecodeUnsignedLeb128(&ptr));
+ }
+ }
+
+ CreateAndAddIndexedItem(header_->HiddenapiClassDatas(),
+ header_->HiddenapiClassDatas().GetOffset() +
+ hiddenapi_class_data->flags_offset_[index],
+ index,
+ class_def.get(),
+ std::move(flags));
+ }
+}
+
AnnotationItem* BuilderMaps::CreateAnnotationItem(const DexFile& dex_file,
const DexFile::AnnotationItem* annotation) {
const uint8_t* const start_data = reinterpret_cast<const uint8_t*>(annotation);
@@ -908,13 +951,13 @@ ClassData* BuilderMaps::CreateClassData(const DexFile& dex_file,
FieldItemVector* static_fields = new FieldItemVector();
for (const ClassAccessor::Field& field : accessor.GetStaticFields()) {
FieldId* field_item = header_->FieldIds()[field.GetIndex()];
- uint32_t access_flags = field.GetRawAccessFlags();
+ uint32_t access_flags = field.GetAccessFlags();
static_fields->emplace_back(access_flags, field_item);
}
FieldItemVector* instance_fields = new FieldItemVector();
for (const ClassAccessor::Field& field : accessor.GetInstanceFields()) {
FieldId* field_item = header_->FieldIds()[field.GetIndex()];
- uint32_t access_flags = field.GetRawAccessFlags();
+ uint32_t access_flags = field.GetAccessFlags();
instance_fields->emplace_back(access_flags, field_item);
}
// Direct methods.
@@ -1180,7 +1223,7 @@ void BuilderMaps::ReadEncodedValue(const DexFile& dex_file,
MethodItem BuilderMaps::GenerateMethodItem(const DexFile& dex_file,
const ClassAccessor::Method& method) {
MethodId* method_id = header_->MethodIds()[method.GetIndex()];
- uint32_t access_flags = method.GetRawAccessFlags();
+ uint32_t access_flags = method.GetAccessFlags();
const DexFile::CodeItem* disk_code_item = method.GetCodeItem();
// Temporary hack to prevent incorrectly deduping code items if they have the same offset since
// they may have different debug info streams.