mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-05 17:36:06 +00:00

The previous logic was to first try without relocations at all and failing that stop on the first defined symbol. That was inefficient and incorrect in the case part of the expression could be simplified and another part could not (see included test). We now stop the evaluation when we get to a variable whose value can change (i.e. is weak). llvm-svn: 233187
59 lines
2.2 KiB
C++
59 lines
2.2 KiB
C++
//===- lib/MC/MCObjectWriter.cpp - MCObjectWriter implementation ----------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/MC/MCAssembler.h"
|
|
#include "llvm/MC/MCExpr.h"
|
|
#include "llvm/MC/MCObjectWriter.h"
|
|
#include "llvm/MC/MCSymbol.h"
|
|
|
|
using namespace llvm;
|
|
|
|
MCObjectWriter::~MCObjectWriter() {
|
|
}
|
|
|
|
bool
|
|
MCObjectWriter::IsSymbolRefDifferenceFullyResolved(const MCAssembler &Asm,
|
|
const MCSymbolRefExpr *A,
|
|
const MCSymbolRefExpr *B,
|
|
bool InSet) const {
|
|
// Modified symbol references cannot be resolved.
|
|
if (A->getKind() != MCSymbolRefExpr::VK_None ||
|
|
B->getKind() != MCSymbolRefExpr::VK_None)
|
|
return false;
|
|
|
|
const MCSymbol &SA = A->getSymbol();
|
|
const MCSymbol &SB = B->getSymbol();
|
|
if (SA.AliasedSymbol().isUndefined() || SB.AliasedSymbol().isUndefined())
|
|
return false;
|
|
|
|
const MCSymbolData &DataA = Asm.getSymbolData(SA);
|
|
const MCSymbolData &DataB = Asm.getSymbolData(SB);
|
|
if(!DataA.getFragment() || !DataB.getFragment())
|
|
return false;
|
|
|
|
return IsSymbolRefDifferenceFullyResolvedImpl(Asm, DataA,
|
|
*DataB.getFragment(),
|
|
InSet,
|
|
false);
|
|
}
|
|
|
|
bool
|
|
MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
|
|
const MCSymbolData &DataA,
|
|
const MCFragment &FB,
|
|
bool InSet,
|
|
bool IsPCRel) const {
|
|
const MCSection &SecA = DataA.getSymbol().AliasedSymbol().getSection();
|
|
const MCSection &SecB = FB.getParent()->getSection();
|
|
// On ELF and COFF A - B is absolute if A and B are in the same section.
|
|
return &SecA == &SecB;
|
|
}
|
|
|
|
bool MCObjectWriter::isWeak(const MCSymbolData &SD) const { return false; }
|