blob: 98ac48a23f91c5cbe4090ed6f3c7eafe873205db [file] [log] [blame]
Daniel Dunbar2df4ceb2010-03-19 10:43:15 +00001//===- lib/MC/MCObjectWriter.cpp - MCObjectWriter implementation ----------===//
Daniel Dunbar53b23382010-03-19 09:28:59 +00002//
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"
Chandler Carruthe3e43d92017-06-06 11:49:48 +000011#include "llvm/MC/MCAssembler.h"
12#include "llvm/MC/MCExpr.h"
13#include "llvm/MC/MCFragment.h"
Rafael Espindola31327802010-12-18 06:27:54 +000014#include "llvm/MC/MCSymbol.h"
Daniel Dunbar53b23382010-03-19 09:28:59 +000015
16using namespace llvm;
17
Eugene Zelenko498b48e2017-02-08 22:23:19 +000018MCObjectWriter::~MCObjectWriter() = default;
Kevin Enderbyc0957932010-09-30 16:52:03 +000019
Jim Grosbachbc812862015-06-04 22:24:41 +000020bool MCObjectWriter::isSymbolRefDifferenceFullyResolved(
Rafael Espindola55f6e3b2015-03-25 19:24:39 +000021 const MCAssembler &Asm, const MCSymbolRefExpr *A, const MCSymbolRefExpr *B,
22 bool InSet) const {
Rafael Espindola31327802010-12-18 06:27:54 +000023 // Modified symbol references cannot be resolved.
24 if (A->getKind() != MCSymbolRefExpr::VK_None ||
25 B->getKind() != MCSymbolRefExpr::VK_None)
26 return false;
27
28 const MCSymbol &SA = A->getSymbol();
29 const MCSymbol &SB = B->getSymbol();
Rafael Espindolae17e7a22015-04-06 16:10:05 +000030 if (SA.isUndefined() || SB.isUndefined())
Rafael Espindola31327802010-12-18 06:27:54 +000031 return false;
32
Rafael Espindolacfac75a2015-05-29 21:45:01 +000033 if (!SA.getFragment() || !SB.getFragment())
Kevin Enderbyd49b2a72012-01-31 23:02:57 +000034 return false;
Rafael Espindolafea753b2010-12-24 21:22:02 +000035
Rafael Espindola0eba49c2015-10-05 12:07:05 +000036 return isSymbolRefDifferenceFullyResolvedImpl(Asm, SA, SB, InSet);
37}
38
39bool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
40 const MCAssembler &Asm, const MCSymbol &A, const MCSymbol &B,
41 bool InSet) const {
42 return isSymbolRefDifferenceFullyResolvedImpl(Asm, A, *B.getFragment(), InSet,
43 false);
Rafael Espindola31327802010-12-18 06:27:54 +000044}
Rafael Espindola908159b2011-02-16 03:25:55 +000045
Jim Grosbachbc812862015-06-04 22:24:41 +000046bool MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
Duncan P. N. Exon Smith9e6378d2015-05-16 01:01:55 +000047 const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB,
Rafael Espindolafb118bd2015-04-17 21:15:17 +000048 bool InSet, bool IsPCRel) const {
Duncan P. N. Exon Smith9e6378d2015-05-16 01:01:55 +000049 const MCSection &SecA = SymA.getSection();
Rafael Espindolaf3639602015-05-26 00:36:57 +000050 const MCSection &SecB = *FB.getParent();
Rafael Espindola908159b2011-02-16 03:25:55 +000051 // On ELF and COFF A - B is absolute if A and B are in the same section.
52 return &SecA == &SecB;
53}