diff --git a/addrcheck/ac_main.c b/addrcheck/ac_main.c
index 8d94404..41a8560 100644
--- a/addrcheck/ac_main.c
+++ b/addrcheck/ac_main.c
@@ -233,7 +233,7 @@
    UChar   abits8;
    PROF_EVENT(24);
 #  ifdef VG_DEBUG_MEMORY
-   sk_assert(IS_ALIGNED4_ADDR(a));
+   tl_assert(IS_ALIGNED4_ADDR(a));
 #  endif
    sm     = primary_map[a >> 16];
    sm_off = a & 0xFFFF;
@@ -274,10 +274,10 @@
       indicate bugs in our machinery.  30,000,000 is arbitrary, but so
       far all legitimate requests have fallen beneath that size. */
    /* 4 Mar 02: this is just stupid; get rid of it. */
-   /* sk_assert(len < 30000000); */
+   /* tl_assert(len < 30000000); */
 
    /* Check the permissions make sense. */
-   sk_assert(example_a_bit == VGM_BIT_VALID 
+   tl_assert(example_a_bit == VGM_BIT_VALID 
              || example_a_bit == VGM_BIT_INVALID);
 
    /* In order that we can charge through the address space at 8
@@ -317,7 +317,7 @@
       VGP_POPCC(VgpSetMem);
       return;
    }
-   sk_assert((a % 8) == 0 && len > 0);
+   tl_assert((a % 8) == 0 && len > 0);
 
    /* Once aligned, go fast. */
    while (True) {
@@ -335,7 +335,7 @@
       VGP_POPCC(VgpSetMem);
       return;
    }
-   sk_assert((a % 8) == 0 && len > 0 && len < 8);
+   tl_assert((a % 8) == 0 && len > 0 && len < 8);
 
    /* Finish the upper fragment. */
    while (True) {
@@ -350,7 +350,7 @@
    /* Check that zero page and highest page have not been written to
       -- this could happen with buggy syscall wrappers.  Today
       (2001-04-26) had precisely such a problem with __NR_setitimer. */
-   sk_assert(SK_(cheap_sanity_check)());
+   tl_assert(SK_(cheap_sanity_check)());
    VGP_POPCC(VgpSetMem);
 }
 
@@ -550,7 +550,7 @@
          break;
 
       case Vg_CoreSignal:
-         sk_assert(isWrite);     /* Should only happen with isWrite case */
+         tl_assert(isWrite);     /* Should only happen with isWrite case */
          /* fall through */
       case Vg_CorePThread:
          MAC_(record_core_mem_error)( tid, /*isUnaddr*/True, s );
@@ -559,7 +559,7 @@
       /* If we're being asked to jump to a silly address, record an error 
          message before potentially crashing the entire system. */
       case Vg_CoreTranslate:
-         sk_assert(!isWrite);    /* Should only happen with !isWrite case */
+         tl_assert(!isWrite);    /* Should only happen with !isWrite case */
          MAC_(record_jump_error)( tid, bad_addr );
          break;
 
@@ -594,7 +594,7 @@
 
    VGP_PUSHCC(VgpCheckMem);
 
-   sk_assert(part == Vg_CoreSysCall);
+   tl_assert(part == Vg_CoreSysCall);
    ok = ac_check_readable_asciiz ( (Addr)str, &bad_addr );
    if (!ok) {
       MAC_(record_param_error) ( tid, bad_addr, /*IsReg*/False,
@@ -793,7 +793,7 @@
       (which is the default), and the address is 4-aligned.  
       If not, Case 2 will have applied.
    */
-   sk_assert(MAC_(clo_partial_loads_ok));
+   tl_assert(MAC_(clo_partial_loads_ok));
    {
       return;
    }
@@ -1001,11 +1001,11 @@
             break;
 
 	 case SSE3ag_MemRd_RegWr:
-            sk_assert(u_in->size == 4 || u_in->size == 8);
+            tl_assert(u_in->size == 4 || u_in->size == 8);
             helper = (Addr)ac_fpu_READ_check;
 	    goto do_Access_ARG1;
          do_Access_ARG1:
-	    sk_assert(u_in->tag1 == TempReg);
+	    tl_assert(u_in->tag1 == TempReg);
             t_addr = u_in->val1;
             t_size = newTemp(cb);
 	    uInstr2(cb, MOV, 4, Literal, 0, TempReg, t_size);
@@ -1016,11 +1016,11 @@
             break;
 
          case MMX2_MemRd:
-            sk_assert(u_in->size == 4 || u_in->size == 8);
+            tl_assert(u_in->size == 4 || u_in->size == 8);
             helper = (Addr)ac_fpu_READ_check;
 	    goto do_Access_ARG2;
          case MMX2_MemWr:
-            sk_assert(u_in->size == 4 || u_in->size == 8);
+            tl_assert(u_in->size == 4 || u_in->size == 8);
             helper = (Addr)ac_fpu_WRITE_check;
 	    goto do_Access_ARG2;
          case FPU_R:
@@ -1030,7 +1030,7 @@
             helper = (Addr)ac_fpu_WRITE_check;
             goto do_Access_ARG2;
          do_Access_ARG2:
-	    sk_assert(u_in->tag2 == TempReg);
+	    tl_assert(u_in->tag2 == TempReg);
             t_addr = u_in->val2;
             t_size = newTemp(cb);
 	    uInstr2(cb, MOV, 4, Literal, 0, TempReg, t_size);
@@ -1052,9 +1052,9 @@
             helper = (Addr)ac_fpu_WRITE_check;
 	    goto do_Access_ARG3;
          do_Access_ARG3:
-	    sk_assert(u_in->size == 4 || u_in->size == 8
+	    tl_assert(u_in->size == 4 || u_in->size == 8
                       || u_in->size == 16 || u_in->size == 512);
-            sk_assert(u_in->tag3 == TempReg);
+            tl_assert(u_in->tag3 == TempReg);
             t_addr = u_in->val3;
             t_size = newTemp(cb);
 	    uInstr2(cb, MOV, 4, Literal, 0, TempReg, t_size);
@@ -1094,7 +1094,7 @@
 static
 Bool ac_is_valid_64k_chunk ( UInt chunk_number )
 {
-   sk_assert(chunk_number >= 0 && chunk_number < 65536);
+   tl_assert(chunk_number >= 0 && chunk_number < 65536);
    if (IS_DISTINGUISHED_SM(primary_map[chunk_number])) {
       /* Definitely not in use. */
       return False;
@@ -1110,7 +1110,7 @@
 Bool ac_is_valid_address ( Addr a )
 {
    UChar abits;
-   sk_assert(IS_ALIGNED4_ADDR(a));
+   tl_assert(IS_ALIGNED4_ADDR(a));
    abits = get_abits4_ALIGNED(a);
    if (abits == VGM_NIBBLE_VALID) {
       return True;
diff --git a/cachegrind/cg_main.c b/cachegrind/cg_main.c
index ac91f41..f795dc4 100644
--- a/cachegrind/cg_main.c
+++ b/cachegrind/cg_main.c
@@ -370,7 +370,7 @@
    *bb_seen_before = ( NULL == bb_info ? False : True );
    if (*bb_seen_before) {
       // BB must have been translated before, but flushed from the TT
-      sk_assert(bb_info->n_instrs == n_instrs );
+      tl_assert(bb_info->n_instrs == n_instrs );
       BB_retranslations++;
    } else {
       // BB never translated before (at this address, at least;  could have
@@ -391,9 +391,9 @@
 {
    lineCC* parent = get_lineCC(instr_addr);
    if (bb_seen_before) {
-      sk_assert( n->instr_addr == instr_addr );
-      sk_assert( n->instr_size == instr_size );
-      sk_assert( n->data_size  == data_size );
+      tl_assert( n->instr_addr == instr_addr );
+      tl_assert( n->instr_size == instr_size );
+      tl_assert( n->data_size  == data_size );
       // Don't assert that (n->parent == parent)... it's conceivable that
       // the debug info might change;  the other asserts should be enough to
       // detect anything strange.
@@ -424,7 +424,7 @@
            t_data_addr1 = INVALID_TEMPREG,
            t_data_addr2 = INVALID_TEMPREG;
 
-   sk_assert(instr_size >= MIN_INSTR_SIZE && 
+   tl_assert(instr_size >= MIN_INSTR_SIZE && 
              instr_size <= MAX_INSTR_SIZE);
 
 #define IS_(X)      (INVALID_TEMPREG != t_##X##_addr)
@@ -432,29 +432,29 @@
 
    // Work out what kind of x86 instruction it is
    if (!IS_(read) && !IS_(write)) {
-      sk_assert( 0 == data_size );
-      sk_assert(INV(t_read) && INV(t_write));
+      tl_assert( 0 == data_size );
+      tl_assert(INV(t_read) && INV(t_write));
       helper = (Addr) & log_1I_0D_cache_access;
       argc = 1;
 
    } else if (IS_(read) && !IS_(write)) {
-      sk_assert( is_valid_data_size(data_size) );
-      sk_assert(!INV(t_read) && INV(t_write));
+      tl_assert( is_valid_data_size(data_size) );
+      tl_assert(!INV(t_read) && INV(t_write));
       helper = (Addr) & log_1I_1Dr_cache_access;
       argc = 2;
       t_data_addr1 = t_read_addr;
 
    } else if (!IS_(read) && IS_(write)) {
-      sk_assert( is_valid_data_size(data_size) );
-      sk_assert(INV(t_read) && !INV(t_write));
+      tl_assert( is_valid_data_size(data_size) );
+      tl_assert(INV(t_read) && !INV(t_write));
       helper = (Addr) & log_1I_1Dw_cache_access;
       argc = 2;
       t_data_addr1 = t_write_addr;
 
    } else {
-      sk_assert(IS_(read) && IS_(write));
-      sk_assert( is_valid_data_size(data_size) );
-      sk_assert(!INV(t_read) && !INV(t_write));
+      tl_assert(IS_(read) && IS_(write));
+      tl_assert( is_valid_data_size(data_size) );
+      tl_assert(!INV(t_read) && !INV(t_write));
       if (t_read == t_write) {
          helper = (Addr) & log_1I_1Dr_cache_access;
          argc = 2;
@@ -530,7 +530,7 @@
       // x86 instruction sizes are obtained from INCEIPs (for case 1) or
       // from .extra4b field of the final JMP (for case 2 & 3).
 
-      if (instrumented_Jcc) sk_assert(u_in->opcode == JMP);
+      if (instrumented_Jcc) tl_assert(u_in->opcode == JMP);
 
       switch (u_in->opcode) {
 
@@ -599,18 +599,18 @@
          // JMP: insert instrumentation if the first JMP
          case JMP:
             if (instrumented_Jcc) {
-               sk_assert(CondAlways == u_in->cond);
-               sk_assert(i+1 == VG_(get_num_instrs)(cb_in));
+               tl_assert(CondAlways == u_in->cond);
+               tl_assert(i+1 == VG_(get_num_instrs)(cb_in));
                VG_(copy_UInstr)(cb, u_in);
                instrumented_Jcc = False;     // rest
                break;
             } else {
                // The first JMP... instrument.
                if (CondAlways != u_in->cond) {
-                  sk_assert(i+2 == VG_(get_num_instrs)(cb_in));
+                  tl_assert(i+2 == VG_(get_num_instrs)(cb_in));
                   instrumented_Jcc = True;
                } else {
-                  sk_assert(i+1 == VG_(get_num_instrs)(cb_in));
+                  tl_assert(i+1 == VG_(get_num_instrs)(cb_in));
                }
                // Get x86 instr size from final JMP.
                x86_instr_size = VG_(get_last_instr)(cb_in)->extra4b;
@@ -646,8 +646,8 @@
    }
 
    // BB address should be the same as the first instruction's address.
-   sk_assert(bb_info->BB_addr == bb_info->instrs[0].instr_addr );
-   sk_assert(bb_info_i == bb_info->n_instrs);
+   tl_assert(bb_info->BB_addr == bb_info->instrs[0].instr_addr );
+   tl_assert(bb_info_i == bb_info->n_instrs);
 
    VG_(free_UCodeBlock)(cb_in);
    return cb;
@@ -1033,7 +1033,7 @@
 
    // Get BB info, remove from table, free BB info.  Simple!
    bb_info = VG_(HT_get_node)(instr_info_table, a, &prev_next_ptr);
-   sk_assert(NULL != bb_info);
+   tl_assert(NULL != bb_info);
    *prev_next_ptr = bb_info->next;
    VG_(free)(bb_info);
 }
@@ -1130,7 +1130,7 @@
    VG_(register_compact_helper)((Addr) & log_1I_2D_cache_access);
 
    /* Get working directory */
-   sk_assert( VG_(getcwd_alloc)(&base_dir) );
+   tl_assert( VG_(getcwd_alloc)(&base_dir) );
 
    /* Block is big enough for dir name + cachegrind.out.<pid> */
    cachegrind_out_file = VG_(malloc)((VG_(strlen)(base_dir) + 32)*sizeof(Char));
diff --git a/cachegrind/x86/cg_arch.c b/cachegrind/x86/cg_arch.c
index a070c97..13d01eb 100644
--- a/cachegrind/x86/cg_arch.c
+++ b/cachegrind/x86/cg_arch.c
@@ -265,10 +265,10 @@
    sigill_new.sa_flags    = 0;
    sigill_new.sa_restorer = NULL;
    res = VG_(sigemptyset)( &sigill_new.sa_mask );
-   sk_assert(res == 0);
+   tl_assert(res == 0);
 
    res = VG_(sigaction)( VKI_SIGILL, &sigill_new, &sigill_saved );
-   sk_assert(res == 0);
+   tl_assert(res == 0);
 
    /* Trap for illegal instruction, in case it's a really old processor that
     * doesn't support CPUID. */
@@ -279,14 +279,14 @@
 
       /* Restore old SIGILL handler */
       res = VG_(sigaction)( VKI_SIGILL, &sigill_saved, NULL );
-      sk_assert(res == 0);
+      tl_assert(res == 0);
 
    } else  {
       VG_(message)(Vg_DebugMsg, "CPUID instruction not supported");
 
       /* Restore old SIGILL handler */
       res = VG_(sigaction)( VKI_SIGILL, &sigill_saved, NULL );
-      sk_assert(res == 0);
+      tl_assert(res == 0);
       return -1;
    }
 
diff --git a/coregrind/vg_errcontext.c b/coregrind/vg_errcontext.c
index 1b8f704..73b9953 100644
--- a/coregrind/vg_errcontext.c
+++ b/coregrind/vg_errcontext.c
@@ -307,7 +307,7 @@
 void construct_error ( Error* err, ThreadId tid, ErrorKind ekind, Addr a,
                        Char* s, void* extra, ExeContext* where )
 {
-   sk_assert(tid < VG_N_THREADS);
+   tl_assert(tid < VG_N_THREADS);
 
    /* Core-only parts */
    err->next     = NULL;
diff --git a/coregrind/vg_instrument.c b/coregrind/vg_instrument.c
index 8df8c78..6220496 100644
--- a/coregrind/vg_instrument.c
+++ b/coregrind/vg_instrument.c
@@ -60,7 +60,7 @@
 // f(reg)
 void VG_(ccall_R_0)(UCodeBlock* cb, Addr f, UInt t1, UInt regparms_n)
 {
-   sk_assert(regparms_n <= 1);
+   tl_assert(regparms_n <= 1);
    uInstr1(cb, CCALL, 0, TempReg, t1);
    uCCall(cb, f, 1, regparms_n, /*retval*/False);
 }
@@ -76,8 +76,8 @@
 void VG_(ccall_R_R)(UCodeBlock* cb, Addr f, UInt t1, UInt t_ret,
                     UInt regparms_n)
 {
-   sk_assert(regparms_n <= 1);
-   sk_assert(t1 < VG_(get_num_temps)(cb)); // help catch lits accidentally passed in
+   tl_assert(regparms_n <= 1);
+   tl_assert(t1 < VG_(get_num_temps)(cb)); // help catch lits accidentally passed in
    uInstr3(cb, CCALL, 0, TempReg, t1, NoValue, 0, TempReg, t_ret);
    uCCall(cb, f, 1, regparms_n, /*retval*/True);
 }
@@ -93,9 +93,9 @@
 // f(reg, reg)
 void VG_(ccall_RR_0)(UCodeBlock* cb, Addr f, UInt t1, UInt t2, UInt regparms_n)
 {
-   sk_assert(regparms_n <= 2);
-   sk_assert(t1 < VG_(get_num_temps)(cb));
-   sk_assert(t2 < VG_(get_num_temps)(cb));
+   tl_assert(regparms_n <= 2);
+   tl_assert(t1 < VG_(get_num_temps)(cb));
+   tl_assert(t2 < VG_(get_num_temps)(cb));
    uInstr2(cb, CCALL, 0, TempReg, t1, TempReg, t2);
    uCCall(cb, f, 2, regparms_n, /*retval*/False);
 }
@@ -129,9 +129,9 @@
 void VG_(ccall_RR_R)(UCodeBlock* cb, Addr f, UInt t1, UInt t2, UInt t_ret,
                      UInt regparms_n)
 {
-   sk_assert(regparms_n <= 2);
-   sk_assert(t1 < VG_(get_num_temps)(cb));
-   sk_assert(t2 < VG_(get_num_temps)(cb));
+   tl_assert(regparms_n <= 2);
+   tl_assert(t1 < VG_(get_num_temps)(cb));
+   tl_assert(t2 < VG_(get_num_temps)(cb));
    uInstr3(cb, CCALL, 0, TempReg, t1, TempReg, t2, TempReg, t_ret);
    uCCall(cb, f, 2, regparms_n, /*retval*/True);
 }
@@ -165,10 +165,10 @@
 void VG_(ccall_RRR_0)(UCodeBlock* cb, Addr f, UInt t1, UInt t2,
                       UInt t3, UInt regparms_n)
 {
-   sk_assert(regparms_n <= 3);
-   sk_assert(t1 < VG_(get_num_temps)(cb));
-   sk_assert(t2 < VG_(get_num_temps)(cb));
-   sk_assert(t3 < VG_(get_num_temps)(cb));
+   tl_assert(regparms_n <= 3);
+   tl_assert(t1 < VG_(get_num_temps)(cb));
+   tl_assert(t2 < VG_(get_num_temps)(cb));
+   tl_assert(t3 < VG_(get_num_temps)(cb));
    uInstr3(cb, CCALL, 0, TempReg, t1, TempReg, t2, TempReg, t3);
    uCCall(cb, f, 3, regparms_n, /*retval*/False);
 }
diff --git a/coregrind/vg_malloc2.c b/coregrind/vg_malloc2.c
index e46098d..6721d35 100644
--- a/coregrind/vg_malloc2.c
+++ b/coregrind/vg_malloc2.c
@@ -396,7 +396,7 @@
    }
 
    /* No particular reason for this figure, it's just smallish */
-   sk_assert(VG_(vg_malloc_redzone_szB) < 128);
+   tl_assert(VG_(vg_malloc_redzone_szB) < 128);
    client_rz_szB = VG_(vg_malloc_redzone_szB);
 
    /* Use checked red zones (of various sizes) for our internal stuff,
diff --git a/coregrind/vg_memory.c b/coregrind/vg_memory.c
index fa62f1a..f04ff0e 100644
--- a/coregrind/vg_memory.c
+++ b/coregrind/vg_memory.c
@@ -742,8 +742,8 @@
 {
    len = PGROUNDUP(len);
 
-   sk_assert(!(sf_flags & SF_FIXED));
-   sk_assert(0 == addr);
+   tl_assert(!(sf_flags & SF_FIXED));
+   tl_assert(0 == addr);
 
    addr = (Addr)VG_(mmap)((void *)addr, len, prot, 
                           VKI_MAP_PRIVATE | VKI_MAP_ANONYMOUS | VKI_MAP_CLIENT,
diff --git a/coregrind/vg_procselfmaps.c b/coregrind/vg_procselfmaps.c
index 19f9ecc..b649f87 100644
--- a/coregrind/vg_procselfmaps.c
+++ b/coregrind/vg_procselfmaps.c
@@ -152,7 +152,7 @@
    UInt	  ino;
    UWord  foffset, maj, min;
 
-   sk_assert( '\0' != procmap_buf[0] && 0 != buf_n_tot);
+   tl_assert( '\0' != procmap_buf[0] && 0 != buf_n_tot);
 
    if (0)
       VG_(message)(Vg_DebugMsg, "raw:\n%s", procmap_buf );
diff --git a/helgrind/hg_main.c b/helgrind/hg_main.c
index 01e0af0..35fe3e0 100644
--- a/helgrind/hg_main.c
+++ b/helgrind/hg_main.c
@@ -53,7 +53,7 @@
 #define DEBUG_VIRGIN_READS  0   /* Dump around address on VIRGIN reads */
 
 #if SLOW_ASSERTS
-#define SK_ASSERT(x)	sk_assert(x)
+#define SK_ASSERT(x)	tl_assert(x)
 #else
 #define SK_ASSERT(x)
 #endif
@@ -113,7 +113,7 @@
 }
 
 #define PROF_EVENT(ev)                                  \
-   do { sk_assert((ev) >= 0 && (ev) < N_PROF_EVENTS);   \
+   do { tl_assert((ev) >= 0 && (ev) < N_PROF_EVENTS);   \
         event_ctr[ev]++;                                \
    } while (False);
 
@@ -412,13 +412,13 @@
       VG_(printf)("making TLS %p(%u) prior to TLS %p(%u)\n",
 		  thread_seg[prior], prior, tls, tid);
 
-   sk_assert(thread_seg[tid] != NULL);
-   sk_assert(thread_seg[prior] != NULL);
+   tl_assert(thread_seg[tid] != NULL);
+   tl_assert(thread_seg[prior] != NULL);
 
    if (tls->prior[0] == NULL)
       tls->prior[0] = thread_seg[prior];
    else {
-      sk_assert(tls->prior[1] == NULL);
+      tl_assert(tls->prior[1] == NULL);
       tls->prior[1] = thread_seg[prior];
    }
 }
@@ -514,7 +514,7 @@
 
    /* Use bits 31..16 for primary, 15..2 for secondary lookup */
    sm     = primary_map[a >> 16];
-   sk_assert(sm != &distinguished_secondary_map);
+   tl_assert(sm != &distinguished_secondary_map);
    oldsw = &sm->swords[(a & 0xFFFC) >> 2];
    if (oldsw->state == Vge_Excl && oldsw->other != TLSP_INDICATING_ALL) {
       ThreadLifeSeg *tls = unpackTLS(oldsw->other);
@@ -579,7 +579,7 @@
    ThreadId tid = VG_(get_current_or_recent_tid)();
    ThreadLifeSeg *tls;
 
-   sk_assert(tid != VG_INVALID_THREADID);
+   tl_assert(tid != VG_INVALID_THREADID);
    tls = thread_seg[tid];
 
    sword = SW(Vge_Excl, packTLS(tls));
@@ -596,7 +596,7 @@
 {
    shadow_word sword;
 
-   sk_assert(VG_INVALID_THREADID == VG_(get_current_tid)());
+   tl_assert(VG_INVALID_THREADID == VG_(get_current_tid)());
 
    sword = SW(Vge_Virgin, TID_INDICATING_NONVIRGIN);
 
@@ -695,7 +695,7 @@
    Int  i;
    UInt hash = ls->setsize + (with != NULL) - (without != NULL);
    
-   sk_assert(with == NULL || with != without);
+   tl_assert(with == NULL || with != without);
 
    for(i = 0; with != NULL || i < ls->setsize; i++) {
       const Mutex *mx = i >= ls->setsize ? NULL : ls->mutex[i];
@@ -817,7 +817,7 @@
       print_LockSet("     2:      b", b);
    }
 
-   sk_assert(ia == a->setsize || mutex_cmp(a->mutex[ia], missing_mutex) >= 0);
+   tl_assert(ia == a->setsize || mutex_cmp(a->mutex[ia], missing_mutex) >= 0);
 
    if (ib == b->setsize || mutex_cmp(missing_mutex, b->mutex[ib]) != 0)
       return False;
@@ -885,7 +885,7 @@
    
    set->hash = hash;
 
-   sk_assert(lookup_LockSet(set) == NULL);
+   tl_assert(lookup_LockSet(set) == NULL);
 
    set->next = lockset_hash[hash];
    lockset_hash[hash] = set;
@@ -1014,7 +1014,7 @@
    if (debug || LOCKSET_SANITY)
       sanity_check_locksets("add-IN");
 
-   sk_assert(!ismember(ls, mx));
+   tl_assert(!ismember(ls, mx));
 
    ret = alloc_LockSet(ls->setsize+1);
 
@@ -1033,7 +1033,7 @@
    if (mx)
       ret->mutex[j++] = mx;
 
-   sk_assert(j == ret->setsize);
+   tl_assert(j == ret->setsize);
 
    if (debug || LOCKSET_SANITY) {
       print_LockSet("add-OUT", ret);
@@ -1060,7 +1060,7 @@
    if (debug || LOCKSET_SANITY)
       sanity_check_locksets("remove-IN");
 
-   sk_assert(ismember(ls, mx));
+   tl_assert(ismember(ls, mx));
 
    ret = alloc_LockSet(ls->setsize-1);
 
@@ -1070,7 +1070,7 @@
       ret->mutex[j++] = ls->mutex[i];
    }
 
-   sk_assert(j == ret->setsize);
+   tl_assert(j == ret->setsize);
 
    if (debug || LOCKSET_SANITY) {
       print_LockSet("remove-OUT", ret);
@@ -1110,7 +1110,7 @@
       } else if (mutex_cmp(a->mutex[ia], b->mutex[ib]) < 0) {
 	 ia++;
       } else {
-	 sk_assert(mutex_cmp(a->mutex[ia], b->mutex[ib]) > 0);
+	 tl_assert(mutex_cmp(a->mutex[ia], b->mutex[ib]) > 0);
 	 ib++;
       } 
    }
@@ -1119,14 +1119,14 @@
    ret = alloc_LockSet(size);
    for (iret = ia = ib = 0; ia < a->setsize && ib < b->setsize; ) {
       if (mutex_cmp(a->mutex[ia], b->mutex[ib]) == 0) {
-	 sk_assert(iret < ret->setsize);
+	 tl_assert(iret < ret->setsize);
 	 ret->mutex[iret++] = a->mutex[ia];
 	 ia++;
 	 ib++;
       } else if (mutex_cmp(a->mutex[ia], b->mutex[ib]) < 0) {
 	 ia++;
       } else {
-	 sk_assert(mutex_cmp(a->mutex[ia], b->mutex[ib]) > 0);
+	 tl_assert(mutex_cmp(a->mutex[ia], b->mutex[ib]) > 0);
 	 ib++;
       } 
    }
@@ -1229,7 +1229,7 @@
 	 size++;
 	 ia++;
       } else {
-	 sk_assert(cmp > 0);
+	 tl_assert(cmp > 0);
 	 size++;
 	 ib++;
       } 
@@ -1239,7 +1239,7 @@
    ret = alloc_LockSet(size);
    for (iret = ia = ib = 0; (ia < a->setsize) || (ib < b->setsize); ) {
       Int cmp;
-      sk_assert(iret < ret->setsize);
+      tl_assert(iret < ret->setsize);
 
       if ((ia < a->setsize) && (ib < b->setsize))
 	 cmp = mutex_cmp(a->mutex[ia], b->mutex[ib]);
@@ -1256,13 +1256,13 @@
 	 ret->mutex[iret++] = a->mutex[ia];
 	 ia++;
       } else {
-	 sk_assert(cmp > 0);
+	 tl_assert(cmp > 0);
 	 ret->mutex[iret++] = b->mutex[ib];
 	 ib++;
       } 
    }
 
-   sk_assert(iret == ret->setsize);
+   tl_assert(iret == ret->setsize);
 
    ret->hash = hash_LockSet(ret);
 
@@ -1461,7 +1461,7 @@
 
    switch(state) {
    case MxLocked:
-      sk_assert(!check_cycle(mutex, mutex->lockdep));
+      tl_assert(!check_cycle(mutex, mutex->lockdep));
 
       if (debug)
 	 print_LockSet("thread holding", thread_locks[tid]);
@@ -1539,7 +1539,7 @@
 	 break;
       }
 
-      sk_assert(!check_cycle(mutex, mutex->lockdep));
+      tl_assert(!check_cycle(mutex, mutex->lockdep));
 
       mutex->tid = tid;
       break;
@@ -1557,7 +1557,7 @@
    case MxDead:
       if (mutex->state == MxLocked) {
 	 /* forcably remove offending lock from thread's lockset  */
-	 sk_assert(ismember(thread_locks[mutex->tid], mutex));
+	 tl_assert(ismember(thread_locks[mutex->tid], mutex));
 	 thread_locks[mutex->tid] = remove_LockSet(thread_locks[mutex->tid], mutex);
 	 mutex->tid = VG_INVALID_THREADID;
 
@@ -1655,7 +1655,7 @@
       -- this could happen with buggy syscall wrappers.  Today
       (2001-04-26) had precisely such a problem with
       __NR_setitimer. */
-   sk_assert(SK_(cheap_sanity_check)());
+   tl_assert(SK_(cheap_sanity_check)());
    VGP_POPCC(VgpSARP);
 }
 
@@ -2074,9 +2074,9 @@
 	    break;
 
          case GET:
-	    sk_assert(u_in->tag1 == ArchReg);
-	    sk_assert(u_in->tag2 == TempReg);
-	    sk_assert(u_in->val2 < ntemps);
+	    tl_assert(u_in->tag1 == ArchReg);
+	    tl_assert(u_in->tag2 == TempReg);
+	    tl_assert(u_in->val2 < ntemps);
 
 	    stackref[u_in->val2] = (u_in->size == 4 &&
 				    (u_in->val1 == R_STACK_PTR ||
@@ -2086,7 +2086,7 @@
 
          case MOV:
 	    if (u_in->size == 4 && u_in->tag1 == TempReg) {
-	       sk_assert(u_in->tag2 == TempReg);
+	       tl_assert(u_in->tag2 == TempReg);
 	       stackref[u_in->val2] = stackref[u_in->val1];
 	    }
 	    VG_(copy_UInstr)(cb, u_in);
@@ -2095,7 +2095,7 @@
          case LEA1:
          case ADD: case SUB:
 	    if (u_in->size == 4 && u_in->tag1 == TempReg) {
-	       sk_assert(u_in->tag2 == TempReg);
+	       tl_assert(u_in->tag2 == TempReg);
 	       stackref[u_in->val2] |= stackref[u_in->val1];
 	    }
 	    VG_(copy_UInstr)(cb, u_in);
@@ -2103,8 +2103,8 @@
 
          case LOAD: {
 	    void (*help)(Addr);
-	    sk_assert(1 == u_in->size || 2 == u_in->size || 4 == u_in->size);
-	    sk_assert(u_in->tag1 == TempReg);
+	    tl_assert(1 == u_in->size || 2 == u_in->size || 4 == u_in->size);
+	    tl_assert(u_in->tag1 == TempReg);
 
 	    if (!clo_priv_stacks || !stackref[u_in->val1]) {
 	       nonstk_ld++;
@@ -2131,7 +2131,7 @@
 
          case MMX2_MemRd:
          case FPU_R: {
-            sk_assert(1 == u_in->size || 2 == u_in->size || 4 == u_in->size || 
+            tl_assert(1 == u_in->size || 2 == u_in->size || 4 == u_in->size || 
                       8 == u_in->size || 10 == u_in->size || 108 == u_in->size);
 	    
 	    t_size = newTemp(cb);
@@ -2149,7 +2149,7 @@
 	 } 
 
          case MMX2a1_MemRd: {
-            sk_assert(8 == u_in->size);
+            tl_assert(8 == u_in->size);
 	    
 	    t_size = newTemp(cb);
 	    uInstr2(cb, MOV,   4, Literal, 0, TempReg, t_size);
@@ -2172,7 +2172,7 @@
          case SSE3ag_MemRd_RegWr: {
 	    Int addr = (u_in->opcode == SSE3ag_MemRd_RegWr) ? u_in->val1 : u_in->val3;
 
-            sk_assert(u_in->size == 4 || u_in->size == 8 || u_in->size == 16 || u_in->size == 512);
+            tl_assert(u_in->size == 4 || u_in->size == 8 || u_in->size == 16 || u_in->size == 512);
 	    
 	    t_size = newTemp(cb);
 	    uInstr2(cb, MOV,   4, Literal, 0, TempReg, t_size);
@@ -2188,8 +2188,8 @@
 
          case STORE: {
 	    void (*help)(Addr, UInt);
-            sk_assert(1 == u_in->size || 2 == u_in->size || 4 == u_in->size);
-	    sk_assert(u_in->tag2 == TempReg);
+            tl_assert(1 == u_in->size || 2 == u_in->size || 4 == u_in->size);
+	    tl_assert(u_in->tag2 == TempReg);
 
 	    if (!clo_priv_stacks || !stackref[u_in->val2]) {
 	       nonstk_st++;
@@ -2216,7 +2216,7 @@
 
          case MMX2_MemWr:
          case FPU_W: {
-            sk_assert(1 == u_in->size || 2 == u_in->size || 4 == u_in->size || 
+            tl_assert(1 == u_in->size || 2 == u_in->size || 4 == u_in->size || 
                       8 == u_in->size || 10 == u_in->size || 108 == u_in->size);
 
 	    t_size = newTemp(cb);
@@ -2234,7 +2234,7 @@
 
          case SSE2a_MemWr:
          case SSE3a_MemWr: {
-            sk_assert(4 == u_in->size || 8 == u_in->size || 16 == u_in->size ||
+            tl_assert(4 == u_in->size || 8 == u_in->size || 16 == u_in->size ||
 		      512 == u_in->size);
 
 	    t_size = newTemp(cb);
@@ -2540,7 +2540,7 @@
 {
    Char *e1s, *e2s;
 
-   sk_assert(VG_(get_error_kind)(e1) == VG_(get_error_kind)(e2));
+   tl_assert(VG_(get_error_kind)(e1) == VG_(get_error_kind)(e2));
 
    switch (VG_(get_error_kind)(e1)) {
    case EraserErr:
@@ -2672,7 +2672,7 @@
       case Vge_Excl: {
 	 ThreadLifeSeg *tls = unpackTLS(extra->prevstate.other);
 
-	 sk_assert(tls != unpackTLS(TLSP_INDICATING_ALL));
+	 tl_assert(tls != unpackTLS(TLSP_INDICATING_ALL));
 	 VG_(sprintf)(buf, "exclusively owned by thread %u", tls->tid);
 	 break;
       }
@@ -2798,7 +2798,7 @@
 
 Bool SK_(error_matches_suppression)(Error* err, Supp* su)
 {
-   sk_assert(VG_(get_supp_kind)(su) == EraserSupp);
+   tl_assert(VG_(get_supp_kind)(su) == EraserSupp);
 
    return (VG_(get_error_kind)(err) == EraserErr);
 }
@@ -2949,7 +2949,7 @@
    };
 
    tls = thread_seg[tid];
-   sk_assert(tls != NULL && tls->tid == tid);
+   tl_assert(tls != NULL && tls->tid == tid);
 
    sword = get_sword_addr(a);
    if (sword == SEC_MAP_ACCESS) {
@@ -3059,7 +3059,7 @@
    };
 
    tls = thread_seg[tid];
-   sk_assert(tls != NULL && tls->tid == tid);
+   tl_assert(tls != NULL && tls->tid == tid);
 
    sword = get_sword_addr(a);
    if (sword == SEC_MAP_ACCESS) {
diff --git a/include/tool.h.base b/include/tool.h.base
index c2a9d7f..a39d41c 100644
--- a/include/tool.h.base
+++ b/include/tool.h.base
@@ -475,7 +475,7 @@
 /* Asserts permanently enabled -- no turning off with NDEBUG.  Hurrah! */
 #define VG__STRING(__str)  #__str
 
-#define sk_assert(expr)                                               \
+#define tl_assert(expr)                                               \
   ((void) ((expr) ? 0 :						      \
 	   (VG_(skin_assert_fail) (VG__STRING(expr),	              \
 			           __FILE__, __LINE__,                \
@@ -1797,7 +1797,7 @@
    setting is optional. */
 extern void VG_(details_avg_translation_sizeB) ( UInt size );
 
-/* String printed if an `sk_assert' assertion fails or VG_(skin_panic)
+/* String printed if an `tl_assert' assertion fails or VG_(skin_panic)
    is called.  Should probably be an email address. */
 extern void VG_(details_bug_reports_to)   ( Char* bug_reports_to );
 
diff --git a/include/vg_profile.c b/include/vg_profile.c
index a5860dd..8e8bb95 100644
--- a/include/vg_profile.c
+++ b/include/vg_profile.c
@@ -89,7 +89,7 @@
    Int cc;
    vgp_nticks++;
    cc = vgp_stack[vgp_sp];
-   sk_assert(cc >= 0 && cc < VGP_MAX_CCS);
+   tl_assert(cc >= 0 && cc < VGP_MAX_CCS);
    vgp_counts[ cc ]++;
 }
 
@@ -101,7 +101,7 @@
    /* Register core events... tricky macro definition causes
       VGP_(register_profile_event)() to be called once for each core event
       in VGP_CORE_LIST. */
-   sk_assert(VgpUnc == 0);
+   tl_assert(VgpUnc == 0);
 #  define VGP_PAIR(n,name) VGP_(register_profile_event)(n,name)
    VGP_CORE_LIST;
 #  undef  VGP_PAIR
diff --git a/massif/ms_main.c b/massif/ms_main.c
index e475c0f..2f12625 100644
--- a/massif/ms_main.c
+++ b/massif/ms_main.c
@@ -375,7 +375,7 @@
    xpt->parent       = parent;
 
    // Check parent is not a bottom-XPt
-   sk_assert(parent == NULL || 0 != parent->max_children);
+   tl_assert(parent == NULL || 0 != parent->max_children);
 
    xpt->n_children   = 0;
 
@@ -447,7 +447,7 @@
 
       // Must be at least one alloc function, unless client used
       // MALLOCLIKE_BLOCK
-      if (!custom_malloc) sk_assert(L > 0);    
+      if (!custom_malloc) tl_assert(L > 0);    
 
       // Should be at least one non-alloc function.  If not, try again.
       if (L == n_eips) {
@@ -482,8 +482,8 @@
       while (True) {
          if (nC == xpt->n_children) {
             // not found, insert new XPt
-            sk_assert(xpt->max_children != 0);
-            sk_assert(xpt->n_children <= xpt->max_children);
+            tl_assert(xpt->max_children != 0);
+            tl_assert(xpt->n_children <= xpt->max_children);
             // Expand 'children' if necessary
             if (xpt->n_children == xpt->max_children) {
                xpt->max_children *= 2;
@@ -503,7 +503,7 @@
 
       // Return found/built bottom-XPt.
       if (reached_bottom) {
-         sk_assert(0 == xpt->children[nC]->n_children);   // Must be bottom-XPt
+         tl_assert(0 == xpt->children[nC]->n_children);   // Must be bottom-XPt
          VGP_POPCC(VgpGetXPt);
          return xpt->children[nC];
       }
@@ -519,17 +519,17 @@
 {
    VGP_PUSHCC(VgpUpdateXCon);
 
-   sk_assert(True == clo_heap);
-   sk_assert(0    != space_delta);
-   sk_assert(NULL != xpt);
-   sk_assert(0    == xpt->n_children);    // must be bottom-XPt
+   tl_assert(True == clo_heap);
+   tl_assert(0    != space_delta);
+   tl_assert(NULL != xpt);
+   tl_assert(0    == xpt->n_children);    // must be bottom-XPt
 
    while (xpt != alloc_xpt) {
-      if (space_delta < 0) sk_assert(xpt->curr_space >= -space_delta);
+      if (space_delta < 0) tl_assert(xpt->curr_space >= -space_delta);
       xpt->curr_space += space_delta;
       xpt = xpt->parent;
    } 
-   if (space_delta < 0) sk_assert(alloc_xpt->curr_space >= -space_delta);
+   if (space_delta < 0) tl_assert(alloc_xpt->curr_space >= -space_delta);
    alloc_xpt->curr_space += space_delta;
 
    VGP_POPCC(VgpUpdateXCon);
@@ -602,7 +602,7 @@
 {
    void** old_elems;
 
-   sk_assert(q->tail == q->max_elems);
+   tl_assert(q->tail == q->max_elems);
    if (q->head < 10) {
       old_elems     = q->elems;
       q->max_elems *= 2; 
@@ -655,7 +655,7 @@
 static __inline__
 void remove_HP_Chunk(HP_Chunk* hc, HP_Chunk** prev_chunks_next_ptr)
 {
-   sk_assert(n_heap_blocks > 0);
+   tl_assert(n_heap_blocks > 0);
    n_heap_blocks--;
    *prev_chunks_next_ptr = hc->next;
 }
@@ -719,7 +719,7 @@
    hc = get_HP_Chunk( p, &remove_handle );
    if (hc == NULL)
       return;   // must have been a bogus free(), or p==NULL
-   sk_assert(hc->data == (Addr)p);
+   tl_assert(hc->data == (Addr)p);
    remove_HP_Chunk(hc, remove_handle);
 
    if (clo_heap && hc->size != 0)
@@ -796,7 +796,7 @@
       return NULL;   // must have been a bogus free()
    }
 
-   sk_assert(hc->data == (Addr)p_old);
+   tl_assert(hc->data == (Addr)p_old);
    old_size = hc->size;
   
    if (new_size <= old_size) {
@@ -933,7 +933,7 @@
       FIND_CENSUS(j+1, jn);
       while (jn < MAX_N_CENSI) {
          Int timespan = censi[jn].ms_time - censi[jp].ms_time;
-         sk_assert(timespan >= 0);
+         tl_assert(timespan >= 0);
          if (timespan < min_span) {
             min_span = timespan;
             min_j    = j;
@@ -1053,7 +1053,7 @@
          VGP_PUSHCC(VgpCensusSnapshot);
          xtree_size2 = do_space_snapshot(alloc_xpt->children[i],
                                          census->xtree_snapshots[i], 0);
-         sk_assert(xtree_size == xtree_size2);
+         tl_assert(xtree_size == xtree_size2);
          VGP_POPCC(VgpCensusSnapshot);
       }
 //      VG_(printf)("\n\n");
@@ -1120,7 +1120,7 @@
 
 static void die_mem_stack_signal(Addr a, SizeT len)
 {
-   sk_assert(sigstacks_space >= len);
+   tl_assert(sigstacks_space >= len);
    sigstacks_space -= len;
 }
 
@@ -1137,7 +1137,7 @@
       SizeT sizeB     =        argv[2];
       *ret            = 0;
       res = new_block( p, sizeB, /*align -- ignored*/0, /*is_zeroed*/False );
-      sk_assert(res == p);
+      tl_assert(res == p);
       return True;
    }
    case VG_USERREQ__FREELIKE_BLOCK: {
@@ -1196,7 +1196,7 @@
    // Dummy node at top of the context structure.
    alloc_xpt = new_XPt(0, NULL, /*is_bottom*/False);
 
-   sk_assert( VG_(getcwd_alloc)(&base_dir) );
+   tl_assert( VG_(getcwd_alloc)(&base_dir) );
 }
 
 void SK_(post_clo_init)(void)
@@ -1454,7 +1454,7 @@
    }
 
    // Close file
-   sk_assert(fd >= 0);
+   tl_assert(fd >= 0);
    VG_(close)(fd);
 
    // Attempt to convert file using hp2ps
@@ -1506,7 +1506,7 @@
    static Char mbuf[32];
    
    UInt  p = 10;
-   sk_assert(0 != total_spacetime);
+   tl_assert(0 != total_spacetime);
    percentify(spacetime * 100 * p / total_spacetime, p, 5, mbuf); 
    return mbuf;
 }
@@ -1522,7 +1522,7 @@
    Char* maybe_br     = ( is_HTML ? "<br>" : "" );
    Char* maybe_indent = ( is_HTML ? "&nbsp;&nbsp;" : "" );
 
-   sk_assert(NULL != xpt);
+   tl_assert(NULL != xpt);
 
    while (True) {
       rev_eips[i] = xpt->eip;
@@ -1579,23 +1579,23 @@
 
    while (NULL != (xpt = (XPt*)dequeue(q))) {
       // Check that non-top-level XPts have a zero .approx_ST field.
-      if (xpt->parent != alloc_xpt) sk_assert( 0 == xpt->approx_ST );
+      if (xpt->parent != alloc_xpt) tl_assert( 0 == xpt->approx_ST );
 
       // Check that the sum of all children .exact_ST_dbld fields equals
       // parent's (unless alloc_xpt, when it should == 0).
       if (alloc_xpt == xpt) {
-         sk_assert(0 == xpt->exact_ST_dbld);
+         tl_assert(0 == xpt->exact_ST_dbld);
       } else {
          sum = 0;
          for (i = 0; i < xpt->n_children; i++) {
             sum += xpt->children[i]->exact_ST_dbld;
          }
-         //sk_assert(sum == xpt->exact_ST_dbld);
+         //tl_assert(sum == xpt->exact_ST_dbld);
          // It's possible that not all the children were included in the
          // exact_ST_dbld calculations.  Hopefully almost all of them were, and
          // all the important ones.
-//         sk_assert(sum <= xpt->exact_ST_dbld);
-//         sk_assert(sum * 1.05 > xpt->exact_ST_dbld );
+//         tl_assert(sum <= xpt->exact_ST_dbld);
+//         tl_assert(sum * 1.05 > xpt->exact_ST_dbld );
 //         if (sum != xpt->exact_ST_dbld) {
 //            VG_(printf)("%ld, %ld\n", sum, xpt->exact_ST_dbld);
 //         }
@@ -1618,7 +1618,7 @@
                          perc);
          }
          n = pp_XCon(fd, xpt);
-         sk_assert(n == L);
+         tl_assert(n == L);
       }
 
       // Sort children by exact_ST_dbld
@@ -1734,7 +1734,7 @@
    if (clo_heap)
       pp_all_XPts(fd, alloc_xpt, heap_ST, total_ST);
 
-   sk_assert(fd >= 0);
+   tl_assert(fd >= 0);
    VG_(close)(fd);
 
    VGP_POPCC(VgpPrintXPts);
@@ -1762,17 +1762,17 @@
                    ( 0 == total_ST ? (Char*)"(n/a)"
                                    : make_perc(heap_admin_ST, total_ST) ) );
 
-   sk_assert( VG_(HT_count_nodes)(malloc_list) == n_heap_blocks );
+   tl_assert( VG_(HT_count_nodes)(malloc_list) == n_heap_blocks );
 
    // Stack(s) ----------------------------------------------------------
    if (clo_stacks) {
-      sk_assert(0 != total_ST);
+      tl_assert(0 != total_ST);
       VG_(message)(Vg_UserMsg, "stack(s):          %s", 
                    make_perc(stack_ST, total_ST) );
    }
 
    if (VG_(clo_verbosity) > 1) {
-      sk_assert(n_xpts > 0);  // always have alloc_xpt
+      tl_assert(n_xpts > 0);  // always have alloc_xpt
       VG_(message)(Vg_DebugMsg, "    allocs: %u", n_allocs);
       VG_(message)(Vg_DebugMsg, "zeroallocs: %u (%d%%)", n_zero_allocs,
                                 n_zero_allocs * 100 / n_allocs );
diff --git a/memcheck/mac_leakcheck.c b/memcheck/mac_leakcheck.c
index c839c17..6320feb 100644
--- a/memcheck/mac_leakcheck.c
+++ b/memcheck/mac_leakcheck.c
@@ -93,33 +93,33 @@
    sigbus_new.sa_flags = VKI_SA_ONSTACK | VKI_SA_RESTART;
    sigbus_new.sa_restorer = NULL;
    res = VG_(sigemptyset)( &sigbus_new.sa_mask );
-   sk_assert(res == 0);
+   tl_assert(res == 0);
 
    sigsegv_new.ksa_handler = vg_scan_all_valid_memory_sighandler;
    sigsegv_new.sa_flags = VKI_SA_ONSTACK | VKI_SA_RESTART;
    sigsegv_new.sa_restorer = NULL;
    res = VG_(sigemptyset)( &sigsegv_new.sa_mask );
-   sk_assert(res == 0+0);
+   tl_assert(res == 0+0);
 
    res =  VG_(sigemptyset)( &unblockmask_new );
    res |= VG_(sigaddset)( &unblockmask_new, VKI_SIGBUS );
    res |= VG_(sigaddset)( &unblockmask_new, VKI_SIGSEGV );
    res |= VG_(sigaddset)( &unblockmask_new, VKI_SIGTERM );
-   sk_assert(res == 0+0+0);
+   tl_assert(res == 0+0+0);
 
    res = VG_(sigaction)( VKI_SIGBUS, &sigbus_new, &sigbus_saved );
-   sk_assert(res == 0+0+0+0);
+   tl_assert(res == 0+0+0+0);
 
    res = VG_(sigaction)( VKI_SIGSEGV, &sigsegv_new, &sigsegv_saved );
-   sk_assert(res == 0+0+0+0+0);
+   tl_assert(res == 0+0+0+0+0);
 
    res = VG_(sigprocmask)( VKI_SIG_UNBLOCK, &unblockmask_new, &blockmask_saved );
-   sk_assert(res == 0+0+0+0+0+0);
+   tl_assert(res == 0+0+0+0+0+0);
 
    /* The signal handlers are installed.  Actually do the memory scan. */
    numPages = 1 << (32-VKI_PAGE_SHIFT);
-   sk_assert(numPages == 1048576);
-   sk_assert(4096 == (1 << VKI_PAGE_SHIFT));
+   tl_assert(numPages == 1048576);
+   tl_assert(4096 == (1 << VKI_PAGE_SHIFT));
 
    nWordsNotified = 0;
 
@@ -178,13 +178,13 @@
 
    /* Restore signal state to whatever it was before. */
    res = VG_(sigaction)( VKI_SIGBUS, &sigbus_saved, NULL );
-   sk_assert(res == 0 +0);
+   tl_assert(res == 0 +0);
 
    res = VG_(sigaction)( VKI_SIGSEGV, &sigsegv_saved, NULL );
-   sk_assert(res == 0 +0 +0);
+   tl_assert(res == 0 +0 +0);
 
    res = VG_(sigprocmask)( VKI_SIG_SETMASK, &blockmask_saved, NULL );
-   sk_assert(res == 0 +0 +0 +0);
+   tl_assert(res == 0 +0 +0 +0);
 
    return nWordsNotified;
 }
@@ -271,13 +271,13 @@
          lo = mid+1;
          continue;
       }
-      sk_assert(ptr >= a_mid_lo && ptr <= a_mid_hi);
+      tl_assert(ptr >= a_mid_lo && ptr <= a_mid_hi);
       retVal = mid;
       break;
    }
 
 #  ifdef VG_DEBUG_LEAKCHECK
-   sk_assert(retVal == find_shadow_for_OLD ( ptr, shadows, n_shadows ));
+   tl_assert(retVal == find_shadow_for_OLD ( ptr, shadows, n_shadows ));
 #  endif
    /* VG_(printf)("%d\n", retVal); */
    return retVal;
@@ -321,8 +321,8 @@
       sh_no = find_shadow_for ( ptr, lc_shadows, lc_n_shadows );
       if (sh_no != -1) {
          /* Found a block at/into which ptr points. */
-         sk_assert(sh_no >= 0 && sh_no < lc_n_shadows);
-         sk_assert(ptr < lc_shadows[sh_no]->data + lc_shadows[sh_no]->size);
+         tl_assert(sh_no >= 0 && sh_no < lc_n_shadows);
+         tl_assert(ptr < lc_shadows[sh_no]->data + lc_shadows[sh_no]->size);
          /* Decide whether Proper-ly or Interior-ly reached. */
          if (ptr == lc_shadows[sh_no]->data) {
             if (0) VG_(printf)("pointer at %p to %p\n", a, word_at_a );
@@ -400,17 +400,17 @@
 
    /* Sanity check; assert that the blocks are now in order */
    for (i = 0; i < lc_n_shadows-1; i++) {
-      sk_assert( lc_shadows[i]->data <= lc_shadows[i+1]->data);
+      tl_assert( lc_shadows[i]->data <= lc_shadows[i+1]->data);
    }
 
    /* Sanity check -- make sure they don't overlap */
    for (i = 0; i < lc_n_shadows-1; i++) {
-      sk_assert( lc_shadows[i]->data + lc_shadows[i]->size
+      tl_assert( lc_shadows[i]->data + lc_shadows[i]->size
                  < lc_shadows[i+1]->data );
    }
 
    if (lc_n_shadows == 0) {
-      sk_assert(lc_shadows == NULL);
+      tl_assert(lc_shadows == NULL);
       if (VG_(clo_verbosity) >= 1) {
          VG_(message)(Vg_UserMsg, 
                       "No malloc'd blocks -- no leaks are possible.");
@@ -489,7 +489,7 @@
             p_min = p;
          }
       }
-      sk_assert(p_min != NULL);
+      tl_assert(p_min != NULL);
 
       /* Ok to have tst==NULL;  it's only used if --gdb-attach=yes, and
          we disallow that when --leak-check=yes.  
diff --git a/memcheck/mac_malloc_wrappers.c b/memcheck/mac_malloc_wrappers.c
index 17c47ac..23836af 100644
--- a/memcheck/mac_malloc_wrappers.c
+++ b/memcheck/mac_malloc_wrappers.c
@@ -79,11 +79,11 @@
 
    /* Put it at the end of the freed list */
    if (freed_list_end == NULL) {
-      sk_assert(freed_list_start == NULL);
+      tl_assert(freed_list_start == NULL);
       freed_list_end    = freed_list_start = mc;
       freed_list_volume = mc->size;
    } else {
-      sk_assert(freed_list_end->next == NULL);
+      tl_assert(freed_list_end->next == NULL);
       freed_list_end->next = mc;
       freed_list_end       = mc;
       freed_list_volume += mc->size;
@@ -94,13 +94,13 @@
       volume below vg_clo_freelist_vol. */
 
    while (freed_list_volume > MAC_(clo_freelist_vol)) {
-      sk_assert(freed_list_start != NULL);
-      sk_assert(freed_list_end != NULL);
+      tl_assert(freed_list_start != NULL);
+      tl_assert(freed_list_end != NULL);
 
       sc1 = freed_list_start;
       freed_list_volume -= sc1->size;
       /* VG_(printf)("volume now %d\n", freed_list_volume); */
-      sk_assert(freed_list_volume >= 0);
+      tl_assert(freed_list_volume >= 0);
 
       if (freed_list_start == freed_list_end) {
          freed_list_start = freed_list_end = NULL;
@@ -191,9 +191,9 @@
 
    // Allocate and zero if necessary
    if (p) {
-      sk_assert(MAC_AllocCustom == kind);
+      tl_assert(MAC_AllocCustom == kind);
    } else {
-      sk_assert(MAC_AllocCustom != kind);
+      tl_assert(MAC_AllocCustom != kind);
       p = (Addr)VG_(cli_malloc)( align, size );
       if (!p) {
          VGP_POPCC(VgpCliMalloc);
diff --git a/memcheck/mac_needs.c b/memcheck/mac_needs.c
index 1de70cd..b088393 100644
--- a/memcheck/mac_needs.c
+++ b/memcheck/mac_needs.c
@@ -143,7 +143,7 @@
    MAC_Error* e2_extra = VG_(get_error_extra)(e2);
 
    /* Guaranteed by calling function */
-   sk_assert(VG_(get_error_kind)(e1) == VG_(get_error_kind)(e2));
+   tl_assert(VG_(get_error_kind)(e1) == VG_(get_error_kind)(e2));
    
    switch (VG_(get_error_kind)(e1)) {
       case CoreMemErr: {
@@ -257,7 +257,7 @@
       }
       case Register:
          // print nothing
-         sk_assert(0 == a);
+         tl_assert(0 == a);
          break;
       default:
          VG_(skin_panic)("MAC_(pp_AddrInfo)");
@@ -463,7 +463,7 @@
 {
    MAC_Error err_extra;
 
-   sk_assert(VG_INVALID_THREADID != tid);
+   tl_assert(VG_INVALID_THREADID != tid);
    MAC_(clear_MAC_Error)( &err_extra );
    err_extra.addrinfo.akind = ( isReg ? Register : Undescribed );
    err_extra.isUnaddr = isUnaddr;
@@ -474,7 +474,7 @@
 {
    MAC_Error err_extra;
 
-   sk_assert(VG_INVALID_THREADID != tid);
+   tl_assert(VG_INVALID_THREADID != tid);
    MAC_(clear_MAC_Error)( &err_extra );
    err_extra.axskind = ExecAxs;
    err_extra.size    = 1;     // size only used for suppressions
@@ -486,7 +486,7 @@
 {
    MAC_Error err_extra;
 
-   sk_assert(VG_INVALID_THREADID != tid);
+   tl_assert(VG_INVALID_THREADID != tid);
    MAC_(clear_MAC_Error)( &err_extra );
    err_extra.addrinfo.akind = Undescribed;
    VG_(maybe_record_error)( tid, FreeErr, a, /*s*/NULL, &err_extra );
@@ -496,7 +496,7 @@
 {
    MAC_Error err_extra;
 
-   sk_assert(VG_INVALID_THREADID != tid);
+   tl_assert(VG_INVALID_THREADID != tid);
    MAC_(clear_MAC_Error)( &err_extra );
    err_extra.addrinfo.akind = Undescribed;
    VG_(maybe_record_error)( tid, IllegalMempoolErr, a, /*s*/NULL, &err_extra );
@@ -506,7 +506,7 @@
 {
    MAC_Error err_extra;
 
-   sk_assert(VG_INVALID_THREADID != tid);
+   tl_assert(VG_INVALID_THREADID != tid);
    MAC_(clear_MAC_Error)( &err_extra );
    err_extra.addrinfo.akind = Undescribed;
    VG_(maybe_record_error)( tid, FreeMismatchErr, a, /*s*/NULL, &err_extra );
@@ -859,7 +859,7 @@
    // Not using 'tid' here because MAC_(new_block)() and MAC_(handle_free)()
    // grab it themselves.  But what they grab should match 'tid', check
    // this.
-   sk_assert(tid == VG_(get_current_or_recent_tid)());
+   tl_assert(tid == VG_(get_current_or_recent_tid)());
    
    switch (arg[0]) {
    case VG_USERREQ__COUNT_LEAKS: { /* count leaked bytes */
diff --git a/memcheck/mac_shared.h b/memcheck/mac_shared.h
index 9d6e80f..850c63c 100644
--- a/memcheck/mac_shared.h
+++ b/memcheck/mac_shared.h
@@ -178,7 +178,7 @@
 extern UInt MAC_(event_ctr)[N_PROF_EVENTS];
 
 #  define PROF_EVENT(ev)                                 \
-   do { sk_assert((ev) >= 0 && (ev) < N_PROF_EVENTS);    \
+   do { tl_assert((ev) >= 0 && (ev) < N_PROF_EVENTS);    \
         MAC_(event_ctr)[ev]++;                           \
    } while (False);
 
diff --git a/memcheck/mc_errcontext.c b/memcheck/mc_errcontext.c
index 250ce18..8f88147 100644
--- a/memcheck/mc_errcontext.c
+++ b/memcheck/mc_errcontext.c
@@ -65,7 +65,7 @@
          Bool isReg = ( Register == err_extra->addrinfo.akind );
          Char* s1 = ( isReg ? "contains" : "points to" );
          Char* s2 = ( err_extra->isUnaddr ? "unaddressable" : "uninitialised" );
-         if (isReg) sk_assert(!err_extra->isUnaddr);
+         if (isReg) tl_assert(!err_extra->isUnaddr);
 
          VG_(message)(Vg_UserMsg, "Syscall param %s %s %s byte(s)",
                       VG_(get_error_string)(err), s1, s2);
@@ -114,7 +114,7 @@
 {
    MAC_Error err_extra;
 
-   sk_assert(VG_INVALID_THREADID != tid);
+   tl_assert(VG_INVALID_THREADID != tid);
    MAC_(clear_MAC_Error)( &err_extra );
    err_extra.addrinfo.akind = Undescribed;
    err_extra.isUnaddr       = isUnaddr;
diff --git a/memcheck/mc_from_ucode.c b/memcheck/mc_from_ucode.c
index a36fcbc..cef72db 100644
--- a/memcheck/mc_from_ucode.c
+++ b/memcheck/mc_from_ucode.c
@@ -55,7 +55,7 @@
    if (sz == 2) {
       VG_(emitB) ( 0x66 );
    } else {
-      sk_assert(sz == 4);
+      tl_assert(sz == 4);
    }
    VG_(emitB) ( 0xF7 ); /* Grp3 Ev */
    VG_(emit_amode_ereg_greg) ( reg, 0 /* Grp3 subopcode for TEST */ );
@@ -71,7 +71,7 @@
    if (sz == 2) {
       VG_(emitB) ( 0x66 );
    } else {
-      sk_assert(sz == 4);
+      tl_assert(sz == 4);
    }
    VG_(emitB) ( 0xF7 ); /* Grp3 Ev */
    VG_(emit_amode_offregmem_reg) ( off, reg, 0 /* Grp3 subopcode for TEST */ );
@@ -138,7 +138,7 @@
    UInt argv[] = { a_reg,   tv_val };
    Tag  tagv[] = { RealReg, tv_tag };
 
-   sk_assert(tv_tag == RealReg || tv_tag == Literal);
+   tl_assert(tv_tag == RealReg || tv_tag == Literal);
    switch (sz) {
       case 4: helper = (Addr) MC_(helperc_STOREV4); break;
       case 2: helper = (Addr) MC_(helperc_STOREV2); break;
@@ -173,11 +173,11 @@
       the codegen scheme used below.  Since there are a shortage of
       compact helper slots, and since the size==1 case is never
       actually used, we assert against it. */
-   sk_assert(sz == 0 || sz == 2 || sz == 4);
+   tl_assert(sz == 0 || sz == 2 || sz == 4);
 
    VG_(init_target)(&tgt);
 
-   sk_assert(tag == ArchReg || tag == RealReg);
+   tl_assert(tag == ArchReg || tag == RealReg);
    if (tag == ArchReg) {
       switch (sz) {
          case 4: 
@@ -282,17 +282,17 @@
       UInt lit = lit_or_reg;
       switch (sz) {
          case 4:
-            sk_assert(lit == 0x00000000);
+            tl_assert(lit == 0x00000000);
             VG_(emit_movv_lit_offregmem) ( 4, 0x00000000, 
                                       VG_(shadow_reg_offset)(arch), R_EBP );
             break;
          case 2:
-            sk_assert(lit == 0xFFFF0000);
+            tl_assert(lit == 0xFFFF0000);
             VG_(emit_movv_lit_offregmem) ( 2, 0x0000, 
                                       VG_(shadow_reg_offset)(arch), R_EBP );
             break;
          case 1:
-            sk_assert(lit == 0xFFFFFF00);
+            tl_assert(lit == 0xFFFFFF00);
             if (arch < 4) {
                VG_(emit_movb_lit_offregmem) ( 0x00, 
                                          VG_(shadow_reg_offset)(arch), R_EBP );
@@ -309,7 +309,7 @@
    } else {
 
       UInt reg;
-      sk_assert(srcTag == RealReg);
+      tl_assert(srcTag == RealReg);
 
       if (sz == 1 && lit_or_reg >= 4) {
          VG_(emit_swapl_reg_EAX) ( lit_or_reg );
@@ -318,7 +318,7 @@
          reg = lit_or_reg;
       }
 
-      if (sz == 1) sk_assert(reg < 4);
+      if (sz == 1) tl_assert(reg < 4);
 
       switch (sz) {
          case 4:
@@ -588,13 +588,13 @@
    switch (u->opcode) {
 
       case SETV:
-         sk_assert(u->tag1 == RealReg);
+         tl_assert(u->tag1 == RealReg);
          synth_SETV ( u->size, u->val1 );
          break;
 
       case STOREV:
-         sk_assert(u->tag1 == RealReg || u->tag1 == Literal);
-         sk_assert(u->tag2 == RealReg);
+         tl_assert(u->tag1 == RealReg || u->tag1 == Literal);
+         tl_assert(u->tag2 == RealReg);
          synth_STOREV ( u->size, u->tag1, 
                                  u->tag1==Literal ? u->lit32 : u->val1, 
                                  u->val2,
@@ -602,8 +602,8 @@
          break;
 
       case LOADV:
-         sk_assert(u->tag1 == RealReg);
-         sk_assert(u->tag2 == RealReg);
+         tl_assert(u->tag1 == RealReg);
+         tl_assert(u->tag2 == RealReg);
          if (0)
             VG_(emit_AMD_prefetch_reg) ( u->val1 );
          synth_LOADV ( u->size, u->val1, u->val2,
@@ -611,33 +611,33 @@
          break;
 
       case TESTV:
-         sk_assert(u->tag1 == RealReg || u->tag1 == ArchReg);
+         tl_assert(u->tag1 == RealReg || u->tag1 == ArchReg);
          synth_TESTV(u->size, u->tag1, u->val1);
          break;
 
       case GETV:
-         sk_assert(u->tag1 == ArchReg);
-         sk_assert(u->tag2 == RealReg);
+         tl_assert(u->tag1 == ArchReg);
+         tl_assert(u->tag2 == RealReg);
          synth_GETV(u->size, u->val1, u->val2);
          break;
 
       case GETVF:
-         sk_assert(u->tag1 == RealReg);
-         sk_assert(u->size == 0);
+         tl_assert(u->tag1 == RealReg);
+         tl_assert(u->size == 0);
          synth_GETVF(u->val1);
          break;
 
       case PUTV:
-         sk_assert(u->tag1 == RealReg || u->tag1 == Literal);
-         sk_assert(u->tag2 == ArchReg);
+         tl_assert(u->tag1 == RealReg || u->tag1 == Literal);
+         tl_assert(u->tag2 == ArchReg);
          synth_PUTV(u->size, u->tag1, 
                              u->tag1==Literal ? u->lit32 : u->val1, 
                              u->val2 );
          break;
 
       case PUTVF:
-         sk_assert(u->tag1 == RealReg);
-         sk_assert(u->size == 0);
+         tl_assert(u->tag1 == RealReg);
+         tl_assert(u->size == 0);
          synth_PUTVF(u->val1);
          break;
 
diff --git a/memcheck/mc_main.c b/memcheck/mc_main.c
index 91ceaa4..27ac7cf 100644
--- a/memcheck/mc_main.c
+++ b/memcheck/mc_main.c
@@ -225,7 +225,7 @@
    UChar   abits8;
    PROF_EVENT(24);
 #  ifdef VG_DEBUG_MEMORY
-   sk_assert(IS_ALIGNED4_ADDR(a));
+   tl_assert(IS_ALIGNED4_ADDR(a));
 #  endif
    sm     = primary_map[a >> 16];
    sm_off = a & 0xFFFF;
@@ -241,7 +241,7 @@
    UInt    sm_off = a & 0xFFFF;
    PROF_EVENT(25);
 #  ifdef VG_DEBUG_MEMORY
-   sk_assert(IS_ALIGNED4_ADDR(a));
+   tl_assert(IS_ALIGNED4_ADDR(a));
 #  endif
    return ((UInt*)(sm->vbyte))[sm_off >> 2];
 }
@@ -256,7 +256,7 @@
    sm_off = a & 0xFFFF;
    PROF_EVENT(23);
 #  ifdef VG_DEBUG_MEMORY
-   sk_assert(IS_ALIGNED4_ADDR(a));
+   tl_assert(IS_ALIGNED4_ADDR(a));
 #  endif
    ((UInt*)(sm->vbyte))[sm_off >> 2] = vbytes;
 }
@@ -294,15 +294,15 @@
       indicate bugs in our machinery.  30,000,000 is arbitrary, but so
       far all legitimate requests have fallen beneath that size. */
    /* 4 Mar 02: this is just stupid; get rid of it. */
-   /* sk_assert(len < 30000000); */
+   /* tl_assert(len < 30000000); */
 
    /* Check the permissions make sense. */
-   sk_assert(example_a_bit == VGM_BIT_VALID 
+   tl_assert(example_a_bit == VGM_BIT_VALID 
              || example_a_bit == VGM_BIT_INVALID);
-   sk_assert(example_v_bit == VGM_BIT_VALID 
+   tl_assert(example_v_bit == VGM_BIT_VALID 
              || example_v_bit == VGM_BIT_INVALID);
    if (example_a_bit == VGM_BIT_INVALID)
-      sk_assert(example_v_bit == VGM_BIT_INVALID);
+      tl_assert(example_v_bit == VGM_BIT_INVALID);
 
    /* The validity bits to write. */
    vbyte = example_v_bit==VGM_BIT_VALID 
@@ -347,7 +347,7 @@
       VGP_POPCC(VgpSetMem);
       return;
    }
-   sk_assert((a % 8) == 0 && len > 0);
+   tl_assert((a % 8) == 0 && len > 0);
 
    /* Once aligned, go fast. */
    while (True) {
@@ -367,7 +367,7 @@
       VGP_POPCC(VgpSetMem);
       return;
    }
-   sk_assert((a % 8) == 0 && len > 0 && len < 8);
+   tl_assert((a % 8) == 0 && len > 0 && len < 8);
 
    /* Finish the upper fragment. */
    while (True) {
@@ -383,7 +383,7 @@
    /* Check that zero page and highest page have not been written to
       -- this could happen with buggy syscall wrappers.  Today
       (2001-04-26) had precisely such a problem with __NR_setitimer. */
-   sk_assert(SK_(cheap_sanity_check)());
+   tl_assert(SK_(cheap_sanity_check)());
    VGP_POPCC(VgpSetMem);
 }
 
@@ -699,7 +699,7 @@
 
    VGP_PUSHCC(VgpCheckMem);
 
-   sk_assert(part == Vg_CoreSysCall);
+   tl_assert(part == Vg_CoreSysCall);
    res = mc_check_readable_asciiz ( (Addr)str, &bad_addr );
    if (MC_Ok != res) {
       Bool isUnaddr = ( MC_AddrErr == res ? True : False );
@@ -768,7 +768,7 @@
    UWord mask;
    
    // XXX: the only one at the moment
-   sk_assert(Vg_CoreSysCall == part);
+   tl_assert(Vg_CoreSysCall == part);
 
    switch (size) {
    case 4:  mask = 0xffffffff; break;
@@ -1009,7 +1009,7 @@
       (which is the default), and the address is 4-aligned.  
       If not, Case 2 will have applied.
    */
-   sk_assert(MAC_(clo_partial_loads_ok));
+   tl_assert(MAC_(clo_partial_loads_ok));
    {
       UInt vw = VGM_WORD_INVALID;
       vw <<= 8; vw |= (a3ok ? vb3 : VGM_BYTE_INVALID);
@@ -1467,7 +1467,7 @@
 static
 Bool mc_is_valid_64k_chunk ( UInt chunk_number )
 {
-   sk_assert(chunk_number >= 0 && chunk_number < 65536);
+   tl_assert(chunk_number >= 0 && chunk_number < 65536);
    if (IS_DISTINGUISHED_SM(primary_map[chunk_number])) {
       /* Definitely not in use. */
       return False;
@@ -1484,7 +1484,7 @@
 {
    UInt vbytes;
    UChar abits;
-   sk_assert(IS_ALIGNED4_ADDR(a));
+   tl_assert(IS_ALIGNED4_ADDR(a));
    abits  = get_abits4_ALIGNED(a);
    vbytes = get_vbytes4_ALIGNED(a);
    if (abits == VGM_NIBBLE_VALID && vbytes == VGM_WORD_VALID) {
@@ -1554,7 +1554,7 @@
          str[w++] = ' ';
    }
    str[w++] = 0;
-   sk_assert(w == 36);
+   tl_assert(w == 36);
 }
 
 /* Caution!  Not vthread-safe; looks in VG_(baseBlock), not the thread
@@ -1723,7 +1723,7 @@
    }
 
    /* Ok, we have to allocate a new one. */
-   sk_assert(vg_cgb_used == vg_cgb_size);
+   tl_assert(vg_cgb_used == vg_cgb_size);
    sz_new = (vg_cgbs == NULL) ? 10 : (2 * vg_cgb_size);
 
    cgbs_new = VG_(malloc)( sz_new * sizeof(CGenBlock) );
@@ -1880,7 +1880,7 @@
          if (vg_cgbs == NULL 
              || arg[2] >= vg_cgb_used || vg_cgbs[arg[2]].kind == CG_NotInUse)
             return 1;
-         sk_assert(arg[2] >= 0 && arg[2] < vg_cgb_used);
+         tl_assert(arg[2] >= 0 && arg[2] < vg_cgb_used);
          vg_cgbs[arg[2]].kind = CG_NotInUse;
          vg_cgb_discards++;
 	 *ret = 0;
diff --git a/memcheck/mc_translate.c b/memcheck/mc_translate.c
index af01e6d..05dfb16 100644
--- a/memcheck/mc_translate.c
+++ b/memcheck/mc_translate.c
@@ -509,7 +509,7 @@
                   goto literal;
                break;
             case LEA1: 
-               sk_assert(u_in->size == 4);
+               tl_assert(u_in->size == 4);
                goto literal;
             default: 
                break;
@@ -550,14 +550,14 @@
             all this is that instrumentation of USESEG is a no-op! */
 
          case PUTSEG:
-            sk_assert(u_in->tag1 == TempReg);
+            tl_assert(u_in->tag1 == TempReg);
             uInstr1(cb, TESTV, 2, TempReg, SHADOW(u_in->val1));
             uInstr1(cb, SETV,  2, TempReg, SHADOW(u_in->val1));
             VG_(copy_UInstr)(cb, u_in);
             break;
 
          case GETSEG:
-            sk_assert(u_in->tag2 == TempReg);
+            tl_assert(u_in->tag2 == TempReg);
             uInstr1(cb, SETV,  2, TempReg, SHADOW(u_in->val2));
             VG_(copy_UInstr)(cb, u_in);
             break;
@@ -647,7 +647,7 @@
             Therefore: lea1#(qa) = left(qa) 
          */
          case LEA1:
-            sk_assert(u_in->size == 4 && !VG_(any_flag_use)(u_in));
+            tl_assert(u_in->size == 4 && !VG_(any_flag_use)(u_in));
             qs = SHADOW(u_in->val1);
             qd = SHADOW(u_in->val2);
             uInstr2(cb, MOV, 4, TempReg, qs, TempReg, qd);
@@ -665,7 +665,7 @@
          */
          case LEA2: {
             Int shift;
-            sk_assert(u_in->size == 4 && !VG_(any_flag_use)(u_in));
+            tl_assert(u_in->size == 4 && !VG_(any_flag_use)(u_in));
             switch (u_in->extra4b) {
                case 1: shift = 0; break;
                case 2: shift = 1; break;
@@ -706,7 +706,7 @@
             the eflags.
          */
          case RCL: case RCR:
-	    sk_assert(u_in->flags_r != FlagsEmpty);
+	    tl_assert(u_in->flags_r != FlagsEmpty);
             /* The following assertion looks like it makes sense, but is
                actually wrong.  Consider this:
                   rcll    %eax
@@ -715,7 +715,7 @@
                write of the rcll is annulled by the prior improvement pass.
                Noticed by Kevin Ryde <user42@zip.com.au>
             */
-	    /* sk_assert(u_in->flags_w != FlagsEmpty); */
+	    /* tl_assert(u_in->flags_w != FlagsEmpty); */
             qs = getOperandShadow(cb, 1, u_in->tag1, u_in->val1);
             /* We can safely modify qs; cast it to 0-size. */
             create_PCast(cb, 1, 0, qs);
@@ -753,8 +753,8 @@
          case SHR: case SAR:
          case ROL: case ROR: {
             Int t_amount = INVALID_TEMPREG;
-            sk_assert(u_in->tag1 == TempReg || u_in->tag1 == Literal);
-            sk_assert(u_in->tag2 == TempReg);
+            tl_assert(u_in->tag1 == TempReg || u_in->tag1 == Literal);
+            tl_assert(u_in->tag2 == TempReg);
             qd = SHADOW(u_in->val2);
 
             /* Make qs hold shift-count# and make
@@ -784,7 +784,7 @@
 
          /* One simple tag operation. */
          case WIDEN:
-            sk_assert(u_in->tag1 == TempReg);
+            tl_assert(u_in->tag1 == TempReg);
             create_Widen(cb, u_in->signed_widen, u_in->extra4b, u_in->size, 
                              SHADOW(u_in->val1));
             VG_(copy_UInstr)(cb, u_in);
@@ -792,21 +792,21 @@
 
          /* not#(x) = x (since bitwise independent) */
          case NOT:
-            sk_assert(u_in->tag1 == TempReg);
+            tl_assert(u_in->tag1 == TempReg);
             VG_(copy_UInstr)(cb, u_in);
             break;
 
          /* neg#(x) = left(x) (derivable from case for SUB) */
          case NEG:
-            sk_assert(u_in->tag1 == TempReg);
+            tl_assert(u_in->tag1 == TempReg);
             create_Left(cb, u_in->size, SHADOW(u_in->val1));
             VG_(copy_UInstr)(cb, u_in);
             break;
 
          /* bswap#(x) = bswap(x) */
          case BSWAP:
-            sk_assert(u_in->tag1 == TempReg);
-            sk_assert(u_in->size == 4);
+            tl_assert(u_in->tag1 == TempReg);
+            tl_assert(u_in->size == 4);
             qd = SHADOW(u_in->val1);
             uInstr1(cb, BSWAP, 4, TempReg, qd);
             VG_(copy_UInstr)(cb, u_in);
@@ -814,8 +814,8 @@
 
          /* cc2val#(qd) = pcast-0-to-size(eflags#) */
          case CC2VAL:
-            sk_assert(u_in->tag1 == TempReg);
-            sk_assert(u_in->flags_r != FlagsEmpty);
+            tl_assert(u_in->tag1 == TempReg);
+            tl_assert(u_in->flags_r != FlagsEmpty);
             qt = create_GETVF(cb, u_in->size);
             uInstr2(cb, MOV, 4, TempReg, qt, TempReg, SHADOW(u_in->val1));
             VG_(copy_UInstr)(cb, u_in);
@@ -827,11 +827,11 @@
             validity of the flags.
          */
          case CMOV:
-            sk_assert(u_in->size == 4);
-            sk_assert(u_in->tag1 == TempReg);
-            sk_assert(u_in->tag2 == TempReg);
-            sk_assert(u_in->flags_r != FlagsEmpty);
-            sk_assert(u_in->flags_w == FlagsEmpty);
+            tl_assert(u_in->size == 4);
+            tl_assert(u_in->tag1 == TempReg);
+            tl_assert(u_in->tag2 == TempReg);
+            tl_assert(u_in->flags_r != FlagsEmpty);
+            tl_assert(u_in->flags_w == FlagsEmpty);
             qs = SHADOW(u_in->val1);
             qd = SHADOW(u_in->val2);
             qt = create_GETVF(cb, 0);
@@ -864,7 +864,7 @@
             create_UifU(cb, u_in->size, qs, qd);
             create_Left(cb, u_in->size, qd);
             if (u_in->opcode == ADC || u_in->opcode == SBB) {
-               sk_assert(u_in->flags_r != FlagsEmpty);
+               tl_assert(u_in->flags_r != FlagsEmpty);
                qt = create_GETVF(cb, u_in->size);
                create_UifU(cb, u_in->size, qt, qd);
             }
@@ -898,8 +898,8 @@
                qd = qt `DifD` qd
          */
          case AND: case OR:
-            sk_assert(u_in->tag1 == TempReg);
-            sk_assert(u_in->tag2 == TempReg);
+            tl_assert(u_in->tag1 == TempReg);
+            tl_assert(u_in->tag2 == TempReg);
             qd = SHADOW(u_in->val2);
             qs = SHADOW(u_in->val1);
             qt = newShadow(cb);
@@ -1022,10 +1022,10 @@
                uInstr1(cb, TESTV, 4, TempReg, SHADOW(u_in->val1));
                uInstr1(cb, SETV,  4, TempReg, SHADOW(u_in->val1));
             } else {
-               sk_assert(u_in->tag1 == Literal);
+               tl_assert(u_in->tag1 == Literal);
             }
             if (u_in->cond != CondAlways) {
-               sk_assert(u_in->flags_r != FlagsEmpty);
+               tl_assert(u_in->flags_r != FlagsEmpty);
                qt = create_GETVF(cb, 0);
                if (/* HACK */ bogusLiterals) {
                   if (0) 
@@ -1054,10 +1054,10 @@
             Bool is_load;
 
             if (u_in->opcode == MMX2_MemRd || u_in->opcode == MMX2_MemWr)
-               sk_assert(u_in->size == 4 || u_in->size == 8);
+               tl_assert(u_in->size == 4 || u_in->size == 8);
 
             is_load = u_in->opcode==FPU_R || u_in->opcode==MMX2_MemRd;
-            sk_assert(u_in->tag2 == TempReg);
+            tl_assert(u_in->tag2 == TempReg);
             uInstr1(cb, TESTV, 4, TempReg, SHADOW(u_in->val2));
             uInstr1(cb, SETV,  4, TempReg, SHADOW(u_in->val2));
 
@@ -1076,9 +1076,9 @@
          case MMX2a1_MemRd: {
             Int t_size = INVALID_TEMPREG;
 
-            sk_assert(u_in->size == 8);
+            tl_assert(u_in->size == 8);
 
-            sk_assert(u_in->tag3 == TempReg);
+            tl_assert(u_in->tag3 == TempReg);
             uInstr1(cb, TESTV, 4, TempReg, SHADOW(u_in->val3));
             uInstr1(cb, SETV,  4, TempReg, SHADOW(u_in->val3));
 
@@ -1101,12 +1101,12 @@
          case SSE3e_RegWr: 
          case SSE3g1_RegWr:
          case SSE3e1_RegRd:
-            sk_assert(u_in->tag3 == TempReg);
+            tl_assert(u_in->tag3 == TempReg);
 
             if (u_in->opcode == SSE2e1_RegRd || u_in->opcode == SSE3e1_RegRd) {
-               sk_assert(u_in->size == 2);
+               tl_assert(u_in->size == 2);
             } else {
-               sk_assert(u_in->size == 4);
+               tl_assert(u_in->size == 4);
             }
 
             /* Is it a read ?  Better check the V bits right now. */
@@ -1134,7 +1134,7 @@
             Bool is_load;
             Int t_size;
 
-            sk_assert(u_in->size == 4 || u_in->size == 8
+            tl_assert(u_in->size == 4 || u_in->size == 8
                       || u_in->size == 16 || u_in->size == 512);
 
             t_size = INVALID_TEMPREG;
@@ -1143,7 +1143,7 @@
                       || u_in->opcode==SSE2a1_MemRd
                       || u_in->opcode==SSE3a1_MemRd;
 
-            sk_assert(u_in->tag3 == TempReg);
+            tl_assert(u_in->tag3 == TempReg);
 
 	    uInstr1(cb, TESTV, 4, TempReg, SHADOW(u_in->val3));
 	    uInstr1(cb, SETV,  4, TempReg, SHADOW(u_in->val3));
@@ -1163,8 +1163,8 @@
 	 {
 	    Int t_size;
 
-            sk_assert(u_in->size == 4 || u_in->size == 8);
-	    sk_assert(u_in->tag1 == TempReg);
+            tl_assert(u_in->size == 4 || u_in->size == 8);
+	    tl_assert(u_in->tag1 == TempReg);
 	    uInstr1(cb, TESTV, 4, TempReg, SHADOW(u_in->val1));
 	    uInstr1(cb, SETV,  4, TempReg, SHADOW(u_in->val1));
             t_size = newTemp(cb);
@@ -1203,8 +1203,8 @@
             MMX state, we'd better check that the (int) reg being
             read here is defined. */
          case MMX2_ERegRd: 
-            sk_assert(u_in->tag2 == TempReg);
-            sk_assert(u_in->size == 4);
+            tl_assert(u_in->tag2 == TempReg);
+            tl_assert(u_in->size == 4);
             uInstr1(cb, TESTV, 4, TempReg, SHADOW(u_in->val2));
             uInstr1(cb, SETV,  4, TempReg, SHADOW(u_in->val2));
             VG_(copy_UInstr)(cb, u_in);
@@ -1213,8 +1213,8 @@
 	 /* The MMX register is assumed to be fully defined, so
 	    that's what this register becomes. */
          case MMX2_ERegWr:
-            sk_assert(u_in->tag2 == TempReg);
-            sk_assert(u_in->size == 4);
+            tl_assert(u_in->tag2 == TempReg);
+            tl_assert(u_in->size == 4);
             uInstr1(cb, SETV,  4, TempReg, SHADOW(u_in->val2));
             VG_(copy_UInstr)(cb, u_in);	 
             break;
@@ -1293,7 +1293,7 @@
 
       if (u->opcode == GETV && VGC_IS_SHADOW(u->val2) 
                             && next_is_write[u->val2]) {
-         sk_assert(u->val2 < n_temps);
+         tl_assert(u->val2 < n_temps);
          VG_(new_NOP)(u);
          if (dis) 
             VG_(printf)("   at %2d: delete GETV\n", i);
@@ -1301,7 +1301,7 @@
 
       if (u->opcode == TAG1 && VGC_IS_SHADOW(u->val1) 
                             && next_is_write[u->val1]) {
-         sk_assert(u->val1 < n_temps);
+         tl_assert(u->val1 < n_temps);
          VG_(new_NOP)(u);
          if (dis) 
             VG_(printf)("   at %2d: delete TAG1\n", i);
@@ -1309,7 +1309,7 @@
 
       if (u->opcode == TAG2 && VGC_IS_SHADOW(u->val2) 
                             && next_is_write[u->val2]) {
-         sk_assert(u->val2 < n_temps);
+         tl_assert(u->val2 < n_temps);
          VG_(new_NOP)(u);
          if (dis) 
             VG_(printf)("   at %2d: delete TAG2\n", i);
@@ -1329,7 +1329,7 @@
 
       if (u->opcode == SETV) {
          if (u->tag1 == TempReg) {
-            sk_assert(VGC_IS_SHADOW(u->val1));
+            tl_assert(VGC_IS_SHADOW(u->val1));
             if (next_is_write[u->val1]) {
                /* This write is pointless, so annul it. */
                VG_(new_NOP)(u);
@@ -1346,7 +1346,7 @@
       } else {
          /* Find out what this insn does to the temps. */
          k = VG_(get_reg_usage)(u, TempReg, &tempUse[0], &isWrites[0]);
-         sk_assert(0 <= k && k <= VG_MAX_REGS_USED);
+         tl_assert(0 <= k && k <= VG_MAX_REGS_USED);
          for (j = k-1; j >= 0; j--) {
             next_is_write[ tempUse[j] ] = isWrites[j];
          }
@@ -1401,15 +1401,15 @@
 
          /* Make a tag defined. */
          case SETV:
-            sk_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
+            tl_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
             def[u->val1] = u->size;
             break;
 
          /* Check definedness of a tag. */
          case TESTV:
-            sk_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
+            tl_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
             if (def[u->val1] <= 4) { 
-               sk_assert(def[u->val1] == u->size); 
+               tl_assert(def[u->val1] == u->size); 
                NOP_no_msg(u);
                if (dis) 
                   VG_(printf)("   at %2d: delete TESTV on defd arg\n", i);
@@ -1420,19 +1420,19 @@
             property through copies.  Note that this isn't optional;
             we *have* to do this to keep def[] correct. */
          case MOV:
-            sk_assert(u->tag2 == TempReg);
+            tl_assert(u->tag2 == TempReg);
             if (u->tag1 == TempReg) {
                if (VGC_IS_SHADOW(u->val1)) {
-                  sk_assert(VGC_IS_SHADOW(u->val2));
+                  tl_assert(VGC_IS_SHADOW(u->val2));
                   def[u->val2] = def[u->val1];
                }
             }
             break;
 
          case PUTV:
-            sk_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
+            tl_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
             if (def[u->val1] <= 4) {
-               sk_assert(def[u->val1] == u->size);
+               tl_assert(def[u->val1] == u->size);
                u->tag1 = Literal;
                u->val1 = 0;
                switch (u->size) {
@@ -1448,9 +1448,9 @@
             break;
 
          case STOREV:
-            sk_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
+            tl_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
             if (def[u->val1] <= 4) {
-               sk_assert(def[u->val1] == u->size);
+               tl_assert(def[u->val1] == u->size);
                u->tag1 = Literal;
                u->val1 = 0;
                switch (u->size) {
@@ -1471,17 +1471,17 @@
 
          /* Tag handling operations. */
          case TAG2:
-            sk_assert(u->tag2 == TempReg && VGC_IS_SHADOW(u->val2));
-            sk_assert(u->tag3 == Lit16);
+            tl_assert(u->tag2 == TempReg && VGC_IS_SHADOW(u->val2));
+            tl_assert(u->tag3 == Lit16);
             /* Ultra-paranoid "type" checking. */
             switch (u->val3) {
                case Tag_ImproveAND4_TQ: case Tag_ImproveAND2_TQ:
                case Tag_ImproveAND1_TQ: case Tag_ImproveOR4_TQ:
                case Tag_ImproveOR2_TQ: case Tag_ImproveOR1_TQ:
-                  sk_assert(u->tag1 == TempReg && !VGC_IS_SHADOW(u->val1));
+                  tl_assert(u->tag1 == TempReg && !VGC_IS_SHADOW(u->val1));
                   break;
                default:
-                  sk_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
+                  tl_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
                   break;
             }
             switch (u->val3) {
@@ -1495,12 +1495,12 @@
                case Tag_UifU0:
                   sz = 0; goto do_UifU;
                do_UifU:
-                  sk_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
-                  sk_assert(u->tag2 == TempReg && VGC_IS_SHADOW(u->val2));
+                  tl_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
+                  tl_assert(u->tag2 == TempReg && VGC_IS_SHADOW(u->val2));
                   if (def[u->val1] <= 4) {
                      /* UifU.  The first arg is defined, so result is
                         simply second arg.  Delete this operation. */
-                     sk_assert(def[u->val1] == sz);
+                     tl_assert(def[u->val1] == sz);
                      NOP_no_msg(u);
                      if (dis) 
                         VG_(printf)(
@@ -1511,7 +1511,7 @@
                   if (def[u->val2] <= 4) {
                      /* UifU.  The second arg is defined, so result is
                         simply first arg.  Copy to second. */
-                     sk_assert(def[u->val2] == sz);
+                     tl_assert(def[u->val2] == sz);
                      u->opcode = MOV; 
                      u->size = 4;
                      u->tag3 = NoValue;
@@ -1531,7 +1531,7 @@
                   /* Implements Q = T AND Q.  So if Q is entirely defined,
                      ie all 0s, we get MOV T, Q. */
 		  if (def[u->val2] <= 4) {
-                     sk_assert(def[u->val2] == sz);
+                     tl_assert(def[u->val2] == sz);
                      u->size = 4; /* Regardless of sz */
                      u->opcode = MOV;
                      u->tag3 = NoValue;
@@ -1549,7 +1549,7 @@
             break;
 
          case TAG1:
-            sk_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
+            tl_assert(u->tag1 == TempReg && VGC_IS_SHADOW(u->val1));
             if (def[u->val1] > 4) break;
             /* We now know that the arg to the op is entirely defined.
                If the op changes the size of the arg, we must replace
@@ -1558,36 +1558,36 @@
             switch (u->val3) {
                /* Maintain the same size ... */
                case Tag_Left4: 
-                  sk_assert(def[u->val1] == 4);
+                  tl_assert(def[u->val1] == 4);
                   NOP_tag1_op(u);
                   break;
                case Tag_PCast11: 
-                  sk_assert(def[u->val1] == 1);
+                  tl_assert(def[u->val1] == 1);
                   NOP_tag1_op(u);
                   break;
                /* Change size ... */
                case Tag_PCast40: 
-                  sk_assert(def[u->val1] == 4);
+                  tl_assert(def[u->val1] == 4);
                   SETV_tag1_op(u,0);
                   def[u->val1] = 0;
                   break;
                case Tag_PCast14: 
-                  sk_assert(def[u->val1] == 1);
+                  tl_assert(def[u->val1] == 1);
                   SETV_tag1_op(u,4);
                   def[u->val1] = 4;
                   break;
                case Tag_PCast12: 
-                  sk_assert(def[u->val1] == 1);
+                  tl_assert(def[u->val1] == 1);
                   SETV_tag1_op(u,2);
                   def[u->val1] = 2;
                   break;
                case Tag_PCast10: 
-                  sk_assert(def[u->val1] == 1);
+                  tl_assert(def[u->val1] == 1);
                   SETV_tag1_op(u,0);
                   def[u->val1] = 0;
                   break;
                case Tag_PCast02: 
-                  sk_assert(def[u->val1] == 0);
+                  tl_assert(def[u->val1] == 0);
                   SETV_tag1_op(u,2);
                   def[u->val1] = 2;
                   break;
@@ -1605,10 +1605,10 @@
             /* We don't know how to handle this uinstr.  Be safe, and 
                set to VGC_VALUE or VGC_UNDEF all temps written by it. */
             k = VG_(get_reg_usage)(u, TempReg, &tempUse[0], &isWrites[0]);
-            sk_assert(0 <= k && k <= VG_MAX_REGS_USED);
+            tl_assert(0 <= k && k <= VG_MAX_REGS_USED);
             for (j = 0; j < k; j++) {
                t = tempUse[j];
-               sk_assert(t >= 0 && t < n_temps);
+               tl_assert(t >= 0 && t < n_temps);
                if (!isWrites[j]) {
                   /* t is read; ignore it. */
                   if (0&& VGC_IS_SHADOW(t) && def[t] <= 4)
