diff --git a/includes/Rts.h b/includes/Rts.h
index 3bec799585ab28ab9bc909cc0a4be4cc62c67179..753a66436b848804d542830dc791394f1dea5326 100644
--- a/includes/Rts.h
+++ b/includes/Rts.h
@@ -51,7 +51,19 @@ extern "C" {
 // Symbols that are extern, but private to the RTS, are declared
 // with visibility "hidden" to hide them outside the RTS shared
 // library.
+#if !defined(mingw32_HOST_OS)
 #define RTS_PRIVATE  GNUC3_ATTRIBUTE(visibility("hidden"))
+#else
+#define RTS_PRIVATE  /* disabled: RTS_PRIVATE */
+#endif
+
+#if __GNUC__ > 4
+#define BEGIN_RTS_PRIVATE #pragma GCC visibility push(hidden)
+#define END_RTS_PRIVATE   #pragma GCC visibility pop
+#else
+#define BEGIN_RTS_PRIVATE /* disabled: BEGIN_RTS_PRIVATE */
+#define END_RTS_PRIVATE   /* disabled: END_RTS_PRIVATE */
+#endif
 
 /* Fix for mingw stat problem (done here so it's early enough) */
 #ifdef mingw32_HOST_OS
diff --git a/rts/Capability.h b/rts/Capability.h
index 6fdc002049cd123a0952995c633baaa6bbd00ebb..3f01bf3d8898af3f86993b486e7479f73a0a3966 100644
--- a/rts/Capability.h
+++ b/rts/Capability.h
@@ -22,7 +22,7 @@
 #include "Task.h"
 #include "Sparks.h"
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 struct Capability_ {
     // State required by the STG virtual machine when running Haskell
@@ -332,6 +332,6 @@ contextSwitchCapability (Capability *cap)
     cap->context_switch = 1;
 }
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* CAPABILITY_H */
diff --git a/rts/FrontPanel.h b/rts/FrontPanel.h
index 07508aa4036932b95b771b861576a1882493b699..fba97e15ee001baf384012824ef6c2e09b61d7e7 100644
--- a/rts/FrontPanel.h
+++ b/rts/FrontPanel.h
@@ -9,7 +9,7 @@
 #ifndef FRONTPANEL_H
 #define FRONTPANEL_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 #ifdef RTS_GTK_FRONTPANEL
 
@@ -33,7 +33,7 @@ extern gboolean continue_now, stop_now, quit;
 
 #endif /* RTS_GTK_FRONTPANEL */
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* FRONTPANEL_H */
 
diff --git a/rts/GetTime.h b/rts/GetTime.h
index 11da6411641e94f180b90e46268d49224c997829..03e1f171be144010966d2c36a34a230da4348854 100644
--- a/rts/GetTime.h
+++ b/rts/GetTime.h
@@ -9,7 +9,7 @@
 #ifndef GETTIME_H
 #define GETTIME_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 // We'll use a fixed resolution of usec for now.  The machine
 // dependent implementation may have a different resolution, but we'll
@@ -25,6 +25,6 @@ void  getProcessTimes       (Ticks *user, Ticks *elapsed);
 // Not strictly timing, but related
 nat   getPageFaults         (void);
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* GETTIME_H */
diff --git a/rts/Hash.h b/rts/Hash.h
index c5eec3755299949dbb3cfd650def6b11875f52d5..1099b8f334a833c8f9f5a013bed446f0e3f04390 100644
--- a/rts/Hash.h
+++ b/rts/Hash.h
@@ -9,7 +9,7 @@
 #ifndef HASH_H
 #define HASH_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 typedef struct hashtable HashTable; /* abstract */
 
@@ -47,7 +47,7 @@ void freeHashTable ( HashTable *table, void (*freeDataFun)(void *) );
 
 void exitHashTable ( void );
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* HASH_H */
 
diff --git a/rts/Papi.h b/rts/Papi.h
index 8658d8ccac8bef9ab8e52f49d5fda61a09304a7b..f8acab7a4b20094f9eea85c11774b9a9274e08fe 100644
--- a/rts/Papi.h
+++ b/rts/Papi.h
@@ -8,7 +8,7 @@
 #ifndef PAPI_H
 #define PAPI_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 /* Check the error value of a PAPI call, reporting an error, if needed */
 extern int papi_error;
@@ -31,6 +31,6 @@ void papi_stop_gc1_count(void);
 void papi_thread_start_gc1_count(int event_set);
 void papi_thread_stop_gc1_count(int event_set);
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* PAPI_H */
diff --git a/rts/Printer.h b/rts/Printer.h
index fd89aa073a4648868115001e9b4df313477f752b..ca0cadb19ce354984b91ea1fe33949782b1a4b21 100644
--- a/rts/Printer.h
+++ b/rts/Printer.h
@@ -9,7 +9,7 @@
 #ifndef PRINTER_H
 #define PRINTER_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 extern void   	   printPtr        ( StgPtr p );
 extern void   	   printObj        ( StgClosure *obj );
@@ -34,7 +34,7 @@ extern const char *lookupGHCName( void *addr );
 extern char *what_next_strs[];
 #endif
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* PRINTER_H */
 
diff --git a/rts/ProfHeap.h b/rts/ProfHeap.h
index b781235c77d1e78c46b4f04f0ed8447b0ee1e31b..cda29ad09246c5a7c37f925b1e9da1501eb1ce76 100644
--- a/rts/ProfHeap.h
+++ b/rts/ProfHeap.h
@@ -9,7 +9,7 @@
 #ifndef PROFHEAP_H
 #define PROFHEAP_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 void    heapCensus         (void);
 nat     initHeapProfiling  (void);
@@ -17,6 +17,6 @@ void    endHeapProfiling   (void);
 void    LDV_recordDead     (StgClosure *c, nat size);
 rtsBool strMatchesSelector (char* str, char* sel);
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* PROFHEAP_H */
diff --git a/rts/Profiling.h b/rts/Profiling.h
index 87d81e2f9b5f9bc6e532617eace735dbfe7d9a9d..764e467b41ff9af5cd1491461ab913c728cb4bcc 100644
--- a/rts/Profiling.h
+++ b/rts/Profiling.h
@@ -11,7 +11,7 @@
 
 #include <stdio.h>
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 void initProfiling1 (void);
 void freeProfiling1 (void);
@@ -37,6 +37,6 @@ void debugCCS( CostCentreStack *ccs );
 
 #endif
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* PROFILING_H */
diff --git a/rts/Proftimer.h b/rts/Proftimer.h
index 7d4295642da1042af20d8999ceab0bfc3fa5a555..a3cfc8bbd3b237614d423d9f3a9564d815af7406 100644
--- a/rts/Proftimer.h
+++ b/rts/Proftimer.h
@@ -9,7 +9,7 @@
 #ifndef PROFTIMER_H
 #define PROFTIMER_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 void initProfTimer      ( void );
 void handleProfTick     ( void );
@@ -24,6 +24,6 @@ void startHeapProfTimer ( void );
 
 extern rtsBool performHeapProfile;
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* PROFTIMER_H */
diff --git a/rts/RaiseAsync.h b/rts/RaiseAsync.h
index 52a0aa4bf06044e65c5302065a7173f142bf8d01..96eb96e10b5529cdd19dce8a55ea874da34448b5 100644
--- a/rts/RaiseAsync.h
+++ b/rts/RaiseAsync.h
@@ -9,12 +9,13 @@
 #ifndef RAISEASYNC_H
 #define RAISEASYNC_H
 
-#pragma GCC visibility push(hidden)
-
 #define THROWTO_SUCCESS   0
 #define THROWTO_BLOCKED   1
 
 #ifndef CMINUSMINUS
+
+BEGIN_RTS_PRIVATE
+
 void throwToSingleThreaded (Capability *cap,
 			    StgTSO *tso,
 			    StgClosure *exception);
@@ -66,9 +67,9 @@ interruptible(StgTSO *t)
   }
 }
 
