diff options
Diffstat (limited to 'COFF/MapFile.cpp')
| -rw-r--r-- | COFF/MapFile.cpp | 115 | 
1 files changed, 57 insertions, 58 deletions
diff --git a/COFF/MapFile.cpp b/COFF/MapFile.cpp index fd4894250223..f98cf8fa6130 100644 --- a/COFF/MapFile.cpp +++ b/COFF/MapFile.cpp @@ -1,9 +1,8 @@  //===- MapFile.cpp --------------------------------------------------------===//  // -//                             The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  //  //===----------------------------------------------------------------------===//  // @@ -24,7 +23,7 @@  #include "Symbols.h"  #include "Writer.h"  #include "lld/Common/ErrorHandler.h" -#include "llvm/Support/Parallel.h" +#include "lld/Common/Threads.h"  #include "llvm/Support/raw_ostream.h"  using namespace llvm; @@ -33,93 +32,93 @@ using namespace llvm::object;  using namespace lld;  using namespace lld::coff; -typedef DenseMap<const SectionChunk *, SmallVector<DefinedRegular *, 4>> -    SymbolMapTy; +using SymbolMapTy = +    DenseMap<const SectionChunk *, SmallVector<DefinedRegular *, 4>>; -static const std::string Indent8 = "        ";          // 8 spaces -static const std::string Indent16 = "                "; // 16 spaces +static const std::string indent8 = "        ";          // 8 spaces +static const std::string indent16 = "                "; // 16 spaces  // Print out the first three columns of a line. -static void writeHeader(raw_ostream &OS, uint64_t Addr, uint64_t Size, -                        uint64_t Align) { -  OS << format("%08llx %08llx %5lld ", Addr, Size, Align); +static void writeHeader(raw_ostream &os, uint64_t addr, uint64_t size, +                        uint64_t align) { +  os << format("%08llx %08llx %5lld ", addr, size, align);  }  // Returns a list of all symbols that we want to print out.  static std::vector<DefinedRegular *> getSymbols() { -  std::vector<DefinedRegular *> V; -  for (ObjFile *File : ObjFile::Instances) -    for (Symbol *B : File->getSymbols()) -      if (auto *Sym = dyn_cast_or_null<DefinedRegular>(B)) -        if (Sym && !Sym->getCOFFSymbol().isSectionDefinition()) -          V.push_back(Sym); -  return V; +  std::vector<DefinedRegular *> v; +  for (ObjFile *file : ObjFile::instances) +    for (Symbol *b : file->getSymbols()) +      if (auto *sym = dyn_cast_or_null<DefinedRegular>(b)) +        if (sym && !sym->getCOFFSymbol().isSectionDefinition()) +          v.push_back(sym); +  return v;  }  // Returns a map from sections to their symbols. -static SymbolMapTy getSectionSyms(ArrayRef<DefinedRegular *> Syms) { -  SymbolMapTy Ret; -  for (DefinedRegular *S : Syms) -    Ret[S->getChunk()].push_back(S); +static SymbolMapTy getSectionSyms(ArrayRef<DefinedRegular *> syms) { +  SymbolMapTy ret; +  for (DefinedRegular *s : syms) +    ret[s->getChunk()].push_back(s);    // Sort symbols by address. -  for (auto &It : Ret) { -    SmallVectorImpl<DefinedRegular *> &V = It.second; -    std::sort(V.begin(), V.end(), [](DefinedRegular *A, DefinedRegular *B) { -      return A->getRVA() < B->getRVA(); +  for (auto &it : ret) { +    SmallVectorImpl<DefinedRegular *> &v = it.second; +    std::sort(v.begin(), v.end(), [](DefinedRegular *a, DefinedRegular *b) { +      return a->getRVA() < b->getRVA();      });    } -  return Ret; +  return ret;  }  // Construct a map from symbols to their stringified representations.  static DenseMap<DefinedRegular *, std::string> -getSymbolStrings(ArrayRef<DefinedRegular *> Syms) { -  std::vector<std::string> Str(Syms.size()); -  for_each_n(parallel::par, (size_t)0, Syms.size(), [&](size_t I) { -    raw_string_ostream OS(Str[I]); -    writeHeader(OS, Syms[I]->getRVA(), 0, 0); -    OS << Indent16 << toString(*Syms[I]); +getSymbolStrings(ArrayRef<DefinedRegular *> syms) { +  std::vector<std::string> str(syms.size()); +  parallelForEachN((size_t)0, syms.size(), [&](size_t i) { +    raw_string_ostream os(str[i]); +    writeHeader(os, syms[i]->getRVA(), 0, 0); +    os << indent16 << toString(*syms[i]);    }); -  DenseMap<DefinedRegular *, std::string> Ret; -  for (size_t I = 0, E = Syms.size(); I < E; ++I) -    Ret[Syms[I]] = std::move(Str[I]); -  return Ret; +  DenseMap<DefinedRegular *, std::string> ret; +  for (size_t i = 0, e = syms.size(); i < e; ++i) +    ret[syms[i]] = std::move(str[i]); +  return ret;  } -void coff::writeMapFile(ArrayRef<OutputSection *> OutputSections) { -  if (Config->MapFile.empty()) +void coff::writeMapFile(ArrayRef<OutputSection *> outputSections) { +  if (config->mapFile.empty())      return; -  std::error_code EC; -  raw_fd_ostream OS(Config->MapFile, EC, sys::fs::F_None); -  if (EC) -    fatal("cannot open " + Config->MapFile + ": " + EC.message()); +  std::error_code ec; +  raw_fd_ostream os(config->mapFile, ec, sys::fs::F_None); +  if (ec) +    fatal("cannot open " + config->mapFile + ": " + ec.message());    // Collect symbol info that we want to print out. -  std::vector<DefinedRegular *> Syms = getSymbols(); -  SymbolMapTy SectionSyms = getSectionSyms(Syms); -  DenseMap<DefinedRegular *, std::string> SymStr = getSymbolStrings(Syms); +  std::vector<DefinedRegular *> syms = getSymbols(); +  SymbolMapTy sectionSyms = getSectionSyms(syms); +  DenseMap<DefinedRegular *, std::string> symStr = getSymbolStrings(syms);    // Print out the header line. -  OS << "Address  Size     Align Out     In      Symbol\n"; +  os << "Address  Size     Align Out     In      Symbol\n";    // Print out file contents. -  for (OutputSection *Sec : OutputSections) { -    writeHeader(OS, Sec->getRVA(), Sec->getVirtualSize(), /*Align=*/PageSize); -    OS << Sec->Name << '\n'; +  for (OutputSection *sec : outputSections) { +    writeHeader(os, sec->getRVA(), sec->getVirtualSize(), /*align=*/pageSize); +    os << sec->name << '\n'; -    for (Chunk *C : Sec->Chunks) { -      auto *SC = dyn_cast<SectionChunk>(C); -      if (!SC) +    for (Chunk *c : sec->chunks) { +      auto *sc = dyn_cast<SectionChunk>(c); +      if (!sc)          continue; -      writeHeader(OS, SC->getRVA(), SC->getSize(), SC->Alignment); -      OS << Indent8 << SC->File->getName() << ":(" << SC->getSectionName() +      writeHeader(os, sc->getRVA(), sc->getSize(), sc->getAlignment()); +      os << indent8 << sc->file->getName() << ":(" << sc->getSectionName()           << ")\n"; -      for (DefinedRegular *Sym : SectionSyms[SC]) -        OS << SymStr[Sym] << '\n'; +      for (DefinedRegular *sym : sectionSyms[sc]) +        os << symStr[sym] << '\n';      }    }  }  | 
