[llvm-commits] [llvm] r98925 - in /llvm/trunk: include/llvm/MC/MCAssembler.h lib/MC/MCAssembler.cpp
Daniel Dunbar
daniel at zuster.org
Thu Mar 18 20:18:15 PDT 2010
Author: ddunbar
Date: Thu Mar 18 22:18:15 2010
New Revision: 98925
URL: http://llvm.org/viewvc/llvm-project?rev=98925&view=rev
Log:
MC/Mach-O/x86_64: Add getAtom[ForAddress].
- These find the defining symbol which identifies the containing atom for a symbol or address. They are currently very slow, but will be eliminated eventually.
Modified:
llvm/trunk/include/llvm/MC/MCAssembler.h
llvm/trunk/lib/MC/MCAssembler.cpp
Modified: llvm/trunk/include/llvm/MC/MCAssembler.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAssembler.h?rev=98925&r1=98924&r2=98925&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCAssembler.h (original)
+++ llvm/trunk/include/llvm/MC/MCAssembler.h Thu Mar 18 22:18:15 2010
@@ -636,6 +636,19 @@
// FIXME: Make protected once we factor out object writer classes.
public:
+ /// Find the symbol which defines the atom containing given address, inside
+ /// the given section, or null if there is no such symbol.
+ //
+ // FIXME: Eliminate this, it is very slow.
+ const MCSymbolData *getAtomForAddress(const MCSectionData *Section,
+ uint64_t Address) const;
+
+ /// Find the symbol which defines the atom containing the given symbol, or
+ /// null if there is no such symbol.
+ //
+ // FIXME: Eliminate this, it is very slow.
+ const MCSymbolData *getAtom(const MCSymbolData *Symbol) const;
+
/// 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
Modified: llvm/trunk/lib/MC/MCAssembler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAssembler.cpp?rev=98925&r1=98924&r2=98925&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCAssembler.cpp (original)
+++ llvm/trunk/lib/MC/MCAssembler.cpp Thu Mar 18 22:18:15 2010
@@ -1062,6 +1062,42 @@
SD->getFragment()->getParent()->getSection());
}
+const MCSymbolData *MCAssembler::getAtomForAddress(const MCSectionData *Section,
+ uint64_t Address) const {
+ const MCSymbolData *Best = 0;
+ for (MCAssembler::const_symbol_iterator it = symbol_begin(),
+ ie = symbol_end(); it != ie; ++it) {
+ // Ignore non-linker visible symbols.
+ if (!isSymbolLinkerVisible(it))
+ continue;
+
+ // Ignore symbols not in the same section.
+ if (!it->getFragment() || it->getFragment()->getParent() != Section)
+ continue;
+
+ // Otherwise, find the closest symbol preceding this address (ties are
+ // resolved in favor of the last defined symbol).
+ if (it->getAddress() <= Address &&
+ (!Best || it->getAddress() >= Best->getAddress()))
+ Best = it;
+ }
+
+ return Best;
+}
+
+const MCSymbolData *MCAssembler::getAtom(const MCSymbolData *SD) const {
+ // Linker visible symbols define atoms.
+ if (isSymbolLinkerVisible(SD))
+ return SD;
+
+ // Absolute and undefined symbols have no defining atom.
+ if (!SD->getFragment())
+ return 0;
+
+ // Otherwise, search by address.
+ return getAtomForAddress(SD->getFragment()->getParent(), SD->getAddress());
+}
+
bool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout, MCAsmFixup &Fixup,
MCDataFragment *DF,
MCValue &Target, uint64_t &Value) const {
More information about the llvm-commits
mailing list