10b57cec5SDimitry Andric //===- lib/MC/MCObjectWriter.cpp - MCObjectWriter implementation ----------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "llvm/MC/MCObjectWriter.h" 10*0fca6ea1SDimitry Andric #include "llvm/MC/MCAssembler.h" 110b57cec5SDimitry Andric #include "llvm/MC/MCExpr.h" 120b57cec5SDimitry Andric #include "llvm/MC/MCFragment.h" 130b57cec5SDimitry Andric #include "llvm/MC/MCSymbol.h" 1481ad6265SDimitry Andric namespace llvm { 1581ad6265SDimitry Andric class MCSection; 1681ad6265SDimitry Andric } 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric using namespace llvm; 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric MCObjectWriter::~MCObjectWriter() = default; 210b57cec5SDimitry Andric 22*0fca6ea1SDimitry Andric void MCObjectWriter::reset() { 23*0fca6ea1SDimitry Andric FileNames.clear(); 24*0fca6ea1SDimitry Andric AddrsigSyms.clear(); 25*0fca6ea1SDimitry Andric EmitAddrsigSection = false; 26*0fca6ea1SDimitry Andric SubsectionsViaSymbols = false; 27*0fca6ea1SDimitry Andric CGProfile.clear(); 28*0fca6ea1SDimitry Andric } 29*0fca6ea1SDimitry Andric 300b57cec5SDimitry Andric bool MCObjectWriter::isSymbolRefDifferenceFullyResolved( 310b57cec5SDimitry Andric const MCAssembler &Asm, const MCSymbolRefExpr *A, const MCSymbolRefExpr *B, 320b57cec5SDimitry Andric bool InSet) const { 330b57cec5SDimitry Andric // Modified symbol references cannot be resolved. 340b57cec5SDimitry Andric if (A->getKind() != MCSymbolRefExpr::VK_None || 350b57cec5SDimitry Andric B->getKind() != MCSymbolRefExpr::VK_None) 360b57cec5SDimitry Andric return false; 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric const MCSymbol &SA = A->getSymbol(); 390b57cec5SDimitry Andric const MCSymbol &SB = B->getSymbol(); 4006c3fb27SDimitry Andric assert(!SA.isUndefined() && !SB.isUndefined()); 41*0fca6ea1SDimitry Andric MCFragment *FB = SB.getFragment(); 42*0fca6ea1SDimitry Andric if (!FB || !SA.getFragment()) 430b57cec5SDimitry Andric return false; 440b57cec5SDimitry Andric 45*0fca6ea1SDimitry Andric return isSymbolRefDifferenceFullyResolvedImpl(Asm, SA, *FB, InSet, /*IsPCRel=*/false); 460b57cec5SDimitry Andric } 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric bool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl( 490b57cec5SDimitry Andric const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB, 500b57cec5SDimitry Andric bool InSet, bool IsPCRel) const { 510b57cec5SDimitry Andric const MCSection &SecA = SymA.getSection(); 520b57cec5SDimitry Andric const MCSection &SecB = *FB.getParent(); 530b57cec5SDimitry Andric // On ELF and COFF A - B is absolute if A and B are in the same section. 540b57cec5SDimitry Andric return &SecA == &SecB; 550b57cec5SDimitry Andric } 56*0fca6ea1SDimitry Andric 57*0fca6ea1SDimitry Andric void MCObjectWriter::addFileName(MCAssembler &Asm, StringRef FileName) { 58*0fca6ea1SDimitry Andric FileNames.emplace_back(std::string(FileName), Asm.Symbols.size()); 59*0fca6ea1SDimitry Andric } 60