Index: COFF/Driver.cpp =================================================================== --- COFF/Driver.cpp +++ COFF/Driver.cpp @@ -597,6 +597,18 @@ llvm::errs() << EC.message() << "\n"; return false; } + + if (auto *Arg = Args.getLastArg(OPT_lldmap)) { + std::error_code EC; + llvm::raw_fd_ostream Out(Arg->getValue(), EC, + llvm::sys::fs::OpenFlags::F_Text); + if (EC) { + llvm::errs() << EC.message() << "\n"; + return false; + } + Symtab.printMap(Out); + } + return true; } Index: COFF/Options.td =================================================================== --- COFF/Options.td +++ COFF/Options.td @@ -88,7 +88,8 @@ def DASH_DASH : Option<["--"], "", KIND_REMAINING_ARGS>; -// Flag for debug +// Flags for debugging +def lldmap : Joined<["/", "-"], "lldmap:">; def lldmoduledeffile : Joined<["/", "-"], "lldmoduledeffile:">; //============================================================================== Index: COFF/SymbolTable.h =================================================================== --- COFF/SymbolTable.h +++ COFF/SymbolTable.h @@ -12,6 +12,7 @@ #include "InputFiles.h" #include "llvm/Support/Allocator.h" +#include "llvm/Support/raw_ostream.h" #include namespace llvm { @@ -62,6 +63,9 @@ // Dump contents of the symbol table to stderr. void dump(); + // Print a layout map to OS. + void printMap(llvm::raw_ostream &OS); + // Build a COFF object representing the combined contents of BitcodeFiles // and add it to the symbol table. Called after all files are added and // before the writer writes results to a file. Index: COFF/SymbolTable.cpp =================================================================== --- COFF/SymbolTable.cpp +++ COFF/SymbolTable.cpp @@ -237,6 +237,17 @@ } } +void SymbolTable::printMap(llvm::raw_ostream &OS) { + for (ObjectFile *File : ObjectFiles) { + OS << File->getShortName() << ":\n"; + for (SymbolBody *Body : File->getSymbols()) + if (auto R = dyn_cast(Body)) + if (R->isLive()) + OS << Twine::utohexstr(Config->ImageBase + R->getRVA()) + << " " << R->getName() << "\n"; + } +} + std::error_code SymbolTable::addCombinedLTOObject() { if (BitcodeFiles.empty()) return std::error_code(); Index: COFF/Symbols.h =================================================================== --- COFF/Symbols.h +++ COFF/Symbols.h @@ -134,6 +134,7 @@ int compare(SymbolBody *Other) override; std::string getDebugName() override; bool isCOMDAT() { return IsCOMDAT; } + bool isLive() const { return (*Data)->isLive(); } void markLive() { (*Data)->markLive(); } Chunk *getChunk() { return *Data; } Index: test/COFF/lldmap.test =================================================================== --- /dev/null +++ test/COFF/lldmap.test @@ -0,0 +1,8 @@ +# RUN: yaml2obj < %p/Inputs/ret42.yaml > %t.obj +# RUN: lld -flavor link2 /out:%t.exe /lldmap:%t.map %t.obj +# RUN: FileCheck %s < %t.map + +# CHECK: .obj: +# CHECK-NEXT: 140001000 .text$mn +# CHECK-NEXT: 140001000 .data +# CHECK-NEXT: 140001000 mainCRTStartup