[cairo-commit] src/cairo.c src/cairo-compiler-private.h

Jeff Muizelaar jrmuizel at kemper.freedesktop.org
Thu Feb 19 13:07:28 PST 2009


 src/cairo-compiler-private.h |   24 ++++++++++++++++++++++++
 src/cairo.c                  |    1 +
 2 files changed, 25 insertions(+)

New commits:
commit fe7d5323f5bc734e76179b74d68fcba9b924ba94
Author: Jeff Muizelaar <jmuizelaar at mozilla.com>
Date:   Thu Feb 19 16:00:17 2009 -0500

    Relanding: Add CAIRO_ENSURE_UNIQUE macro and use it in _cairo_error()
    
    When using MSVC, _cairo_error() can be folded into other identical functions.
    If that happens, _cairo_error isn't really useful anymore. Using the
    CAIRO_ENSURE_UNIQUE macro makes sure this doesn't happen.
    
    Use __asm to serve as a line delimiter. This allows us to use the
    __asm{} block in a macro.

diff --git a/src/cairo-compiler-private.h b/src/cairo-compiler-private.h
index bd7cccd..f796e13 100644
--- a/src/cairo-compiler-private.h
+++ b/src/cairo-compiler-private.h
@@ -172,6 +172,30 @@
 #define inline __inline
 #endif
 
+#ifdef _MSC_VER
+/* When compiling with /Gy and /OPT:ICF identical functions will be folded in together.
+   The CAIRO_ENSURE_UNIQUE macro ensures that a function is always unique and
+   will never be folded into another one. Something like this might eventually
+   be needed for GCC but it seems fine for now. */
+#define CAIRO_ENSURE_UNIQUE                       \
+    do {                                          \
+	char func[] = __FUNCTION__;               \
+	char file[] = __FILE__;                   \
+	__asm {                                   \
+	    __asm jmp __internal_skip_line_no     \
+	    __asm _emit (__LINE__ & 0xff)         \
+	    __asm _emit ((__LINE__>>8) & 0xff)    \
+	    __asm _emit ((__LINE__>>16) & 0xff)   \
+	    __asm _emit ((__LINE__>>24) & 0xff)   \
+	    __asm lea eax, func                   \
+	    __asm lea eax, file                   \
+	    __asm __internal_skip_line_no:        \
+	};                                        \
+    } while (0)
+#else
+#define CAIRO_ENSURE_UNIQUE    do { } while (0)
+#endif
+
 #ifdef __STRICT_ANSI__
 #undef inline
 #define inline __inline__
diff --git a/src/cairo.c b/src/cairo.c
index 4aa52f6..ddc8d4a 100644
--- a/src/cairo.c
+++ b/src/cairo.c
@@ -82,6 +82,7 @@ static const cairo_t _cairo_nil = {
 cairo_status_t
 _cairo_error (cairo_status_t status)
 {
+    CAIRO_ENSURE_UNIQUE;
     assert (_cairo_status_is_error (status));
 
     return status;


More information about the cairo-commit mailing list