@Override public LayoutDecisionMap getDecisions(LayoutDecisionMap copyingIn) { return impl.getDecisions(copyingIn); }
@Override public Iterable<BuildDependency> getDependencies(Map<Element, LayoutDecisionMap> decisions) { return impl.getDependencies(decisions); }
@Override public int getMemSize(Map<Element, LayoutDecisionMap> alreadyDecided) { return impl.getMemSize(alreadyDecided); }
@Override public int getOrDecideVaddr(Map<Element, LayoutDecisionMap> alreadyDecided, int vaddrHint) { /* * We have to be careful about our vaddr. If we're the first section in the text segment, we * should have vaddr at least 4096. Why? to reproduce what the native tools do. */ int implVaddr = impl.getOrDecideVaddr(alreadyDecided, vaddrHint); // we should already have decided our file offset Object offsetObj = alreadyDecided.get(this).getDecidedValue(LayoutDecision.Kind.OFFSET); assert offsetObj != null; assert offsetObj instanceof Integer; // test for the special case if (getSegment() == getOwner().getSegments().iterator().next() && getSegment().get(0) == this) { if (implVaddr < getOwner().getPageSize()) { // choose the next congruent return ObjectFile.nextIntegerMultipleWithCongruence(getOwner().getPageSize(), impl.getAlignment(), (int) offsetObj, getOwner().getPageSize()); } } return implVaddr; }
int implOffset = impl.getOrDecideOffset(alreadyDecided, offsetHint); Segment ourSegment = getSegment(); Segment prevSegment = null; if (implOffset < getOwner().getPageSize()) { return ObjectFile.nextIntegerMultipleWithCongruence(getOwner().getPageSize(), impl.getAlignment(), implOffset, getOwner().getPageSize());
public void setImpl(ElementImpl impl) { assert impl == null; this.impl = impl; // Use READ to signify a loadable section if (impl.isLoadable()) { flags.add(PECoffSectionFlag.READ); } else { flags.remove(PECoffSectionFlag.READ); } }
@Override public boolean isReferenceable() { if (getImpl() == this) { return isLoadable(); } return getImpl().isReferenceable(); }
@Override public int getOrDecideSize(Map<Element, LayoutDecisionMap> alreadyDecided, int sizeHint) { return impl.getOrDecideSize(alreadyDecided, sizeHint); }
@Override public byte[] getOrDecideContent(Map<Element, LayoutDecisionMap> alreadyDecided, byte[] contentHint) { return impl.getOrDecideContent(alreadyDecided, contentHint); }
@Override public int getOrDecideVaddr(Map<Element, LayoutDecisionMap> alreadyDecided, int vaddrHint) { return impl.getOrDecideVaddr(alreadyDecided, vaddrHint); }
@Override public int getOrDecideOffset(Map<Element, LayoutDecisionMap> alreadyDecided, int offsetHint) { return impl.getOrDecideOffset(alreadyDecided, offsetHint); }
public void setImpl(ElementImpl impl) { assert impl == null; this.impl = impl; if (impl.isLoadable()) { flags.add(ELFSectionFlag.ALLOC); } else { flags.remove(ELFSectionFlag.ALLOC); } }
@Override public boolean isReferenceable() { if (getImpl() == this) { return isLoadable(); } return getImpl().isReferenceable(); }
@Override public int getOrDecideSize(Map<Element, LayoutDecisionMap> alreadyDecided, int sizeHint) { return impl.getOrDecideSize(alreadyDecided, sizeHint); }
@Override public byte[] getOrDecideContent(Map<Element, LayoutDecisionMap> alreadyDecided, byte[] contentHint) { return impl.getOrDecideContent(alreadyDecided, contentHint); }
@Override public int getOrDecideVaddr(Map<Element, LayoutDecisionMap> alreadyDecided, int vaddrHint) { return impl.getOrDecideVaddr(alreadyDecided, vaddrHint); }
@Override public int getOrDecideOffset(Map<Element, LayoutDecisionMap> alreadyDecided, int offsetHint) { return impl.getOrDecideOffset(alreadyDecided, offsetHint); }
@Override public boolean isLoadable() { /* * NOTE the following distinction: whether a section is loadable is a property of the * section (abstractly). (This is also why we we delegate to the impl.) * * Whether an PECoff section is explicitly loaded is a property of the PHT contents. The * code in ObjectFile WILL assign vaddrs for all loadable sections! So * isExplicitlyLoaded is actually irrelevant. */ // if we are our own impl, just go with what the flags say if (getImpl() == this) { return flags.contains(PECoffSectionFlag.READ); } // otherwise, the impl and flags should agree boolean implIsLoadable = getImpl().isLoadable(); // our constructors and impl-setter are responsible for syncing flags with impl assert implIsLoadable == flags.contains(PECoffSectionFlag.READ); return implIsLoadable; }
@Override public boolean isReferenceable() { if (getImpl() == this) { return isLoadable(); } return getImpl().isReferenceable(); }
@Override public int getOrDecideSize(Map<Element, LayoutDecisionMap> alreadyDecided, int sizeHint) { return impl.getOrDecideSize(alreadyDecided, sizeHint); }