v1.2.0
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 93c90d2..0b39ba8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,20 +1,27 @@
 cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
 project(demumble C CXX)
 
-# TODO: Also do this for gcc once gcc 4.9 is common.
-if (${UNIX} AND ${CMAKE_GENERATOR} STREQUAL "Ninja" AND
-    ${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color -Wall")
+if (UNIX)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fno-exceptions -fno-rtti")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
+  if (${CMAKE_GENERATOR} STREQUAL "Ninja")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color")
+  endif()
+
+  # 10.9 chosen somewhat arbitrary; it's the first target where clang defaults
+  # to libc++ and ld64 defaults to stripping __TEXT,__eh_frame.
+  if (APPLE)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.9")
+  else()
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-PIC")
+    set(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -no-pie")
+  endif()
 endif()
 
-# 10.9 chosen somewhat arbitrary; it's the first target where clang defaults
-# to libc++ and ld64 defaults to stripping __TEXT,__eh_frame.
-if (APPLE)
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.9")
-endif()
-
-# This is apparently the simplest way to statically link the CRT in CMake:
 if (WIN32)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:inline /EHs-c- /GR-")
+
+  # This is apparently the simplest way to statically link the CRT in CMake:
   string(TOUPPER "${CMAKE_BUILD_TYPE}" build)
   set(flag_var "CMAKE_CXX_FLAGS_${build}")
   if(${flag_var} MATCHES "/MD")
diff --git a/README.md b/README.md
index 29f7135..1e6a773 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # demumble
 
-`demumble` demangles both POSIX and Visual Studio symbols. It runs on both
+`demumble` demangles both Itanium and Visual Studio symbols. It runs on both
 POSIX and Windows.
 
     $ demumble _Z4funcPci
@@ -37,9 +37,11 @@
 
 Smart about filtering: Both c++filt and demumble can work as a stdin filter.
 demumble only demangles function symbols (which never look like other words),
-while c++filt defaults to demangling type names too, which are likely to look
-like regular words. demumble does demangle types when they're passed as args:
+while c++filt on macOS defaults to demangling type names too, which are likely
+to look like regular words. demumble does demangle types when they're passed
+as args without requiring the `--types` switch that c++filt needs on Linux:
 
+    # on macOS:
     $ echo 'I like Pi and _Znw' | c++filt
     I like int* and _Znw
     $ echo 'I like Pi and _Znw' | demumble
@@ -48,6 +50,9 @@
     int*
     $ demumble Pi
     int*
+    # on Linux:
+    $ c++filt Pi
+    Pi
 
 Cross-platform: demumble runs on Windows. demumble can demangle Windows-style
 symbols (also when running on non-Windows).
diff --git a/demumble.cc b/demumble.cc
index 61e89d5..9f37890 100644
--- a/demumble.cc
+++ b/demumble.cc
@@ -6,7 +6,7 @@
 
 #include "llvm/Demangle/Demangle.h"
 
-const char kDemumbleVersion[] = "1.1.0";
+const char kDemumbleVersion[] = "1.2.0";
 
 static void print_help(FILE* out) {
   fprintf(out,
@@ -15,6 +15,7 @@
 "if symbols are unspecified, reads from stdin.\n"
 "\n"
 "options:\n"
+"  -b         print both demangled and mangled name\n"
 "  -m         only print mangled names that were demangled, omit other output\n"
 "  -u         use unbuffered output\n"
 "  --version  print demumble version (\"%s\")\n", kDemumbleVersion);
@@ -24,15 +25,15 @@
   return strncmp(s, prefix, strlen(prefix)) == 0;
 }
 
-static void print_demangled(const char* s) {
+static void print_demangled(const char* format, const char* s) {
   const char* cxa_in = s;
   if (starts_with(s, "__Z") || starts_with(s, "____Z"))
     cxa_in += 1;
   if (char* itanium = llvm::itaniumDemangle(cxa_in, NULL, NULL, NULL)) {
-    printf("%s", itanium);
+    printf(format, itanium, s);
     free(itanium);
   } else if (char* ms = llvm::microsoftDemangle(s, NULL, NULL, NULL)) {
-    printf("%s", ms);
+    printf(format, ms, s);
     free(ms);
   } else {
     printf("%s", s);
@@ -61,10 +62,13 @@
 static char buf[8192];
 int main(int argc, char* argv[]) {
   enum { kPrintAll, kPrintMatching } print_mode = kPrintAll;
+  const char* print_format = "%s";
   while (argc > 1 && argv[1][0] == '-') {
     if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0) {
       print_help(stdout);
       return 0;
+    } else if (strcmp(argv[1], "-b") == 0) {
+      print_format = "\"%s\" (%s)";
     } else if (strcmp(argv[1], "-m") == 0) {
       print_mode = kPrintMatching;
     } else if (strcmp(argv[1], "-u") == 0) {
@@ -85,7 +89,7 @@
     ++argv;
   }
   for (int i = 1; i < argc; ++i) {
-    print_demangled(argv[i]);
+    print_demangled(print_format, argv[i]);
     printf("\n");
   }
   if (argc == 1) {  // Read stdin instead.
@@ -125,7 +129,7 @@
 
         char tmp = cur[n_sym];
         cur[n_sym] = '\0';
-        print_demangled(cur);
+        print_demangled(print_format, cur);
         need_separator = true;
         cur[n_sym] = tmp;
 
diff --git a/demumble_test.py b/demumble_test.py
index e53d467..7df0ae9 100755
--- a/demumble_test.py
+++ b/demumble_test.py
@@ -23,11 +23,15 @@
      '.invocation function for block in blocksNRVO()\n'),
     ('demumble -m < .____Z10blocksNRVOv_block_invoke',
      'invocation function for block in blocksNRVO()\n'),
+    ('demumble -- -b', '-b\n'),
     ('demumble -- -m', '-m\n'),
     ('demumble -- -h', '-h\n'),
     ('demumble -h', re.compile('.*usage: demumble.*')),
     ('demumble --help', re.compile('.*usage: demumble.*')),
     ('demumble --version', re.compile('.*\..*')),
+    ('demumble -b hello', 'hello\n'),
+    ('demumble -b _Z1fv', '"f()" (_Z1fv)\n'),
+    ('demumble -b < _Z1fv', '"f()" (_Z1fv)\n'),
 ]
 
 status = 0