diff --git a/lib/MC/MCModule.cpp b/lib/MC/MCModule.cpp
index 5890b4b..b09fbb5 100644
--- a/lib/MC/MCModule.cpp
+++ b/lib/MC/MCModule.cpp
@@ -14,8 +14,19 @@
 
 using namespace llvm;
 
-static bool AtomComp(const MCAtom *L, uint64_t Addr) {
-  return L->getEndAddr() < Addr;
+static bool AtomComp(const MCAtom *LHS, const MCAtom *RHS) {
+  return LHS->getEndAddr() < RHS->getEndAddr();
+}
+
+MCModule::const_atom_iterator MCModule::atom_lower_bound(uint64_t Addr) const {
+  // This is a dummy atom, because VS 2008 doesn't like asymmetric comparators.
+  MCDataAtom AddrAtom(0, Addr, Addr);
+  return std::lower_bound(atom_begin(), atom_end(), &AddrAtom, AtomComp);
+}
+
+MCModule::atom_iterator MCModule::atom_lower_bound(uint64_t Addr) {
+  MCDataAtom AddrAtom(0, Addr, Addr);
+  return std::lower_bound(atom_begin(), atom_end(), &AddrAtom, AtomComp);
 }
 
 void MCModule::map(MCAtom *NewAtom) {
@@ -24,8 +35,7 @@
   assert(Begin <= NewAtom->End && "Creating MCAtom with endpoints reversed?");
 
   // Check for atoms already covering this range.
-  AtomListTy::iterator I = std::lower_bound(atom_begin(), atom_end(),
-                                            Begin, AtomComp);
+  AtomListTy::iterator I = atom_lower_bound(Begin);
   assert((I == atom_end() || (*I)->getBeginAddr() > NewAtom->End)
          && "Offset range already occupied!");
 
@@ -48,15 +58,13 @@
 // remap - Update the interval mapping for an atom.
 void MCModule::remap(MCAtom *Atom, uint64_t NewBegin, uint64_t NewEnd) {
   // Find and erase the old mapping.
-  AtomListTy::iterator I = std::lower_bound(atom_begin(), atom_end(),
-                                            Atom->Begin, AtomComp);
+  AtomListTy::iterator I = atom_lower_bound(Atom->Begin);
   assert(I != atom_end() && "Atom offset not found in module!");
   assert(*I == Atom && "Previous atom mapping was invalid!");
   Atoms.erase(I);
 
   // Insert the new mapping.
-  AtomListTy::iterator NewI = std::lower_bound(atom_begin(), atom_end(),
-                                               NewBegin, AtomComp);
+  AtomListTy::iterator NewI = atom_lower_bound(NewBegin);
   Atoms.insert(NewI, Atom);
 
   // Update the atom internal bounds.
@@ -65,16 +73,14 @@
 }
 
 const MCAtom *MCModule::findAtomContaining(uint64_t Addr) const {
-  AtomListTy::const_iterator I = std::lower_bound(atom_begin(), atom_end(),
-                                                  Addr, AtomComp);
+  AtomListTy::const_iterator I = atom_lower_bound(Addr);
   if (I != atom_end() && (*I)->getBeginAddr() <= Addr)
     return *I;
   return 0;
 }
 
 MCAtom *MCModule::findAtomContaining(uint64_t Addr) {
-  AtomListTy::iterator I = std::lower_bound(atom_begin(), atom_end(),
-                                            Addr, AtomComp);
+  AtomListTy::iterator I = atom_lower_bound(Addr);
   if (I != atom_end() && (*I)->getBeginAddr() <= Addr)
     return *I;
   return 0;