-#endif /* CMINUSMINUS */
+END_RTS_PRIVATE
 
-#pragma GCC visibility pop
+#endif /* CMINUSMINUS */
 
 #endif /* RAISEASYNC_H */
 
diff --git a/rts/RetainerProfile.h b/rts/RetainerProfile.h
index 7278dc74659abf0198efebbf60c9e6a85695236d..9736eeb8d6895b401a53e70c75da8b286d02c6b3 100644
--- a/rts/RetainerProfile.h
+++ b/rts/RetainerProfile.h
@@ -14,7 +14,7 @@
 
 #include "RetainerSet.h"
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 void initRetainerProfiling ( void );
 void endRetainerProfiling  ( void );
@@ -43,7 +43,7 @@ retainerSetOf( StgClosure *c )
 extern lnat retainerStackBlocks ( void );
 #endif
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* PROFILING */
 
diff --git a/rts/RetainerSet.h b/rts/RetainerSet.h
index cbf8c1d9b08264633f3cfd6ca306b49db7b5dc84..e3d3acd38cdc7cf2fa35698bfa46619f0870bf38 100644
--- a/rts/RetainerSet.h
+++ b/rts/RetainerSet.h
@@ -14,7 +14,7 @@
 
 #ifdef PROFILING
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 /*
   Type 'retainer' defines the retainer identity.
@@ -199,7 +199,7 @@ void outputAllRetainerSet(FILE *);
 //       the best place to define it.
 void printRetainer(FILE *, retainer);
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* PROFILING */
 #endif /* RETAINERSET_H */
