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/MCAssembler.h" |
11 | #include "llvm/MC/MCExpr.h" |
12 | #include "llvm/MC/MCFragment.h" |
13 | #include "llvm/MC/MCSymbol.h" |
14 | namespace llvm { |
15 | class MCSection; |
16 | } |
17 | |
18 | using namespace llvm; |
19 | |
20 | MCObjectWriter::~MCObjectWriter() = default; |
21 | |
22 | void MCObjectWriter::reset() { |
23 | FileNames.clear(); |
24 | AddrsigSyms.clear(); |
25 | EmitAddrsigSection = false; |
26 | SubsectionsViaSymbols = false; |
27 | CGProfile.clear(); |
28 | } |
29 | |
30 | bool MCObjectWriter::isSymbolRefDifferenceFullyResolved( |
31 | const MCAssembler &Asm, const MCSymbolRefExpr *A, const MCSymbolRefExpr *B, |
32 | bool InSet) const { |
33 | // Modified symbol references cannot be resolved. |
34 | if (A->getKind() != MCSymbolRefExpr::VK_None || |
35 | B->getKind() != MCSymbolRefExpr::VK_None) |
36 | return false; |
37 | |
38 | const MCSymbol &SA = A->getSymbol(); |
39 | const MCSymbol &SB = B->getSymbol(); |
40 | assert(!SA.isUndefined() && !SB.isUndefined()); |
41 | MCFragment *FB = SB.getFragment(); |
42 | if (!FB || !SA.getFragment()) |
43 | return false; |
44 | |
45 | return isSymbolRefDifferenceFullyResolvedImpl(Asm, SymA: SA, FB: *FB, InSet, /*IsPCRel=*/false); |
46 | } |
47 | |
48 | bool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl( |
49 | const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB, |
50 | bool InSet, bool IsPCRel) const { |
51 | const MCSection &SecA = SymA.getSection(); |
52 | const MCSection &SecB = *FB.getParent(); |
53 | // On ELF and COFF A - B is absolute if A and B are in the same section. |
54 | return &SecA == &SecB; |
55 | } |
56 | |
57 | void MCObjectWriter::addFileName(MCAssembler &Asm, StringRef FileName) { |
58 | FileNames.emplace_back(Args: std::string(FileName), Args: Asm.Symbols.size()); |
59 | } |
60 | |