MC/Mach-O: Factor out isSymbolLinkerVisible method; "linker visible" is a made up term to refer to non-temporary labels + temporary labels in sections-which-require symbols. For Darwin, it corresponds to symbols which effectively define an atom.

llvm-svn: 98923
This commit is contained in:
Daniel Dunbar 2010-03-19 03:18:09 +00:00
parent fab9b02fc8
commit c558ec211f
2 changed files with 24 additions and 10 deletions

View File

@ -636,6 +636,12 @@ private:
// FIXME: Make protected once we factor out object writer classes.
public:
/// Check whether a particular symbol is visible to the linker and is required
/// in the symbol table, or whether it can be discarded by the assembler. This
/// also effects whether the assembler treats the label as potentially
/// defining a separate atom.
bool isSymbolLinkerVisible(const MCSymbolData *SD) const;
/// Evaluate a fixup to a relocatable expression and the value which should be
/// placed into the fixup.
///

View File

@ -673,11 +673,8 @@ public:
ie = Asm.symbol_end(); it != ie; ++it) {
const MCSymbol &Symbol = it->getSymbol();
// Ignore assembler temporaries.
if (it->getSymbol().isTemporary() &&
(!it->getFragment() ||
!Asm.getBackend().doesSectionRequireSymbols(
it->getFragment()->getParent()->getSection())))
// Ignore non-linker visible symbols.
if (!Asm.isSymbolLinkerVisible(it))
continue;
if (!it->isExternal() && !Symbol.isUndefined())
@ -712,11 +709,8 @@ public:
ie = Asm.symbol_end(); it != ie; ++it) {
const MCSymbol &Symbol = it->getSymbol();
// Ignore assembler temporaries.
if (it->getSymbol().isTemporary() &&
(!it->getFragment() ||
!Asm.getBackend().doesSectionRequireSymbols(
it->getFragment()->getParent()->getSection())))
// Ignore non-linker visible symbols.
if (!Asm.isSymbolLinkerVisible(it))
continue;
if (it->isExternal() || Symbol.isUndefined())
@ -1016,6 +1010,20 @@ MCAssembler::MCAssembler(MCContext &_Context, TargetAsmBackend &_Backend,
MCAssembler::~MCAssembler() {
}
bool MCAssembler::isSymbolLinkerVisible(const MCSymbolData *SD) const {
// Non-temporary labels should always be visible to the linker.
if (!SD->getSymbol().isTemporary())
return true;
// Absolute temporary labels are never visible.
if (!SD->getFragment())
return false;
// Otherwise, check if the section requires symbols even for temporary labels.
return getBackend().doesSectionRequireSymbols(
SD->getFragment()->getParent()->getSection());
}
bool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout, MCAsmFixup &Fixup,
MCDataFragment *DF,
MCValue &Target, uint64_t &Value) const {