diff --git a/rts/RtsSignals.h b/rts/RtsSignals.h
index b222272e123aa6afef3d11dc0a4503e8171e9ddf..f31a0ac1d6d67596f1fc4f6fac8bf4f887240ec8 100644
--- a/rts/RtsSignals.h
+++ b/rts/RtsSignals.h
@@ -25,7 +25,7 @@
 
 #if RTS_USER_SIGNALS
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 /*
  * Function: initUserSignals()
@@ -60,7 +60,7 @@ void awaitUserSignals(void);
  */
 void markSignalHandlers (evac_fn evac, void *user);
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* RTS_USER_SIGNALS */
 
diff --git a/rts/RtsUtils.h b/rts/RtsUtils.h
index cbf23b06d5e7b876abab29fa1974b4bb7b33c414..e47dbb911003baad20ff856cd5ad2d57290668b5 100644
--- a/rts/RtsUtils.h
+++ b/rts/RtsUtils.h
@@ -9,7 +9,7 @@
 #ifndef RTSUTILS_H
 #define RTSUTILS_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 /* -----------------------------------------------------------------------------
  * (Checked) dynamic allocation
@@ -48,6 +48,6 @@ int genericRaise(int sig);
 
 int rts_isProfiled(void);
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* RTSUTILS_H */
diff --git a/rts/STM.h b/rts/STM.h
index 1f28b9c3faf71c3dd1b1cd2f20d9a73e6d5b1deb..495b7631399ee31e310a2946211075b64602ea19 100644
--- a/rts/STM.h
+++ b/rts/STM.h
@@ -40,7 +40,7 @@
 #define STM_UNIPROC
 #endif
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 /*----------------------------------------------------------------------
 
@@ -232,7 +232,7 @@ void stmWriteTVar(Capability *cap,
 
 /*----------------------------------------------------------------------*/
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* STM_H */
 
diff --git a/rts/Sanity.h b/rts/Sanity.h
index f27c395c44ca7c097dcae4d657fe6763cec26da0..96ac6c534f7bf32be361783c740805ce6cef184d 100644
--- a/rts/Sanity.h
+++ b/rts/Sanity.h
@@ -11,7 +11,7 @@
 
 #ifdef DEBUG
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 # if defined(PAR)
 # define PVM_PE_MASK    0xfffc0000
@@ -36,7 +36,7 @@ void checkMutableLists ( rtsBool checkTSOs );
 
 void checkBQ (StgTSO *bqe, StgClosure *closure);
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* DEBUG */
  
