From be54955bba298553d04780d68f61d0f4692ce555 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Fri, 26 Jun 2015 18:58:24 +0000 Subject: COFF: Implement /lldmap flag. This flag can be used to produce a map file, which is essentially a list of objects linked into the final output file together with the RVAs of their symbols. Because our format differs from MSVC's we expose it as a separate flag. Differential Revision: http://reviews.llvm.org/D10773 llvm-svn: 240812 --- lld/COFF/Driver.cpp | 12 ++++++++++++ lld/COFF/Options.td | 4 ++-- lld/COFF/SymbolTable.cpp | 11 +++++++++++ lld/COFF/SymbolTable.h | 4 ++++ lld/COFF/Symbols.h | 1 + 5 files changed, 30 insertions(+), 2 deletions(-) (limited to 'lld/COFF') diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 7c1612ca2695..a14e6375c869 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -34,6 +34,7 @@ using llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN; using llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CUI; using llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_GUI; using llvm::sys::Process; +using llvm::sys::fs::OpenFlags::F_Text; using llvm::sys::fs::file_magic; using llvm::sys::fs::identify_magic; @@ -597,6 +598,17 @@ bool LinkerDriver::link(llvm::ArrayRef ArgsArr) { 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, F_Text); + if (EC) { + llvm::errs() << EC.message() << "\n"; + return false; + } + Symtab.printMap(Out); + } + return true; } diff --git a/lld/COFF/Options.td b/lld/COFF/Options.td index 0a145abfab51..fe7abbf96398 100644 --- a/lld/COFF/Options.td +++ b/lld/COFF/Options.td @@ -88,8 +88,8 @@ def help_q : Flag<["/?", "-?"], "">, Alias; def DASH_DASH : Option<["--"], "", KIND_REMAINING_ARGS>; -// Flag for debug -def lldmoduledeffile : Joined<["/", "-"], "lldmoduledeffile:">; +// Flags for debugging +def lldmap : Joined<["/", "-"], "lldmap:">; //============================================================================== // The flags below do nothing. They are defined only for link.exe compatibility. diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp index 112ffb36e3e5..054aa1179381 100644 --- a/lld/COFF/SymbolTable.cpp +++ b/lld/COFF/SymbolTable.cpp @@ -237,6 +237,17 @@ void SymbolTable::dump() { } } +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(); diff --git a/lld/COFF/SymbolTable.h b/lld/COFF/SymbolTable.h index 595a97ced31b..d96401a8e24f 100644 --- a/lld/COFF/SymbolTable.h +++ b/lld/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 @@ public: // 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. diff --git a/lld/COFF/Symbols.h b/lld/COFF/Symbols.h index 8afbdc6d5b85..e0cb7b16acb0 100644 --- a/lld/COFF/Symbols.h +++ b/lld/COFF/Symbols.h @@ -134,6 +134,7 @@ public: 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; } -- cgit v1.2.3