thakis created this revision.
thakis added a reviewer: mclow.lists.
thakis added a subscriber: cfe-commits.

I wanted a demangler that can demangle both Itanium-style and Microsoft-style 
mangled symbols, and that runs on all of Windows, Linux, and Mac OS X. I used 
libcxxabi's cxa_demangle for the Itanium demangling, but that required to get 
it to build with gcc on Linux and with clang-cl/MSVC on Windows. It required 
only small changes, and imho they look reasonable enough to send them upstream.

libstdc++ needs a few typedefs in malloc_alloc. MSVC's STL needs rebind(), 
construct(), destroy().

MSVC2013 also has no snprintf, but it allegedly exists in 2015. (I haven't 
tried building with 2015, though.)

http://reviews.llvm.org/D12895

Files:
  src/cxa_demangle.cpp

Index: src/cxa_demangle.cpp
===================================================================
--- src/cxa_demangle.cpp
+++ src/cxa_demangle.cpp
@@ -18,6 +18,13 @@
 #include <cstring>
 #include <cctype>
 
+#ifdef _MSC_VER
+// snprintf is implemented in VS 2015
+#if _MSC_VER < 1900
+#define snprintf _snprintf_s
+#endif
+#endif
+
 namespace __cxxabiv1
 {
 
@@ -4818,6 +4825,12 @@
 {
 public:
     typedef T value_type;
+    typedef T& reference;
+    typedef const T& const_reference;
+    typedef T* pointer;
+    typedef const T* const_pointer;
+    typedef std::size_t size_type;
+    typedef std::ptrdiff_t difference_type;
 
     malloc_alloc() = default;
     template <class U> malloc_alloc(const malloc_alloc<U>&) noexcept {}
@@ -4830,6 +4843,17 @@
     {
         std::free(p);
     }
+
+    template <class U> struct rebind { using other = malloc_alloc<U>; };
+    template <class U, class... Args>
+    void construct(U* p, Args&&... args)
+    {
+        ::new ((void*)p) U(std::forward<Args>(args)...);
+    }
+    void destroy(T* p)
+    {
+        p->~T();
+    }
 };
 
 template <class T, class U>


Index: src/cxa_demangle.cpp
===================================================================
--- src/cxa_demangle.cpp
+++ src/cxa_demangle.cpp
@@ -18,6 +18,13 @@
 #include <cstring>
 #include <cctype>
 
+#ifdef _MSC_VER
+// snprintf is implemented in VS 2015
+#if _MSC_VER < 1900
+#define snprintf _snprintf_s
+#endif
+#endif
+
 namespace __cxxabiv1
 {
 
@@ -4818,6 +4825,12 @@
 {
 public:
     typedef T value_type;
+    typedef T& reference;
+    typedef const T& const_reference;
+    typedef T* pointer;
+    typedef const T* const_pointer;
+    typedef std::size_t size_type;
+    typedef std::ptrdiff_t difference_type;
 
     malloc_alloc() = default;
     template <class U> malloc_alloc(const malloc_alloc<U>&) noexcept {}
@@ -4830,6 +4843,17 @@
     {
         std::free(p);
     }
+
+    template <class U> struct rebind { using other = malloc_alloc<U>; };
+    template <class U, class... Args>
+    void construct(U* p, Args&&... args)
+    {
+        ::new ((void*)p) U(std::forward<Args>(args)...);
+    }
+    void destroy(T* p)
+    {
+        p->~T();
+    }
 };
 
 template <class T, class U>
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to