diff --git a/rts/Schedule.h b/rts/Schedule.h
index 1214fd87840a365ce9b695895c6feee3d9b506c9..2dd4acd0d99be8a63f8fa0736eca968272d581f9 100644
--- a/rts/Schedule.h
+++ b/rts/Schedule.h
@@ -14,7 +14,7 @@
 #include "Capability.h"
 #include "Trace.h"
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 /* initScheduler(), exitScheduler()
  * Called from STG :  no
@@ -241,7 +241,7 @@ emptyThreadQueues(Capability *cap)
 
 #endif /* !IN_STG_CODE */
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* SCHEDULE_H */
 
diff --git a/rts/Sparks.h b/rts/Sparks.h
index 25affbbe55e5f23246a8632a077fbcaaf4db0780..33aa818aabe799c0d6633a63eb541bad11ded71d 100644
--- a/rts/Sparks.h
+++ b/rts/Sparks.h
@@ -11,7 +11,7 @@
 
 #include "WSDeque.h"
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 /* typedef for SparkPool in RtsTypes.h */
 
@@ -65,6 +65,6 @@ INLINE_HEADER void discardSparks (SparkPool *pool)
 
 #endif // THREADED_RTS
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* SPARKS_H */
diff --git a/rts/Stable.h b/rts/Stable.h
index b1b25ff62fb1c2223cc0e9029d47c2620b44b567..ebabee7ad0158306c8d3bca327f693f1488d2ec1 100644
--- a/rts/Stable.h
+++ b/rts/Stable.h
@@ -17,7 +17,7 @@
 
 #include "sm/GC.h" // for evac_fn below
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 void    freeStablePtr         ( StgStablePtr sp );
 
@@ -33,6 +33,6 @@ void    updateStablePtrTable  ( rtsBool full );
 void    stablePtrPreGC        ( void );
 void    stablePtrPostGC       ( void );
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* STABLE_H */
diff --git a/rts/Stats.h b/rts/Stats.h
index 234d64c7e3932a71b9bed132301214e26cef67c2..f13221546e2c672468ccc4b3871e7db19577e50c 100644
--- a/rts/Stats.h
+++ b/rts/Stats.h
@@ -11,7 +11,7 @@
 
 #include "GetTime.h"
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 void      stat_startInit(void);
 void      stat_endInit(void);
@@ -61,6 +61,6 @@ Ticks stat_getElapsedTime(void);
 void statsPrintf( char *s, ... ) 
     GNUC3_ATTRIBUTE(format (printf, 1, 2));
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* STATS_H */
diff --git a/rts/StgPrimFloat.h b/rts/StgPrimFloat.h
index f0e466b76b12855ea544f23344a054e1f6b4eca9..3f5b3e50138fbeb4d786ee7ec5f5456f19012cee 100644
--- a/rts/StgPrimFloat.h
+++ b/rts/StgPrimFloat.h
@@ -9,7 +9,7 @@
 #ifndef STGPRIMFLOAT_H
 #define STGPRIMFLOAT_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 /* grimy low-level support functions defined in StgPrimFloat.c */
 void      __decodeDouble_2Int (I_ *man_sign, W_ *man_high, W_ *man_low, I_ *exp, StgDouble dbl);
@@ -21,6 +21,6 @@ StgFloat  __word_encodeFloat (W_ j, I_ e);
 // __int_encodeDouble and __int_encodeFloat are public, declared in 
 // includes/rts/PrimFloat.h.
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* STGPRIMFLOAT_H */
diff --git a/rts/Task.h b/rts/Task.h
index b18bcfb60022e9303ac39d8fbfd65ea662da8ad0..9b5f0253cd41082c77230991a75a696e25caccdc 100644
--- a/rts/Task.h
+++ b/rts/Task.h
@@ -11,7 +11,7 @@
 
 #include "GetTime.h"
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 /* 
    Definition of a Task
@@ -261,6 +261,6 @@ taskEnter (Task *task)
     setMyTask(task);
 }
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* TASK_H */
diff --git a/rts/ThreadLabels.h b/rts/ThreadLabels.h
index 550e2869e32932cb4a087a7de371a30e68f1b548..bd516a1de3e449d414c230e418cc3afb508babce 100644
--- a/rts/ThreadLabels.h
+++ b/rts/ThreadLabels.h
@@ -10,7 +10,7 @@
 #ifndef THREADLABELS_H
 #define THREADLABELS_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 #if defined(DEBUG)
 void    initThreadLabelTable (void);
