package com.oracle.objectfile.macho;
import java.util.HashSet;
import java.util.Map;
import com.oracle.objectfile.BuildDependency;
import com.oracle.objectfile.LayoutDecision;
import com.oracle.objectfile.LayoutDecisionMap;
import com.oracle.objectfile.ObjectFile;
import com.oracle.objectfile.ObjectFile.Element;
import com.oracle.objectfile.io.OutputAssembler;
import com.oracle.objectfile.macho.MachOObjectFile.LoadCommandKind;
class DyLdInfoCommand extends MachOObjectFile.LoadCommand {
@SuppressWarnings("unused") private final MachOObjectFile owner;
ExportTrieElement export;
DyLdInfoCommand(String name, MachOObjectFile owner, boolean reqDyld) {
owner.super(name, reqDyld ? LoadCommandKind.DYLD_INFO_ONLY : LoadCommandKind.DYLD_INFO);
this.owner = owner;
export = new ExportTrieElement(name, owner);
}
@Override
public Iterable<BuildDependency> getDependencies(Map<Element, LayoutDecisionMap> decisions) {
HashSet<BuildDependency> deps = ObjectFile.minimalDependencies(decisions, this);
LayoutDecision ourContent = decisions.get(this).getDecision(LayoutDecision.Kind.CONTENT);
deps.add(BuildDependency.createOrGet(ourContent, decisions.get(export).getDecision(LayoutDecision.Kind.OFFSET)));
deps.add(BuildDependency.createOrGet(ourContent, decisions.get(export).getDecision(LayoutDecision.Kind.SIZE)));
return deps;
}
@Override
public int getOrDecideSize(Map<Element, LayoutDecisionMap> alreadyDecided, int sizeHint) {
return getWrittenSize(10 * 4);
}
@Override
protected void writePayload(OutputAssembler out, Map<Element, LayoutDecisionMap> alreadyDecided) {
out.write4Byte(0);
out.write4Byte(0);
out.write4Byte(0);
out.write4Byte(0);
out.write4Byte(0);
out.write4Byte(0);
out.write4Byte(0);
out.write4Byte(0);
out.write4Byte((int) alreadyDecided.get(export).getDecidedValue(LayoutDecision.Kind.OFFSET));
out.write4Byte((int) alreadyDecided.get(export).getDecidedValue(LayoutDecision.Kind.SIZE));
}
}