diff --git a/llvm/test/tools/llvm-cxxfilt/abitag.test b/llvm/test/tools/llvm-cxxfilt/abitag.test --- a/llvm/test/tools/llvm-cxxfilt/abitag.test +++ b/llvm/test/tools/llvm-cxxfilt/abitag.test @@ -1,4 +1,4 @@ -RUN: llvm-cxxfilt _Z14returns_stringB5cxx11v _Z6globalB5cxx11 _Z6globalB12a_longer_tag | FileCheck %s +RUN: llvm-cxxfilt -n _Z14returns_stringB5cxx11v _Z6globalB5cxx11 _Z6globalB12a_longer_tag | FileCheck %s CHECK: returns_string[abi:cxx11]() CHECK-NEXT: global[abi:cxx11] diff --git a/llvm/test/tools/llvm-cxxfilt/coff-import.test b/llvm/test/tools/llvm-cxxfilt/coff-import.test --- a/llvm/test/tools/llvm-cxxfilt/coff-import.test +++ b/llvm/test/tools/llvm-cxxfilt/coff-import.test @@ -1,5 +1,5 @@ RUN: llvm-cxxfilt -_ ___imp__ZSt6futureIvE | FileCheck %s -RUN: llvm-cxxfilt __imp__ZSt6futureIvE | FileCheck %s +RUN: llvm-cxxfilt -n __imp__ZSt6futureIvE | FileCheck %s CHECK: import thunk for std::future diff --git a/llvm/test/tools/llvm-cxxfilt/darwin.test b/llvm/test/tools/llvm-cxxfilt/darwin.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-cxxfilt/darwin.test @@ -0,0 +1,4 @@ +REQUIRES: system-darwin + +RUN: llvm-cxxfilt __Z1fv | FileCheck %s +CHECK: f() diff --git a/llvm/test/tools/llvm-cxxfilt/delimiters.test b/llvm/test/tools/llvm-cxxfilt/delimiters.test --- a/llvm/test/tools/llvm-cxxfilt/delimiters.test +++ b/llvm/test/tools/llvm-cxxfilt/delimiters.test @@ -28,7 +28,7 @@ RUN: '_Z3Foo}' \ RUN: '_Z3Foo~,,' \ RUN: '_Z3Foo,,_Z3Bar::_Z3Baz _Z3Foo,_Z3Bar:_Z3Baz' \ -RUN: '_Z3Foo$ ._Z3Foo' | llvm-cxxfilt | FileCheck %s +RUN: '_Z3Foo$ ._Z3Foo' | llvm-cxxfilt -n | FileCheck %s CHECK: ,,Foo! CHECK: Foo" diff --git a/llvm/test/tools/llvm-cxxfilt/empty-line.test b/llvm/test/tools/llvm-cxxfilt/empty-line.test --- a/llvm/test/tools/llvm-cxxfilt/empty-line.test +++ b/llvm/test/tools/llvm-cxxfilt/empty-line.test @@ -2,7 +2,7 @@ RUN: echo "" > %t RUN: echo "_Z3foov" >> %t RUN: echo "" >> %t -RUN: llvm-cxxfilt < %t | FileCheck %s +RUN: llvm-cxxfilt -n < %t | FileCheck %s CHECK: {{^$}} CHECK-NEXT: foo() diff --git a/llvm/test/tools/llvm-cxxfilt/invalid.test b/llvm/test/tools/llvm-cxxfilt/invalid.test --- a/llvm/test/tools/llvm-cxxfilt/invalid.test +++ b/llvm/test/tools/llvm-cxxfilt/invalid.test @@ -1,4 +1,4 @@ -RUN: llvm-cxxfilt _Z1fi __Z1fi f ___ZSt1ff_block_invoke | FileCheck %s +RUN: llvm-cxxfilt -n _Z1fi __Z1fi f ___ZSt1ff_block_invoke | FileCheck %s CHECK: f(int) CHECK-NEXT: __Z1fi diff --git a/llvm/test/tools/llvm-cxxfilt/noargs.test b/llvm/test/tools/llvm-cxxfilt/noargs.test --- a/llvm/test/tools/llvm-cxxfilt/noargs.test +++ b/llvm/test/tools/llvm-cxxfilt/noargs.test @@ -1,4 +1,4 @@ -RUN: sed -n 's/^STDIN: //p' %s | llvm-cxxfilt | FileCheck %s +RUN: sed -n 's/^STDIN: //p' %s | llvm-cxxfilt -n | FileCheck %s STDIN: _Znw STDIN: _Znwj diff --git a/llvm/test/tools/llvm-cxxfilt/simple.test b/llvm/test/tools/llvm-cxxfilt/simple.test --- a/llvm/test/tools/llvm-cxxfilt/simple.test +++ b/llvm/test/tools/llvm-cxxfilt/simple.test @@ -1,7 +1,7 @@ -RUN: llvm-cxxfilt _Z1fi abc | FileCheck %s -RUN: echo "Mangled _Z1fi and _Z3foov in string." | llvm-cxxfilt \ +RUN: llvm-cxxfilt -n _Z1fi abc | FileCheck %s +RUN: echo "Mangled _Z1fi and _Z3foov in string." | llvm-cxxfilt -n \ RUN: | FileCheck %s --check-prefix=CHECK-STRING -RUN: llvm-cxxfilt "CLI remains mangled _Z1fi" \ +RUN: llvm-cxxfilt -n "CLI remains mangled _Z1fi" \ RUN: | FileCheck %s --check-prefix=CHECK-MANGLED CHECK: f(int) diff --git a/llvm/test/tools/llvm-cxxfilt/types.test b/llvm/test/tools/llvm-cxxfilt/types.test --- a/llvm/test/tools/llvm-cxxfilt/types.test +++ b/llvm/test/tools/llvm-cxxfilt/types.test @@ -1,4 +1,4 @@ -RUN: llvm-cxxfilt -t f i | FileCheck %s +RUN: llvm-cxxfilt -n -t f i | FileCheck %s RUN: echo "f i" | llvm-cxxfilt -t | FileCheck %s --check-prefix="CHECK-STRING" CHECK: float diff --git a/llvm/test/tools/llvm-cxxfilt/underscore.test b/llvm/test/tools/llvm-cxxfilt/underscore.test --- a/llvm/test/tools/llvm-cxxfilt/underscore.test +++ b/llvm/test/tools/llvm-cxxfilt/underscore.test @@ -1,5 +1,5 @@ RUN: llvm-cxxfilt -_ __ZN2ns1fE _ZSt1f _f | FileCheck %s -check-prefix CHECK-STRIPPED -RUN: llvm-cxxfilt __ZN2ns1fE _ZSt1f _f | FileCheck %s -check-prefix CHECK-UNSTRIPPED +RUN: llvm-cxxfilt -n __ZN2ns1fE _ZSt1f _f | FileCheck %s -check-prefix CHECK-UNSTRIPPED CHECK-STRIPPED: ns::f CHECK-STRIPPED: _ZSt1f diff --git a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp --- a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp +++ b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp @@ -7,8 +7,10 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/Triple.h" #include "llvm/Demangle/Demangle.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Host.h" #include "llvm/Support/InitLLVM.h" #include "llvm/Support/raw_ostream.h" #include @@ -41,6 +43,13 @@ static cl::alias StripUnderscoreShort("_", cl::desc("alias for --strip-underscore"), cl::aliasopt(StripUnderscore)); +static cl::opt + NoStripUnderscore("no-strip-underscore", + cl::desc("do not strip the leading underscore"), + cl::init(false)); +static cl::alias + NoStripUnderscoreShort("n", cl::desc("alias for --no-strip-underscore"), + cl::aliasopt(NoStripUnderscore)); static cl::opt Types("types", @@ -55,11 +64,21 @@ static cl::extrahelp HelpResponse("\nPass @FILE as argument to read options from FILE.\n"); +static bool shouldStripUnderscore() { + if (StripUnderscore) + return true; + if (NoStripUnderscore) + return false; + // If none of them are set, use the default value for platform. + // macho has symbols prefix with "_" so strip by default. + return Triple(sys::getProcessTriple()).isOSBinFormatMachO(); +} + static std::string demangle(llvm::raw_ostream &OS, const std::string &Mangled) { int Status; const char *DecoratedStr = Mangled.c_str(); - if (StripUnderscore) + if (shouldStripUnderscore()) if (DecoratedStr[0] == '_') ++DecoratedStr; size_t DecoratedLength = strlen(DecoratedStr);