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; }
MCSymbol *MCStreamer::endSection(MCSection *Section) { // TODO: keep track of the last subsection so that this symbol appears in the // correct place. MCSymbol *Sym = Section->getEndSymbol(Context); if (Sym->isInSection()) return Sym; SwitchSection(Section); EmitLabel(Sym); return Sym; }
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 MCStreamer::SwitchSection(MCSection *Section, const MCExpr *Subsection) { assert(Section && "Cannot switch to a null section!"); MCSectionSubPair curSection = SectionStack.back().first; SectionStack.back().second = curSection; if (MCSectionSubPair(Section, Subsection) != curSection) { ChangeSection(Section, Subsection); SectionStack.back().first = MCSectionSubPair(Section, Subsection); assert(!Section->hasEnded() && "Section already ended"); MCSymbol *Sym = Section->getBeginSymbol(); if (Sym && !Sym->isInSection()) EmitLabel(Sym); } }
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; if (Symbol.isUsedInReloc()) return true; return false; }
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); }