summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/COFF/Config.h1
-rw-r--r--lld/COFF/Driver.cpp1
-rw-r--r--lld/COFF/Options.td1
-rw-r--r--lld/COFF/Writer.cpp2
-rw-r--r--lld/test/COFF/sort-debug.test13
-rw-r--r--lld/test/COFF/symtab.test2
6 files changed, 19 insertions, 1 deletions
diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h
index 3ccccb61e7b..43dc75883e9 100644
--- a/lld/COFF/Config.h
+++ b/lld/COFF/Config.h
@@ -98,6 +98,7 @@ struct Configuration {
bool Debug = false;
bool DebugDwarf = false;
bool DebugGHashes = false;
+ bool DebugSymtab = false;
bool ShowTiming = false;
unsigned DebugTypes = static_cast<unsigned>(DebugType::None);
std::vector<std::string> NatvisFiles;
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index ecfa258bce7..b6019ffec95 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -1217,6 +1217,7 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
!Config->DLL && Args.hasFlag(OPT_tsaware, OPT_tsaware_no, true);
Config->DebugDwarf = Args.hasArg(OPT_debug_dwarf);
Config->DebugGHashes = Args.hasArg(OPT_debug_ghash);
+ Config->DebugSymtab = Args.hasArg(OPT_debug_symtab);
Config->MapFile = getMapFile(Args);
diff --git a/lld/COFF/Options.td b/lld/COFF/Options.td
index 9051b0ba039..83aa890fe4c 100644
--- a/lld/COFF/Options.td
+++ b/lld/COFF/Options.td
@@ -139,6 +139,7 @@ def help_q : Flag<["/?", "-?"], "">, Alias<help>;
// LLD extensions
def debug_ghash : F<"debug:ghash">;
def debug_dwarf : F<"debug:dwarf">;
+def debug_symtab : F<"debug:symtab">;
def export_all_symbols : F<"export-all-symbols">;
def kill_at : F<"kill-at">;
def lldmingw : F<"lldmingw">;
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index a9950e4cc85..c6e17eea115 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -665,7 +665,7 @@ void Writer::createSymbolAndStringTable() {
Sec->setStringTableOff(addEntryToStringTable(Sec->Name));
}
- if (Config->DebugDwarf) {
+ if (Config->DebugDwarf || Config->DebugSymtab) {
for (ObjFile *File : ObjFile::Instances) {
for (Symbol *B : File->getSymbols()) {
auto *D = dyn_cast_or_null<Defined>(B);
diff --git a/lld/test/COFF/sort-debug.test b/lld/test/COFF/sort-debug.test
index 3bad013a309..e11b8b48a7f 100644
--- a/lld/test/COFF/sort-debug.test
+++ b/lld/test/COFF/sort-debug.test
@@ -1,6 +1,12 @@
# RUN: yaml2obj < %s > %t.obj
# RUN: lld-link /debug /out:%t.exe /entry:main %t.obj
# RUN: llvm-readobj -sections %t.exe | FileCheck %s
+# RUN: lld-link /debug:dwarf /out:%t.exe /entry:main %t.obj
+# RUN: llvm-readobj -sections %t.exe | FileCheck %s
+# RUN: lld-link /out:%t.exe /entry:main %t.obj
+# RUN: llvm-readobj -sections %t.exe | FileCheck -check-prefix=NODEBUG %s
+# RUN: lld-link /debug:symtab /out:%t.exe /entry:main %t.obj
+# RUN: llvm-readobj -sections %t.exe | FileCheck -check-prefix=NODEBUG %s
# CHECK: Name: .text
# CHECK: Name: .debug_abbrev
@@ -10,6 +16,13 @@
# CHECK: Name: .debug_pubtypes
# CHECK: Name: .reloc
+# NODEBUG: Name: .text
+# NODEBUG-NOT: Name: .debug_abbrev
+# NODEBUG-NOT: Name: .debug_info
+# NODEBUG-NOT: Name: .debug_line
+# NODEBUG-NOT: Name: .debug_pubnames
+# NODEBUG-NOT: Name: .debug_pubtypes
+# NODEBUG: Name: .reloc
--- !COFF
header:
diff --git a/lld/test/COFF/symtab.test b/lld/test/COFF/symtab.test
index 49302d74821..bedcd2f601a 100644
--- a/lld/test/COFF/symtab.test
+++ b/lld/test/COFF/symtab.test
@@ -3,6 +3,8 @@
# RUN: llvm-readobj -symbols %t.exe | FileCheck %s
# RUN: lld-link /debug:dwarf /opt:noref /out:%t.exe /entry:main %t.obj %p/Inputs/std64.lib
# RUN: llvm-readobj -symbols %t.exe | FileCheck %s
+# RUN: lld-link /debug:symtab /opt:noref /out:%t.exe /entry:main %t.obj %p/Inputs/std64.lib
+# RUN: llvm-readobj -symbols %t.exe | FileCheck %s
# RUN: lld-link /debug /out:%t.exe /entry:main %t.obj %p/Inputs/std64.lib
# RUN: llvm-readobj -symbols %t.exe | FileCheck -check-prefix=NO %s
OpenPOWER on IntegriCloud