Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lld/COFF
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2015-06-26 21:58:24 +0300
committerPeter Collingbourne <peter@pcc.me.uk>2015-06-26 21:58:24 +0300
commitbe54955bba298553d04780d68f61d0f4692ce555 (patch)
tree46fcbc9b473a074cd3cdc3d10234ceae3930f961 /lld/COFF
parent65ff7ccf21a738fa2c33a6dcc0ac474ee72277dc (diff)
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
Diffstat (limited to 'lld/COFF')
-rw-r--r--lld/COFF/Driver.cpp12
-rw-r--r--lld/COFF/Options.td4
-rw-r--r--lld/COFF/SymbolTable.cpp11
-rw-r--r--lld/COFF/SymbolTable.h4
-rw-r--r--lld/COFF/Symbols.h1
5 files changed, 30 insertions, 2 deletions
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<const char *> 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<help>;
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<DefinedRegular>(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 <unordered_map>
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; }