Line data Source code
1 : //===- lib/MC/MCObjectWriter.cpp - MCObjectWriter implementation ----------===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 :
10 : #include "llvm/MC/MCObjectWriter.h"
11 : #include "llvm/MC/MCAssembler.h"
12 : #include "llvm/MC/MCExpr.h"
13 : #include "llvm/MC/MCFragment.h"
14 : #include "llvm/MC/MCSymbol.h"
15 :
16 : using namespace llvm;
17 :
18 : MCObjectWriter::~MCObjectWriter() = default;
19 :
20 7078388 : bool MCObjectWriter::isSymbolRefDifferenceFullyResolved(
21 : const MCAssembler &Asm, const MCSymbolRefExpr *A, const MCSymbolRefExpr *B,
22 : bool InSet) const {
23 : // Modified symbol references cannot be resolved.
24 7078388 : if (A->getKind() != MCSymbolRefExpr::VK_None ||
25 7078370 : B->getKind() != MCSymbolRefExpr::VK_None)
26 : return false;
27 :
28 7078370 : const MCSymbol &SA = A->getSymbol();
29 7078370 : const MCSymbol &SB = B->getSymbol();
30 14156740 : if (SA.isUndefined() || SB.isUndefined())
31 0 : return false;
32 :
33 7078370 : if (!SA.getFragment() || !SB.getFragment())
34 0 : return false;
35 :
36 7078370 : return isSymbolRefDifferenceFullyResolvedImpl(Asm, SA, SB, InSet);
37 : }
38 :
39 7078367 : bool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
40 : const MCAssembler &Asm, const MCSymbol &A, const MCSymbol &B,
41 : bool InSet) const {
42 7078367 : return isSymbolRefDifferenceFullyResolvedImpl(Asm, A, *B.getFragment(), InSet,
43 7078367 : false);
44 : }
45 :
46 9881808 : bool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
47 : const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB,
48 : bool InSet, bool IsPCRel) const {
49 : const MCSection &SecA = SymA.getSection();
50 9881808 : const MCSection &SecB = *FB.getParent();
51 : // On ELF and COFF A - B is absolute if A and B are in the same section.
52 9881808 : return &SecA == &SecB;
53 : }
|