diff options
-rw-r--r-- | lld/COFF/Config.h | 1 | ||||
-rw-r--r-- | lld/COFF/Driver.cpp | 3 | ||||
-rw-r--r-- | lld/COFF/Options.td | 8 | ||||
-rw-r--r-- | lld/COFF/Symbols.cpp | 7 | ||||
-rw-r--r-- | lld/test/COFF/undefined-symbol-cv.s | 6 | ||||
-rw-r--r-- | lld/test/COFF/undefined-symbol.s | 12 |
6 files changed, 24 insertions, 13 deletions
diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h index f46be3b0404..420fd559596 100644 --- a/lld/COFF/Config.h +++ b/lld/COFF/Config.h @@ -90,6 +90,7 @@ struct Configuration { bool NoEntry = false; std::string OutputFile; std::string ImportName; + bool Demangle = true; bool DoGC = true; bool DoICF = true; bool TailMerge; diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 50017c50ff6..e20cd97c585 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -1081,6 +1081,9 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) { Config->Incremental = true; } + // Handle /demangle + Config->Demangle = Args.hasFlag(OPT_demangle, OPT_demangle_no); + // Handle /debugtype Config->DebugTypes = parseDebugTypes(Args); diff --git a/lld/COFF/Options.td b/lld/COFF/Options.td index 08a706a437f..b025f4e5440 100644 --- a/lld/COFF/Options.td +++ b/lld/COFF/Options.td @@ -154,6 +154,9 @@ def help_q : Flag<["/?", "-?"], "">, Alias<help>; // LLD extensions def exclude_all_symbols : F<"exclude-all-symbols">; def export_all_symbols : F<"export-all-symbols">; +defm demangle : B<"demangle", + "Demangle symbols in output (default)", + "Do not demangle symbols in output">; def kill_at : F<"kill-at">; def lldmingw : F<"lldmingw">; def output_def : Joined<["/", "-"], "output-def:">; @@ -178,11 +181,6 @@ def show_timing : F<"time">; class QF<string name> : Joined<["/", "-", "-?"], name#":">; -multiclass QB<string name> { - def "" : F<name>; - def _no : F<name#":no">; -} - def ignoreidl : F<"ignoreidl">; def nologo : F<"nologo">; def throwingnew : F<"throwingnew">; diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp index 781fe9fe41a..e14785d8612 100644 --- a/lld/COFF/Symbols.cpp +++ b/lld/COFF/Symbols.cpp @@ -18,10 +18,13 @@ using namespace llvm; using namespace llvm::object; +using namespace lld::coff; + // Returns a symbol name for an error message. std::string lld::toString(coff::Symbol &B) { - if (Optional<std::string> S = lld::demangleMSVC(B.getName())) - return ("\"" + *S + "\" (" + B.getName() + ")").str(); + if (Config->Demangle) + if (Optional<std::string> S = lld::demangleMSVC(B.getName())) + return *S; return B.getName(); } diff --git a/lld/test/COFF/undefined-symbol-cv.s b/lld/test/COFF/undefined-symbol-cv.s index e730c5dfc9f..08a85826b9f 100644 --- a/lld/test/COFF/undefined-symbol-cv.s +++ b/lld/test/COFF/undefined-symbol-cv.s @@ -2,19 +2,19 @@ # RUN: llvm-mc -triple=x86_64-windows-msvc -filetype=obj -o %t.obj %s # RUN: not lld-link /out:%t.exe %t.obj 2>&1 | FileCheck %s -# CHECK: error: undefined symbol: "int __cdecl foo(void)" (?foo@@YAHXZ) +# CHECK: error: undefined symbol: int __cdecl foo(void) # CHECK-NEXT: >>> referenced by file1.cpp:1 # CHECK-NEXT: >>> {{.*}}.obj:(main) # CHECK-NEXT: >>> referenced by file1.cpp:2 # CHECK-NEXT: >>> {{.*}}.obj:(main) # CHECK-EMPTY: -# CHECK-NEXT: error: undefined symbol: "int __cdecl bar(void)" (?bar@@YAHXZ) +# CHECK-NEXT: error: undefined symbol: int __cdecl bar(void) # CHECK-NEXT: >>> referenced by file2.cpp:3 # CHECK-NEXT: >>> {{.*}}.obj:(main) # CHECK-NEXT: >>> referenced by file1.cpp:4 # CHECK-NEXT: >>> {{.*}}.obj:(f1) # CHECK-EMPTY: -# CHECK-NEXT: error: undefined symbol: "int __cdecl baz(void)" (?baz@@YAHXZ) +# CHECK-NEXT: error: undefined symbol: int __cdecl baz(void) # CHECK-NEXT: >>> referenced by file1.cpp:5 # CHECK-NEXT: >>> {{.*}}.obj:(f2) diff --git a/lld/test/COFF/undefined-symbol.s b/lld/test/COFF/undefined-symbol.s index 31da50a9e18..5fb2511ae25 100644 --- a/lld/test/COFF/undefined-symbol.s +++ b/lld/test/COFF/undefined-symbol.s @@ -1,16 +1,22 @@ # REQUIRES: x86 # RUN: llvm-mc -triple=x86_64-windows-msvc -filetype=obj -o %t.obj %s # RUN: not lld-link /out:%t.exe %t.obj 2>&1 | FileCheck %s +# RUN: not lld-link /out:%t.exe /demangle %t.obj 2>&1 | FileCheck %s +# RUN: not lld-link /out:%t.exe /demangle:no %t.obj 2>&1 | FileCheck --check-prefix=NODEMANGLE %s -# CHECK: error: undefined symbol: "int __cdecl foo(void)" (?foo@@YAHXZ) +# NODEMANGLE: error: undefined symbol: ?foo@@YAHXZ +# NODEMANGLE: error: undefined symbol: ?bar@@YAHXZ +# NODEMANGLE: error: undefined symbol: __imp_?baz@@YAHXZ + +# CHECK: error: undefined symbol: int __cdecl foo(void) # CHECK-NEXT: >>> referenced by {{.*}}.obj:(main) # CHECK-NEXT: >>> referenced by {{.*}}.obj:(main) # CHECK-EMPTY: -# CHECK-NEXT: error: undefined symbol: "int __cdecl bar(void)" (?bar@@YAHXZ) +# CHECK-NEXT: error: undefined symbol: int __cdecl bar(void) # CHECK-NEXT: >>> referenced by {{.*}}.obj:(main) # CHECK-NEXT: >>> referenced by {{.*}}.obj:(f1) # CHECK-EMPTY: -# CHECK-NEXT: error: undefined symbol: "__declspec(dllimport) int __cdecl baz(void)" (__imp_?baz@@YAHXZ) +# CHECK-NEXT: error: undefined symbol: __declspec(dllimport) int __cdecl baz(void) # CHECK-NEXT: >>> referenced by {{.*}}.obj:(f2) .section .text,"xr",one_only,main |