@@ -21,6 +21,6 @@ void    removeThreadLabel    (StgWord key);
 void    labelThread          (StgPtr tso, char *label);
 #endif
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* THREADLABELS_H */
diff --git a/rts/Threads.h b/rts/Threads.h
index e58b0db993c825a074441d832e8c2a89fd302d66..8e0ee264f440ba58e18709fb94b8122994d12451 100644
--- a/rts/Threads.h
+++ b/rts/Threads.h
@@ -9,7 +9,7 @@
 #ifndef THREADS_H
 #define THREADS_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 StgTSO * unblockOne (Capability *cap, StgTSO *tso);
 StgTSO * unblockOne_ (Capability *cap, StgTSO *tso, rtsBool allow_migrate);
@@ -29,6 +29,6 @@ void printAllThreads (void);
 void printThreadQueue (StgTSO *t);
 #endif
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* THREADS_H */
diff --git a/rts/Ticker.h b/rts/Ticker.h
index 159820d39963e93ddfcdf82d0324c403e2df295a..3e62622d5d5da9aa82dfbb57d5594b3c0e3a1fa1 100644
--- a/rts/Ticker.h
+++ b/rts/Ticker.h
@@ -9,7 +9,7 @@
 #ifndef TICKER_H
 #define TICKER_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 typedef void (*TickProc)(int);
 
@@ -18,6 +18,6 @@ void startTicker (void);
 void stopTicker  (void);
 void exitTicker  (void);
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* TICKER_H */
diff --git a/rts/Trace.h b/rts/Trace.h
index 3ab6df456cf89393a38e8d05ff101e24908e61c0..702a51ec7220179a42047e47d69de4e5040553d1 100644
--- a/rts/Trace.h
+++ b/rts/Trace.h
@@ -12,7 +12,7 @@
 #include "rts/EventLogFormat.h"
 #include "Capability.h"
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 // -----------------------------------------------------------------------------
 // Posting events
