1205407Srdivacky//===- lib/MC/MCObjectWriter.cpp - MCObjectWriter implementation ----------===// 2205407Srdivacky// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6205407Srdivacky// 7205407Srdivacky//===----------------------------------------------------------------------===// 8205407Srdivacky 9321369Sdim#include "llvm/MC/MCObjectWriter.h" 10218893Sdim#include "llvm/MC/MCAssembler.h" 11218893Sdim#include "llvm/MC/MCExpr.h" 12321369Sdim#include "llvm/MC/MCFragment.h" 13218893Sdim#include "llvm/MC/MCSymbol.h" 14205407Srdivacky 15205407Srdivackyusing namespace llvm; 16205407Srdivacky 17321369SdimMCObjectWriter::~MCObjectWriter() = default; 18218893Sdim 19288943Sdimbool MCObjectWriter::isSymbolRefDifferenceFullyResolved( 20288943Sdim const MCAssembler &Asm, const MCSymbolRefExpr *A, const MCSymbolRefExpr *B, 21288943Sdim bool InSet) const { 22218893Sdim // Modified symbol references cannot be resolved. 23218893Sdim if (A->getKind() != MCSymbolRefExpr::VK_None || 24218893Sdim B->getKind() != MCSymbolRefExpr::VK_None) 25218893Sdim return false; 26218893Sdim 27218893Sdim const MCSymbol &SA = A->getSymbol(); 28218893Sdim const MCSymbol &SB = B->getSymbol(); 29288943Sdim if (SA.isUndefined() || SB.isUndefined()) 30218893Sdim return false; 31218893Sdim 32288943Sdim if (!SA.getFragment() || !SB.getFragment()) 33234353Sdim return false; 34218893Sdim 35296417Sdim return isSymbolRefDifferenceFullyResolvedImpl(Asm, SA, SB, InSet); 36218893Sdim} 37218893Sdim 38288943Sdimbool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl( 39296417Sdim const MCAssembler &Asm, const MCSymbol &A, const MCSymbol &B, 40296417Sdim bool InSet) const { 41296417Sdim return isSymbolRefDifferenceFullyResolvedImpl(Asm, A, *B.getFragment(), InSet, 42296417Sdim false); 43296417Sdim} 44296417Sdim 45296417Sdimbool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl( 46288943Sdim const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB, 47288943Sdim bool InSet, bool IsPCRel) const { 48288943Sdim const MCSection &SecA = SymA.getSection(); 49288943Sdim const MCSection &SecB = *FB.getParent(); 50218893Sdim // On ELF and COFF A - B is absolute if A and B are in the same section. 51218893Sdim return &SecA == &SecB; 52218893Sdim} 53