1 | //===- lib/MC/MCObjectWriter.cpp - MCObjectWriter implementation ----------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "llvm/MC/MCObjectWriter.h" |
10 | #include "llvm/MC/MCExpr.h" |
11 | #include "llvm/MC/MCFragment.h" |
12 | #include "llvm/MC/MCSymbol.h" |
13 | namespace llvm { |
14 | class MCSection; |
15 | } |
16 | |
17 | using namespace llvm; |
18 | |
19 | MCObjectWriter::~MCObjectWriter() = default; |
20 | |
21 | bool MCObjectWriter::isSymbolRefDifferenceFullyResolved( |
22 | const MCAssembler &Asm, const MCSymbolRefExpr *A, const MCSymbolRefExpr *B, |
23 | bool InSet) const { |
24 | // Modified symbol references cannot be resolved. |
25 | if (A->getKind() != MCSymbolRefExpr::VK_None || |
26 | B->getKind() != MCSymbolRefExpr::VK_None) |
27 | return false; |
28 | |
29 | const MCSymbol &SA = A->getSymbol(); |
30 | const MCSymbol &SB = B->getSymbol(); |
31 | assert(!SA.isUndefined() && !SB.isUndefined()); |
32 | if (!SA.getFragment() || !SB.getFragment()) |
33 | return false; |
34 | |
35 | return isSymbolRefDifferenceFullyResolvedImpl(Asm, A: SA, B: SB, InSet); |
36 | } |
37 | |
38 | bool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl( |
39 | const MCAssembler &Asm, const MCSymbol &A, const MCSymbol &B, |
40 | bool InSet) const { |
41 | return isSymbolRefDifferenceFullyResolvedImpl(Asm, SymA: A, FB: *B.getFragment(), InSet, |
42 | IsPCRel: false); |
43 | } |
44 | |
45 | bool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl( |
46 | const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB, |
47 | bool InSet, bool IsPCRel) const { |
48 | const MCSection &SecA = SymA.getSection(); |
49 | const MCSection &SecB = *FB.getParent(); |
50 | // On ELF and COFF A - B is absolute if A and B are in the same section. |
51 | return &SecA == &SecB; |
52 | } |
53 | |