void WinCOFFObjectWriter::ExecutePostLayoutBinding(MCAssembler &Asm,
                                                   const MCAsmLayout &Layout) {
  // "Define" each section & symbol. This creates section & symbol
  // entries in the staging area.

  static_assert(sizeof(((COFF::AuxiliaryFile *)nullptr)->FileName) == COFF::SymbolSize,
                "size mismatch for COFF::AuxiliaryFile::FileName");
  for (auto FI = Asm.file_names_begin(), FE = Asm.file_names_end();
       FI != FE; ++FI) {
    // round up to calculate the number of auxiliary symbols required
    unsigned Count = (FI->size() + COFF::SymbolSize - 1) / COFF::SymbolSize;

    COFFSymbol *file = createSymbol(".file");
    file->Data.SectionNumber = COFF::IMAGE_SYM_DEBUG;
    file->Data.StorageClass = COFF::IMAGE_SYM_CLASS_FILE;
    file->Aux.resize(Count);

    unsigned Offset = 0;
    unsigned Length = FI->size();
    for (auto & Aux : file->Aux) {
      Aux.AuxType = ATFile;

      if (Length > COFF::SymbolSize) {
        memcpy(Aux.Aux.File.FileName, FI->c_str() + Offset, COFF::SymbolSize);
        Length = Length - COFF::SymbolSize;
      } else {
        memcpy(Aux.Aux.File.FileName, FI->c_str() + Offset, Length);
        memset(&Aux.Aux.File.FileName[Length], 0, COFF::SymbolSize - Length);
        Length = 0;
      }

      Offset = Offset + COFF::SymbolSize;
    }
  }

  for (const auto & Section : Asm)
    DefineSection(Section);

  for (MCSymbolData &SD : Asm.symbols())
    if (ExportSymbol(SD, Asm))
      DefineSymbol(SD, Asm, Layout);
}