virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
raw_ostream &OS) const = 0;
- /// isBaseAddressKnownZero - Return true if we know that this section will
- /// get a base address of zero. In cases where we know that this is true we
- /// can emit section offsets as direct references to avoid a subtraction
- /// from the base of the section, saving a relocation.
- virtual bool isBaseAddressKnownZero() const {
- return false;
- }
-
// UseCodeAlign - Return true if a .align directive should use
// "optimized nops" to fill instead of 0s.
virtual bool UseCodeAlign() const = 0;
virtual bool UseCodeAlign() const;
virtual bool isVirtualSection() const;
- /// isBaseAddressKnownZero - We know that non-allocatable sections (like
- /// debug info) have a base of zero.
- virtual bool isBaseAddressKnownZero() const {
- return (getFlags() & ELF::SHF_ALLOC) == 0;
- }
-
static bool classof(const MCSection *S) {
return S->getVariant() == SV_ELF;
}
assert((!Label->isInSection() || &Label->getSection() == &Section) &&
"Section offset using wrong section base for label");
- // If the section in question will end up with an address of 0 anyway, we can
- // just emit an absolute reference to save a relocation.
- if (Section.isBaseAddressKnownZero()) {
- OutStreamer.EmitSymbolValue(Label, 4, 0/*AddrSpace*/);
- return;
- }
-
// Otherwise, emit it as a label difference from the start of the section.
EmitLabelDifference(Label, SectionLabel, 4);
}