@@ -186,6 +186,6 @@ INLINE_HEADER void traceThreadStatus (StgWord32 class STG_UNUSED,
 
 #endif /* TRACING */
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* TRACE_H */
diff --git a/rts/Updates.h b/rts/Updates.h
index 3b374094761794edd5a01cffa60747258ab7ef57..988fb6059fad04eeb0283a7609357bdae4810eb8 100644
--- a/rts/Updates.h
+++ b/rts/Updates.h
@@ -9,7 +9,9 @@
 #ifndef UPDATES_H
 #define UPDATES_H
 
-#pragma GCC visibility push(hidden)
+#ifndef CMINUSMINUS
+BEGIN_RTS_PRIVATE
+#endif
 
 /* -----------------------------------------------------------------------------
    Updates
@@ -228,6 +230,8 @@ no_slop:
   }
 #endif /* CMINUSMINUS */
 
-#pragma GCC visibility pop
+#ifndef CMINUSMINUS
+END_RTS_PRIVATE
+#endif
 
 #endif /* UPDATES_H */
diff --git a/rts/Weak.h b/rts/Weak.h
index 2c831d830e1408168776d2aceab4ba0aae984e7d..a931b054cc342beb16bcb8fec911b7e0b13a7338 100644
--- a/rts/Weak.h
+++ b/rts/Weak.h
@@ -11,7 +11,7 @@
 
 #include "Capability.h"
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 extern rtsBool running_finalizers;
 extern StgWeak * weak_ptr_list;
@@ -21,7 +21,7 @@ void runAllCFinalizers(StgWeak *w);
 void scheduleFinalizers(Capability *cap, StgWeak *w);
 void markWeakList(void);
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* WEAK_H */
 
diff --git a/rts/eventlog/EventLog.h b/rts/eventlog/EventLog.h
index 9f3388e421da511a6f71242f5ae6c31a76a6cfd8..e2ee13ac111265ceb0fe276ae0f064c6580da5c3 100644
--- a/rts/eventlog/EventLog.h
+++ b/rts/eventlog/EventLog.h
@@ -12,7 +12,7 @@
 #include "rts/EventLogFormat.h"
 #include "Capability.h"
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 #ifdef TRACING
 
@@ -56,6 +56,6 @@ INLINE_HEADER void postCapMsg (Capability *cap,
 
 #endif
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* TRACING_H */
diff --git a/rts/posix/Signals.h b/rts/posix/Signals.h
index 30bc63ee46c3643fd909fdaf20f1639a42d61982..4d0a5a5fc74109b6ee7ff7c12218b552d16e2968 100644
--- a/rts/posix/Signals.h
+++ b/rts/posix/Signals.h
@@ -13,7 +13,7 @@
 # include <signal.h>
 #endif
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 rtsBool anyUserHandlers(void);
 
@@ -26,7 +26,7 @@ void startSignalHandlers(Capability *cap);
 
 extern StgInt *signal_handlers;
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* POSIX_SIGNALS_H */
 
diff --git a/rts/sm/BlockAlloc.h b/rts/sm/BlockAlloc.h
index 86836e40b47da6b2eb7beab44bdfc3dd46ebe862..00efeb4bbc788f015a810c975c3c5dd0911c551f 100644
--- a/rts/sm/BlockAlloc.h
+++ b/rts/sm/BlockAlloc.h
@@ -9,7 +9,7 @@
 #ifndef BLOCK_ALLOC_H
 #define BLOCK_ALLOC_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 /* Debugging  -------------------------------------------------------------- */
 
@@ -23,6 +23,6 @@ void reportUnmarkedBlocks (void);
 extern lnat n_alloc_blocks;   // currently allocated blocks
 extern lnat hw_alloc_blocks;  // high-water allocated blocks
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* BLOCK_ALLOC_H */
diff --git a/rts/sm/Compact.h b/rts/sm/Compact.h
index 1e89ad36a8042249ef8cb829d1e40ad5c71d0995..7fe15e5667c4b5765bb17b6902439b603037784e 100644
--- a/rts/sm/Compact.h
+++ b/rts/sm/Compact.h
@@ -14,7 +14,7 @@
 #ifndef SM_COMPACT_H
 #define SM_COMPACT_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 INLINE_HEADER rtsBool
 mark_stack_empty(void)
@@ -78,6 +78,6 @@ is_marked(StgPtr p, bdescr *bd)
 
 void compact (StgClosure *static_objects);
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* SM_COMPACT_H */
diff --git a/rts/sm/Evac.h b/rts/sm/Evac.h
index ca5032f772497533915a1db842a9f4004bea83e7..52346b1fd2fe630ff16410d606376b220f3b21b0 100644
--- a/rts/sm/Evac.h
+++ b/rts/sm/Evac.h
@@ -14,7 +14,7 @@
 #ifndef SM_EVAC_H
 #define SM_EVAC_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 // Use a register argument for evacuate, if available.
 // Earlier, the regparm attribute was used whenever __GNUC__ >= 2, but this
@@ -37,7 +37,7 @@ REGPARM1 void evacuate1 (StgClosure **p);
 
 extern lnat thunk_selector_depth;
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* SM_EVAC_H */
 
diff --git a/rts/sm/GC.h b/rts/sm/GC.h
index 2435c6cd4b809dc7c873d148184e5c0cb7014f8b..4b928e9bfa18819558072132a231d833162bb295 100644
--- a/rts/sm/GC.h
+++ b/rts/sm/GC.h
@@ -14,7 +14,7 @@
 #ifndef SM_GC_H
 #define SM_GC_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 void GarbageCollect(rtsBool force_major_gc, nat gc_type, Capability *cap);
 
@@ -58,6 +58,6 @@ void releaseGCThreads (Capability *cap);
 
 #define WORK_UNIT_WORDS 128
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* SM_GC_H */
diff --git a/rts/sm/GCThread.h b/rts/sm/GCThread.h
index 44ea537cda39db293af0bbf7aa02eca77691e2ce..d2459fd96bea680485986a9e551fb9810feacc7c 100644
--- a/rts/sm/GCThread.h
+++ b/rts/sm/GCThread.h
@@ -16,7 +16,7 @@
 
 #include "WSDeque.h"
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 /* -----------------------------------------------------------------------------
    General scheme
@@ -272,7 +272,7 @@ extern StgWord8 the_gc_thread[];
 
 #endif
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif // SM_GCTHREAD_H
 
diff --git a/rts/sm/GCUtils.h b/rts/sm/GCUtils.h
index c8f8d55c6030abf14014c8510a7faeebf4070f85..7fafe51ba2ca064b0a4e43d091cf1da424689a57 100644
--- a/rts/sm/GCUtils.h
+++ b/rts/sm/GCUtils.h
@@ -14,7 +14,7 @@
 #ifndef SM_GCUTILS_H
 #define SM_GCUTILS_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 bdescr *allocBlock_sync(void);
 void    freeChain_sync(bdescr *bd);
@@ -61,6 +61,6 @@ recordMutableGen_GC (StgClosure *p, nat gen_no)
     *bd->free++ = (StgWord)p;
 }
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* SM_GCUTILS_H */
diff --git a/rts/sm/MarkWeak.h b/rts/sm/MarkWeak.h
index 7fd81e536bf432d2927bd43cb2b40f940453672d..018dd6cd798cbc90cf71de6f4060b4a07b8eee3f 100644
--- a/rts/sm/MarkWeak.h
+++ b/rts/sm/MarkWeak.h
@@ -14,7 +14,7 @@
 #ifndef SM_MARKWEAK_H
 #define SM_MARKWEAK_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 extern StgWeak *old_weak_ptr_list;
 extern StgTSO *resurrected_threads;
@@ -25,6 +25,6 @@ rtsBool traverseWeakPtrList    ( void );
 void    markWeakPtrList        ( void );
 rtsBool traverseBlackholeQueue ( void );
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* SM_MARKWEAK_H */
diff --git a/rts/sm/OSMem.h b/rts/sm/OSMem.h
index 92fe350045c6503471469c43dfa03cae94c986fd..ee6b810f393edd27631875a7c0dc4f2b3819ba73 100644
--- a/rts/sm/OSMem.h
+++ b/rts/sm/OSMem.h
@@ -9,7 +9,7 @@
 #ifndef SM_OSMEM_H
 #define SM_OSMEM_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 void osMemInit(void);
 void *osGetMBlocks(nat n);
@@ -17,6 +17,6 @@ void osFreeAllMBlocks(void);
 lnat getPageSize (void);
 void setExecutable (void *p, lnat len, rtsBool exec);
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* SM_OSMEM_H */
diff --git a/rts/sm/Scav.h b/rts/sm/Scav.h
index 259fe1289a869d2e41eeb6b1e8efaeb51e91d83b..ad466c8488866e30137e8ff00bed90b9cfbb4c9a 100644
--- a/rts/sm/Scav.h
+++ b/rts/sm/Scav.h
@@ -14,7 +14,7 @@
 #ifndef SM_SCAV_H
 #define SM_SCAV_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 void    scavenge_loop (void);
 void    scavenge_mutable_list (bdescr *bd, generation *gen);
@@ -26,7 +26,7 @@ void    scavenge_mutable_list1 (bdescr *bd, generation *gen);
 void    scavenge_capability_mut_Lists1 (Capability *cap);
 #endif
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* SM_SCAV_H */
 
diff --git a/rts/sm/Storage.h b/rts/sm/Storage.h
index 573d6bcd5b97b9646131d66eb842116ffe99cfe5..5ddcbdcdc2c78d45d3993945cdbbb6dd4c244874 100644
--- a/rts/sm/Storage.h
+++ b/rts/sm/Storage.h
@@ -9,7 +9,7 @@
 #ifndef SM_STORAGE_H
 #define SM_STORAGE_H
 
-#pragma GCC visibility push(hidden)
+BEGIN_RTS_PRIVATE
 
 /* -----------------------------------------------------------------------------
    Initialisation / De-initialisation
@@ -156,6 +156,6 @@ void move_TSO  (StgTSO *src, StgTSO *dest);
 extern StgClosure * caf_list;
 extern StgClosure * revertible_caf_list;
 
-#pragma GCC visibility pop
+END_RTS_PRIVATE
 
 #endif /* SM_STORAGE_H */