inline void ARMELFStreamer::SwitchToEHSection(const char *Prefix, unsigned Type, unsigned Flags, SectionKind Kind, const MCSymbol &Fn) { const MCSectionELF &FnSection = static_cast<const MCSectionELF &>(Fn.getSection()); // Create the name for new section StringRef FnSecName(FnSection.getSectionName()); SmallString<128> EHSecName(Prefix); if (FnSecName != ".text") { EHSecName += FnSecName; } // Get .ARM.extab or .ARM.exidx section const MCSectionELF *EHSection = NULL; if (const MCSymbol *Group = FnSection.getGroup()) { EHSection = getContext().getELFSection( EHSecName, Type, Flags | ELF::SHF_GROUP, Kind, FnSection.getEntrySize(), Group->getName()); } else { EHSection = getContext().getELFSection(EHSecName, Type, Flags, Kind); } assert(EHSection); // Switch to .ARM.extab or .ARM.exidx section SwitchSection(EHSection); EmitCodeAlignment(4, 0); }
static bool canUseLocalRelocation(const MCSectionMachO &Section, const MCSymbol &Symbol, unsigned Log2Size) { // Debug info sections can use local relocations. if (Section.hasAttribute(MachO::S_ATTR_DEBUG)) return true; // Otherwise, only pointer sized relocations are supported. if (Log2Size != 3) return false; // But only if they don't point to a few forbidden sections. if (!Symbol.isInSection()) return true; const MCSectionMachO &RefSec = cast<MCSectionMachO>(Symbol.getSection()); if (RefSec.getType() == MachO::S_CSTRING_LITERALS) return false; if (RefSec.getSegmentName() == "__DATA" && RefSec.getSectionName() == "__cfstring") return false; if (RefSec.getSegmentName() == "__DATA" && RefSec.getSectionName() == "__objc_classrefs") return false; return true; }
static bool canUseLocalRelocation(const MCSectionMachO &Section, const MCSymbol &Symbol, unsigned Log2Size) { // Debug info sections can use local relocations. if (Section.hasAttribute(MachO::S_ATTR_DEBUG)) return true; // Otherwise, only pointer sized relocations are supported. if (Log2Size != 3) return false; // But only if they don't point to a few forbidden sections. if (!Symbol.isInSection()) return true; const MCSectionMachO &RefSec = cast<MCSectionMachO>(Symbol.getSection()); if (RefSec.getType() == MachO::S_CSTRING_LITERALS) return false; if (RefSec.getSegmentName() == "__DATA" && RefSec.getSectionName() == "__objc_classrefs") return false; // FIXME: ld64 currently handles internal pointer-sized relocations // incorrectly (applying the addend twice). We should be able to return true // unconditionally by this point when that's fixed. return false; }
bool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl( const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB, bool InSet, bool IsPCRel) const { const MCSection &SecA = SymA.getSection(); const MCSection &SecB = *FB.getParent(); // On ELF and COFF A - B is absolute if A and B are in the same section. return &SecA == &SecB; }
/// EmitValue - Emit label value. /// void DIELocList::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const { DwarfDebug *DD = AP->getDwarfDebug(); MCSymbol *Label = DD->getDebugLocEntries()[Index].Label; if (AP->MAI->doesDwarfUseRelocationsAcrossSections() && !DD->useSplitDwarf()) AP->emitSectionOffset(Label); else AP->EmitLabelDifference(Label, Label->getSection().getBeginSymbol(), 4); }
bool MCAssembler::isSymbolLinkerVisible(const MCSymbol &Symbol) const { // Non-temporary labels should always be visible to the linker. if (!Symbol.isTemporary()) return true; // Absolute temporary labels are never visible. if (!Symbol.isInSection()) return false; // Otherwise, check if the section requires symbols even for temporary labels. return getBackend().doesSectionRequireSymbols(Symbol.getSection()); }
void BTFDebug::beginFunctionImpl(const MachineFunction *MF) { auto *SP = MF->getFunction().getSubprogram(); auto *Unit = SP->getUnit(); if (Unit->getEmissionKind() == DICompileUnit::NoDebug) { SkipInstruction = true; return; } SkipInstruction = false; // Collect all types locally referenced in this function. // Use RetainedNodes so we can collect all argument names // even if the argument is not used. std::unordered_map<uint32_t, StringRef> FuncArgNames; for (const DINode *DN : SP->getRetainedNodes()) { if (const auto *DV = dyn_cast<DILocalVariable>(DN)) { visitTypeEntry(DV->getType().resolve()); // Collect function arguments for subprogram func type. uint32_t Arg = DV->getArg(); if (Arg) FuncArgNames[Arg] = DV->getName(); } } // Construct subprogram func proto type. uint32_t ProtoTypeId; visitSubroutineType(SP->getType(), true, FuncArgNames, ProtoTypeId); // Construct subprogram func type auto FuncTypeEntry = llvm::make_unique<BTFTypeFunc>(SP->getName(), ProtoTypeId); uint32_t FuncTypeId = addType(std::move(FuncTypeEntry)); // Construct funcinfo and the first lineinfo for the function. MCSymbol *FuncLabel = Asm->getFunctionBegin(); BTFFuncInfo FuncInfo; FuncInfo.Label = FuncLabel; FuncInfo.TypeId = FuncTypeId; if (FuncLabel->isInSection()) { MCSection &Section = FuncLabel->getSection(); const MCSectionELF *SectionELF = dyn_cast<MCSectionELF>(&Section); assert(SectionELF && "Null section for Function Label"); SecNameOff = addString(SectionELF->getSectionName()); } else { SecNameOff = addString(".text"); } FuncInfoTable[SecNameOff].push_back(FuncInfo); }