blob: 13a4a2c9342f481b01c88cf5f5221db889fcadcd [file] [log] [blame]
// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.dex;
import com.android.tools.r8.dex.FileWriter.MixedSectionOffsets;
import com.android.tools.r8.experimental.startup.StartupOrder;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexAnnotation;
import com.android.tools.r8.graph.DexAnnotationDirectory;
import com.android.tools.r8.graph.DexAnnotationSet;
import com.android.tools.r8.graph.DexEncodedArray;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexTypeList;
import com.android.tools.r8.graph.ParameterAnnotationsList;
import com.android.tools.r8.graph.ProgramMethod;
import java.util.Collection;
public abstract class MixedSectionLayoutStrategy {
public static MixedSectionLayoutStrategy create(
AppView<?> appView, MixedSectionOffsets mixedSectionOffsets, VirtualFile virtualFile) {
StartupOrder startupOrderForWriting;
if (virtualFile.getStartupOrder().isEmpty()) {
startupOrderForWriting = StartupOrder.empty();
} else {
assert virtualFile.getId() == 0;
startupOrderForWriting =
appView.options().getStartupOptions().isStartupLayoutOptimizationsEnabled()
? virtualFile.getStartupOrder().toStartupOrderForWriting(appView)
: StartupOrder.empty();
}
MixedSectionLayoutStrategy mixedSectionLayoutStrategy =
startupOrderForWriting.isEmpty()
? new DefaultMixedSectionLayoutStrategy(appView, mixedSectionOffsets)
: new StartupMixedSectionLayoutStrategy(
appView, mixedSectionOffsets, startupOrderForWriting, virtualFile);
return wrapForTesting(appView, mixedSectionLayoutStrategy, virtualFile);
}
private static MixedSectionLayoutStrategy wrapForTesting(
AppView<?> appView,
MixedSectionLayoutStrategy mixedSectionLayoutStrategy,
VirtualFile virtualFile) {
return appView
.testing()
.mixedSectionLayoutStrategyInspector
.apply(mixedSectionLayoutStrategy, virtualFile);
}
public abstract Collection<DexAnnotation> getAnnotationLayout();
public abstract Collection<DexAnnotationDirectory> getAnnotationDirectoryLayout();
public abstract Collection<DexAnnotationSet> getAnnotationSetLayout();
public abstract Collection<ParameterAnnotationsList> getAnnotationSetRefListLayout();
public abstract Collection<DexProgramClass> getClassDataLayout();
public abstract Collection<ProgramMethod> getCodeLayout();
public abstract Collection<DexEncodedArray> getEncodedArrayLayout();
public abstract Collection<DexString> getStringDataLayout();
public abstract Collection<DexTypeList> getTypeListLayout();
}