void MCMachOStreamer::Finish() { // We have to set the fragment atom associations so we can relax properly for // Mach-O. // First, scan the symbol table to build a lookup table from fragments to // defining symbols. DenseMap<const MCFragment*, MCSymbolData*> DefiningSymbolMap; for (MCAssembler::symbol_iterator it = getAssembler().symbol_begin(), ie = getAssembler().symbol_end(); it != ie; ++it) { if (getAssembler().isSymbolLinkerVisible(it->getSymbol()) && it->getFragment()) { // An atom defining symbol should never be internal to a fragment. assert(it->getOffset() == 0 && "Invalid offset in atom defining symbol!"); DefiningSymbolMap[it->getFragment()] = it; } } // Set the fragment atom associations by tracking the last seen atom defining // symbol. for (MCAssembler::iterator it = getAssembler().begin(), ie = getAssembler().end(); it != ie; ++it) { MCSymbolData *CurrentAtom = 0; for (MCSectionData::iterator it2 = it->begin(), ie2 = it->end(); it2 != ie2; ++it2) { if (MCSymbolData *SD = DefiningSymbolMap.lookup(it2)) CurrentAtom = SD; it2->setAtom(CurrentAtom); } } this->MCObjectStreamer::Finish(); }