aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-03-19 03:18:15 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-03-19 03:18:15 +0000
commit8ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1b (patch)
tree3b9769d9f83220508afa39c90ae609d36ee53e72 /lib
parent939f8d7ca23b95acdd5d1e71a7579ee8d33e7fd6 (diff)
downloadexternal_llvm-8ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1b.zip
external_llvm-8ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1b.tar.gz
external_llvm-8ad0dccbf2f0c5ecf9fdad93ac0207f6eaabaa1b.tar.bz2
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98925 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/MC/MCAssembler.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp
index 003f032..0d4f98c 100644
--- a/lib/MC/MCAssembler.cpp
+++ b/lib/MC/MCAssembler.cpp
@@ -1062,6 +1062,42 @@ bool MCAssembler::isSymbolLinkerVisible(const MCSymbolData *SD) const {
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 {