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