// 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.
///
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())
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())
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 {