//===- MapFile.cpp --------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // This file implements the -Map option. It shows lists in order and // hierarchically the output sections, input sections, input files and // symbol: // // Address Size Align Out In Symbol // 00201000 00000015 4 .text // 00201000 0000000e 4 test.o:(.text) // 0020100e 00000000 0 local // 00201005 00000000 0 f(int) // //===----------------------------------------------------------------------===// #include "MapFile.h" #include "InputFiles.h" #include "LinkerScript.h" #include "OutputSections.h" #include "Symbols.h" #include "SyntheticSections.h" #include "llvm/ADT/MapVector.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Parallel.h" #include "llvm/Support/TimeProfiler.h" #include "llvm/Support/raw_ostream.h" usingnamespacellvm; usingnamespacellvm::object; usingnamespacelld; usingnamespacelld::elf; SymbolMapTy; static constexpr char indent8[] = …; // 8 spaces static constexpr char indent16[] = …; // 16 spaces // Print out the first three columns of a line. static void writeHeader(Ctx &ctx, raw_ostream &os, uint64_t vma, uint64_t lma, uint64_t size, uint64_t align) { … } // Returns a list of all symbols that we want to print out. static std::vector<Defined *> getSymbols() { … } // Returns a map from sections to their symbols. static SymbolMapTy getSectionSyms(ArrayRef<Defined *> syms) { … } // Construct a map from symbols to their stringified representations. // Demangling symbols (which is what toString() does) is slow, so // we do that in batch using parallel-for. static DenseMap<Symbol *, std::string> getSymbolStrings(Ctx &ctx, ArrayRef<Defined *> syms) { … } // Print .eh_frame contents. Since the section consists of EhSectionPieces, // we need a specialized printer for that section. // // .eh_frame tend to contain a lot of section pieces that are contiguous // both in input file and output file. Such pieces are squashed before // being displayed to make output compact. static void printEhFrame(Ctx &ctx, raw_ostream &os, const EhFrameSection *sec) { … } static void writeMapFile(Ctx &ctx, raw_fd_ostream &os) { … } // Output a cross reference table to stdout. This is for --cref. // // For each global symbol, we print out a file that defines the symbol // followed by files that uses that symbol. Here is an example. // // strlen /lib/x86_64-linux-gnu/libc.so.6 // tools/lld/tools/lld/CMakeFiles/lld.dir/lld.cpp.o // lib/libLLVMSupport.a(PrettyStackTrace.cpp.o) // // In this case, strlen is defined by libc.so.6 and used by other two // files. static void writeCref(Ctx &ctx, raw_fd_ostream &os) { … } void elf::writeMapAndCref(Ctx &ctx) { … }