Fix more Char/HChar mixups. Closing in...


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13119 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/cachegrind/cg-arch.c b/cachegrind/cg-arch.c
index f66a83c..da20441 100644
--- a/cachegrind/cg-arch.c
+++ b/cachegrind/cg-arch.c
@@ -76,10 +76,11 @@
 }
 
 
-static void parse_cache_opt ( cache_t* cache, Char* opt, Char* optval )
+static void parse_cache_opt ( cache_t* cache, const HChar* opt,
+                              const HChar* optval )
 {
    Long i1, i2, i3;
-   Char* endptr;
+   HChar* endptr;
    const HChar* checkRes;
 
    // Option argument looks like "65536,2,64".  Extract them.
@@ -112,12 +113,12 @@
 }
 
 
-Bool VG_(str_clo_cache_opt)(Char *arg,
+Bool VG_(str_clo_cache_opt)(const HChar *arg,
                             cache_t* clo_I1c,
                             cache_t* clo_D1c,
                             cache_t* clo_LLc)
 {
-   Char* tmp_str;
+   const HChar* tmp_str;
 
    if      VG_STR_CLO(arg, "--I1", tmp_str) {
       parse_cache_opt(clo_I1c, arg, tmp_str);
diff --git a/cachegrind/cg_arch.h b/cachegrind/cg_arch.h
index d35ec73..cd0b74f 100644
--- a/cachegrind/cg_arch.h
+++ b/cachegrind/cg_arch.h
@@ -47,7 +47,7 @@
 // If arg is a command line option configuring I1 or D1 or LL cache,
 // then parses arg to set the relevant cache_t elements.
 // Returns True if arg is a cache command line option, False otherwise.
-Bool VG_(str_clo_cache_opt)(Char *arg,
+Bool VG_(str_clo_cache_opt)(const HChar *arg,
                             cache_t* clo_I1c,
                             cache_t* clo_D1c,
                             cache_t* clo_LLc);
diff --git a/cachegrind/cg_main.c b/cachegrind/cg_main.c
index f4d94f8..8cd633f 100644
--- a/cachegrind/cg_main.c
+++ b/cachegrind/cg_main.c
@@ -67,7 +67,7 @@
 
 static Bool  clo_cache_sim  = True;  /* do cache simulation? */
 static Bool  clo_branch_sim = False; /* do branch simulation? */
-static HChar* clo_cachegrind_out_file = "cachegrind.out.%p";
+static const HChar* clo_cachegrind_out_file = "cachegrind.out.%p";
 
 /*------------------------------------------------------------*/
 /*--- Cachesim configuration                               ---*/
@@ -102,9 +102,9 @@
 // - Traversed for dumping stats at end in file/func/line hierarchy.
 
 typedef struct {
-   Char* file;
-   Char* fn;
-   Int   line;
+   HChar* file;
+   HChar* fn;
+   Int    line;
 }
 CodeLoc;
 
@@ -191,18 +191,18 @@
 
 static Word stringCmp( const void* key, const void* elem )
 {
-   return VG_(strcmp)(*(Char**)key, *(Char**)elem);
+   return VG_(strcmp)(*(HChar**)key, *(HChar**)elem);
 }
 
 // Get a permanent string;  either pull it out of the string table if it's
 // been encountered before, or dup it and put it into the string table.
-static Char* get_perm_string(Char* s)
+static HChar* get_perm_string(HChar* s)
 {
-   Char** s_ptr = VG_(OSetGen_Lookup)(stringTable, &s);
+   HChar** s_ptr = VG_(OSetGen_Lookup)(stringTable, &s);
    if (s_ptr) {
       return *s_ptr;
    } else {
-      Char** s_node = VG_(OSetGen_AllocNode)(stringTable, sizeof(Char*));
+      HChar** s_node = VG_(OSetGen_AllocNode)(stringTable, sizeof(HChar*));
       *s_node = VG_(strdup)("cg.main.gps.1", s);
       VG_(OSetGen_Insert)(stringTable, s_node);
       return *s_node;
@@ -213,10 +213,10 @@
 /*--- CC table operations                                  ---*/
 /*------------------------------------------------------------*/
 
-static void get_debug_info(Addr instr_addr, Char file[FILE_LEN],
-                           Char fn[FN_LEN], Int* line)
+static void get_debug_info(Addr instr_addr, HChar file[FILE_LEN],
+                           HChar fn[FN_LEN], UInt* line)
 {
-   Char dir[FILE_LEN];
+   HChar dir[FILE_LEN];
    Bool found_dirname;
    Bool found_file_line = VG_(get_filename_linenum)(
                              instr_addr, 
@@ -255,8 +255,8 @@
 // Returns a pointer to the line CC, creates a new one if necessary.
 static LineCC* get_lineCC(Addr origAddr)
 {
-   Char    file[FILE_LEN], fn[FN_LEN];
-   Int     line;
+   HChar   file[FILE_LEN], fn[FN_LEN];
+   UInt    line;
    CodeLoc loc;
    LineCC* lineCC;
 
@@ -1308,7 +1308,7 @@
    Int     i, fd;
    SysRes  sres;
    HChar    buf[512];
-   Char    *currFile = NULL, *currFn = NULL;
+   HChar   *currFile = NULL, *currFn = NULL;
    LineCC* lineCC;
 
    // Setup output filename.  Nb: it's important to do this now, ie. as late
@@ -1316,7 +1316,7 @@
    // output file format string contains a %p (pid) specifier, both the
    // parent and child will incorrectly write to the same file;  this
    // happened in 3.3.0.
-   Char* cachegrind_out_file =
+   HChar* cachegrind_out_file =
       VG_(expand_file_name)("--cachegrind-out-file", clo_cachegrind_out_file);
 
    sres = VG_(open)(cachegrind_out_file, VKI_O_CREAT|VKI_O_TRUNC|VKI_O_WRONLY,
@@ -1698,7 +1698,7 @@
 /*--- Command line processing                                      ---*/
 /*--------------------------------------------------------------------*/
 
-static Bool cg_process_cmd_line_option(Char* arg)
+static Bool cg_process_cmd_line_option(const HChar* arg)
 {
    if (VG_(str_clo_cache_opt)(arg,
                               &clo_I1_cache,
diff --git a/callgrind/callstack.c b/callgrind/callstack.c
index ae08122..95c2278 100644
--- a/callgrind/callstack.c
+++ b/callgrind/callstack.c
@@ -273,7 +273,8 @@
     CLG_DEBUGIF(0) {
 	if (CLG_(clo).verbose<2) {
 	  if (jcc && jcc->to && jcc->to->bb) {
-	    char spaces[][41] = { "   .   .   .   .   .   .   .   .   .   .",
+	    const HChar spaces[][41] = {
+                                  "   .   .   .   .   .   .   .   .   .   .",
 				  "  .   .   .   .   .   .   .   .   .   . ",
 				  " .   .   .   .   .   .   .   .   .   .  ",
 				  ".   .   .   .   .   .   .   .   .   .   " };
diff --git a/callgrind/clo.c b/callgrind/clo.c
index 61afe62..c35cbf3 100644
--- a/callgrind/clo.c
+++ b/callgrind/clo.c
@@ -89,7 +89,7 @@
   config_node* wild_star;
   config_node* wild_char;
 
-  Char name[1];
+  HChar name[1];
 };
 
 /* root of trie */
@@ -119,7 +119,7 @@
 }
 
 
-static config_node* new_config(Char* name, int length)
+static config_node* new_config(const HChar* name, int length)
 {
     int i;
     config_node* node = (config_node*) CLG_MALLOC("cl.clo.nc.1",
@@ -145,7 +145,7 @@
 }
 
 static __inline__
-Bool is_wild(Char n)
+Bool is_wild(HChar n)
 {
   return (n == '*') || (n == '?');
 }
@@ -158,7 +158,7 @@
  * tree root is stored into <*pnode>, and the created
  * leaf (fn_config) for the given pattern is returned.
  */
-static fn_config* get_fnc2(config_node* node, Char* name)
+static fn_config* get_fnc2(config_node* node, const HChar* name)
 {
   config_node *new_sub, *n, *nprev;
   int offset, len;
@@ -276,7 +276,7 @@
   int i;
 
   if (node != fn_configs) {
-    char sp[] = "                                        ";
+    const HChar sp[] = "                                        ";
 
     if (depth>40) depth=40;
     VG_(printf)("%s", sp+40-depth);
@@ -297,7 +297,7 @@
 }
 
 /* get a function config for a name pattern (from command line) */
-static fn_config* get_fnc(Char* name)
+static fn_config* get_fnc(const HChar* name)
 {
   fn_config* fnc;
 
@@ -354,7 +354,8 @@
  * looking for a match to <name>. For every matching leaf,
  * <fn> is updated with the pattern config.
  */
-static void update_fn_config2(fn_node* fn, Char* name, config_node* node)
+static void update_fn_config2(fn_node* fn, const HChar* name,
+                              config_node* node)
 {
     config_node* n;
 
@@ -405,9 +406,9 @@
 /*--- Command line processing                                      ---*/
 /*--------------------------------------------------------------------*/
 
-Bool CLG_(process_cmd_line_option)(Char* arg)
+Bool CLG_(process_cmd_line_option)(const HChar* arg)
 {
-   Char* tmp_str;
+   const HChar* tmp_str;
 
    if      VG_BOOL_CLO(arg, "--skip-plt", CLG_(clo).skip_plt) {}
 
@@ -469,7 +470,7 @@
 
    else if VG_STREQN(12, arg, "--ct-verbose") {
        fn_config* fnc;
-       Char* s;
+       HChar* s;
        UInt n = VG_(strtoll10)(arg+12, &s);
        if ((n <= 0) || *s != '=') return False;
        fnc = get_fnc(s+1);
@@ -484,7 +485,7 @@
 
    else if VG_STREQN(10, arg, "--fn-group") {
        fn_config* fnc;
-       Char* s;
+       HChar* s;
        UInt n = VG_(strtoll10)(arg+10, &s);
        if ((n <= 0) || *s != '=') return False;
        fnc = get_fnc(s+1);
@@ -493,7 +494,7 @@
 
    else if VG_STREQN(18, arg, "--separate-callers") {
        fn_config* fnc;
-       Char* s;
+       HChar* s;
        UInt n = VG_(strtoll10)(arg+18, &s);
        if ((n <= 0) || *s != '=') return False;
        fnc = get_fnc(s+1);
@@ -502,7 +503,7 @@
 
    else if VG_STREQN(15, arg, "--separate-recs") {
        fn_config* fnc;
-       Char* s;
+       HChar* s;
        UInt n = VG_(strtoll10)(arg+15, &s);
        if ((n <= 0) || *s != '=') return False;
        fnc = get_fnc(s+1);
diff --git a/callgrind/context.c b/callgrind/context.c
index dcadcb6..be6be70 100644
--- a/callgrind/context.c
+++ b/callgrind/context.c
@@ -284,7 +284,7 @@
   Int fn_entries;
 
   CLG_DEBUG(5, "+ push_cxt(fn '%s'): old ctx %d\n", 
-	    fn ? fn->name : (Char*)"0x0",
+	    fn ? fn->name : "0x0",
 	    CLG_(current_state).cxt ?
 	    CLG_(current_state).cxt->base_number : -1);
 
@@ -313,7 +313,7 @@
 
     CLG_DEBUG(0, "Resize Context Stack: %d => %d (pushing '%s')\n", 
 	     CLG_(current_fn_stack).size, new_size,
-	     fn ? fn->name : (Char*)"0x0");
+	     fn ? fn->name : "0x0");
 
     CLG_(current_fn_stack).size = new_size;
   }
@@ -331,7 +331,7 @@
   CLG_(current_state).cxt = CLG_(get_cxt)(CLG_(current_fn_stack).top);
 
   CLG_DEBUG(5, "- push_cxt(fn '%s'): new cxt %d, fn_sp %ld\n",
-	    fn ? fn->name : (Char*)"0x0",
+	    fn ? fn->name : "0x0",
 	    CLG_(current_state).cxt ?
 	      CLG_(current_state).cxt->base_number : -1,
 	    CLG_(current_fn_stack).top - CLG_(current_fn_stack).bottom + 0L);
diff --git a/callgrind/debug.c b/callgrind/debug.c
index cf795a4..67d083b 100644
--- a/callgrind/debug.c
+++ b/callgrind/debug.c
@@ -39,7 +39,7 @@
 static void print_indent(int s)
 {
     /* max of 40 spaces */
-    char sp[] = "                                        ";
+    const HChar sp[] = "                                        ";
     if (s>40) s=40;
     VG_(printf)("%s", sp+40-s);
 }
@@ -72,7 +72,7 @@
 
 
 
-void CLG_(print_cxt)(int s, Context* cxt, int rec_index)
+void CLG_(print_cxt)(Int s, Context* cxt, int rec_index)
 {
   if (s<0) {
     s = -s;
@@ -373,9 +373,9 @@
 /* dump out an address with source info if available */
 void CLG_(print_addr)(Addr addr)
 {
-    Char fl_buf[FILENAME_LEN];
-    Char fn_buf[FN_NAME_LEN];
-    const UChar* obj_name;
+    HChar fl_buf[FILENAME_LEN];
+    HChar fn_buf[FN_NAME_LEN];
+    const HChar* obj_name;
     DebugInfo* di;
     UInt ln, i=0, opos=0;
 	
@@ -435,7 +435,7 @@
   VG_(printf)("\n");
 }
 
-void* CLG_(malloc)(HChar* cc, UWord s, char* f)
+void* CLG_(malloc)(const HChar* cc, UWord s, const HChar* f)
 {
     CLG_DEBUG(3, "Malloc(%lu) in %s.\n", s, f);
     return VG_(malloc)(cc,s);
diff --git a/callgrind/dump.c b/callgrind/dump.c
index e923783..8cdade6 100644
--- a/callgrind/dump.c
+++ b/callgrind/dump.c
@@ -36,8 +36,8 @@
 /* Dump Part Counter */
 static Int out_counter = 0;
 
-static Char* out_file = 0;
-static Char* out_directory = 0;
+static HChar* out_file = 0;
+static HChar* out_directory = 0;
 static Bool dumps_initialized = False;
 
 /* Command */
@@ -62,13 +62,13 @@
   return out_counter;
 }
 
-Char* CLG_(get_out_file)()
+HChar* CLG_(get_out_file)()
 {
     CLG_(init_dumps)();
     return out_file;
 }
 
-Char* CLG_(get_out_directory)()
+HChar* CLG_(get_out_directory)()
 {
     CLG_(init_dumps)();
     return out_directory;
@@ -440,8 +440,8 @@
 static /* __inline__ */
 Bool get_debug_pos(BBCC* bbcc, Addr addr, AddrPos* p)
 {
-    Char file[FILENAME_LEN];
-    Char dir[FILENAME_LEN];
+    HChar file[FILENAME_LEN];
+    HChar dir[FILENAME_LEN];
     Bool found_file_line, found_dirname;
 
     int cachepos = addr % DEBUG_CACHE_SIZE;
@@ -1715,12 +1715,12 @@
        i++;
    }
    i = lastSlash;
-   out_directory = (Char*) CLG_MALLOC("cl.dump.init_dumps.1", i+1);
+   out_directory = (HChar*) CLG_MALLOC("cl.dump.init_dumps.1", i+1);
    VG_(strncpy)(out_directory, out_file, i);
    out_directory[i] = 0;
 
    /* allocate space big enough for final filenames */
-   filename = (Char*) CLG_MALLOC("cl.dump.init_dumps.2",
+   filename = (HChar*) CLG_MALLOC("cl.dump.init_dumps.2",
                                  VG_(strlen)(out_file)+32);
    CLG_ASSERT(filename != 0);
        
diff --git a/callgrind/events.c b/callgrind/events.c
index 566b5e8..0193d2a 100644
--- a/callgrind/events.c
+++ b/callgrind/events.c
@@ -46,7 +46,7 @@
 	eventGroup[i] = 0;
 
     for(i=0; i< MAX_EVENTSET_COUNT; i++)
-	eventSetTable[i] = 0;
+	eventSetTable[i] = 0; 
 
     eventSets_initialized = 1;
  }
@@ -62,7 +62,7 @@
     CLG_ASSERT(eventGroup[id]==0);
 
     eg = (EventGroup*) CLG_MALLOC("cl.events.group.1",
-				  sizeof(EventGroup) + n * sizeof(Char*));
+				  sizeof(EventGroup) + n * sizeof(HChar*));
     eg->size = n;
     eventGroup[id] = eg;
     return eg;
diff --git a/callgrind/fn.c b/callgrind/fn.c
index 09546f3..9975c42 100644
--- a/callgrind/fn.c
+++ b/callgrind/fn.c
@@ -39,7 +39,7 @@
 struct chunk_t { int start, len; };
 struct pattern
 {
-    const char* name;
+    const HChar* name;
     int len;
     struct chunk_t chunk[];
 };
@@ -49,7 +49,7 @@
  */
 __attribute__((unused))    // Possibly;  depends on the platform.
 static Bool check_code(obj_node* obj,
-		       unsigned char code[], struct pattern* pat)
+                       UChar code[], struct pattern* pat)
 {
     Bool found;
     Addr addr, end;
@@ -122,7 +122,7 @@
 static Bool search_runtime_resolve(obj_node* obj)
 {
 #if defined(VGP_x86_linux)
-    static unsigned char code[] = {
+    static UChar code[] = {
 	/* 0*/ 0x50, 0x51, 0x52, 0x8b, 0x54, 0x24, 0x10, 0x8b,
 	/* 8*/ 0x44, 0x24, 0x0c, 0xe8, 0x70, 0x01, 0x00, 0x00,
 	/*16*/ 0x5a, 0x59, 0x87, 0x04, 0x24, 0xc2, 0x08, 0x00 };
@@ -131,7 +131,7 @@
 	"x86-def", 24, {{ 0,12 }, { 16,8 }, { 24,0}} };
 
     /* Pattern for glibc-2.8 on OpenSuse11.0 */
-    static unsigned char code_28[] = {
+    static UChar code_28[] = {
 	/* 0*/ 0x50, 0x51, 0x52, 0x8b, 0x54, 0x24, 0x10, 0x8b,
 	/* 8*/ 0x44, 0x24, 0x0c, 0xe8, 0x70, 0x01, 0x00, 0x00,
 	/*16*/ 0x5a, 0x8b, 0x0c, 0x24, 0x89, 0x04, 0x24, 0x8b,
@@ -146,7 +146,7 @@
 #endif
 
 #if defined(VGP_ppc32_linux)
-    static unsigned char code[] = {
+    static UChar code[] = {
 	/* 0*/ 0x94, 0x21, 0xff, 0xc0, 0x90, 0x01, 0x00, 0x0c,
 	/* 8*/ 0x90, 0x61, 0x00, 0x10, 0x90, 0x81, 0x00, 0x14,
 	/*16*/ 0x7d, 0x83, 0x63, 0x78, 0x90, 0xa1, 0x00, 0x18,
@@ -172,7 +172,7 @@
 #endif
 
 #if defined(VGP_amd64_linux)
-    static unsigned char code[] = {
+    static UChar code[] = {
 	/* 0*/ 0x48, 0x83, 0xec, 0x38, 0x48, 0x89, 0x04, 0x24,
 	/* 8*/ 0x48, 0x89, 0x4c, 0x24, 0x08, 0x48, 0x89, 0x54, 0x24, 0x10,
 	/*18*/ 0x48, 0x89, 0x74, 0x24, 0x18, 0x48, 0x89, 0x7c, 0x24, 0x20,
@@ -214,7 +214,7 @@
 
 #define HASH_CONSTANT   256
 
-static UInt str_hash(const Char *s, UInt table_size)
+static UInt str_hash(const HChar *s, UInt table_size)
 {
     int hash_value = 0;
     for ( ; *s; s++)
@@ -232,7 +232,7 @@
    obj_node* obj;
 
    obj = (obj_node*) CLG_MALLOC("cl.fn.non.1", sizeof(obj_node));
-   obj->name  = di ? (HChar *)VG_(strdup)( "cl.fn.non.2",
+   obj->name  = di ? VG_(strdup)( "cl.fn.non.2",
                                   VG_(DebugInfo_get_filename)(di) )
                    : anonymous_obj;
    for (i = 0; i < N_FILE_ENTRIES; i++) {
@@ -286,7 +286,7 @@
 
 
 static __inline__ 
-file_node* new_file_node(Char filename[FILENAME_LEN],
+file_node* new_file_node(HChar filename[FILENAME_LEN],
 			 obj_node* obj, file_node* next)
 {
   Int i;
@@ -305,7 +305,7 @@
 
  
 file_node* CLG_(get_file_node)(obj_node* curr_obj_node,
-			      Char filename[FILENAME_LEN])
+                               HChar filename[FILENAME_LEN])
 {
     file_node* curr_file_node;
     UInt       filename_hash;
@@ -330,7 +330,7 @@
 static void resize_fn_array(void);
 
 static __inline__ 
-fn_node* new_fn_node(Char fnname[FILENAME_LEN],
+fn_node* new_fn_node(HChar fnname[FILENAME_LEN],
 		     file_node* file, fn_node* next)
 {
     fn_node* fn = (fn_node*) CLG_MALLOC("cl.fn.nfnnd.1",
@@ -374,7 +374,7 @@
  */
 static
 fn_node* get_fn_node_infile(file_node* curr_file_node,
-			    Char fnname[FN_NAME_LEN])
+			    HChar fnname[FN_NAME_LEN])
 {
     fn_node* curr_fn_node;
     UInt     fnname_hash;
@@ -403,8 +403,8 @@
  */
 static __inline__
 fn_node* get_fn_node_inseg(DebugInfo* di,
-			   Char filename[FILENAME_LEN],
-			   Char fnname[FN_NAME_LEN])
+			   HChar filename[FILENAME_LEN],
+			   HChar fnname[FN_NAME_LEN])
 {
   obj_node  *obj  = CLG_(get_obj_node)(di);
   file_node *file = CLG_(get_file_node)(obj, filename);
@@ -415,12 +415,12 @@
 
 
 Bool CLG_(get_debug_info)(Addr instr_addr,
-			 Char file[FILENAME_LEN],
-			 Char fn_name[FN_NAME_LEN], UInt* line_num,
+			 HChar file[FILENAME_LEN],
+			 HChar fn_name[FN_NAME_LEN], UInt* line_num,
 			 DebugInfo** pDebugInfo)
 {
   Bool found_file_line, found_fn, found_dirname, result = True;
-  Char dir[FILENAME_LEN];
+  HChar dir[FILENAME_LEN];
   UInt line;
   
   CLG_DEBUG(6, "  + get_debug_info(%#lx)\n", instr_addr);
@@ -471,9 +471,9 @@
 
    CLG_DEBUG(6, "  - get_debug_info(%#lx): seg '%s', fn %s\n",
 	    instr_addr,
-	    !pDebugInfo   ? (const UChar*)"-" :
+	    !pDebugInfo   ? "-" :
 	    (*pDebugInfo) ? VG_(DebugInfo_get_filename)(*pDebugInfo) :
-	    (const UChar*)"(None)",
+	    "(None)",
 	    fn_name);
 
   return result;
diff --git a/callgrind/global.h b/callgrind/global.h
index e51f210..38ffa95 100644
--- a/callgrind/global.h
+++ b/callgrind/global.h
@@ -422,7 +422,7 @@
  */
 
 struct _fn_node {
-  Char*      name;
+  HChar*     name;
   UInt       number;
   Context*   last_cxt; /* LRU info */
   Context*   pure_cxt; /* the context with only the function itself */
@@ -456,7 +456,7 @@
 #define N_BBCC2_ENTRIES         37
 
 struct _file_node {
-   Char*      name;
+   HChar*     name;
    fn_node*   fns[N_FN_ENTRIES];
    UInt       number;
    obj_node*  obj;
@@ -657,7 +657,7 @@
 struct cachesim_if
 {
     void (*print_opts)(void);
-    Bool (*parse_opt)(Char* arg);
+    Bool (*parse_opt)(const HChar* arg);
     void (*post_clo_init)(void);
     void (*clear)(void);
     void (*getdesc)(HChar* buf);
@@ -712,7 +712,7 @@
 
 void CLG_(set_clo_defaults)(void);
 void CLG_(update_fn_config)(fn_node*);
-Bool CLG_(process_cmd_line_option)(Char*);
+Bool CLG_(process_cmd_line_option)(const HChar*);
 void CLG_(print_usage)(void);
 void CLG_(print_debug_usage)(void);
 
@@ -721,8 +721,8 @@
 void CLG_(init_eventsets)(void);
 
 /* from main.c */
-Bool CLG_(get_debug_info)(Addr, Char filename[FILENAME_LEN],
-			 Char fn_name[FN_NAME_LEN], UInt*, DebugInfo**);
+Bool CLG_(get_debug_info)(Addr, HChar filename[FILENAME_LEN],
+			 HChar fn_name[FN_NAME_LEN], UInt*, DebugInfo**);
 void CLG_(collectBlockInfo)(IRSB* bbIn, UInt*, UInt*, Bool*);
 void CLG_(set_instrument_state)(const HChar*,Bool);
 void CLG_(dump_profile)(const HChar* trigger,Bool only_current_thread);
@@ -751,7 +751,7 @@
 
 void      CLG_(init_obj_table)(void);
 obj_node* CLG_(get_obj_node)(DebugInfo* si);
-file_node* CLG_(get_file_node)(obj_node*, Char* filename);
+file_node* CLG_(get_file_node)(obj_node*, HChar* filename);
 fn_node*  CLG_(get_fn_node)(BB* bb);
 
 /* from bbcc.c */
@@ -813,8 +813,8 @@
 /* from dump.c */
 extern FullCost CLG_(total_cost);
 void CLG_(init_dumps)(void);
-Char* CLG_(get_out_file)(void);
-Char* CLG_(get_out_directory)(void);
+HChar* CLG_(get_out_file)(void);
+HChar* CLG_(get_out_directory)(void);
 
 /*------------------------------------------------------------*/
 /*--- Exported global variables                            ---*/
@@ -882,8 +882,8 @@
 void CLG_(print_addr)(Addr addr);
 void CLG_(print_addr_ln)(Addr addr);
 
-void* CLG_(malloc)(HChar* cc, UWord s, char* f);
-void* CLG_(free)(void* p, char* f);
+void* CLG_(malloc)(const HChar* cc, UWord s, const HChar* f);
+void* CLG_(free)(void* p, const HChar* f);
 #if 0
 #define CLG_MALLOC(_cc,x) CLG_(malloc)((_cc),x,__FUNCTION__)
 #define CLG_FREE(p)       CLG_(free)(p,__FUNCTION__)
diff --git a/callgrind/main.c b/callgrind/main.c
index 2cae802..41fcd9e 100644
--- a/callgrind/main.c
+++ b/callgrind/main.c
@@ -1501,11 +1501,11 @@
 }
 
 /* return True if request recognised, False otherwise */
-static Bool handle_gdb_monitor_command (ThreadId tid, Char *req)
+static Bool handle_gdb_monitor_command (ThreadId tid, const HChar *req)
 {
-   Char* wcmd;
-   Char s[VG_(strlen(req))]; /* copy for strtok_r */
-   Char *ssaveptr;
+   HChar* wcmd;
+   HChar s[VG_(strlen(req))]; /* copy for strtok_r */
+   HChar *ssaveptr;
 
    VG_(strcpy) (s, req);
 
@@ -1529,7 +1529,7 @@
    }
 
    case 3: { /* status */
-     Char* arg = VG_(strtok_r) (0, " ", &ssaveptr);
+     HChar* arg = VG_(strtok_r) (0, " ", &ssaveptr);
      if (arg && (VG_(strcmp)(arg, "internal") == 0)) {
        /* internal interface to callgrind_control */
        dump_state_togdb();
@@ -1550,7 +1550,7 @@
    }
 
    case 4: { /* instrumentation */
-     Char* arg = VG_(strtok_r) (0, " ", &ssaveptr);
+     HChar* arg = VG_(strtok_r) (0, " ", &ssaveptr);
      if (!arg) {
        VG_(gdb_printf)("instrumentation: %s\n",
 		       CLG_(instrument_state) ? "on":"off");
@@ -1582,7 +1582,7 @@
    case VG_USERREQ__DUMP_STATS_AT:
      {
        HChar buf[512];
-       VG_(sprintf)(buf,"Client Request: %s", (Char*)args[1]);
+       VG_(sprintf)(buf,"Client Request: %s", (HChar*)args[1]);
        CLG_(dump_profile)(buf, True);
        *ret = 0;                 /* meaningless */
      }
@@ -1611,7 +1611,7 @@
      break;
 
    case VG_USERREQ__GDB_MONITOR_COMMAND: {
-      Bool handled = handle_gdb_monitor_command (tid, (Char*)args[1]);
+      Bool handled = handle_gdb_monitor_command (tid, (HChar*)args[1]);
       if (handled)
          *ret = 1;
       else
@@ -1739,7 +1739,7 @@
 static
 void finish(void)
 {
-  Char buf[32+COSTS_LEN];
+  HChar buf[32+COSTS_LEN];
   HChar fmt[128];
   Int l1, l2, l3;
   FullCost total;
diff --git a/callgrind/sim.c b/callgrind/sim.c
index 1bb9cbe..3ce0890 100644
--- a/callgrind/sim.c
+++ b/callgrind/sim.c
@@ -1457,7 +1457,7 @@
  *
  * Called from CLG_(process_cmd_line_option)() in clo.c
  */
-static Bool cachesim_parse_opt(Char* arg)
+static Bool cachesim_parse_opt(const HChar* arg)
 {
    if      VG_BOOL_CLO(arg, "--simulate-wb",      clo_simulate_writeback) {}
    else if VG_BOOL_CLO(arg, "--simulate-hwpref",  clo_simulate_hwpref)    {}
@@ -1535,7 +1535,7 @@
   FullCost total = CLG_(total_cost), D_total = 0;
   ULong LL_total_m, LL_total_mr, LL_total_mw,
     LL_total, LL_total_r, LL_total_w;
-  char buf1[RESULTS_BUF_LEN], 
+  HChar buf1[RESULTS_BUF_LEN], 
     buf2[RESULTS_BUF_LEN], 
     buf3[RESULTS_BUF_LEN];
   Int p;
diff --git a/coregrind/launcher-linux.c b/coregrind/launcher-linux.c
index 3b7eb66..dbc198c 100644
--- a/coregrind/launcher-linux.c
+++ b/coregrind/launcher-linux.c
@@ -113,7 +113,7 @@
 static const char *select_platform(const char *clientname)
 {
    int fd;
-   uint8_t header[4096];
+   char header[4096];
    ssize_t n_bytes;
    const char *platform = NULL;
 
diff --git a/coregrind/m_cache.c b/coregrind/m_cache.c
index 117c6db..98965cd 100644
--- a/coregrind/m_cache.c
+++ b/coregrind/m_cache.c
@@ -485,7 +485,7 @@
 {
    Int  ret, i;
    UInt level;
-   Char vendor_id[13];
+   HChar vendor_id[13];
 
    vg_assert(VG_(has_cpuid)());
 
diff --git a/coregrind/m_debugger.c b/coregrind/m_debugger.c
index ede0fbc..14ae9ef 100644
--- a/coregrind/m_debugger.c
+++ b/coregrind/m_debugger.c
@@ -383,7 +383,7 @@
          HChar file[50];
          HChar buf[N_BUF];
          HChar *bufptr;
-         HChar *cmdptr;
+         const HChar *cmdptr;
          
          VG_(sprintf)(pidbuf, "%d", pid);
          VG_(sprintf)(file, "/proc/%d/fd/%d", pid, VG_(cl_exec_fd));
diff --git a/coregrind/m_debuginfo/debuginfo.c b/coregrind/m_debuginfo/debuginfo.c
index 2bf206b..a795547 100644
--- a/coregrind/m_debuginfo/debuginfo.c
+++ b/coregrind/m_debuginfo/debuginfo.c
@@ -1985,7 +1985,7 @@
             // If user supplied --fullpath-after=foo, this will remove 
             // a leading string which matches '.*foo' (not greedy).
             for (i = 0; i < VG_(clo_n_fullpath_after); i++) {
-               UChar* prefix = VG_(clo_fullpath_after)[i];
+              UChar* prefix = (UChar *)VG_(clo_fullpath_after)[i]; // FIXME
                UChar* str    = VG_(strstr)(dirname, prefix);
                if (str) {
                   dirname = str + VG_(strlen)(prefix);
@@ -3842,8 +3842,8 @@
                                   /*OUT*/Addr*    avma,
                                   /*OUT*/Addr*    tocptr,
                                   /*OUT*/UInt*    size,
-                                  /*OUT*/UChar**  pri_name,
-                                  /*OUT*/UChar*** sec_names,
+                                  /*OUT*/HChar**  pri_name,
+                                  /*OUT*/HChar*** sec_names,
                                   /*OUT*/Bool*    isText,
                                   /*OUT*/Bool*    isIFunc )
 {
@@ -3852,7 +3852,7 @@
    if (tocptr)    *tocptr    = si->symtab[idx].tocptr;
    if (size)      *size      = si->symtab[idx].size;
    if (pri_name)  *pri_name  = si->symtab[idx].pri_name;
-   if (sec_names) *sec_names = si->symtab[idx].sec_names;
+   if (sec_names) *sec_names = (HChar **)si->symtab[idx].sec_names; // FIXME
    if (isText)    *isText    = si->symtab[idx].isText;
    if (isIFunc)   *isIFunc   = si->symtab[idx].isIFunc;
 }
diff --git a/coregrind/m_debuglog.c b/coregrind/m_debuglog.c
index 4baffc7..37eb7a5 100644
--- a/coregrind/m_debuglog.c
+++ b/coregrind/m_debuglog.c
@@ -814,8 +814,8 @@
          }
 
 //         case 'y': { /* %y - print symbol */
-//            Char buf[100];
-//            Char *cp = buf;
+//            HChar buf[100];
+//            HChar *cp = buf;
 //            Addr a = va_arg(vargs, Addr);
 //
 //            if (flags & VG_MSG_PAREN)
diff --git a/coregrind/m_demangle/demangle.c b/coregrind/m_demangle/demangle.c
index 6e2b1a2..8f9af4a 100644
--- a/coregrind/m_demangle/demangle.c
+++ b/coregrind/m_demangle/demangle.c
@@ -87,7 +87,7 @@
 /* This is the main, standard demangler entry point. */
 
 void VG_(demangle) ( Bool do_cxx_demangling, Bool do_z_demangling,
-                     Char* orig, Char* result, Int result_size )
+                     HChar* orig, HChar* result, Int result_size )
 {
 #  define N_ZBUF 4096
    HChar* demangled = NULL;
diff --git a/coregrind/m_errormgr.c b/coregrind/m_errormgr.c
index a252080..b4fec57 100644
--- a/coregrind/m_errormgr.c
+++ b/coregrind/m_errormgr.c
@@ -213,7 +213,7 @@
       SuppLocTy ty;
       Bool      name_is_simple_str; /* True if name is a string without
                                        '?' and '*' wildcard characters. */
-      Char*     name; /* NULL for NoName and DotDotDot */
+      HChar*    name; /* NULL for NoName and DotDotDot */
    }
    SuppLoc;
 
@@ -224,7 +224,7 @@
 struct _Supp {
    struct _Supp* next;
    Int count;     // The number of times this error has been suppressed.
-   Char* sname;   // The name by which the suppression is referred to.
+   HChar* sname;  // The name by which the suppression is referred to.
 
    // Length of 'callers'
    Int n_callers;
@@ -234,7 +234,7 @@
 
    /* The tool-specific part */
    SuppKind skind;   // What kind of suppression.  Must use the range (0..).
-   Char* string;     // String -- use is optional.  NULL by default.
+   HChar* string;    // String -- use is optional.  NULL by default.
    void* extra;      // Anything else -- use is optional.  NULL by default.
 };
 
@@ -243,7 +243,7 @@
    return su->skind;
 }
 
-Char* VG_(get_supp_string) ( Supp* su )
+HChar* VG_(get_supp_string) ( Supp* su )
 {
    return su->string;
 }
@@ -259,7 +259,7 @@
    su->skind = skind;
 }
 
-void VG_(set_supp_string) ( Supp* su, Char* string )
+void VG_(set_supp_string) ( Supp* su, HChar* string )
 {
    su->string = string;
 }
@@ -317,7 +317,7 @@
 
 static void printSuppForIp_XML(UInt n, Addr ip, void* uu_opaque)
 {
-   static UChar buf[ERRTXT_LEN];
+   static HChar buf[ERRTXT_LEN];
    if ( VG_(get_fnname_no_cxx_demangle) (ip, buf,  ERRTXT_LEN) ) {
       VG_(printf_xml)("    <sframe> <fun>%pS</fun> </sframe>\n", buf);
    } else
@@ -330,7 +330,7 @@
 
 static void printSuppForIp_nonXML(UInt n, Addr ip, void* textV)
 {
-   static UChar buf[ERRTXT_LEN];
+   static HChar buf[ERRTXT_LEN];
    XArray* /* of HChar */ text = (XArray*)textV;
    if ( VG_(get_fnname_no_cxx_demangle) (ip, buf,  ERRTXT_LEN) ) {
       VG_(xaprintf)(text, "   fun:%s\n", buf);
@@ -447,7 +447,7 @@
 */
 Bool VG_(is_action_requested) ( const HChar* action, Bool* clo )
 {
-   Char ch, ch2;
+   HChar ch, ch2;
    Int res;
 
    /* First off, we shouldn't be asking the user anything if
@@ -1034,10 +1034,10 @@
 /* Get the next char from fd into *out_buf.  Returns 1 if success,
    0 if eof or < 0 if error. */
 
-static Int get_char ( Int fd, Char* out_buf )
+static Int get_char ( Int fd, HChar* out_buf )
 {
    Int r;
-   static Char buf[256];
+   static HChar buf[256];
    static Int buf_size = 0;
    static Int buf_used = 0;
    vg_assert(buf_size >= 0 && buf_size <= 256);
@@ -1058,11 +1058,11 @@
    return 1;
 }
 
-Bool VG_(get_line) ( Int fd, Char** bufpp, SizeT* nBufp, Int* lineno )
+Bool VG_(get_line) ( Int fd, HChar** bufpp, SizeT* nBufp, Int* lineno )
 {
-   Char* buf  = *bufpp;
+   HChar* buf  = *bufpp;
    SizeT nBuf = *nBufp;
-   Char  ch;
+   HChar  ch;
    Int   n, i;
    while (True) {
       /* First, read until a non-blank char appears. */
@@ -1106,7 +1106,7 @@
 
 
 /* True if s contains no wildcard (?, *) characters. */
-static Bool is_simple_str (Char *s)
+static Bool is_simple_str (const HChar *s)
 {
    while (*s) {
       if (*s == '?' || *s == '*')
@@ -1125,7 +1125,7 @@
    after the descriptor (fun: or obj:) part.
    Returns False if failed.
 */
-static Bool setLocationTy ( SuppLoc* p, Char *buf )
+static Bool setLocationTy ( SuppLoc* p, HChar *buf )
 {
    if (VG_(strncmp)(buf, "fun:", 4) == 0) {
       p->name = VG_(arena_strdup)(VG_AR_CORE,
@@ -1154,10 +1154,10 @@
 
 
 /* Look for "tool" in a string like "tool1,tool2,tool3" */
-static Bool tool_name_present(const HChar *name, Char *names)
+static Bool tool_name_present(const HChar *name, HChar *names)
 {
    Bool  found;
-   Char *s = NULL;   /* Shut gcc up */
+   HChar *s = NULL;   /* Shut gcc up */
    Int   len = VG_(strlen)(name);
 
    found = (NULL != (s = VG_(strstr)(names, name)) &&
@@ -1172,15 +1172,15 @@
    and place them in the suppressions list.  If there's any difficulty
    doing this, just give up -- there's no point in trying to recover.  
 */
-static void load_one_suppressions_file ( Char* filename )
+static void load_one_suppressions_file ( const HChar* filename )
 {
    SysRes sres;
    Int    fd, i, j, lineno = 0;
    Bool   eof;
    SizeT  nBuf = 200;
-   Char*  buf = VG_(malloc)("errormgr.losf.1", nBuf);
-   Char*  tool_names;
-   Char*  supp_name;
+   HChar* buf = VG_(malloc)("errormgr.losf.1", nBuf);
+   HChar* tool_names;
+   HChar* supp_name;
    const HChar* err_str = NULL;
    SuppLoc tmp_callers[VG_MAX_SUPP_CALLERS];
 
@@ -1424,9 +1424,9 @@
 
       // All function names and object names will be concatenated
       // in names. names is reallocated on demand.
-      Char *names;
+      HChar *names;
       Int   names_szB;  // size of names.
-      Int   names_free; // offset first free Char in names.
+      Int   names_free; // offset first free HChar in names.
    }
    IPtoFunOrObjCompleter;
 
@@ -1445,8 +1445,8 @@
    The function name or object name will be computed and added in
    names if not yet done.
    IP must be equal to focompl->ipc[ixIP]. */
-static Char* foComplete(IPtoFunOrObjCompleter* ip2fo,
-                        Addr IP, Int ixIP, Bool needFun)
+static HChar* foComplete(IPtoFunOrObjCompleter* ip2fo,
+                         Addr IP, Int ixIP, Bool needFun)
 {
    vg_assert (ixIP < ip2fo->n_ips);
    vg_assert (IP == ip2fo->ips[ixIP]);
@@ -1480,7 +1480,7 @@
                            ip2fo->names_szB + ERRTXT_LEN);
          ip2fo->names_szB += ERRTXT_LEN;
       }
-      Char* caller_name = ip2fo->names + ip2fo->names_free;
+      HChar* caller_name = ip2fo->names + ip2fo->names_free;
       (*offsets)[ixIP] = ip2fo->names_free;
       if (needFun) {
          /* Get the function name into 'caller_name', or "???"
@@ -1511,7 +1511,7 @@
    Addr     ip      = *(Addr*)addrV; /* INPUT */
    IPtoFunOrObjCompleter* ip2fo 
       = (IPtoFunOrObjCompleter*)inputCompleter;
-   Char* funobj_name; // Fun or Obj name.
+   HChar* funobj_name; // Fun or Obj name.
 
    /* So, does this IP address match this suppression-line? */
    switch (supploc->ty) {
diff --git a/coregrind/m_gdbserver/m_gdbserver.c b/coregrind/m_gdbserver/m_gdbserver.c
index 212859e..e20dc23 100644
--- a/coregrind/m_gdbserver/m_gdbserver.c
+++ b/coregrind/m_gdbserver/m_gdbserver.c
@@ -1272,9 +1272,9 @@
 Int VG_(keyword_id) (Char* keywords, Char* input_word, kwd_report_error report)
 {
    const Int il = (input_word == NULL ? 0 : VG_(strlen) (input_word));
-   Char  iw[il+1];
-   Char  kwds[VG_(strlen)(keywords)+1];
-   Char  *kwdssaveptr;
+   HChar  iw[il+1];
+   HChar  kwds[VG_(strlen)(keywords)+1];
+   HChar  *kwdssaveptr;
 
    Char* kw; /* current keyword, its length, its position */
    Int   kwl;
@@ -1377,12 +1377,12 @@
 
 void VG_(strtok_get_address_and_size) (Addr* address, 
                                        SizeT* szB, 
-                                       Char **ssaveptr)
+                                       HChar **ssaveptr)
 {
-   Char* wa;
-   Char* ws;
-   Char* endptr;
-   UChar *ppc;
+   HChar* wa;
+   HChar* ws;
+   HChar* endptr;
+   const HChar *ppc;
 
    wa = VG_(strtok_r) (NULL, " ", ssaveptr);
    ppc = wa;
diff --git a/coregrind/m_gdbserver/regdef.h b/coregrind/m_gdbserver/regdef.h
index 146079c..e974459 100644
--- a/coregrind/m_gdbserver/regdef.h
+++ b/coregrind/m_gdbserver/regdef.h
@@ -25,7 +25,7 @@
 struct reg
 {
   /* The name of this register - NULL for pad entries.  */
-  const char *name;
+  char *name;
 
   /* At the moment, both of the following bit counts must be divisible
      by eight (to match the representation as two hex digits) and divisible
diff --git a/coregrind/m_gdbserver/remote-utils.c b/coregrind/m_gdbserver/remote-utils.c
index 009f327..2e6efa6 100644
--- a/coregrind/m_gdbserver/remote-utils.c
+++ b/coregrind/m_gdbserver/remote-utils.c
@@ -219,7 +219,7 @@
    will be created if not existing yet. They will be removed when
    the gdbserver connection is closed or the process exits */
 
-void remote_open (char *name)
+void remote_open (const HChar *name)
 {
    const HChar *user, *host;
    int save_fcntl_flags, len;
diff --git a/coregrind/m_gdbserver/server.c b/coregrind/m_gdbserver/server.c
index 736bd91..5dcb139 100644
--- a/coregrind/m_gdbserver/server.c
+++ b/coregrind/m_gdbserver/server.c
@@ -126,7 +126,7 @@
    UWord ret = 0;
    char s[strlen(mon)+1]; /* copy for strtok_r */
    char* wcmd;
-   Char* ssaveptr;
+   HChar* ssaveptr;
    char* endptr;
    int   kwdid;
    int int_value;
diff --git a/coregrind/m_gdbserver/server.h b/coregrind/m_gdbserver/server.h
index 95939a7..6686c19 100644
--- a/coregrind/m_gdbserver/server.h
+++ b/coregrind/m_gdbserver/server.h
@@ -134,27 +134,27 @@
 #define VKI_POLLNVAL          0x0020
 
 /* a bunch of macros to avoid libc usage in valgrind-ified gdbserver */ 
-#define strcmp(s1,s2)         VG_(strcmp) ((Char *)(s1),(Char *)(s2))
-#define strncmp(s1,s2,nmax)   VG_(strncmp) ((Char *)(s1),(Char *)(s2),nmax)
-#define strcat(s1,s2)         VG_(strcat) ((Char *)(s1),(Char *)(s2))
-#define strcpy(s1,s2)         VG_(strcpy) ((Char *)(s1),(Char *)(s2))
-#define strncpy(s1,s2,nmax)   VG_(strncpy) ((Char *)(s1),(Char *)(s2),nmax)
-#define strlen(s)             VG_(strlen) ((Char *)(s))
-#define strtok(p,s)           (char *) VG_(strtok) ((Char *)(p),(Char *)(s))
-#define strtok_r(p,s,ss)      (char *) VG_(strtok_r) ((Char *)(p),(Char *)(s),(Char **)(ss))
-#define strchr(s,c)           (char *) VG_(strchr) ((Char *)(s),c)
+#define strcmp(s1,s2)         VG_(strcmp) ((s1),(s2))
+#define strncmp(s1,s2,nmax)   VG_(strncmp) ((s1),(s2),nmax)
+#define strcat(s1,s2)         VG_(strcat) ((s1),(s2))
+#define strcpy(s1,s2)         VG_(strcpy) ((s1),(s2))
+#define strncpy(s1,s2,nmax)   VG_(strncpy) ((s1),(s2),nmax)
+#define strlen(s)             VG_(strlen) ((s))
+#define strtok(p,s)           VG_(strtok) ((p),(s))
+#define strtok_r(p,s,ss)      VG_(strtok_r) ((p),(s),(ss))
+#define strchr(s,c)           VG_(strchr) ((s),c)
 /* strtol and strtoul supports base 16 or else assumes it is base 10 */
 #define strtol(s,r,b)         ((b) == 16 ? \
-                               VG_(strtoll16) ((Char *)(s),(Char **)(r)) \
-                               : VG_(strtoll10) ((Char *)(s),(Char **)(r)))
+                               VG_(strtoll16) ((s),(r)) \
+                               : VG_(strtoll10) ((s),(r)))
 #define strtoul(s,r,b)        ((b) == 16 ? \
-                               VG_(strtoull16) ((Char *)(s),(Char **)(r)) \
-                               : VG_(strtoull10) ((Char *)(s),(Char **)(r)))
+                               VG_(strtoull16) ((s),(r)) \
+                               : VG_(strtoull10) ((s),(r)))
 
 #define malloc(sz)            VG_(arena_malloc)  (VG_AR_CORE, "gdbsrv", sz)
 #define calloc(n,sz)          VG_(arena_calloc)  (VG_AR_CORE, "gdbsrv", n, sz)
 #define realloc(p,size)       VG_(arena_realloc) (VG_AR_CORE, "gdbsrv", p, size)
-#define strdup(s)             (char *) VG_(arena_strdup)  (VG_AR_CORE, "gdbsrv", (Char *)(s))
+#define strdup(s)             VG_(arena_strdup)  (VG_AR_CORE, "gdbsrv", (s))
 #define free(b)               VG_(arena_free)    (VG_AR_CORE, b)
 
 #ifndef ATTR_NORETURN
@@ -276,7 +276,7 @@
 int putpkt (char *buf);
 int putpkt_binary (char *buf, int len);
 int getpkt (char *buf);
-void remote_open (char *name);
+void remote_open (const HChar *name);
 void remote_close (void);
 
 void sync_gdb_connection (void);
diff --git a/coregrind/m_initimg/initimg-darwin.c b/coregrind/m_initimg/initimg-darwin.c
index 64671ab..29d3fb7 100644
--- a/coregrind/m_initimg/initimg-darwin.c
+++ b/coregrind/m_initimg/initimg-darwin.c
@@ -459,7 +459,7 @@
    *ptr++ = 0;
 
    /* --- envp --- */
-   VG_(client_envp) = (Char **)ptr;
+   VG_(client_envp) = (HChar **)ptr;
    for (cpp = orig_envp; cpp && *cpp; ptr++, cpp++)
       *ptr = (Addr)copy_str(&strtab, *cpp);
    *ptr++ = 0;
diff --git a/coregrind/m_initimg/initimg-linux.c b/coregrind/m_initimg/initimg-linux.c
index a32ab57..1510f8c 100644
--- a/coregrind/m_initimg/initimg-linux.c
+++ b/coregrind/m_initimg/initimg-linux.c
@@ -603,7 +603,7 @@
    *ptr++ = 0;
 
    /* --- envp --- */
-   VG_(client_envp) = (Char **)ptr;
+   VG_(client_envp) = (HChar **)ptr;
    for (cpp = orig_envp; cpp && *cpp; ptr++, cpp++)
       *ptr = (Addr)copy_str(&strtab, *cpp);
    *ptr++ = 0;
diff --git a/coregrind/m_libcbase.c b/coregrind/m_libcbase.c
index a5adac5..fc6df6c 100644
--- a/coregrind/m_libcbase.c
+++ b/coregrind/m_libcbase.c
@@ -32,16 +32,16 @@
 #include "pub_core_libcbase.h"
 
 /* ---------------------------------------------------------------------
-   Char functions.
+   HChar functions.
    ------------------------------------------------------------------ */
 
-Bool VG_(isspace) ( Char c )
+Bool VG_(isspace) ( HChar c )
 {
    return (c == ' '  || c == '\n' || c == '\t' || 
            c == '\f' || c == '\v' || c == '\r');
 }
 
-Bool VG_(isdigit) ( Char c )
+Bool VG_(isdigit) ( HChar c )
 {
    return (c >= '0' && c <= '9');
 }
@@ -50,13 +50,13 @@
    Converting strings to numbers
    ------------------------------------------------------------------ */
 
-static Bool is_dec_digit(Char c, Long* digit)
+static Bool is_dec_digit(HChar c, Long* digit)
 {
    if (c >= '0' && c <= '9') { *digit = (Long)(c - '0'); return True; }
    return False;
 }
 
-static Bool is_hex_digit(Char c, Long* digit)
+static Bool is_hex_digit(HChar c, Long* digit)
 {
    if (c >= '0' && c <= '9') { *digit = (Long)(c - '0');        return True; }
    if (c >= 'A' && c <= 'F') { *digit = (Long)((c - 'A') + 10); return True; }
@@ -64,11 +64,11 @@
    return False;
 }
 
-Long VG_(strtoll10) ( Char* str, Char** endptr )
+Long VG_(strtoll10) ( const HChar* str, HChar** endptr )
 {
    Bool neg = False, converted = False;
    Long n = 0, digit = 0;
-   Char* str0 = str;
+   const HChar* str0 = str;
 
    // Skip leading whitespace.
    while (VG_(isspace)(*str)) str++;
@@ -85,16 +85,16 @@
 
    if (!converted) str = str0;   // If nothing converted, endptr points to
    if (neg) n = -n;              //   the start of the string.
-   if (endptr) *endptr = str;    // Record first failing character.
+   if (endptr) *endptr = (HChar *)str;    // Record first failing character.
    return n;
 }
 
-ULong VG_(strtoull10) ( Char* str, Char** endptr )
+ULong VG_(strtoull10) ( const HChar* str, HChar** endptr )
 {
    Bool converted = False;
    ULong n = 0;
    Long digit = 0;
-   Char* str0 = str;
+   const HChar* str0 = str;
 
    // Skip leading whitespace.
    while (VG_(isspace)(*str)) str++;
@@ -110,15 +110,15 @@
 
    if (!converted) str = str0;   // If nothing converted, endptr points to
    //   the start of the string.
-   if (endptr) *endptr = str;    // Record first failing character.
+   if (endptr) *endptr = (HChar *)str;    // Record first failing character.
    return n;
 }
 
-Long VG_(strtoll16) ( Char* str, Char** endptr )
+Long VG_(strtoll16) ( const HChar* str, HChar** endptr )
 {
    Bool neg = False, converted = False;
    Long n = 0, digit = 0;
-   Char* str0 = str;
+   const HChar* str0 = str;
 
    // Skip leading whitespace.
    while (VG_(isspace)(*str)) str++;
@@ -143,16 +143,16 @@
 
    if (!converted) str = str0;   // If nothing converted, endptr points to
    if (neg) n = -n;              //   the start of the string.
-   if (endptr) *endptr = str;    // Record first failing character.
+   if (endptr) *endptr = (HChar *)str;    // Record first failing character.
    return n;
 }
 
-ULong VG_(strtoull16) ( Char* str, Char** endptr )
+ULong VG_(strtoull16) ( const HChar* str, HChar** endptr )
 {
    Bool converted = False;
    ULong n = 0;
    Long digit = 0;
-   Char* str0 = str;
+   const HChar* str0 = str;
 
    // Skip leading whitespace.
    while (VG_(isspace)(*str)) str++;
@@ -176,11 +176,11 @@
 
    if (!converted) str = str0;   // If nothing converted, endptr points to
    //   the start of the string.
-   if (endptr) *endptr = str;    // Record first failing character.
+   if (endptr) *endptr = (HChar *)str;    // Record first failing character.
    return n;
 }
 
-double VG_(strtod) ( Char* str, Char** endptr )
+double VG_(strtod) ( const HChar* str, HChar** endptr )
 {
    Bool neg = False;
    Long digit;
@@ -209,11 +209,11 @@
 
    n += frac;
    if (neg) n = -n;
-   if (endptr) *endptr = str;    // Record first failing character.
+   if (endptr) *endptr = (HChar *)str;    // Record first failing character.
    return n;
 }
 
-Char VG_(tolower) ( Char c )
+HChar VG_(tolower) ( HChar c )
 {
    if ( c >= 'A'  &&  c <= 'Z' ) {
       return c - 'A' + 'a';
@@ -226,47 +226,47 @@
    String functions
    ------------------------------------------------------------------ */
 
-SizeT VG_(strlen) ( const Char* str )
+SizeT VG_(strlen) ( const HChar* str )
 {
    SizeT i = 0;
    while (str[i] != 0) i++;
    return i;
 }
 
-Char* VG_(strcat) ( Char* dest, const Char* src )
+HChar* VG_(strcat) ( HChar* dest, const HChar* src )
 {
-   Char* dest_orig = dest;
+   HChar* dest_orig = dest;
    while (*dest) dest++;
    while (*src) *dest++ = *src++;
    *dest = 0;
    return dest_orig;
 }
 
-Char* VG_(strncat) ( Char* dest, const Char* src, SizeT n )
+HChar* VG_(strncat) ( HChar* dest, const HChar* src, SizeT n )
 {
-   Char* dest_orig = dest;
+   HChar* dest_orig = dest;
    while (*dest) dest++;
    while (*src && n > 0) { *dest++ = *src++; n--; }
    *dest = 0;
    return dest_orig;
 }
 
-Char* VG_(strpbrk) ( const Char* s, const Char* accpt )
+HChar* VG_(strpbrk) ( const HChar* s, const HChar* accpt )
 {
-   const Char* a;
+   const HChar* a;
    while (*s) {
       a = accpt;
       while (*a)
          if (*a++ == *s)
-            return (Char *) s;
+           return (HChar *)s;
       s++;
    }
    return NULL;
 }
 
-Char* VG_(strcpy) ( Char* dest, const Char* src )
+HChar* VG_(strcpy) ( HChar* dest, const HChar* src )
 {
-   Char* dest_orig = dest;
+   HChar* dest_orig = dest;
    while (*src) *dest++ = *src++;
    *dest = 0;
    return dest_orig;
@@ -274,7 +274,7 @@
 
 /* Copy bytes, not overrunning the end of dest and always ensuring
    zero termination. */
-void VG_(strncpy_safely) ( Char* dest, const Char* src, SizeT ndest )
+void VG_(strncpy_safely) ( HChar* dest, const HChar* src, SizeT ndest )
 {
    SizeT i = 0;
    while (True) {
@@ -286,7 +286,7 @@
    }
 }
 
-Char* VG_(strncpy) ( Char* dest, const Char* src, SizeT ndest )
+HChar* VG_(strncpy) ( HChar* dest, const HChar* src, SizeT ndest )
 {
    SizeT i = 0;
    while (True) {
@@ -300,7 +300,7 @@
    }
 }
 
-Int VG_(strcmp) ( const Char* s1, const Char* s2 )
+Int VG_(strcmp) ( const HChar* s1, const HChar* s2 )
 {
    while (True) {
       if (*(UChar*)s1 < *(UChar*)s2) return -1;
@@ -313,7 +313,7 @@
    }
 }
 
-Int VG_(strcasecmp) ( const Char* s1, const Char* s2 )
+Int VG_(strcasecmp) ( const HChar* s1, const HChar* s2 )
 {
    while (True) {
       UChar c1 = (UChar)VG_(tolower)(*s1);
@@ -328,7 +328,7 @@
    }
 }
 
-Int VG_(strncmp) ( const Char* s1, const Char* s2, SizeT nmax )
+Int VG_(strncmp) ( const HChar* s1, const HChar* s2, SizeT nmax )
 {
    SizeT n = 0;
    while (True) {
@@ -343,7 +343,7 @@
    }
 }
 
-Int VG_(strncasecmp) ( const Char* s1, const Char* s2, SizeT nmax )
+Int VG_(strncasecmp) ( const HChar* s1, const HChar* s2, SizeT nmax )
 {
    Int n = 0;
    while (True) {
@@ -362,7 +362,7 @@
    }
 }
 
-Char* VG_(strstr) ( const Char* haystack, const Char* needle )
+HChar* VG_(strstr) ( const HChar* haystack, const HChar* needle )
 {
    SizeT n; 
    if (haystack == NULL)
@@ -372,12 +372,12 @@
       if (haystack[0] == 0) 
          return NULL;
       if (VG_(strncmp)(haystack, needle, n) == 0) 
-         return (Char*)haystack;
+         return (HChar*)haystack;
       haystack++;
    }
 }
 
-Char* VG_(strcasestr) ( const Char* haystack, const Char* needle )
+HChar* VG_(strcasestr) ( const HChar* haystack, const HChar* needle )
 {
    Int n; 
    if (haystack == NULL)
@@ -387,41 +387,41 @@
       if (haystack[0] == 0) 
          return NULL;
       if (VG_(strncasecmp)(haystack, needle, n) == 0) 
-         return (Char*)haystack;
+         return (HChar*)haystack;
       haystack++;
    }
 }
 
-Char* VG_(strchr) ( const Char* s, Char c )
+HChar* VG_(strchr) ( const HChar* s, HChar c )
 {
    while (True) {
-      if (*s == c) return (Char*)s;
+     if (*s == c) return (HChar *)s;
       if (*s == 0) return NULL;
       s++;
    }
 }
 
-Char* VG_(strrchr) ( const Char* s, Char c )
+HChar* VG_(strrchr) ( const HChar* s, HChar c )
 {
    Int n = VG_(strlen)(s);
    while (--n > 0) {
-      if (s[n] == c) return (Char*)s + n;
+     if (s[n] == c) return (HChar *)s + n;
    }
    return NULL;
 }
 
 /* (code copied from glib then updated to valgrind types) */
-static Char *olds;
-Char *
-VG_(strtok) (Char *s, const Char *delim)
+static HChar *olds;
+HChar *
+VG_(strtok) (HChar *s, const HChar *delim)
 {
    return VG_(strtok_r) (s, delim, &olds);
 }
 
-Char *
-VG_(strtok_r) (Char* s, const Char* delim, Char** saveptr)
+HChar *
+VG_(strtok_r) (HChar* s, const HChar* delim, HChar** saveptr)
 {
-   Char *token;
+   HChar *token;
 
    if (s == NULL)
       s = *saveptr;
@@ -449,14 +449,14 @@
    return token;
 }
 
-static Bool isHex ( UChar c )
+static Bool isHex ( HChar c )
 {
   return ((c >= '0' && c <= '9') ||
 	  (c >= 'a' && c <= 'f') ||
 	  (c >= 'A' && c <= 'F'));
 }
 
-static UInt fromHex ( UChar c )
+static UInt fromHex ( HChar c )
 {
    if (c >= '0' && c <= '9')
       return (UInt)c - (UInt)'0';
@@ -469,7 +469,7 @@
    return 0;
 }
 
-Bool VG_(parse_Addr) ( UChar** ppc, Addr* result )
+Bool VG_(parse_Addr) ( const HChar** ppc, Addr* result )
 {
    Int used, limit = 2 * sizeof(Addr);
    if (**ppc != '0')
@@ -492,9 +492,9 @@
    return True;
 }
 
-SizeT VG_(strspn) ( const Char* s, const Char* accpt )
+SizeT VG_(strspn) ( const HChar* s, const HChar* accpt )
 {
-   const Char *p, *a;
+   const HChar *p, *a;
    SizeT count = 0;
    for (p = s; *p != '\0'; ++p) {
       for (a = accpt; *a != '\0'; ++a)
@@ -508,7 +508,7 @@
    return count;
 }
 
-SizeT VG_(strcspn) ( const Char* s, const Char* reject )
+SizeT VG_(strcspn) ( const HChar* s, const HChar* reject )
 {
    SizeT count = 0;
    while (*s != '\0') {
@@ -583,7 +583,7 @@
 void* VG_(memset) ( void *destV, Int c, SizeT sz )
 {
    Int   c4;
-   Char* d = (Char*)destV;
+   HChar* d = (HChar*)destV;
    while ((!VG_IS_4_ALIGNED(d)) && sz >= 1) {
       d[0] = c;
       d++;
diff --git a/coregrind/m_libcfile.c b/coregrind/m_libcfile.c
index 4f76c83..a4f6d1b 100644
--- a/coregrind/m_libcfile.c
+++ b/coregrind/m_libcfile.c
@@ -104,7 +104,7 @@
 #  endif
 }
 
-SysRes VG_(mknod) ( const Char* pathname, Int mode, UWord dev )
+SysRes VG_(mknod) ( const HChar* pathname, Int mode, UWord dev )
 {  
 #  if defined(VGO_linux) || defined(VGO_darwin)
    SysRes res = VG_(do_syscall3)(__NR_mknod,
@@ -115,7 +115,7 @@
    return res;
 }
 
-SysRes VG_(open) ( const Char* pathname, Int flags, Int mode )
+SysRes VG_(open) ( const HChar* pathname, Int flags, Int mode )
 {  
 #  if defined(VGO_linux)
    SysRes res = VG_(do_syscall3)(__NR_open,
@@ -129,7 +129,7 @@
    return res;
 }
 
-Int VG_(fd_open) (const Char* pathname, Int flags, Int mode)
+Int VG_(fd_open) (const HChar* pathname, Int flags, Int mode)
 {
    SysRes sr;
    sr = VG_(open) (pathname, flags, mode);
@@ -270,7 +270,7 @@
       (_p_vgstat)->ctime_nsec = (ULong)( (_p_vkistat)->st_ctime_nsec ); \
    } while (0)
 
-SysRes VG_(stat) ( const Char* file_name, struct vg_stat* vgbuf )
+SysRes VG_(stat) ( const HChar* file_name, struct vg_stat* vgbuf )
 {
    SysRes res;
    VG_(memset)(vgbuf, 0, sizeof(*vgbuf));
@@ -377,13 +377,13 @@
    return sr_isError(res) ? -1 : sr_Res(res);
 }
 
-Int VG_(rename) ( const Char* old_name, const Char* new_name )
+Int VG_(rename) ( const HChar* old_name, const HChar* new_name )
 {
    SysRes res = VG_(do_syscall2)(__NR_rename, (UWord)old_name, (UWord)new_name);
    return sr_isError(res) ? (-1) : 0;
 }
 
-Int VG_(unlink) ( const Char* file_name )
+Int VG_(unlink) ( const HChar* file_name )
 {
    SysRes res = VG_(do_syscall1)(__NR_unlink, (UWord)file_name);
    return sr_isError(res) ? (-1) : 0;
@@ -426,8 +426,8 @@
       tell us the startup path.  Note the env var is keyed to the
       parent's PID, not ours, since our parent is the launcher
       process. */
-   { Char  envvar[100];
-     Char* wd = NULL;
+   { HChar  envvar[100];
+     HChar* wd = NULL;
      VG_(memset)(envvar, 0, sizeof(envvar));
      VG_(sprintf)(envvar, "VALGRIND_STARTUP_PWD_%d_XYZZY", 
                           (Int)VG_(getppid)());
@@ -446,7 +446,7 @@
 
 /* Copy the previously acquired startup_wd into buf[0 .. size-1],
    or return False if buf isn't big enough. */
-Bool VG_(get_startup_wd) ( Char* buf, SizeT size )
+Bool VG_(get_startup_wd) ( HChar* buf, SizeT size )
 {
    vg_assert(startup_wd_acquired);
    vg_assert(startup_wd[ sizeof(startup_wd)-1 ] == 0);
@@ -470,7 +470,7 @@
 }
 
 
-Int VG_(readlink) (const Char* path, Char* buf, UInt bufsiz)
+Int VG_(readlink) (const HChar* path, HChar* buf, UInt bufsiz)
 {
    SysRes res;
    /* res = readlink( path, buf, bufsiz ); */
@@ -705,7 +705,7 @@
    ------------------------------------------------------------------ */
 
 static
-Int parse_inet_addr_and_port ( UChar* str, UInt* ip_addr, UShort* port );
+Int parse_inet_addr_and_port ( const HChar* str, UInt* ip_addr, UShort* port );
 
 static
 Int my_connect ( Int sockfd, struct vki_sockaddr_in* serv_addr, Int addrlen );
@@ -763,7 +763,7 @@
      the relevant file (socket) descriptor, otherwise.
  is used.
 */
-Int VG_(connect_via_socket)( UChar* str )
+Int VG_(connect_via_socket)( const HChar* str )
 {
 #  if defined(VGO_linux) || defined(VGO_darwin)
    Int sd, res;
@@ -809,7 +809,7 @@
 /* Let d = one or more digits.  Accept either:
    d.d.d.d  or  d.d.d.d:d
 */
-static Int parse_inet_addr_and_port ( UChar* str, UInt* ip_addr, UShort* port )
+static Int parse_inet_addr_and_port ( const HChar* str, UInt* ip_addr, UShort* port )
 {
 #  define GET_CH ((*str) ? (*str++) : 0)
    UInt ipa, i, j, c, any;
@@ -1054,11 +1054,11 @@
 }
 
 
-Char *VG_(basename)(const Char *path)
+HChar *VG_(basename)(const HChar *path)
 {
-   static Char buf[VKI_PATH_MAX];
+   static HChar buf[VKI_PATH_MAX];
    
-   const Char *p, *end;
+   const HChar *p, *end;
 
    if (path == NULL  ||  
        0 == VG_(strcmp)(path, ""))
@@ -1090,11 +1090,11 @@
 }
 
 
-Char *VG_(dirname)(const Char *path)
+HChar *VG_(dirname)(const HChar *path)
 {
-   static Char buf[VKI_PATH_MAX];
+   static HChar buf[VKI_PATH_MAX];
     
-   const Char *p;
+   const HChar *p;
 
    if (path == NULL  ||  
        0 == VG_(strcmp)(path, "")  ||  
diff --git a/coregrind/m_libcproc.c b/coregrind/m_libcproc.c
index 7b8ea56..f6b0470 100644
--- a/coregrind/m_libcproc.c
+++ b/coregrind/m_libcproc.c
@@ -60,12 +60,12 @@
 
 /* As deduced from sp_at_startup, the client's argc, argv[] and
    envp[] as extracted from the client's stack at startup-time. */
-Char** VG_(client_envp) = NULL;
+HChar** VG_(client_envp) = NULL;
 
 /* Path to library directory */
-const Char *VG_(libdir) = VG_LIBDIR;
+const HChar *VG_(libdir) = VG_LIBDIR;
 
-const Char *VG_(LD_PRELOAD_var_name) =
+const HChar *VG_(LD_PRELOAD_var_name) =
 #if defined(VGO_linux)
    "LD_PRELOAD";
 #elif defined(VGO_darwin)
@@ -76,13 +76,13 @@
 
 /* We do getenv without libc's help by snooping around in
    VG_(client_envp) as determined at startup time. */
-Char *VG_(getenv)(Char *varname)
+HChar *VG_(getenv)(const HChar *varname)
 {
    Int i, n;
    vg_assert( VG_(client_envp) );
    n = VG_(strlen)(varname);
    for (i = 0; VG_(client_envp)[i] != NULL; i++) {
-      Char* s = VG_(client_envp)[i];
+      HChar* s = VG_(client_envp)[i];
       if (VG_(strncmp)(varname, s, n) == 0 && s[n] == '=') {
          return & s[n+1];
       }
@@ -90,9 +90,9 @@
    return NULL;
 }
 
-void  VG_(env_unsetenv) ( Char **env, const Char *varname )
+void  VG_(env_unsetenv) ( HChar **env, const HChar *varname )
 {
-   Char **from, **to;
+   HChar **from, **to;
    vg_assert(env);
    vg_assert(varname);
    to = NULL;
@@ -108,14 +108,15 @@
 }
 
 /* set the environment; returns the old env if a new one was allocated */
-Char **VG_(env_setenv) ( Char ***envp, const Char* varname, const Char *val )
+HChar **VG_(env_setenv) ( HChar ***envp, const HChar* varname,
+                          const HChar *val )
 {
-   Char **env = (*envp);
-   Char **cpp;
+   HChar **env = (*envp);
+   HChar **cpp;
    Int len = VG_(strlen)(varname);
-   Char *valstr = VG_(arena_malloc)(VG_AR_CORE, "libcproc.es.1",
-                                    len + VG_(strlen)(val) + 2);
-   Char **oldenv = NULL;
+   HChar *valstr = VG_(arena_malloc)(VG_AR_CORE, "libcproc.es.1",
+                                     len + VG_(strlen)(val) + 2);
+   HChar **oldenv = NULL;
 
    VG_(sprintf)(valstr, "%s=%s", varname, val);
 
@@ -127,7 +128,7 @@
    }
 
    if (env == NULL) {
-      env = VG_(arena_malloc)(VG_AR_CORE, "libcproc.es.2", sizeof(Char **) * 2);
+      env = VG_(arena_malloc)(VG_AR_CORE, "libcproc.es.2", sizeof(HChar *) * 2);
       env[0] = valstr;
       env[1] = NULL;
 
@@ -135,8 +136,8 @@
 
    }  else {
       Int envlen = (cpp-env) + 2;
-      Char **newenv = VG_(arena_malloc)(VG_AR_CORE, "libcproc.es.3",
-                                        envlen * sizeof(Char **));
+      HChar **newenv = VG_(arena_malloc)(VG_AR_CORE, "libcproc.es.3",
+                                         envlen * sizeof(HChar *));
 
       for (cpp = newenv; *env; )
 	 *cpp++ = *env++;
@@ -162,18 +163,18 @@
    This is also careful to mop up any excess ':'s, since empty strings
    delimited by ':' are considered to be '.' in a path.
 */
-static void mash_colon_env(Char *varp, const Char *remove_pattern)
+static void mash_colon_env(HChar *varp, const HChar *remove_pattern)
 {
-   Char *const start = varp;
-   Char *entry_start = varp;
-   Char *output = varp;
+   HChar *const start = varp;
+   HChar *entry_start = varp;
+   HChar *output = varp;
 
    if (varp == NULL)
       return;
 
    while(*varp) {
       if (*varp == ':') {
-	 Char prev;
+	 HChar prev;
 	 Bool match;
 
 	 /* This is a bit subtle: we want to match against the entry
@@ -219,7 +220,7 @@
 
 // Removes all the Valgrind-added stuff from the passed environment.  Used
 // when starting child processes, so they don't see that added stuff.
-void VG_(env_remove_valgrind_env_stuff)(Char** envp)
+void VG_(env_remove_valgrind_env_stuff)(HChar** envp)
 {
 
 #if defined(VGO_darwin)
@@ -230,10 +231,10 @@
 #endif
 
    Int i;
-   Char* ld_preload_str = NULL;
-   Char* ld_library_path_str = NULL;
-   Char* dyld_insert_libraries_str = NULL;
-   Char* buf;
+   HChar* ld_preload_str = NULL;
+   HChar* ld_library_path_str = NULL;
+   HChar* dyld_insert_libraries_str = NULL;
+   HChar* buf;
 
    // Find LD_* variables
    // DDD: should probably conditionally compiled some of this:
@@ -296,11 +297,11 @@
 }
 
 /* clone the environment */
-Char **VG_(env_clone) ( Char **oldenv )
+HChar **VG_(env_clone) ( HChar **oldenv )
 {
-   Char **oldenvp;
-   Char **newenvp;
-   Char **newenv;
+   HChar **oldenvp;
+   HChar **newenvp;
+   HChar **newenv;
    Int  envlen;
 
    vg_assert(oldenv);
@@ -309,7 +310,7 @@
    envlen = oldenvp - oldenv + 1;
    
    newenv = VG_(arena_malloc)(VG_AR_CORE, "libcproc.ec.1",
-                              envlen * sizeof(Char **));
+                              envlen * sizeof(HChar *));
 
    oldenvp = oldenv;
    newenvp = newenv;
@@ -323,9 +324,9 @@
    return newenv;
 }
 
-void VG_(execv) ( Char* filename, Char** argv )
+void VG_(execv) ( const HChar* filename, HChar** argv )
 {
-   Char** envp;
+   HChar** envp;
    SysRes res;
 
    /* restore the DATA rlimit for the child */
@@ -342,7 +343,7 @@
 
 /* Return -1 if error, else 0.  NOTE does not indicate return code of
    child! */
-Int VG_(system) ( Char* cmd )
+Int VG_(system) ( const HChar* cmd )
 {
    Int pid;
    if (cmd == NULL)
@@ -352,7 +353,7 @@
       return -1;
    if (pid == 0) {
       /* child */
-      Char* argv[4] = { "/bin/sh", "-c", cmd, 0 };
+      const HChar* argv[4] = { "/bin/sh", "-c", cmd, 0 };
       VG_(execv)(argv[0], argv);
 
       /* If we're still alive here, execve failed. */
@@ -442,7 +443,7 @@
    SysRes res = VG_(do_syscall0)(__NR_gettid);
 
    if (sr_isError(res) && sr_Res(res) == VKI_ENOSYS) {
-      Char pid[16];      
+      HChar pid[16];      
       /*
        * The gettid system call does not exist. The obvious assumption
        * to make at this point would be that we are running on an older
@@ -460,7 +461,7 @@
       res = VG_(do_syscall3)(__NR_readlink, (UWord)"/proc/self",
                              (UWord)pid, sizeof(pid));
       if (!sr_isError(res) && sr_Res(res) > 0) {
-         Char* s;
+         HChar* s;
          pid[sr_Res(res)] = '\0';
          res = VG_(mk_SysRes_Success)(  VG_(strtoll10)(pid, &s) );
          if (*s != '\0') {
diff --git a/coregrind/m_machine.c b/coregrind/m_machine.c
index 9b4dabc..de5561b 100644
--- a/coregrind/m_machine.c
+++ b/coregrind/m_machine.c
@@ -756,7 +756,7 @@
    { Bool have_sse3, have_cx8, have_cx16;
      Bool have_lzcnt, have_avx /*, have_fma*/;
      UInt eax, ebx, ecx, edx, max_extended;
-     UChar vstr[13];
+     HChar vstr[13];
      vstr[0] = 0;
 
      if (!VG_(has_cpuid)())
diff --git a/coregrind/m_main.c b/coregrind/m_main.c
index 6658a70..31e0457 100644
--- a/coregrind/m_main.c
+++ b/coregrind/m_main.c
@@ -269,8 +269,8 @@
 "\n";
 
    const HChar* gdb_path = GDB_PATH;
-   Char default_alignment[30];
-   Char default_redzone_size[30];
+   HChar default_alignment[30];
+   HChar default_redzone_size[30];
 
    // Ensure the message goes to stdout
    VG_(log_output_sink).fd = 1;
@@ -333,7 +333,7 @@
    have handled here.
 */
 static void early_process_cmd_line_options ( /*OUT*/Int* need_help,
-                                             /*OUT*/HChar** tool )
+                                             /*OUT*/const HChar** tool )
 {
    UInt   i;
    HChar* str;
@@ -400,7 +400,7 @@
 */
 static
 void main_process_cmd_line_options ( /*OUT*/Bool* logging_to_fd,
-                                     /*OUT*/Char** xml_fname_unexpanded,
+                                     /*OUT*/HChar** xml_fname_unexpanded,
                                      const HChar* toolname )
 {
    // VG_(clo_log_fd) is used by all the messaging.  It starts as 2 (stderr)
@@ -409,7 +409,7 @@
    SysRes sres;
    Int    i, tmp_log_fd, tmp_xml_fd;
    Int    toolname_len = VG_(strlen)(toolname);
-   Char*  tmp_str;         // Used in a couple of places.
+   const HChar* tmp_str;         // Used in a couple of places.
    enum {
       VgLogTo_Fd,
       VgLogTo_File,
@@ -420,8 +420,8 @@
    /* Temporarily holds the string STR specified with
       --{log,xml}-{name,socket}=STR.  'fs' stands for
       file-or-socket. */
-   Char* log_fsname_unexpanded = NULL;
-   Char* xml_fsname_unexpanded = NULL;
+   const HChar* log_fsname_unexpanded = NULL;
+   const HChar* xml_fsname_unexpanded = NULL;
 
    /* Log to stderr by default, but usage message goes to stdout.  XML
       output is initially disabled. */
@@ -690,7 +690,7 @@
             and the fnpatt just by looking for the second occurrence
             of C, without hardwiring any assumption about what C
             is. */
-         Char patt[7];
+         HChar patt[7];
          Bool ok = True;
          ok = tmp_str && VG_(strlen)(tmp_str) > 0;
          if (ok) {
@@ -898,7 +898,7 @@
          break;
 
       case VgLogTo_File: {
-         Char* logfilename;
+         HChar* logfilename;
 
          vg_assert(log_fsname_unexpanded != NULL);
          vg_assert(VG_(strlen)(log_fsname_unexpanded) <= 900); /* paranoia */
@@ -957,7 +957,7 @@
          break;
 
       case VgLogTo_File: {
-         Char* xmlfilename;
+         HChar* xmlfilename;
 
          vg_assert(xml_fsname_unexpanded != NULL);
          vg_assert(VG_(strlen)(xml_fsname_unexpanded) <= 900); /* paranoia */
@@ -1075,7 +1075,7 @@
          the default one. */
       static const HChar default_supp[] = "default.supp";
       Int len = VG_(strlen)(VG_(libdir)) + 1 + sizeof(default_supp);
-      Char *buf = VG_(arena_malloc)(VG_AR_CORE, "main.mpclo.3", len);
+      HChar *buf = VG_(arena_malloc)(VG_AR_CORE, "main.mpclo.3", len);
       VG_(sprintf)(buf, "%s/%s", VG_(libdir), default_supp);
       VG_(clo_suppressions)[VG_(clo_n_suppressions)] = buf;
       VG_(clo_n_suppressions)++;
@@ -1085,7 +1085,7 @@
 }
 
 // Write the name and value of log file qualifiers to the xml file.
-static void print_file_vars(Char* format)
+static void print_file_vars(HChar* format)
 {
    Int i = 0;
    
@@ -1097,8 +1097,8 @@
             i++;
             if ('{' == format[i]) {
 	       // Get the env var name, print its contents.
-	       Char* qualname;
-               Char* qual;
+	       HChar* qualname;
+               HChar* qual;
                i++;
                qualname = &format[i];
                while (True) {
@@ -1133,7 +1133,7 @@
 /*====================================================================*/
 
 // Print the argument, escaping any chars that require it.
-static void umsg_arg(const Char* arg)
+static void umsg_arg(const HChar* arg)
 {
    SizeT len = VG_(strlen)(arg);
    const HChar* special = " \\<>";
@@ -1147,7 +1147,7 @@
 }
 
 // Send output to the XML-stream and escape any XML meta-characters.
-static void xml_arg(const Char* arg)
+static void xml_arg(const HChar* arg)
 {
    VG_(printf_xml)("%pS", arg);
 }
@@ -1157,7 +1157,7 @@
    command line args, to help people trying to interpret the
    results of a run which encompasses multiple processes. */
 static void print_preamble ( Bool logging_to_fd, 
-                             Char* xml_fname_unexpanded,
+                             HChar* xml_fname_unexpanded,
                              const HChar* toolname )
 {
    Int    i;
@@ -1166,7 +1166,7 @@
    UInt (*umsg_or_xml)( const HChar*, ... )
       = VG_(clo_xml) ? VG_(printf_xml) : VG_(umsg);
 
-   void (*umsg_or_xml_arg)( const Char* )
+   void (*umsg_or_xml_arg)( const HChar* )
       = VG_(clo_xml) ? xml_arg : umsg_arg;
 
    vg_assert( VG_(args_for_client) );
@@ -1319,7 +1319,7 @@
          VG_(message)(Vg_DebugMsg, "  can't open /proc/version\n");
       } else {
 #        define BUF_LEN    256
-         Char version_buf[BUF_LEN];
+         HChar version_buf[BUF_LEN];
          Int n = VG_(read) ( sr_Res(fd), version_buf, BUF_LEN );
          vg_assert(n <= BUF_LEN);
          if (n > 0) {
@@ -1416,7 +1416,7 @@
 {
    ULong score_cumul,   score_here;
    HChar buf_cumul[10], buf_here[10];
-   Char  name[64];
+   HChar name[64];
    Int   r;
 
    VG_(printf)("\n");
@@ -1541,11 +1541,11 @@
 static
 Int valgrind_main ( Int argc, HChar **argv, HChar **envp )
 {
-   HChar*  toolname           = "memcheck";    // default to Memcheck
+   const HChar* toolname      = "memcheck";    // default to Memcheck
    Int     need_help          = 0; // 0 = no, 1 = --help, 2 = --help-debug
    ThreadId tid_main          = VG_INVALID_THREADID;
    Bool    logging_to_fd      = False;
-   Char* xml_fname_unexpanded = NULL;
+   HChar* xml_fname_unexpanded = NULL;
    Int     loglevel, i;
    struct vki_rlimit zero = { 0, 0 };
    XArray* addr2dihandle = NULL;
@@ -1575,7 +1575,7 @@
    //============================================================
    
    /* This is needed to make VG_(getenv) usable early. */
-   VG_(client_envp) = (Char**)envp;
+   VG_(client_envp) = (HChar**)envp;
 
    //--------------------------------------------------------------
    // Start up Mach kernel interface, if any
@@ -1769,7 +1769,7 @@
         VG_(err_config_error)( "Can't establish current working "
                                "directory at startup\n");
    }
-   { Char buf[VKI_PATH_MAX+1];
+   { HChar buf[VKI_PATH_MAX+1];
      Bool ok = VG_(get_startup_wd)( buf, sizeof(buf) );
      vg_assert(ok);
      buf[VKI_PATH_MAX] = 0;
diff --git a/coregrind/m_mallocfree.c b/coregrind/m_mallocfree.c
index 3ecb463..2ed53b6 100644
--- a/coregrind/m_mallocfree.c
+++ b/coregrind/m_mallocfree.c
@@ -2212,12 +2212,12 @@
 
 
 /* Inline just for the wrapper VG_(strdup) below */
-__inline__ Char* VG_(arena_strdup) ( ArenaId aid, const HChar* cc, 
-                                     const Char* s )
+__inline__ HChar* VG_(arena_strdup) ( ArenaId aid, const HChar* cc, 
+                                      const HChar* s )
 {
    Int   i;
    Int   len;
-   Char* res;
+   HChar* res;
 
    if (s == NULL)
       return NULL;
@@ -2257,7 +2257,7 @@
    return VG_(arena_realloc) ( VG_AR_TOOL, cc, ptr, size );
 }
 
-Char* VG_(strdup) ( const HChar* cc, const Char* s )
+HChar* VG_(strdup) ( const HChar* cc, const HChar* s )
 {
    return VG_(arena_strdup) ( VG_AR_TOOL, cc, s ); 
 }
diff --git a/coregrind/m_options.c b/coregrind/m_options.c
index 2a3ea3d..5d419d1 100644
--- a/coregrind/m_options.c
+++ b/coregrind/m_options.c
@@ -54,31 +54,31 @@
 #endif
 Int    VG_(clo_vgdb_poll)      = 5000; 
 Int    VG_(clo_vgdb_error)     = 999999999;
-HChar* VG_(clo_vgdb_prefix)    = NULL;
+const HChar* VG_(clo_vgdb_prefix)    = NULL;
 Bool   VG_(clo_vgdb_shadow_registers) = False;
 
 Bool   VG_(clo_db_attach)      = False;
-Char*  VG_(clo_db_command)     = GDB_PATH " -nw %f %p";
+const HChar*  VG_(clo_db_command)     = GDB_PATH " -nw %f %p";
 Int    VG_(clo_gen_suppressions) = 0;
 Int    VG_(clo_sanity_level)   = 1;
 Int    VG_(clo_verbosity)      = 1;
 Bool   VG_(clo_stats)          = False;
 Bool   VG_(clo_xml)            = False;
-HChar* VG_(clo_xml_user_comment) = NULL;
+const HChar* VG_(clo_xml_user_comment) = NULL;
 Bool   VG_(clo_demangle)       = True;
-HChar* VG_(clo_soname_synonyms)    = NULL;
+const HChar* VG_(clo_soname_synonyms)    = NULL;
 Bool   VG_(clo_trace_children) = False;
-HChar* VG_(clo_trace_children_skip) = NULL;
-HChar* VG_(clo_trace_children_skip_by_arg) = NULL;
+const HChar* VG_(clo_trace_children_skip) = NULL;
+const HChar* VG_(clo_trace_children_skip_by_arg) = NULL;
 Bool   VG_(clo_child_silent_after_fork) = False;
-Char*  VG_(clo_log_fname_expanded) = NULL;
-Char*  VG_(clo_xml_fname_expanded) = NULL;
+HChar* VG_(clo_log_fname_expanded) = NULL;
+HChar* VG_(clo_xml_fname_expanded) = NULL;
 Bool   VG_(clo_time_stamp)     = False;
 Int    VG_(clo_input_fd)       = 0; /* stdin */
 Int    VG_(clo_n_suppressions) = 0;
-Char*  VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
+const HChar* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
 Int    VG_(clo_n_fullpath_after) = 0;
-Char*  VG_(clo_fullpath_after)[VG_CLO_MAX_FULLPATH_AFTER];
+const HChar* VG_(clo_fullpath_after)[VG_CLO_MAX_FULLPATH_AFTER];
 UChar  VG_(clo_trace_flags)    = 0; // 00000000b
 UChar  VG_(clo_profile_flags)  = 0; // 00000000b
 Int    VG_(clo_trace_notbelow) = -1;  // unspecified
@@ -86,7 +86,7 @@
 Bool   VG_(clo_trace_syscalls) = False;
 Bool   VG_(clo_trace_signals)  = False;
 Bool   VG_(clo_trace_symtab)   = False;
-HChar* VG_(clo_trace_symtab_patt) = "*";
+const HChar* VG_(clo_trace_symtab_patt) = "*";
 Bool   VG_(clo_trace_cfi)      = False;
 Bool   VG_(clo_debug_dump_syms) = False;
 Bool   VG_(clo_debug_dump_line) = False;
@@ -102,11 +102,11 @@
 Int    VG_(clo_redzone_size)   = -1;
 Int    VG_(clo_dump_error)     = 0;
 Int    VG_(clo_backtrace_size) = 12;
-Char*  VG_(clo_sim_hints)      = NULL;
+const HChar* VG_(clo_sim_hints)      = NULL;
 Bool   VG_(clo_sym_offsets)    = False;
 Bool   VG_(clo_read_var_info)  = False;
 Int    VG_(clo_n_req_tsyms)    = 0;
-HChar* VG_(clo_req_tsyms)[VG_CLO_MAX_REQ_TSYMS];
+const HChar* VG_(clo_req_tsyms)[VG_CLO_MAX_REQ_TSYMS];
 HChar* VG_(clo_require_text_symbol) = NULL;
 Bool   VG_(clo_run_libc_freeres) = True;
 Bool   VG_(clo_track_fds)      = False;
@@ -116,7 +116,7 @@
 Word   VG_(clo_main_stacksize) = 0; /* use client's rlimit.stack */
 Bool   VG_(clo_wait_for_gdb)   = False;
 VgSmc  VG_(clo_smc_check)      = Vg_SmcStack;
-HChar* VG_(clo_kernel_variant) = NULL;
+const HChar* VG_(clo_kernel_variant) = NULL;
 Bool   VG_(clo_dsymutil)       = False;
 
 
@@ -126,11 +126,11 @@
 
 // Copies the string, prepending it with the startup working directory, and
 // expanding %p and %q entries.  Returns a new, malloc'd string.
-Char* VG_(expand_file_name)(Char* option_name, Char* format)
+HChar* VG_(expand_file_name)(const HChar* option_name, const HChar* format)
 {
-   static Char base_dir[VKI_PATH_MAX];
+   static HChar base_dir[VKI_PATH_MAX];
    Int len, i = 0, j = 0;
-   Char* out;
+   HChar* out;
 
    Bool ok = VG_(get_startup_wd)(base_dir, VKI_PATH_MAX);
    tl_assert(ok);
@@ -200,8 +200,8 @@
             i++;
             if ('{' == format[i]) {
                // Get the env var name, print its contents.
-               Char* qualname;
-               Char* qual;
+               const HChar* qualname;
+               HChar* qual;
                i++;
                qualname = &format[i];
                while (True) {
@@ -213,15 +213,19 @@
                      // name.
                      // FIXME: this is not safe as FORMAT is sometimes a
                      // string literal which may reside in read-only memory
-                     format[i] = 0;
+                    ((HChar *)format)[i] = 0;
                      qual = VG_(getenv)(qualname);
                      if (NULL == qual) {
                         VG_(fmsg)("%s: environment variable %s is not set\n",
                                   option_name, qualname);
-                        format[i] = '}';  // Put the '}' back.
+                     // FIXME: this is not safe as FORMAT is sometimes a
+                     // string literal which may reside in read-only memory
+                        ((HChar *)format)[i] = '}';  // Put the '}' back.
                         goto bad;
                      }
-                     format[i] = '}';     // Put the '}' back.
+                     // FIXME: this is not safe as FORMAT is sometimes a
+                     // string literal which may reside in read-only memory
+                     ((HChar *)format)[i] = '}';     // Put the '}' back.
                      i++;
                      break;
                   }
@@ -248,7 +252,7 @@
    return out;
 
   bad: {
-   Char* opt =    // 2:  1 for the '=', 1 for the NUL.
+   HChar* opt =    // 2:  1 for the '=', 1 for the NUL.
       VG_(malloc)( "options.efn.3",
                    VG_(strlen)(option_name) + VG_(strlen)(format) + 2 );
    VG_(strcpy)(opt, option_name);
@@ -300,7 +304,7 @@
    // by --trace-children-skip=.
    if (VG_(clo_trace_children_skip)) {
       HChar const* last = VG_(clo_trace_children_skip);
-      HChar const* name = (HChar const*)child_exe_name;
+      HChar const* name = child_exe_name;
       while (*last) {
          Bool   matches;
          HChar* patt;
diff --git a/coregrind/m_oset.c b/coregrind/m_oset.c
index 8e45700..458a143 100644
--- a/coregrind/m_oset.c
+++ b/coregrind/m_oset.c
@@ -935,7 +935,7 @@
 }
 
 static void OSet_Print2( AvlTree* t, AvlNode* n,
-                         Char*(*strElem)(void *), Int p )
+                         HChar*(*strElem)(void *), Int p )
 {
    // This is a recursive in-order traversal.
    Int q = p;
@@ -947,7 +947,8 @@
 }
 
 __attribute__((unused))
-static void OSet_Print( AvlTree* t, const HChar *where, Char*(*strElem)(void *) )
+static void OSet_Print( AvlTree* t, const HChar *where,
+                        HChar*(*strElem)(void *) )
 {
    VG_(printf)("-- start %s ----------------\n", where);
    OSet_Print2(t, t->root, strElem, 0);
diff --git a/coregrind/m_redir.c b/coregrind/m_redir.c
index 1df8d96..dde527c 100644
--- a/coregrind/m_redir.c
+++ b/coregrind/m_redir.c
@@ -310,7 +310,7 @@
 static void   show_redir_state ( const HChar* who );
 static void   show_active ( const HChar* left, Active* act );
 
-static void   handle_maybe_load_notifier( const UChar* soname, 
+static void   handle_maybe_load_notifier( const HChar* soname, 
                                                 HChar* symbol, Addr addr );
 
 static void   handle_require_text_symbols ( DebugInfo* );
@@ -334,8 +334,8 @@
    NULL terminated array, for easy iteration.  Caller must pass also
    the address of a 2-entry array which can be used in the common case
    to avoid dynamic allocation. */
-static UChar** alloc_symname_array ( UChar* pri_name, UChar** sec_names,
-                                     UChar** twoslots )
+static HChar** alloc_symname_array ( HChar* pri_name, HChar** sec_names,
+                                     HChar** twoslots )
 {
    /* Special-case the common case: only one name.  We expect the
       caller to supply a stack-allocated 2-entry array for this. */
@@ -346,10 +346,10 @@
    }
    /* Else must use dynamic allocation.  Figure out size .. */
    Word    n_req = 1;
-   UChar** pp    = sec_names;
+   HChar** pp    = sec_names;
    while (*pp) { n_req++; pp++; }
    /* .. allocate and copy in. */
-   UChar** arr = dinfo_zalloc( "redir.asa.1", (n_req+1) * sizeof(UChar*) );
+   HChar** arr = dinfo_zalloc( "redir.asa.1", (n_req+1) * sizeof(HChar*) );
    Word    i   = 0;
    arr[i++] = pri_name;
    pp = sec_names;
@@ -361,7 +361,7 @@
 
 
 /* Free the array allocated by alloc_symname_array, if any. */
-static void free_symname_array ( UChar** names, UChar** twoslots )
+static void free_symname_array ( HChar** names, HChar** twoslots )
 {
    if (names != twoslots)
       dinfo_free(names);
@@ -395,14 +395,14 @@
    Spec*        spec;
    TopSpec*     ts;
    TopSpec*     newts;
-   UChar*       sym_name_pri;
-   UChar**      sym_names_sec;
+   HChar*       sym_name_pri;
+   HChar**      sym_names_sec;
    Addr         sym_addr, sym_toc;
    HChar        demangled_sopatt[N_DEMANGLED];
    HChar        demangled_fnpatt[N_DEMANGLED];
    Bool         check_ppcTOCs = False;
    Bool         isText;
-   const UChar* newdi_soname;
+   const HChar* newdi_soname;
 
 #  if defined(VG_PLAT_USES_PPCTOC)
    check_ppcTOCs = True;
@@ -437,8 +437,8 @@
          is a kludge. An alternate solution would be to change
          the _vgr prefix according to outer/inner/client.
       */
-      const UChar* newdi_filename = VG_(DebugInfo_get_filename)(newdi);
-      const UChar* newdi_basename = VG_(basename) (newdi_filename);
+      const HChar* newdi_filename = VG_(DebugInfo_get_filename)(newdi);
+      const HChar* newdi_basename = VG_(basename) (newdi_filename);
       if (VG_(strncmp) (newdi_basename, "vgpreload_", 10) == 0) {
          /* This looks like a vgpreload file => check if this file
             is from the inner VALGRIND_LIB.
@@ -503,10 +503,10 @@
                                   NULL, &sym_name_pri, &sym_names_sec,
                                   &isText, NULL );
       /* Set up to conveniently iterate over all names for this symbol. */
-      UChar*  twoslots[2];
-      UChar** names_init = alloc_symname_array(sym_name_pri, sym_names_sec,
+      HChar*  twoslots[2];
+      HChar** names_init = alloc_symname_array(sym_name_pri, sym_names_sec,
                                                &twoslots[0]);
-      UChar** names;
+      HChar** names;
       for (names = names_init; *names; names++) {
          ok = VG_(maybe_Z_demangle)( *names,
                                      demangled_sopatt, N_DEMANGLED,
@@ -595,10 +595,10 @@
          VG_(DebugInfo_syms_getidx)( newdi, i, &sym_addr, &sym_toc,
                                      NULL, &sym_name_pri, &sym_names_sec,
                                      &isText, NULL );
-         UChar*  twoslots[2];
-         UChar** names_init = alloc_symname_array(sym_name_pri, sym_names_sec,
+         HChar*  twoslots[2];
+         HChar** names_init = alloc_symname_array(sym_name_pri, sym_names_sec,
                                                   &twoslots[0]);
-         UChar** names;
+         HChar** names;
          for (names = names_init; *names; names++) {
             ok = isText
                  && VG_(maybe_Z_demangle)( 
@@ -733,8 +733,8 @@
    Active  act;
    Int     nsyms, i;
    Addr    sym_addr;
-   UChar*  sym_name_pri;
-   UChar** sym_names_sec;
+   HChar*  sym_name_pri;
+   HChar** sym_names_sec;
 
    /* First figure out which of the specs match the seginfo's soname.
       Also clear the 'done' bits, so that after the main loop below
@@ -758,10 +758,10 @@
       VG_(DebugInfo_syms_getidx)( di, i, &sym_addr, NULL,
                                   NULL, &sym_name_pri, &sym_names_sec,
                                   &isText, &isIFunc );
-      UChar*  twoslots[2];
-      UChar** names_init = alloc_symname_array(sym_name_pri, sym_names_sec,
+      HChar*  twoslots[2];
+      HChar** names_init = alloc_symname_array(sym_name_pri, sym_names_sec,
                                                &twoslots[0]);
-      UChar** names;
+      HChar** names;
       for (names = names_init; *names; names++) {
 
          /* ignore data symbols */
@@ -1417,7 +1417,7 @@
 /*------------------------------------------------------------*/
 
 static 
-void handle_maybe_load_notifier( const UChar* soname, 
+void handle_maybe_load_notifier( const HChar* soname, 
                                        HChar* symbol, Addr addr )
 {
 #  if defined(VGP_x86_linux)
@@ -1478,10 +1478,10 @@
    vg_assert(VG_(clo_n_req_tsyms) >= 0);
    vg_assert(VG_(clo_n_req_tsyms) <= VG_CLO_MAX_REQ_TSYMS);
    for (i = 0; i < VG_(clo_n_req_tsyms); i++) {
-      HChar* spec = VG_(clo_req_tsyms)[i];
-      vg_assert(spec && VG_(strlen)(spec) >= 4);
+      const HChar* clo_spec = VG_(clo_req_tsyms)[i];
+      vg_assert(clo_spec && VG_(strlen)(clo_spec) >= 4);
       // clone the spec, so we can stick a zero at the end of the sopatt
-      spec = VG_(strdup)("m_redir.hrts.1", spec);
+      HChar *spec = VG_(strdup)("m_redir.hrts.1", clo_spec);
       HChar sep = spec[0];
       HChar* sopatt = &spec[1];
       HChar* fnpatt = VG_(strchr)(sopatt, sep);
@@ -1518,15 +1518,15 @@
       Int    nsyms  = VG_(DebugInfo_syms_howmany)(di);
       for (j = 0; j < nsyms; j++) {
          Bool    isText        = False;
-         UChar*  sym_name_pri  = NULL;
-         UChar** sym_names_sec = NULL;
+         HChar*  sym_name_pri  = NULL;
+         HChar** sym_names_sec = NULL;
          VG_(DebugInfo_syms_getidx)( di, j, NULL, NULL,
                                      NULL, &sym_name_pri, &sym_names_sec,
                                      &isText, NULL );
-         UChar*  twoslots[2];
-         UChar** names_init = alloc_symname_array(sym_name_pri, sym_names_sec,
+         HChar*  twoslots[2];
+         HChar** names_init = alloc_symname_array(sym_name_pri, sym_names_sec,
                                                   &twoslots[0]);
-         UChar** names;
+         HChar** names;
          for (names = names_init; *names; names++) {
             /* ignore data symbols */
             if (0) VG_(printf)("QQQ %s\n", *names);
diff --git a/coregrind/m_replacemalloc/replacemalloc_core.c b/coregrind/m_replacemalloc/replacemalloc_core.c
index 98de3e5..773caef 100644
--- a/coregrind/m_replacemalloc/replacemalloc_core.c
+++ b/coregrind/m_replacemalloc/replacemalloc_core.c
@@ -51,7 +51,7 @@
 UInt VG_(clo_alignment)     = VG_MIN_MALLOC_SZB;
 
 
-Bool VG_(replacement_malloc_process_cmd_line_option)(Char* arg)
+Bool VG_(replacement_malloc_process_cmd_line_option)(const HChar* arg)
 {
    if VG_INT_CLO(arg, "--alignment", VG_(clo_alignment)) {
       if (VG_(clo_alignment) < VG_MIN_MALLOC_SZB ||
diff --git a/coregrind/m_seqmatch.c b/coregrind/m_seqmatch.c
index 35f0f62..d9afe4b 100644
--- a/coregrind/m_seqmatch.c
+++ b/coregrind/m_seqmatch.c
@@ -78,8 +78,8 @@
    /* No specific need to set NULL when !have{Patt,Input}, but guards
       against inadvertantly dereferencing an out of range pointer to
       the pattern or input arrays. */
-   currPatt  = havePatt  ? ((Char*)patt) + szbPatt * ixPatt    : NULL;
-   currInput = haveInput ? ((Char*)input) + szbInput * ixInput : NULL;
+   currPatt  = havePatt  ? ((HChar*)patt) + szbPatt * ixPatt    : NULL;
+   currInput = haveInput ? ((HChar*)input) + szbInput * ixInput : NULL;
 
    // Deal with the complex case first: wildcards.  Do frugal
    // matching.  When encountering a '*', first skip no characters
@@ -163,21 +163,21 @@
 /* And a parameterization of the above, to make it do
    string matching.
 */
-static Bool charIsStar  ( void* pV ) { return *(Char*)pV == '*'; }
-static Bool charIsQuery ( void* pV ) { return *(Char*)pV == '?'; }
+static Bool charIsStar  ( void* pV ) { return *(HChar*)pV == '*'; }
+static Bool charIsQuery ( void* pV ) { return *(HChar*)pV == '?'; }
 static Bool char_p_EQ_i ( void* pV, void* cV,
                           void* null_completer, UWord ixcV ) {
-   Char p = *(Char*)pV;
-   Char c = *(Char*)cV;
+   HChar p = *(HChar*)pV;
+   HChar c = *(HChar*)cV;
    vg_assert(p != '*' && p != '?');
    return p == c;
 }
-Bool VG_(string_match) ( const Char* patt, const Char* input )
+Bool VG_(string_match) ( const HChar* patt, const HChar* input )
 {
    return VG_(generic_match)(
              True/* match-all */,
-             (void*)patt,  sizeof(UChar), VG_(strlen)(patt), 0,
-             (void*)input, sizeof(UChar), VG_(strlen)(input), 0,
+             (void*)patt,  sizeof(HChar), VG_(strlen)(patt), 0,
+             (void*)input, sizeof(HChar), VG_(strlen)(input), 0,
              charIsStar, charIsQuery, char_p_EQ_i,
              NULL
           );
diff --git a/coregrind/m_stacktrace.c b/coregrind/m_stacktrace.c
index 15a360a..c64cb1a 100644
--- a/coregrind/m_stacktrace.c
+++ b/coregrind/m_stacktrace.c
@@ -1096,7 +1096,7 @@
 {
    #define BUF_LEN   4096
    
-   static UChar buf[BUF_LEN];
+   static HChar buf[BUF_LEN];
 
    VG_(describe_IP)(ip, buf, BUF_LEN);
 
diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c
index 7bc9f89..196ee3f 100644
--- a/coregrind/m_syswrap/syswrap-generic.c
+++ b/coregrind/m_syswrap/syswrap-generic.c
@@ -510,7 +510,7 @@
 typedef struct OpenFd
 {
    Int fd;                        /* The file descriptor */
-   Char *pathname;                /* NULL if not a regular file or unknown */
+   HChar *pathname;               /* NULL if not a regular file or unknown */
    ExeContext *where;             /* NULL if inherited from parent */
    struct OpenFd *next, *prev;
 } OpenFd;
@@ -774,7 +774,7 @@
          goto out;
 
       if (VG_(strcmp)(d.d_name, ".") && VG_(strcmp)(d.d_name, "..")) {
-         Char* s;
+         HChar* s;
          Int fno = VG_(strtoll10)(d.d_name, &s);
          if (*s == '\0') {
             if (fno != sr_Res(f))
@@ -2522,11 +2522,11 @@
 // but it seems to work nonetheless...
 PRE(sys_execve)
 {
-   Char*        path = NULL;       /* path to executable */
-   Char**       envp = NULL;
-   Char**       argv = NULL;
-   Char**       arg2copy;
-   Char*        launcher_basename = NULL;
+   HChar*       path = NULL;       /* path to executable */
+   HChar**      envp = NULL;
+   HChar**      argv = NULL;
+   HChar**      arg2copy;
+   HChar*       launcher_basename = NULL;
    ThreadState* tst;
    Int          i, j, tot_args;
    SysRes       res;
@@ -2603,7 +2603,7 @@
    }
 
    /* After this point, we can't recover if the execve fails. */
-   VG_(debugLog)(1, "syswrap", "Exec of %s\n", (Char*)ARG1);
+   VG_(debugLog)(1, "syswrap", "Exec of %s\n", (HChar*)ARG1);
 
    
    // Terminate gdbserver if it is active.
@@ -2639,7 +2639,7 @@
       }
 
    } else {
-      path = (Char*)ARG1;
+      path = (HChar*)ARG1;
    }
 
    // Set up the child's environment.
@@ -2656,7 +2656,7 @@
    if (ARG3 == 0) {
       envp = NULL;
    } else {
-      envp = VG_(env_clone)( (Char**)ARG3 );
+      envp = VG_(env_clone)( (HChar**)ARG3 );
       if (envp == NULL) goto hosed;
       VG_(env_remove_valgrind_env_stuff)( envp );
    }
@@ -2675,7 +2675,7 @@
    // are omitted.
    //
    if (!trace_this_child) {
-      argv = (Char**)ARG2;
+      argv = (HChar**)ARG2;
    } else {
       vg_assert( VG_(args_for_valgrind) );
       vg_assert( VG_(args_for_valgrind_noexecpass) >= 0 );
@@ -2690,7 +2690,7 @@
       // name of client exe
       tot_args++;
       // args for client exe, skipping [0]
-      arg2copy = (Char**)ARG2;
+      arg2copy = (HChar**)ARG2;
       if (arg2copy && arg2copy[0]) {
          for (i = 1; arg2copy[i]; i++)
             tot_args++;
@@ -2707,7 +2707,7 @@
             continue;
          argv[j++] = * (HChar**) VG_(indexXA)( VG_(args_for_valgrind), i );
       }
-      argv[j++] = (Char*)ARG1;
+      argv[j++] = (HChar*)ARG1;
       if (arg2copy && arg2copy[0])
          for (i = 1; arg2copy[i]; i++)
             argv[j++] = arg2copy[i];
@@ -2765,7 +2765,7 @@
    }
 
    if (0) {
-      Char **cpp;
+      HChar **cpp;
       VG_(printf)("exec: %s\n", path);
       for (cpp = argv; cpp && *cpp; cpp++)
          VG_(printf)("argv: %s\n", *cpp);
@@ -3619,7 +3619,7 @@
       cloned fd back to the start. */
    {
       HChar  name[30];
-      Char*  arg1s = (Char*) ARG1;
+      HChar* arg1s = (HChar*) ARG1;
       SysRes sres;
 
       VG_(sprintf)(name, "/proc/%d/cmdline", VG_(getpid)());
@@ -3644,7 +3644,7 @@
       cloned fd back to the start. */
    {
       HChar  name[30];
-      Char*  arg1s = (Char*) ARG1;
+      HChar* arg1s = (HChar*) ARG1;
       SysRes sres;
 
       VG_(sprintf)(name, "/proc/%d/auxv", VG_(getpid)());
@@ -3676,7 +3676,7 @@
       SET_STATUS_Failure( VKI_EMFILE );
    } else {
       if (VG_(clo_track_fds))
-         ML_(record_fd_open_with_given_name)(tid, RES, (Char*)ARG1);
+         ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG1);
    }
 }
 
@@ -3734,7 +3734,7 @@
       SET_STATUS_Failure( VKI_EMFILE );
    } else {
       if (VG_(clo_track_fds))
-         ML_(record_fd_open_with_given_name)(tid, RES, (Char*)ARG1);
+         ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG1);
    }
 }
 
@@ -3792,7 +3792,7 @@
        * /proc/<pid>/exe.
        */
       HChar name[25];
-      Char* arg1s = (Char*) ARG1;
+      HChar* arg1s = (HChar*) ARG1;
       VG_(sprintf)(name, "/proc/%d/exe", VG_(getpid)());
       if (ML_(safe_to_deref)(arg1s, 1) &&
           (VG_STREQ(arg1s, name) || VG_STREQ(arg1s, "/proc/self/exe"))
diff --git a/coregrind/m_tooliface.c b/coregrind/m_tooliface.c
index b9229ca..ac2af36 100644
--- a/coregrind/m_tooliface.c
+++ b/coregrind/m_tooliface.c
@@ -230,8 +230,8 @@
    void (*pp)         (Error*),
    Bool show_TIDs,
    UInt (*update)     (Error*),
-   Bool (*recog)      (Char*, Supp*),
-   Bool (*read_extra) (Int, Char**, SizeT*, Supp*),
+   Bool (*recog)      (const HChar*, Supp*),
+   Bool (*read_extra) (Int, HChar**, SizeT*, Supp*),
    Bool (*matches)    (Error*, Supp*),
    const HChar* (*name) (Error*),
    Bool (*get_xtra_si)(Error*,/*OUT*/HChar*,Int)
@@ -251,7 +251,7 @@
 }
 
 void VG_(needs_command_line_options)(
-   Bool (*process)(Char*),
+   Bool (*process)(const HChar*),
    void (*usage)(void),
    void (*debug_usage)(void)
 )
diff --git a/coregrind/m_translate.c b/coregrind/m_translate.c
index db53b46..762762f 100644
--- a/coregrind/m_translate.c
+++ b/coregrind/m_translate.c
@@ -165,7 +165,7 @@
    if (N_ALIASES == next_SP_alias_slot) next_SP_alias_slot = 0;
 }
 
-static Bool get_SP_delta(IRTemp temp, ULong* delta)
+static Bool get_SP_delta(IRTemp temp, Long* delta)
 {
    Int i;      // i must be signed!
    vg_assert(IRTemp_INVALID != temp);
@@ -1349,8 +1349,8 @@
    if ((kind == T_Redir_Wrap || kind == T_Redir_Replace)
        && (VG_(clo_verbosity) >= 2 || VG_(clo_trace_redir))) {
       Bool ok;
-      Char name1[512] = "";
-      Char name2[512] = "";
+      HChar name1[512] = "";
+      HChar name2[512] = "";
       name1[0] = name2[0] = 0;
       ok = VG_(get_fnname_w_offset)(nraddr, name1, 512);
       if (!ok) VG_(strcpy)(name1, "???");
@@ -1368,9 +1368,9 @@
 
    /* If doing any code printing, print a basic block start marker */
    if (VG_(clo_trace_flags) || debugging_translation) {
-      Char fnname[512] = "UNKNOWN_FUNCTION";
+      HChar fnname[512] = "UNKNOWN_FUNCTION";
       VG_(get_fnname_w_offset)(addr, fnname, 512);
-      const UChar* objname = "UNKNOWN_OBJECT";
+      const HChar* objname = "UNKNOWN_OBJECT";
       OffT         objoff  = 0;
       DebugInfo*   di      = VG_(find_DebugInfo)( addr );
       if (di) {
diff --git a/coregrind/m_transtab.c b/coregrind/m_transtab.c
index 87cf7ec..7173a06 100644
--- a/coregrind/m_transtab.c
+++ b/coregrind/m_transtab.c
@@ -805,7 +805,7 @@
    TTEntry* tte
       = index_tte(ie->from_sNo, ie->from_tteNo);
    UChar* place_to_patch
-      = ((HChar*)tte->tcptr) + ie->from_offs;
+      = ((UChar*)tte->tcptr) + ie->from_offs;
    UChar* disp_cp_chain_me
       = VG_(fnptr_to_fnentry)(
            ie->to_fastEP ? &VG_(disp_cp_chain_me_to_fastEP)
diff --git a/coregrind/pub_core_demangle.h b/coregrind/pub_core_demangle.h
index 79346d3..749ede1 100644
--- a/coregrind/pub_core_demangle.h
+++ b/coregrind/pub_core_demangle.h
@@ -41,7 +41,7 @@
  * (2) undoes C++ demangling, if 'do_cxx_demangle' is True.  */
 extern 
 void VG_(demangle) ( Bool do_cxx_demangling, Bool do_z_demangling,
-                     Char* orig, Char* result, Int result_size );
+                     HChar* orig, HChar* result, Int result_size );
 
 /* Demangle a Z-encoded name as described in pub_tool_redir.h. 
    Z-encoded names are used by Valgrind for doing function 
diff --git a/coregrind/pub_core_initimg.h b/coregrind/pub_core_initimg.h
index d82e36c..574d07d 100644
--- a/coregrind/pub_core_initimg.h
+++ b/coregrind/pub_core_initimg.h
@@ -69,7 +69,7 @@
 
 struct _IICreateImageInfo {
    /* ------ Mandatory fields ------ */
-   HChar*  toolname;
+   const HChar*  toolname;
    Addr    sp_at_startup;
    Addr    clstack_top;
    /* ------ Per-OS fields ------ */
diff --git a/coregrind/pub_core_libcfile.h b/coregrind/pub_core_libcfile.h
index 8e7c20b..1528a5e 100644
--- a/coregrind/pub_core_libcfile.h
+++ b/coregrind/pub_core_libcfile.h
@@ -56,7 +56,7 @@
    none specified. */
 #define VG_CLO_DEFAULT_LOGPORT 1500
 
-extern Int VG_(connect_via_socket)( UChar* str );
+extern Int VG_(connect_via_socket)( const HChar* str );
 
 extern UInt   VG_(htonl) ( UInt x );
 extern UInt   VG_(ntohl) ( UInt x );
diff --git a/coregrind/pub_core_libcproc.h b/coregrind/pub_core_libcproc.h
index c200c92..88cbc47 100644
--- a/coregrind/pub_core_libcproc.h
+++ b/coregrind/pub_core_libcproc.h
@@ -69,11 +69,11 @@
 
 
 // Environment manipulations
-extern Char **VG_(env_setenv)   ( Char ***envp, const Char* varname,
-                                  const Char *val );
-extern void   VG_(env_unsetenv) ( Char **env, const Char *varname );
-extern void   VG_(env_remove_valgrind_env_stuff) ( Char** env ); 
-extern Char **VG_(env_clone)    ( Char **env_clone );
+extern HChar **VG_(env_setenv)   ( HChar ***envp, const HChar* varname,
+                                   const HChar *val );
+extern void    VG_(env_unsetenv) ( HChar **env, const HChar *varname );
+extern void    VG_(env_remove_valgrind_env_stuff) ( HChar** env ); 
+extern HChar **VG_(env_clone)    ( HChar **env_clone );
 
 // misc
 extern Int  VG_(getgroups)( Int size, UInt* list );
diff --git a/coregrind/pub_core_mallocfree.h b/coregrind/pub_core_mallocfree.h
index f6270c8..907acef 100644
--- a/coregrind/pub_core_mallocfree.h
+++ b/coregrind/pub_core_mallocfree.h
@@ -111,8 +111,8 @@
                                   void* ptr, SizeT size );
 extern void* VG_(arena_memalign)( ArenaId aid, const HChar* cc,
                                   SizeT req_alignB, SizeT req_pszB );
-extern Char* VG_(arena_strdup)  ( ArenaId aid, const HChar* cc, 
-                                  const Char* s);
+extern HChar* VG_(arena_strdup)  ( ArenaId aid, const HChar* cc, 
+                                   const HChar* s);
 
 extern SizeT VG_(arena_malloc_usable_size) ( ArenaId aid, void* payload );
 
diff --git a/coregrind/pub_core_options.h b/coregrind/pub_core_options.h
index c22580a..1a3ef1f 100644
--- a/coregrind/pub_core_options.h
+++ b/coregrind/pub_core_options.h
@@ -69,7 +69,7 @@
 /* if > 0, checks every VG_(clo_vgdb_poll) BBS if vgdb wants to be served. */
 extern Int VG_(clo_vgdb_poll);
 /* prefix for the named pipes (FIFOs) used by vgdb/gdb to communicate with valgrind */
-extern HChar* VG_(clo_vgdb_prefix);
+extern const HChar* VG_(clo_vgdb_prefix);
 /* if True, gdbserver in valgrind will expose a target description containing
    shadow registers */
 extern Bool  VG_(clo_vgdb_shadow_registers);
@@ -77,7 +77,7 @@
 /* Enquire about whether to attach to a debugger at errors?   default: NO */
 extern Bool  VG_(clo_db_attach);
 /* The debugger command?  default: whatever gdb ./configure found */
-extern Char* VG_(clo_db_command);
+extern const HChar* VG_(clo_db_command);
 /* Generating a suppression for each error?   default: 0 (NO)
    Other values: 1 (yes, but ask user), 2 (yes, don't ask user) */
 extern Int   VG_(clo_gen_suppressions);
@@ -89,15 +89,15 @@
 /* Soname synonyms : a string containing a list of pairs
    xxxxx=yyyyy separated by commas.
    E.g. --soname-synonyms=somalloc=libtcmalloc*.so*,solibtruc=NONE */
-extern HChar* VG_(clo_soname_synonyms);
+extern const HChar* VG_(clo_soname_synonyms);
 extern Bool  VG_(clo_trace_children);
 /* String containing comma-separated patterns for executable names
    that should not be traced into even when --trace-children=yes */
-extern HChar* VG_(clo_trace_children_skip);
+extern const HChar* VG_(clo_trace_children_skip);
 /* The same as VG_(clo_trace_children), except that these patterns are
    tested against the arguments for child processes, rather than the
    executable name. */
-extern HChar* VG_(clo_trace_children_skip_by_arg);
+extern const HChar* VG_(clo_trace_children_skip_by_arg);
 /* After a fork, the child's output can become confusingly
    intermingled with the parent's output.  This is especially
    problematic when VG_(clo_xml) is True.  Setting
@@ -108,8 +108,8 @@
 
 /* If the user specified --log-file=STR and/or --xml-file=STR, these
    hold STR after expansion of the %p and %q templates. */
-extern Char* VG_(clo_log_fname_expanded);
-extern Char* VG_(clo_xml_fname_expanded);
+extern HChar* VG_(clo_log_fname_expanded);
+extern HChar* VG_(clo_xml_fname_expanded);
 
 /* Add timestamps to log messages?  default: NO */
 extern Bool  VG_(clo_time_stamp);
@@ -120,11 +120,11 @@
 /* The number of suppression files specified. */
 extern Int   VG_(clo_n_suppressions);
 /* The names of the suppression files. */
-extern Char* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
+extern const HChar* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
 
 /* An array of strings harvested from --fullpath-after= flags. */
 extern Int   VG_(clo_n_fullpath_after);
-extern Char* VG_(clo_fullpath_after)[VG_CLO_MAX_FULLPATH_AFTER];
+extern const HChar* VG_(clo_fullpath_after)[VG_CLO_MAX_FULLPATH_AFTER];
 
 /* DEBUG: print generated code?  default: 00000000 ( == NO ) */
 extern UChar VG_(clo_trace_flags);
@@ -141,7 +141,7 @@
 /* DEBUG: print symtab details?  default: NO */
 extern Bool  VG_(clo_trace_symtab);
 /* DEBUG: restrict symtab etc details to object name pattern.  Default: "*" */
-extern HChar* VG_(clo_trace_symtab_patt);
+extern const HChar* VG_(clo_trace_symtab_patt);
 /* DEBUG: print call-frame-info details?  default: NO */
 extern Bool  VG_(clo_trace_cfi);
 /* DEBUG:  mimic /usr/bin/readelf --syms?  default: NO */
@@ -175,13 +175,13 @@
    default: Infinity. */
 extern Int   VG_(clo_dump_error);
 /* Engage miscellaneous weird hacks needed for some progs. */
-extern Char* VG_(clo_sim_hints);
+extern const HChar* VG_(clo_sim_hints);
 /* Show symbols in the form 'name+offset' ?  Default: NO */
 extern Bool VG_(clo_sym_offsets);
 /* Read DWARF3 variable info even if tool doesn't ask for it? */
 extern Bool VG_(clo_read_var_info);
 /* Which prefix to strip from full source file paths, if any. */
-extern Char* VG_(clo_prefix_to_strip);
+extern const HChar* VG_(clo_prefix_to_strip);
 
 /* An array of strings harvested from --require-text-symbol= 
    flags.
@@ -214,7 +214,7 @@
    the entire flag in quotes to stop shells messing up the * and ?
    wildcards. */
 extern Int    VG_(clo_n_req_tsyms);
-extern HChar* VG_(clo_req_tsyms)[VG_CLO_MAX_REQ_TSYMS];
+extern const HChar* VG_(clo_req_tsyms)[VG_CLO_MAX_REQ_TSYMS];
 
 /* Track open file descriptors? */
 extern Bool  VG_(clo_track_fds);
@@ -260,7 +260,7 @@
 
 /* String containing comma-separated names of minor kernel variants,
    so they can be properly handled by m_syswrap. */
-extern HChar* VG_(clo_kernel_variant);
+extern const HChar* VG_(clo_kernel_variant);
 
 /* Darwin-specific: automatically run /usr/bin/dsymutil to update
    .dSYM directories as necessary? */
diff --git a/coregrind/pub_core_redir.h b/coregrind/pub_core_redir.h
index 67fe802..1d78112 100644
--- a/coregrind/pub_core_redir.h
+++ b/coregrind/pub_core_redir.h
@@ -128,7 +128,7 @@
 //extern Bool VG_(is_wrapper_return)(Addr eip);
 
 /* Primary interface for adding wrappers for client-side functions. */
-//extern CodeRedirect *VG_(add_wrapper)(const Char *from_lib, const Char *from_sym,
+//extern CodeRedirect *VG_(add_wrapper)(const HChar *from_lib, const HChar *from_sym,
 //				      const FuncWrapper *wrapper);
 //
 //extern Bool VG_(is_resolved)(const CodeRedirect *redir);
diff --git a/coregrind/pub_core_tooliface.h b/coregrind/pub_core_tooliface.h
index 10a6a75..056d173 100644
--- a/coregrind/pub_core_tooliface.h
+++ b/coregrind/pub_core_tooliface.h
@@ -121,8 +121,8 @@
    void  (*tool_pp_Error)                    (Error*);
    Bool  tool_show_ThreadIDs_for_errors;
    UInt  (*tool_update_extra)                (Error*);
-   Bool  (*tool_recognised_suppression)      (Char*, Supp*);
-   Bool  (*tool_read_extra_suppression_info) (Int, Char**, SizeT*, Supp*);
+   Bool  (*tool_recognised_suppression)      (const HChar*, Supp*);
+   Bool  (*tool_read_extra_suppression_info) (Int, HChar**, SizeT*, Supp*);
    Bool  (*tool_error_matches_suppression)   (Error*, Supp*);
    const HChar* (*tool_get_error_name)       (Error*);
    Bool  (*tool_get_extra_suppression_info)  (Error*,/*OUT*/HChar*,Int);
@@ -131,7 +131,7 @@
    void (*tool_discard_superblock_info)(Addr64, VexGuestExtents);
 
    // VG_(needs).command_line_options
-   Bool (*tool_process_cmd_line_option)(Char*);
+   Bool (*tool_process_cmd_line_option)(const HChar*);
    void (*tool_print_usage)            (void);
    void (*tool_print_debug_usage)      (void);
 
diff --git a/coregrind/vg_preloaded.c b/coregrind/vg_preloaded.c
index aec1656..7b19cd7 100644
--- a/coregrind/vg_preloaded.c
+++ b/coregrind/vg_preloaded.c
@@ -116,10 +116,10 @@
 #include <crt_externs.h>
 
 // GrP fixme copied from m_libcproc
-static void env_unsetenv ( Char **env, const Char *varname )
+static void env_unsetenv ( HChar **env, const HChar *varname )
 {
-   Char **from;
-   Char **to = NULL;
+   HChar **from;
+   HChar **to = NULL;
    Int len = strlen(varname);
 
    for (from = to = env; from && *from; from++) {
@@ -137,7 +137,7 @@
 static void vg_cleanup_env(void)  __attribute__((constructor));
 static void vg_cleanup_env(void)
 {
-    Char **envp = (Char**)*_NSGetEnviron();
+    HChar **envp = (HChar**)*_NSGetEnviron();
     env_unsetenv(envp, "VALGRIND_LAUNCHER");
     env_unsetenv(envp, "DYLD_SHARED_REGION");
     // GrP fixme should be more like mash_colon_env()
diff --git a/drd/drd.h b/drd/drd.h
index c3537d2..9226ed1 100644
--- a/drd/drd.h
+++ b/drd/drd.h
@@ -440,7 +440,7 @@
 
    /* Tell DRD that a DRD annotation has not yet been implemented. */
    VG_USERREQ__DRD_ANNOTATION_UNIMP,
-   /* args: Char*. */
+   /* args: char*. */
 
    /* Tell DRD that a user-defined reader-writer synchronization object
     * has been created. */
@@ -466,7 +466,7 @@
    /* Tell DRD that a Helgrind annotation has not yet been implemented. */
    VG_USERREQ__HELGRIND_ANNOTATION_UNIMP
       = VG_USERREQ_TOOL_BASE('H','G') + 256 + 32,
-   /* args: Char*. */
+   /* args: char*. */
 
    /* Tell DRD to insert a happens-before annotation. */
    VG_USERREQ__DRD_ANNOTATE_HAPPENS_BEFORE
diff --git a/drd/drd_barrier.c b/drd/drd_barrier.c
index 06da0ec..f7c6d5c 100644
--- a/drd/drd_barrier.c
+++ b/drd/drd_barrier.c
@@ -55,8 +55,8 @@
 static void barrier_cleanup(struct barrier_info* p);
 static void barrier_delete_thread(struct barrier_info* const p,
                                   const DrdThreadId tid);
-static const char* barrier_get_typename(struct barrier_info* const p);
-static const char* barrier_type_name(const BarrierT bt);
+static const HChar* barrier_get_typename(struct barrier_info* const p);
+static const HChar* barrier_type_name(const BarrierT bt);
 static
 void barrier_report_wait_delete_race(const struct barrier_info* const p,
                                      const struct barrier_thread_info* const q);
@@ -540,14 +540,14 @@
    }
 }
 
-static const char* barrier_get_typename(struct barrier_info* const p)
+static const HChar* barrier_get_typename(struct barrier_info* const p)
 {
    tl_assert(p);
 
    return barrier_type_name(p->barrier_type);
 }
 
-static const char* barrier_type_name(const BarrierT bt)
+static const HChar* barrier_type_name(const BarrierT bt)
 {
    switch (bt)
    {
diff --git a/drd/drd_clientobj.c b/drd/drd_clientobj.c
index 1e9876b..a7996f5 100644
--- a/drd/drd_clientobj.c
+++ b/drd/drd_clientobj.c
@@ -243,7 +243,7 @@
    }
 }
 
-const char* DRD_(clientobj_type_name)(const ObjType t)
+const HChar* DRD_(clientobj_type_name)(const ObjType t)
 {
    switch (t)
    {
diff --git a/drd/drd_clientobj.h b/drd/drd_clientobj.h
index f177d85..fc4ae50 100644
--- a/drd/drd_clientobj.h
+++ b/drd/drd_clientobj.h
@@ -165,7 +165,7 @@
 Bool DRD_(clientobj_remove)(const Addr addr, const ObjType t);
 void DRD_(clientobj_stop_using_mem)(const Addr a1, const Addr a2);
 void DRD_(clientobj_delete_thread)(const DrdThreadId tid);
-const char* DRD_(clientobj_type_name)(const ObjType t);
+const HChar* DRD_(clientobj_type_name)(const ObjType t);
 
 
 #endif /* __DRD_CLIENTOBJ_H */
diff --git a/drd/drd_clientreq.c b/drd/drd_clientreq.c
index 49e1f11..8712764 100644
--- a/drd/drd_clientreq.c
+++ b/drd/drd_clientreq.c
@@ -142,7 +142,7 @@
       break;
 
    case VG_USERREQ__DRD_SET_THREAD_NAME:
-      DRD_(thread_set_name)(drd_tid, (const char*)arg[1]);
+      DRD_(thread_set_name)(drd_tid, (const HChar*)arg[1]);
       break;
 
    case VG_USERREQ__DRD_START_SUPPRESSION:
@@ -440,7 +440,7 @@
 
    case VG_USERREQ__POST_SEM_OPEN:
       if (DRD_(thread_leave_synchr)(drd_tid) == 0)
-         DRD_(semaphore_open)(arg[1], (Char*)arg[2], arg[3], arg[4], arg[5]);
+         DRD_(semaphore_open)(arg[1], (HChar*)arg[2], arg[3], arg[4], arg[5]);
       break;
 
    case VG_USERREQ__PRE_SEM_CLOSE:
@@ -548,7 +548,7 @@
           * freed, e.g. because it points to static data.
           */
          UnimpClReqInfo UICR =
-            { DRD_(thread_get_running_tid)(), (Char*)arg[1] };
+            { DRD_(thread_get_running_tid)(), (HChar*)arg[1] };
          VG_(maybe_record_error)(vg_tid,
                                  UnimpHgClReq,
                                  VG_(get_IP)(vg_tid),
@@ -563,7 +563,7 @@
           * freed, e.g. because it points to static data.
           */
          UnimpClReqInfo UICR =
-            { DRD_(thread_get_running_tid)(), (Char*)arg[1] };
+            { DRD_(thread_get_running_tid)(), (HChar*)arg[1] };
          VG_(maybe_record_error)(vg_tid,
                                  UnimpDrdClReq,
                                  VG_(get_IP)(vg_tid),
diff --git a/drd/drd_error.c b/drd/drd_error.c
index feb1494..cf1944d 100644
--- a/drd/drd_error.c
+++ b/drd/drd_error.c
@@ -56,7 +56,7 @@
    s_show_conflicting_segments = scs;
 }
 
-void DRD_(trace_msg)(const char* format, ...)
+void DRD_(trace_msg)(const HChar* format, ...)
 {
    va_list vargs;
    va_start(vargs, format);
@@ -71,7 +71,7 @@
    va_end(vargs);
 }
 
-void DRD_(trace_msg_w_bt)(const char* format, ...)
+void DRD_(trace_msg_w_bt)(const HChar* format, ...)
 {
    va_list vargs;
    va_start(vargs, format);
@@ -92,8 +92,8 @@
 /**
  * Emit error message detail in the format requested by the user.
  */
-static void print_err_detail(const char* format, ...) PRINTF_CHECK(1, 2);
-static void print_err_detail(const char* format, ...)
+static void print_err_detail(const HChar* format, ...) PRINTF_CHECK(1, 2);
+static void print_err_detail(const HChar* format, ...)
 {
    va_list vargs;
    va_start(vargs, format);
@@ -154,11 +154,11 @@
 void drd_report_data_race(Error* const err, const DataRaceErrInfo* const dri)
 {
    const Bool xml = VG_(clo_xml);
-   const char* const what_prefix = xml ? "  <what>" : "";
-   const char* const what_suffix = xml ? "</what>" : "";
-   const char* const auxwhat_prefix = xml ? "  <auxwhat>" : "";
-   const char* const auxwhat_suffix = xml ? "</auxwhat>" : "";
-   const char* const indent = xml ? "  " : "";
+   const HChar* const what_prefix = xml ? "  <what>" : "";
+   const HChar* const what_suffix = xml ? "</what>" : "";
+   const HChar* const auxwhat_prefix = xml ? "  <auxwhat>" : "";
+   const HChar* const auxwhat_suffix = xml ? "</auxwhat>" : "";
+   const HChar* const indent = xml ? "  " : "";
    AddrInfo ai;
 
    XArray* /* of HChar */ descr1
@@ -222,7 +222,7 @@
       if (xml)
          print_err_detail("  </allocation_context>\n");
    } else {
-      char sect_name[64];
+      HChar sect_name[64];
       VgSectKind sect_kind;
 
       sect_kind = VG_(DebugInfo_sect_kind)(sect_name, sizeof(sect_name),
@@ -301,8 +301,8 @@
 static void drd_tool_error_pp(Error* const e)
 {
    const Bool xml = VG_(clo_xml);
-   const char* const what_prefix = xml ? "  <what>" : "";
-   const char* const what_suffix = xml ? "</what>" : "";
+   const HChar* const what_prefix = xml ? "  <what>" : "";
+   const HChar* const what_suffix = xml ? "</what>" : "";
 
    if (xml)
       VG_(printf_xml)( "  <kind>%pS</kind>\n", drd_get_error_name(e));
@@ -507,7 +507,8 @@
  * types supported by DRD. So try to match the suppression name against the
  * names of DRD error types.
  */
-static Bool drd_is_recognized_suppression(Char* const name, Supp* const supp)
+static Bool drd_is_recognized_suppression(const HChar* const name,
+                                          Supp* const supp)
 {
    DrdErrorKind skind = 0;
 
@@ -554,7 +555,7 @@
  * that reading the 'extra' lines succeeded.
  */
 static
-Bool drd_read_extra_suppression_info(Int fd, Char** bufpp,
+Bool drd_read_extra_suppression_info(Int fd, HChar** bufpp,
                                      SizeT* nBufp, Supp* supp)
 {
    return True;
diff --git a/drd/drd_error.h b/drd/drd_error.h
index e6ed640..0829d11 100644
--- a/drd/drd_error.h
+++ b/drd/drd_error.h
@@ -90,8 +90,8 @@
    ExeContext* lastchange;    //   Mallocd
    DrdThreadId stack_tid;     //   Stack
    DebugInfo*  debuginfo;     //   Segment
-   Char        name[256];     //   Segment
-   Char        descr[256];    //   Segment
+   HChar       name[256];     //   Segment
+   HChar       descr[256];    //   Segment
 } AddrInfo;
 
 /*
@@ -174,13 +174,13 @@
 
 typedef struct {
    DrdThreadId tid;
-   Char*       descr;
+   HChar*      descr;
 } UnimpClReqInfo;
 
 void DRD_(set_show_conflicting_segments)(const Bool scs);
 void DRD_(register_error_handlers)(void);
-void DRD_(trace_msg)(const char* format, ...) PRINTF_CHECK(1, 2);
-void DRD_(trace_msg_w_bt)(const char* format, ...) PRINTF_CHECK(1, 2);
+void DRD_(trace_msg)(const HChar* format, ...) PRINTF_CHECK(1, 2);
+void DRD_(trace_msg_w_bt)(const HChar* format, ...) PRINTF_CHECK(1, 2);
 
 
 #endif /* __DRD_ERROR_H */
diff --git a/drd/drd_load_store.c b/drd/drd_load_store.c
index d5d46ce..6791555 100644
--- a/drd/drd_load_store.c
+++ b/drd/drd_load_store.c
@@ -93,7 +93,7 @@
 {
    if (DRD_(is_any_traced)(addr, addr + size))
    {
-      char* vc;
+      HChar* vc;
 
       vc = DRD_(vc_aprint)(DRD_(thread_get_vc)(DRD_(thread_get_running_tid)()));
       if (access_type == eStore && size <= sizeof(HWord)) {
diff --git a/drd/drd_main.c b/drd/drd_main.c
index 624c5f7..1147795 100644
--- a/drd/drd_main.c
+++ b/drd/drd_main.c
@@ -65,7 +65,7 @@
 /**
  * Implement the needs_command_line_options for drd.
  */
-static Bool DRD_(process_cmd_line_option)(Char* arg)
+static Bool DRD_(process_cmd_line_option)(const HChar* arg)
 {
    int check_stack_accesses   = -1;
    int join_list_vol          = -1;
@@ -89,8 +89,8 @@
    int trace_segment          = -1;
    int trace_semaphore        = -1;
    int trace_suppression      = -1;
-   Char* trace_address        = 0;
-   Char* ptrace_address       = 0;
+   const HChar* trace_address = 0;
+   const HChar* ptrace_address= 0;
 
    if      VG_BOOL_CLO(arg, "--check-stack-var",     check_stack_accesses) {}
    else if VG_INT_CLO (arg, "--join-list-vol",       join_list_vol) {}
@@ -277,7 +277,7 @@
                                     const HChar* const s,
                                     const Addr a)
 {
-   const char* p = (void*)a;
+   const HChar* p = (void*)a;
    SizeT size = 0;
 
    // Don't segfault if the string starts in an obviously stupid
@@ -862,7 +862,7 @@
    DRD_(thread_init)();
 
    {
-      Char* const smi = VG_(getenv)("DRD_SEGMENT_MERGING_INTERVAL");
+      HChar* const smi = VG_(getenv)("DRD_SEGMENT_MERGING_INTERVAL");
       if (smi)
          DRD_(thread_set_segment_merge_interval)(VG_(strtoll10)(smi, NULL));
    }
diff --git a/drd/drd_mutex.c b/drd/drd_mutex.c
index a3347e9..a073f56 100644
--- a/drd/drd_mutex.c
+++ b/drd/drd_mutex.c
@@ -445,14 +445,14 @@
    }
 }
 
-const char* DRD_(mutex_get_typename)(struct mutex_info* const p)
+const HChar* DRD_(mutex_get_typename)(struct mutex_info* const p)
 {
    tl_assert(p);
 
    return DRD_(mutex_type_name)(p->mutex_type);
 }
 
-const char* DRD_(mutex_type_name)(const MutexT mt)
+const HChar* DRD_(mutex_type_name)(const MutexT mt)
 {
    switch (mt)
    {
diff --git a/drd/drd_mutex.h b/drd/drd_mutex.h
index 41bd87f..205d43d 100644
--- a/drd/drd_mutex.h
+++ b/drd/drd_mutex.h
@@ -46,8 +46,8 @@
                            const Bool post_cond_wait);
 void DRD_(mutex_unlock)(const Addr mutex, const MutexT mutex_type);
 void DRD_(spinlock_init_or_unlock)(const Addr spinlock);
-const char* DRD_(mutex_get_typename)(struct mutex_info* const p);
-const char* DRD_(mutex_type_name)(const MutexT mt);
+const HChar* DRD_(mutex_get_typename)(struct mutex_info* const p);
+const HChar* DRD_(mutex_type_name)(const MutexT mt);
 Bool DRD_(mutex_is_locked_by)(const Addr mutex, const DrdThreadId tid);
 int DRD_(mutex_get_recursion_count)(const Addr mutex);
 ULong DRD_(get_mutex_lock_count)(void);
diff --git a/drd/drd_pthread_intercepts.c b/drd/drd_pthread_intercepts.c
index f883f7c..9eaae07 100644
--- a/drd/drd_pthread_intercepts.c
+++ b/drd/drd_pthread_intercepts.c
@@ -367,7 +367,7 @@
 #if defined(linux)
 #if defined(_CS_GNU_LIBPTHREAD_VERSION)
    /* Linux with a recent glibc. */
-   char buffer[256];
+   HChar buffer[256];
    unsigned len;
    len = confstr(_CS_GNU_LIBPTHREAD_VERSION, buffer, sizeof(buffer));
    assert(len <= sizeof(buffer));
diff --git a/drd/drd_segment.c b/drd/drd_segment.c
index 775bcd7..7d5d5d9 100644
--- a/drd/drd_segment.c
+++ b/drd/drd_segment.c
@@ -94,7 +94,7 @@
 
    if (s_trace_segment)
    {
-      char* vc;
+      HChar* vc;
 
       vc = DRD_(vc_aprint)(&sg->vc);
       VG_(message)(Vg_DebugMsg, "New segment for thread %d with vc %s\n",
@@ -138,7 +138,7 @@
 {
    if (DRD_(sg_get_trace)())
    {
-      char* vc;
+      HChar* vc;
 
       vc = DRD_(vc_aprint)(&sg->vc);
       VG_(message)(Vg_DebugMsg, "Discarding the segment with vector clock %s\n",
@@ -179,7 +179,7 @@
 
    if (s_trace_segment)
    {
-      char* vc;
+      HChar* vc;
 
       vc = DRD_(vc_aprint)(&sg->vc);
       VG_(message)(Vg_DebugMsg,
@@ -206,7 +206,7 @@
 
    if (s_trace_segment)
    {
-      char *vc1, *vc2;
+      HChar *vc1, *vc2;
 
       vc1 = DRD_(vc_aprint)(&sg1->vc);
       vc2 = DRD_(vc_aprint)(&sg2->vc);
diff --git a/drd/drd_semaphore.c b/drd/drd_semaphore.c
index 226c5ea..3a8b207 100644
--- a/drd/drd_semaphore.c
+++ b/drd/drd_semaphore.c
@@ -245,7 +245,7 @@
 
 /** Called after sem_open(). */
 struct semaphore_info* DRD_(semaphore_open)(const Addr semaphore,
-                                            const Char* name, const Word oflag,
+                                            const HChar* name, const Word oflag,
                                             const Word mode, const UInt value)
 {
    struct semaphore_info* p;
diff --git a/drd/drd_semaphore.h b/drd/drd_semaphore.h
index 2ebc130..62042a5 100644
--- a/drd/drd_semaphore.h
+++ b/drd/drd_semaphore.h
@@ -42,7 +42,7 @@
                                             const UInt value);
 void DRD_(semaphore_destroy)(const Addr semaphore);
 struct semaphore_info* DRD_(semaphore_open)(const Addr semaphore,
-                                            const Char* name, const Word oflag,
+                                            const HChar* name, const Word oflag,
                                             const Word mode, const UInt value);
 void DRD_(semaphore_close)(const Addr semaphore);
 void DRD_(semaphore_pre_wait)(const Addr semaphore);
diff --git a/drd/drd_suppression.c b/drd/drd_suppression.c
index 282ce7a..65768cb 100644
--- a/drd/drd_suppression.c
+++ b/drd/drd_suppression.c
@@ -60,7 +60,7 @@
 }
 
 void DRD_(start_suppression)(const Addr a1, const Addr a2,
-                             const char* const reason)
+                             const HChar* const reason)
 {
    if (s_trace_suppression)
       VG_(message)(Vg_DebugMsg, "start suppression of 0x%lx sz %ld (%s)\n",
diff --git a/drd/drd_suppression.h b/drd/drd_suppression.h
index 0fe8bdf..908877a 100644
--- a/drd/drd_suppression.h
+++ b/drd/drd_suppression.h
@@ -12,7 +12,7 @@
 void DRD_(suppression_set_trace)(const Bool trace_suppression);
 void DRD_(suppression_init)(void);
 void DRD_(start_suppression)(const Addr a1, const Addr a2,
-                             const char* const reason);
+                             const HChar* const reason);
 void DRD_(finish_suppression)(const Addr a1, const Addr a2);
 Bool DRD_(is_suppressed)(const Addr a1, const Addr a2);
 Bool DRD_(is_any_suppressed)(const Addr a1, const Addr a2);
diff --git a/drd/drd_thread.c b/drd/drd_thread.c
index adc6f62..160ce07 100644
--- a/drd/drd_thread.c
+++ b/drd/drd_thread.c
@@ -377,7 +377,7 @@
    {
       const ThreadId joiner = DRD_(DrdThreadIdToVgThreadId)(drd_joiner);
       const unsigned msg_size = 256;
-      char* msg;
+      HChar* msg;
 
       msg = VG_(malloc)("drd.main.dptj.1", msg_size);
       tl_assert(msg);
@@ -386,7 +386,7 @@
                     drd_joiner, drd_joinee);
       if (joiner)
       {
-         char* vc;
+         HChar* vc;
 
          vc = DRD_(vc_aprint)(DRD_(thread_get_vc)(drd_joiner));
          VG_(snprintf)(msg + VG_(strlen)(msg), msg_size - VG_(strlen)(msg),
@@ -636,7 +636,7 @@
 }
 
 /** Obtain the thread number and the user-assigned thread name. */
-const char* DRD_(thread_get_name)(const DrdThreadId tid)
+const HChar* DRD_(thread_get_name)(const DrdThreadId tid)
 {
    tl_assert(0 <= (int)tid && tid < DRD_N_THREADS
              && tid != DRD_INVALID_THREADID);
@@ -645,7 +645,7 @@
 }
 
 /** Set the name of the specified thread. */
-void DRD_(thread_set_name)(const DrdThreadId tid, const char* const name)
+void DRD_(thread_set_name)(const DrdThreadId tid, const HChar* const name)
 {
    tl_assert(0 <= (int)tid && tid < DRD_N_THREADS
              && tid != DRD_INVALID_THREADID);
@@ -893,7 +893,7 @@
    DRD_(thread_compute_minimum_vc)(&thread_vc_min);
    if (DRD_(sg_get_trace)())
    {
-      char *vc_min, *vc_max;
+      HChar *vc_min, *vc_max;
       VectorClock thread_vc_max;
 
       DRD_(vc_init)(&thread_vc_max, 0, 0);
@@ -1087,7 +1087,7 @@
 
    if (DRD_(sg_get_trace)())
    {
-      char *str1, *str2;
+      HChar *str1, *str2;
       str1 = DRD_(vc_aprint)(DRD_(thread_get_vc)(joiner));
       str2 = DRD_(vc_aprint)(DRD_(thread_get_vc)(joinee));
       VG_(message)(Vg_DebugMsg, "Before join: joiner %s, joinee %s\n",
@@ -1112,7 +1112,7 @@
    thread_discard_ordered_segments();
 
    if (DRD_(sg_get_trace)()) {
-      char* str;
+      HChar* str;
 
       str = DRD_(vc_aprint)(DRD_(thread_get_vc)(joiner));
       VG_(message)(Vg_DebugMsg, "After join: %s\n", str);
@@ -1141,7 +1141,7 @@
       DRD_(vc_copy)(&old_vc, DRD_(thread_get_vc)(tid));
       DRD_(vc_combine)(DRD_(thread_get_vc)(tid), vc);
       if (DRD_(sg_get_trace)()) {
-         char *str1, *str2;
+         HChar *str1, *str2;
          str1 = DRD_(vc_aprint)(&old_vc);
          str2 = DRD_(vc_aprint)(DRD_(thread_get_vc)(tid));
          VG_(message)(Vg_DebugMsg, "thread %d: vc %s -> %s\n", tid, str1, str2);
@@ -1400,7 +1400,7 @@
    }
 
    if (s_trace_conflict_set) {
-      char* str;
+      HChar* str;
 
       str = DRD_(vc_aprint)(DRD_(thread_get_vc)(tid));
       VG_(message)(Vg_DebugMsg,
@@ -1414,7 +1414,7 @@
       unsigned j;
 
       if (s_trace_conflict_set) {
-         char* vc;
+         HChar* vc;
 
          vc = DRD_(vc_aprint)(&p->vc);
          VG_(message)(Vg_DebugMsg, "conflict set: thread [%d] at vc %s\n",
@@ -1430,7 +1430,7 @@
                if (!DRD_(vc_lte)(&q->vc, &p->vc)
                    && !DRD_(vc_lte)(&p->vc, &q->vc)) {
                   if (s_trace_conflict_set) {
-                     char* str;
+                     HChar* str;
 
                      str = DRD_(vc_aprint)(&q->vc);
                      VG_(message)(Vg_DebugMsg,
@@ -1441,7 +1441,7 @@
                   DRD_(bm_merge2)(*conflict_set, DRD_(sg_bm)(q));
                } else {
                   if (s_trace_conflict_set) {
-                     char* str;
+                     HChar* str;
 
                      str = DRD_(vc_aprint)(&q->vc);
                      VG_(message)(Vg_DebugMsg,
@@ -1486,7 +1486,7 @@
    tl_assert(DRD_(g_conflict_set));
 
    if (s_trace_conflict_set) {
-      char* str;
+      HChar* str;
 
       str = DRD_(vc_aprint)(DRD_(thread_get_vc)(tid));
       VG_(message)(Vg_DebugMsg,
@@ -1516,7 +1516,7 @@
             = !DRD_(vc_lte)(new_vc, &q->vc);
 
          if (UNLIKELY(s_trace_conflict_set)) {
-            char* str;
+            HChar* str;
 
             str = DRD_(vc_aprint)(&q->vc);
             VG_(message)(Vg_DebugMsg,
@@ -1538,7 +1538,7 @@
             && !DRD_(vc_lte)(new_vc, &q->vc);
 
          if (UNLIKELY(s_trace_conflict_set)) {
-            char* str;
+            HChar* str;
 
             str = DRD_(vc_aprint)(&q->vc);
             VG_(message)(Vg_DebugMsg,
diff --git a/drd/drd_thread.h b/drd/drd_thread.h
index 68e2917..1f2b0d4 100644
--- a/drd/drd_thread.h
+++ b/drd/drd_thread.h
@@ -75,7 +75,7 @@
    Addr      stack_startup; /**<Stack pointer after pthread_create() finished.*/
    Addr      stack_max;     /**< Top of stack. */
    SizeT     stack_size;    /**< Maximum size of stack. */
-   char      name[64];      /**< User-assigned thread name. */
+   HChar     name[64];      /**< User-assigned thread name. */
    Bool      on_alt_stack;
    /** Whether this structure contains valid information. */
    Bool      valid;
@@ -158,8 +158,8 @@
 void DRD_(thread_set_joinable)(const DrdThreadId tid, const Bool joinable);
 void DRD_(thread_entering_pthread_create)(const DrdThreadId tid);
 void DRD_(thread_left_pthread_create)(const DrdThreadId tid);
-const char* DRD_(thread_get_name)(const DrdThreadId tid);
-void DRD_(thread_set_name)(const DrdThreadId tid, const char* const name);
+const HChar* DRD_(thread_get_name)(const DrdThreadId tid);
+void DRD_(thread_set_name)(const DrdThreadId tid, const HChar* const name);
 void DRD_(thread_set_vg_running_tid)(const ThreadId vg_tid);
 void DRD_(thread_set_running_tid)(const ThreadId vg_tid,
                                   const DrdThreadId drd_tid);
diff --git a/drd/drd_vc.c b/drd/drd_vc.c
index f1d34d1..078a99a 100644
--- a/drd/drd_vc.c
+++ b/drd/drd_vc.c
@@ -236,7 +236,7 @@
 /** Print the contents of vector clock 'vc'. */
 void DRD_(vc_print)(const VectorClock* const vc)
 {
-   char* str;
+   HChar* str;
 
    if ((str = DRD_(vc_aprint)(vc)) != NULL)
    {
@@ -249,12 +249,12 @@
  * Print the contents of vector clock 'vc' to a newly allocated string.
  * The caller must call VG_(free)() on the return value of this function.
  */
-char* DRD_(vc_aprint)(const VectorClock* const vc)
+HChar* DRD_(vc_aprint)(const VectorClock* const vc)
 {
    unsigned i;
    unsigned reserved;
    unsigned size;
-   char* str = 0;
+   HChar* str = 0;
 
    tl_assert(vc);
    reserved = 64;
diff --git a/drd/drd_vc.h b/drd/drd_vc.h
index 096ad88..bf8ab10 100644
--- a/drd/drd_vc.h
+++ b/drd/drd_vc.h
@@ -87,7 +87,7 @@
 void DRD_(vc_combine)(VectorClock* const result,
                       const VectorClock* const rhs);
 void DRD_(vc_print)(const VectorClock* const vc);
-char* DRD_(vc_aprint)(const VectorClock* const vc);
+HChar* DRD_(vc_aprint)(const VectorClock* const vc);
 void DRD_(vc_check)(const VectorClock* const vc);
 void DRD_(vc_test)(void);
 
diff --git a/drd/tests/unit_vc.c b/drd/tests/unit_vc.c
index 4364fda..aff5ebf 100644
--- a/drd/tests/unit_vc.c
+++ b/drd/tests/unit_vc.c
@@ -42,7 +42,7 @@
 { UInt ret; va_list vargs; va_start(vargs, format); ret = vprintf(format, vargs); va_end(vargs); return ret; }
 UInt VG_(snprintf)(HChar* buf, Int size, const HChar *format, ...)
 { UInt ret; va_list vargs; va_start(vargs, format); ret = vsnprintf(buf, size, format, vargs); va_end(vargs); return ret; }
-SizeT VG_(strlen)(const Char* str) { return strlen(str); }
+SizeT VG_(strlen)(const HChar* str) { return strlen(str); }
 UInt VG_(message)(VgMsgKind kind, const HChar* format, ...)
 { UInt ret; va_list vargs; va_start(vargs, format); ret = vprintf(format, vargs); va_end(vargs); printf("\n"); return ret; }
 Bool DRD_(is_suppressed)(const Addr a1, const Addr a2)
diff --git a/exp-bbv/bbv_main.c b/exp-bbv/bbv_main.c
index 43b8d8f..b73bd1b 100644
--- a/exp-bbv/bbv_main.c
+++ b/exp-bbv/bbv_main.c
@@ -55,10 +55,10 @@
 static Int interval_size=DEFAULT_GRAIN_SIZE;
 
    /* filenames */
-static HChar *clo_bb_out_file="bb.out.%p";
-static HChar *clo_pc_out_file="pc.out.%p";
-static UChar *pc_out_file=NULL;
-static UChar *bb_out_file=NULL;
+static const HChar *clo_bb_out_file="bb.out.%p";
+static const HChar *clo_pc_out_file="pc.out.%p";
+static HChar *pc_out_file=NULL;
+static HChar *bb_out_file=NULL;
 
 
    /* output parameters */
@@ -95,7 +95,7 @@
    Int        block_num;         /* unique block identifier              */
    Int        *inst_counter;     /* times entered * num_instructions     */
    Bool       is_entry;          /* is this block a function entry point */
-   UChar      fn_name[FUNCTION_NAME_LENGTH];  /* Function block is in    */
+   HChar      fn_name[FUNCTION_NAME_LENGTH];  /* Function block is in    */
 };
 
 
@@ -275,8 +275,8 @@
 
 #if defined(VGA_x86) || defined(VGA_amd64)
 
-   unsigned char *inst_pointer;
-   unsigned char inst_byte;
+   UChar *inst_pointer;
+   UChar  inst_byte;
    int i,possible_rep;
 
    /* rep prefixed instructions are counted as one instruction on */
@@ -286,7 +286,7 @@
    /*     SSE instructions.  So we need to specifically check for */
    /*     the following: movs, cmps, scas, lods, stos, ins, outs  */
 
-   inst_pointer=(unsigned char *)addr;
+   inst_pointer=(UChar *)addr;
    i=0;
    inst_byte=0;
    possible_rep=0;
@@ -322,7 +322,7 @@
    /*     performance counters on pentium 4 processors so it is   */
    /*     useful to have that count when doing validation work.   */
 
-   inst_pointer=(unsigned char *)addr;
+   inst_pointer=(UChar *)addr;
    if (len>1) {
          /* FLDCW detection */
          /* opcode is 0xd9/5, ie 1101 1001 oo10 1mmm */
@@ -531,7 +531,7 @@
 }
 
    /* Parse the command line options */
-static Bool bbv_process_cmd_line_option(Char* arg)
+static Bool bbv_process_cmd_line_option(const HChar* arg)
 {
    if VG_INT_CLO       (arg, "--interval-size",    interval_size) {}
    else if VG_STR_CLO  (arg, "--bb-out-file",      clo_bb_out_file) {}
diff --git a/exp-dhat/dh_main.c b/exp-dhat/dh_main.c
index 139f807..ef45cea 100644
--- a/exp-dhat/dh_main.c
+++ b/exp-dhat/dh_main.c
@@ -801,7 +801,7 @@
                  Int goff_sp)
 {
    IRType   tyAddr   = Ity_INVALID;
-   HChar*   hName    = NULL;
+   const HChar* hName= NULL;
    void*    hAddr    = NULL;
    IRExpr** argv     = NULL;
    IRDirty* di       = NULL;
@@ -1031,12 +1031,12 @@
 // FORWARDS
 static Bool identify_metric ( /*OUT*/ULong(**get_metricP)(APInfo*),
                               /*OUT*/Bool* increasingP,
-                              HChar* metric_name );
+                              const HChar* metric_name );
 
 static Int    clo_show_top_n = 10;
-static HChar* clo_sort_by    = "max-bytes-live";
+static const HChar *clo_sort_by = "max-bytes-live";
 
-static Bool dh_process_cmd_line_option(Char* arg)
+static Bool dh_process_cmd_line_option(const HChar* arg)
 {
    if VG_BINT_CLO(arg, "--show-top-n", clo_show_top_n, 1, 100000) {}
 
@@ -1184,7 +1184,7 @@
    string could not be identified.*/
 static Bool identify_metric ( /*OUT*/ULong(**get_metricP)(APInfo*),
                               /*OUT*/Bool* increasingP,
-                              HChar* metric_name )
+                              const HChar* metric_name )
 {
    if (0 == VG_(strcmp)(metric_name, "max-bytes-live")) {
       *get_metricP = get_metric__max_bytes_live;
@@ -1212,7 +1212,7 @@
    ULong (*get_metric)(APInfo*);
    Bool  increasing;
 
-   HChar* metric_name = clo_sort_by;
+   const HChar* metric_name = clo_sort_by;
    tl_assert(metric_name); // ensured by clo processing
 
    Bool ok = identify_metric( &get_metric, &increasing, metric_name );
diff --git a/exp-sgcheck/pc_common.c b/exp-sgcheck/pc_common.c
index dc608a8..d4c5bc9 100644
--- a/exp-sgcheck/pc_common.c
+++ b/exp-sgcheck/pc_common.c
@@ -63,7 +63,7 @@
 /* Bool h_clo_lossage_check     = False; */ /* dev flag only */
 Bool sg_clo_enable_sg_checks = True;   /* user visible */
 
-Bool pc_process_cmd_line_options(Char* arg)
+Bool pc_process_cmd_line_options(const HChar* arg)
 {
         if VG_BOOL_CLO(arg, "--partial-loads-ok", h_clo_partial_loads_ok) {}
    /* else if VG_BOOL_CLO(arg, "--lossage-check",    h_clo_lossage_check) {} */
@@ -134,7 +134,7 @@
             Seg*     vseg;
             XArray*  descr1; /* XArray* of HChar */
             XArray*  descr2; /* XArray* of HChar */
-            Char     datasym[96];
+            HChar    datasym[96];
             PtrdiffT datasymoff;
          } Heap;
          struct {
@@ -200,7 +200,7 @@
                             /*a*/0, /*str*/NULL, /*extra*/(void*)&xe);
 }
 
-void h_record_sysparam_error( ThreadId tid, CorePart part, Char* s,
+void h_record_sysparam_error( ThreadId tid, CorePart part, const HChar* s,
                               Addr lo, Addr hi, Seg* seglo, Seg* seghi )
 {
    XError xe;
@@ -720,7 +720,7 @@
    return sizeof(XError);
 }
 
-Bool pc_is_recognised_suppression ( Char* name, Supp *su )
+Bool pc_is_recognised_suppression ( const HChar* name, Supp *su )
 {
    SuppKind skind;
 
@@ -735,7 +735,7 @@
    return True;
 }
 
-Bool pc_read_extra_suppression_info ( Int fd, Char** bufpp, 
+Bool pc_read_extra_suppression_info ( Int fd, HChar** bufpp, 
                                       SizeT* nBufp, Supp* su )
 {
    Bool eof;
diff --git a/exp-sgcheck/pc_common.h b/exp-sgcheck/pc_common.h
index 20d5bbe..c547a23 100644
--- a/exp-sgcheck/pc_common.h
+++ b/exp-sgcheck/pc_common.h
@@ -44,15 +44,15 @@
 
 void h_record_arith_error( Seg* seg1, Seg* seg2, HChar* opname );
 
-void h_record_sysparam_error( ThreadId tid, CorePart part, Char* s,
+void h_record_sysparam_error( ThreadId tid, CorePart part, const HChar* s,
                               Addr lo, Addr hi, Seg* seglo, Seg* seghi );
 
 Bool pc_eq_Error           ( VgRes res, Error* e1, Error* e2 );
 void pc_before_pp_Error    ( Error* err );
 void pc_pp_Error           ( Error* err );
 UInt pc_update_Error_extra ( Error* err );
-Bool pc_is_recognised_suppression ( Char* name, Supp *su );
-Bool pc_read_extra_suppression_info ( Int fd, Char** bufpp, 
+Bool pc_is_recognised_suppression ( const HChar* name, Supp *su );
+Bool pc_read_extra_suppression_info ( Int fd, HChar** bufpp, 
                                       SizeT* nBufp, Supp* su );
 Bool pc_error_matches_suppression (Error* err, Supp* su);
 const HChar* pc_get_error_name ( Error* err );
@@ -63,7 +63,7 @@
 /* extern Bool h_clo_lossage_check; */
 extern Bool sg_clo_enable_sg_checks;
 
-Bool pc_process_cmd_line_options(Char* arg);
+Bool pc_process_cmd_line_options(const HChar* arg);
 void pc_print_usage(void);
 void pc_print_debug_usage(void);
 
diff --git a/helgrind/hg_basics.c b/helgrind/hg_basics.c
index 00f4a8b..9da1cd4 100644
--- a/helgrind/hg_basics.c
+++ b/helgrind/hg_basics.c
@@ -58,7 +58,7 @@
    VG_(free)(p);
 }
 
-Char* HG_(strdup) ( const HChar* cc, const Char* s )
+HChar* HG_(strdup) ( const HChar* cc, const HChar* s )
 {
    return VG_(strdup)( cc, s );
 }
diff --git a/helgrind/hg_basics.h b/helgrind/hg_basics.h
index 6d9d5f4..93f0154 100644
--- a/helgrind/hg_basics.h
+++ b/helgrind/hg_basics.h
@@ -39,9 +39,9 @@
 
 #define HG_(str) VGAPPEND(vgHelgrind_,str)
 
-void* HG_(zalloc) ( const HChar* cc, SizeT n );
-void  HG_(free)   ( void* p );
-Char* HG_(strdup) ( const HChar* cc, const Char* s );
+void*  HG_(zalloc) ( const HChar* cc, SizeT n );
+void   HG_(free)   ( void* p );
+HChar* HG_(strdup) ( const HChar* cc, const HChar* s );
 
 static inline Bool HG_(is_sane_ThreadId) ( ThreadId coretid ) {
    return coretid >= 0 && coretid < VG_N_THREADS;
diff --git a/helgrind/hg_errors.c b/helgrind/hg_errors.c
index 9a51ad1..8a6c1d4 100644
--- a/helgrind/hg_errors.c
+++ b/helgrind/hg_errors.c
@@ -66,7 +66,7 @@
    return (Word)VG_(strcmp)( (HChar*)s1, (HChar*)s2 );
 }
 
-static HChar* string_table_strdup ( HChar* str ) {
+static HChar* string_table_strdup ( const HChar* str ) {
    HChar* copy = NULL;
    HG_(stats__string_table_queries)++;
    if (!str)
@@ -84,7 +84,7 @@
    } else {
       copy = HG_(strdup)("hg.sts.2", str);
       tl_assert(copy);
-      VG_(addToFM)( string_table, (Word)copy, (Word)copy );
+      VG_(addToFM)( string_table, (UWord)copy, (UWord)copy );
       return copy;
    }
 }
@@ -1347,7 +1347,7 @@
    }
 }
 
-Bool HG_(recognised_suppression) ( Char* name, Supp *su )
+Bool HG_(recognised_suppression) ( const HChar* name, Supp *su )
 {
 #  define TRY(_name,_xskind)                   \
       if (0 == VG_(strcmp)(name, (_name))) {   \
@@ -1366,7 +1366,7 @@
 #  undef TRY
 }
 
-Bool HG_(read_extra_suppression_info) ( Int fd, Char** bufpp, SizeT* nBufp,
+Bool HG_(read_extra_suppression_info) ( Int fd, HChar** bufpp, SizeT* nBufp,
                                         Supp* su )
 {
    /* do nothing -- no extra suppression info present.  Return True to
diff --git a/helgrind/hg_errors.h b/helgrind/hg_errors.h
index 919ff52..eb22859 100644
--- a/helgrind/hg_errors.h
+++ b/helgrind/hg_errors.h
@@ -39,8 +39,8 @@
 void  HG_(before_pp_Error) ( Error* err );
 void  HG_(pp_Error)        ( Error* err );
 UInt  HG_(update_extra)    ( Error* err );
-Bool  HG_(recognised_suppression) ( Char* name, Supp *su );
-Bool  HG_(read_extra_suppression_info) ( Int fd, Char** bufpp, SizeT* nBufp,
+Bool  HG_(recognised_suppression) ( const HChar* name, Supp *su );
+Bool  HG_(read_extra_suppression_info) ( Int fd, HChar** bufpp, SizeT* nBufp,
                                          Supp* su );
 Bool  HG_(error_matches_suppression) ( Error* err, Supp* su );
 const HChar* HG_(get_error_name) ( Error* err );
diff --git a/helgrind/hg_main.c b/helgrind/hg_main.c
index b4ea174..c5bea8c 100644
--- a/helgrind/hg_main.c
+++ b/helgrind/hg_main.c
@@ -1725,7 +1725,7 @@
    // checking the first byte is better than nothing.  See #255009.
    if (!VG_(am_is_valid_for_client) (a, 1, VKI_PROT_READ))
       return;
-   len = VG_(strlen)( (Char*) a );
+   len = VG_(strlen)( (HChar*) a );
    shadow_mem_cread_range( map_threads_lookup(tid), a, len+1 );
    if (len >= SCE_BIGRANGE_T && (HG_(clo_sanity_flags) & SCE_BIGRANGE))
       all__sanity_check("evh__pre_mem_read_asciiz-post");
@@ -4295,7 +4295,7 @@
 static Bool is_in_dynamic_linker_shared_object( Addr64 ga )
 {
    DebugInfo* dinfo;
-   const UChar* soname;
+   const HChar* soname;
    if (0) return False;
 
    dinfo = VG_(find_DebugInfo)( (Addr)ga );
@@ -4838,7 +4838,7 @@
          break;
 
       case _VG_USERREQ__HG_CLIENTREQ_UNIMP: {
-         /* char* who */
+         /* HChar* who */
          HChar*  who = (HChar*)args[1];
          HChar   buf[50 + 50];
          Thread* thr = map_threads_maybe_lookup( tid );
@@ -4880,9 +4880,9 @@
 /*--- Setup                                                    ---*/
 /*----------------------------------------------------------------*/
 
-static Bool hg_process_cmd_line_option ( Char* arg )
+static Bool hg_process_cmd_line_option ( const HChar* arg )
 {
-   Char* tmp_str;
+   const HChar* tmp_str;
 
    if      VG_BOOL_CLO(arg, "--track-lockorders",
                             HG_(clo_track_lockorders)) {}
diff --git a/include/pub_tool_debuginfo.h b/include/pub_tool_debuginfo.h
index 133784a..e35af22 100644
--- a/include/pub_tool_debuginfo.h
+++ b/include/pub_tool_debuginfo.h
@@ -216,8 +216,8 @@
                                    /*OUT*/Addr*    avma,
                                    /*OUT*/Addr*    tocptr,
                                    /*OUT*/UInt*    size,
-                                   /*OUT*/UChar**  pri_name,
-                                   /*OUT*/UChar*** sec_names,
+                                   /*OUT*/HChar**  pri_name,
+                                   /*OUT*/HChar*** sec_names,
                                    /*OUT*/Bool*    isText,
                                    /*OUT*/Bool*    isIFunc );
 
diff --git a/include/pub_tool_errormgr.h b/include/pub_tool_errormgr.h
index 4d6af06..039115d 100644
--- a/include/pub_tool_errormgr.h
+++ b/include/pub_tool_errormgr.h
@@ -94,7 +94,7 @@
    the process).  (It will bomb out if the size gets ridiculous).  Skips
    leading spaces on the line.  Increments lineno with the number of lines
    read if lineno is non-NULL. Returns True if EOF was hit.  */
-extern Bool VG_(get_line) ( Int fd, Char** bufpp, SizeT* nBufp, Int* lineno );
+extern Bool VG_(get_line) ( Int fd, HChar** bufpp, SizeT* nBufp, Int* lineno );
 
 
 /* ------------------------------------------------------------------ */
@@ -119,13 +119,13 @@
 
 /* Useful in VG_(tdict).tool_error_matches_suppression() */
 SuppKind VG_(get_supp_kind)   ( Supp* su );
-Char*    VG_(get_supp_string) ( Supp* su );
+HChar*   VG_(get_supp_string) ( Supp* su );
 void*    VG_(get_supp_extra)  ( Supp* su );
 
 /* Must be used in VG_(recognised_suppression)() */
 void VG_(set_supp_kind)   ( Supp* su, SuppKind suppkind );
 /* May be used in VG_(read_extra_suppression_info)() */
-void VG_(set_supp_string) ( Supp* su, Char* string );
+void VG_(set_supp_string) ( Supp* su, HChar* string );
 void VG_(set_supp_extra)  ( Supp* su, void* extra );
 
 
diff --git a/include/pub_tool_gdbserver.h b/include/pub_tool_gdbserver.h
index 8ceba7b..03a43b4 100644
--- a/include/pub_tool_gdbserver.h
+++ b/include/pub_tool_gdbserver.h
@@ -170,7 +170,7 @@
    user problems via VG_(gdb_printf).  */
 extern void VG_(strtok_get_address_and_size) (Addr* address, 
                                               SizeT* szB, 
-                                              Char **ssaveptr);
+                                              HChar **ssaveptr);
 
 #endif   // __PUB_TOOL_GDBSERVER_H
 
diff --git a/include/pub_tool_libcbase.h b/include/pub_tool_libcbase.h
index 304aa0c..f1b47f5 100644
--- a/include/pub_tool_libcbase.h
+++ b/include/pub_tool_libcbase.h
@@ -35,9 +35,9 @@
    Char functions.
    ------------------------------------------------------------------ */
 
-extern Bool VG_(isspace) ( Char c );
-extern Bool VG_(isdigit) ( Char c );
-extern Char VG_(tolower) ( Char c );
+extern Bool  VG_(isspace) ( HChar c );
+extern Bool  VG_(isdigit) ( HChar c );
+extern HChar VG_(tolower) ( HChar c );
 
 /* ---------------------------------------------------------------------
    Converting strings to numbers
@@ -61,16 +61,16 @@
 // useless because they don't do any error checking and so accept malformed
 // numbers and non-numbers -- eg. "123xyz" gives 123, and "foo" gives 0!
 // If you really want that behaviour, you can use "VG_(strtoll10)(str, NULL)".
-extern Long  VG_(strtoll10) ( Char* str, Char** endptr );
-extern Long  VG_(strtoll16) ( Char* str, Char** endptr );
-extern ULong  VG_(strtoull10) ( Char* str, Char** endptr );
-extern ULong  VG_(strtoull16) ( Char* str, Char** endptr );
+extern Long  VG_(strtoll10) ( const HChar* str, HChar** endptr );
+extern Long  VG_(strtoll16) ( const HChar* str, HChar** endptr );
+extern ULong  VG_(strtoull10) ( const HChar* str, HChar** endptr );
+extern ULong  VG_(strtoull16) ( const HChar* str, HChar** endptr );
 
 // Convert a string to a double.  After leading whitespace is ignored, a
 // '+' or '-' is allowed, and then it accepts a non-empty sequence of
 // decimal digits possibly containing a '.'.  Hexadecimal floats are not
 // accepted, nor are "fancy" floats (eg. "3.4e-5", "NAN").
-extern double VG_(strtod)  ( Char* str, Char** endptr );
+extern double VG_(strtod)  ( const HChar* str, HChar** endptr );
 
 /* ---------------------------------------------------------------------
    String functions and macros
@@ -82,36 +82,36 @@
 #define VG_STREQN(n,s1,s2) ( (s1 != NULL && s2 != NULL \
                              && VG_(strncmp)((s1),(s2),(n))==0) ? True : False )
 
-extern SizeT VG_(strlen)         ( const Char* str );
-extern Char* VG_(strcat)         ( Char* dest, const Char* src );
-extern Char* VG_(strncat)        ( Char* dest, const Char* src, SizeT n );
-extern Char* VG_(strpbrk)        ( const Char* s, const Char* accpt );
-extern Char* VG_(strcpy)         ( Char* dest, const Char* src );
-extern Char* VG_(strncpy)        ( Char* dest, const Char* src, SizeT ndest );
-extern Int   VG_(strcmp)         ( const Char* s1, const Char* s2 );
-extern Int   VG_(strcasecmp)     ( const Char* s1, const Char* s2 );
-extern Int   VG_(strncmp)        ( const Char* s1, const Char* s2, SizeT nmax );
-extern Int   VG_(strncasecmp)    ( const Char* s1, const Char* s2, SizeT nmax );
-extern Char* VG_(strstr)         ( const Char* haystack, const Char* needle );
-extern Char* VG_(strcasestr)     ( const Char* haystack, const Char* needle );
-extern Char* VG_(strchr)         ( const Char* s, Char c );
-extern Char* VG_(strrchr)        ( const Char* s, Char c );
-extern SizeT VG_(strspn)         ( const Char* s, const Char* accpt );
-extern SizeT VG_(strcspn)        ( const Char* s, const Char* reject );
+extern SizeT  VG_(strlen)         ( const HChar* str );
+extern HChar* VG_(strcat)         ( HChar* dest, const HChar* src );
+extern HChar* VG_(strncat)        ( HChar* dest, const HChar* src, SizeT n );
+extern HChar* VG_(strpbrk)        ( const HChar* s, const HChar* accpt );
+extern HChar* VG_(strcpy)         ( HChar* dest, const HChar* src );
+extern HChar* VG_(strncpy)        ( HChar* dest, const HChar* src, SizeT ndest );
+extern Int    VG_(strcmp)         ( const HChar* s1, const HChar* s2 );
+extern Int    VG_(strcasecmp)     ( const HChar* s1, const HChar* s2 );
+extern Int    VG_(strncmp)        ( const HChar* s1, const HChar* s2, SizeT nmax );
+extern Int    VG_(strncasecmp)    ( const HChar* s1, const HChar* s2, SizeT nmax );
+extern HChar* VG_(strstr)         ( const HChar* haystack, const HChar* needle );
+extern HChar* VG_(strcasestr)     ( const HChar* haystack, const HChar* needle );
+extern HChar* VG_(strchr)         ( const HChar* s, HChar c );
+extern HChar* VG_(strrchr)        ( const HChar* s, HChar c );
+extern SizeT  VG_(strspn)         ( const HChar* s, const HChar* accpt );
+extern SizeT  VG_(strcspn)        ( const HChar* s, const HChar* reject );
 
 /* strtok* functions and some parsing utilities. */
-extern Char* VG_(strtok_r)       (Char* s, const Char* delim, Char** saveptr);
-extern Char* VG_(strtok)         (Char* s, const Char* delim);
+extern HChar* VG_(strtok_r)       (HChar* s, const HChar* delim, HChar** saveptr);
+extern HChar* VG_(strtok)         (HChar* s, const HChar* delim);
 
 /* Parse a 32- or 64-bit hex number, including leading 0x, from string
    starting at *ppc, putting result in *result, and return True.  Or
    fail, in which case *ppc and *result are undefined, and return
    False. */
-extern Bool VG_(parse_Addr) ( UChar** ppc, Addr* result );
+extern Bool VG_(parse_Addr) ( const HChar** ppc, Addr* result );
 
 /* Like strncpy(), but if 'src' is longer than 'ndest' inserts a '\0' as the
    last character. */
-extern void  VG_(strncpy_safely) ( Char* dest, const Char* src, SizeT ndest );
+extern void  VG_(strncpy_safely) ( HChar* dest, const HChar* src, SizeT ndest );
 
 /* ---------------------------------------------------------------------
    mem* functions
diff --git a/include/pub_tool_libcfile.h b/include/pub_tool_libcfile.h
index 9777a3d..b9acc1c 100644
--- a/include/pub_tool_libcfile.h
+++ b/include/pub_tool_libcfile.h
@@ -68,38 +68,38 @@
    ULong   ctime_nsec;
 };
 
-extern SysRes VG_(mknod)  ( const Char* pathname, Int mode, UWord dev );
-extern SysRes VG_(open)   ( const Char* pathname, Int flags, Int mode );
+extern SysRes VG_(mknod)  ( const HChar* pathname, Int mode, UWord dev );
+extern SysRes VG_(open)   ( const HChar* pathname, Int flags, Int mode );
 /* fd_open words like the open(2) system call: 
    returns fd if success, -1 otherwise */
-extern Int VG_(fd_open)  (const Char* pathname, Int flags, Int mode);
+extern Int VG_(fd_open)  (const HChar* pathname, Int flags, Int mode);
 extern void   VG_(close)  ( Int fd );
 extern Int    VG_(read)   ( Int fd, void* buf, Int count);
 extern Int    VG_(write)  ( Int fd, const void* buf, Int count);
 extern Int    VG_(pipe)   ( Int fd[2] );
 extern Off64T VG_(lseek)  ( Int fd, Off64T offset, Int whence );
 
-extern SysRes VG_(stat)   ( const Char* file_name, struct vg_stat* buf );
+extern SysRes VG_(stat)   ( const HChar* file_name, struct vg_stat* buf );
 extern Int    VG_(fstat)  ( Int   fd,        struct vg_stat* buf );
 extern SysRes VG_(dup)    ( Int oldfd );
 extern SysRes VG_(dup2)   ( Int oldfd, Int newfd );
-extern Int    VG_(rename) ( const Char* old_name, const Char* new_name );
-extern Int    VG_(unlink) ( const Char* file_name );
+extern Int    VG_(rename) ( const HChar* old_name, const HChar* new_name );
+extern Int    VG_(unlink) ( const HChar* file_name );
 
 extern Int    VG_(poll) (struct vki_pollfd *fds, Int nfds, Int timeout);
 
-extern Int    VG_(readlink)( const Char* path, Char* buf, UInt bufsize );
+extern Int    VG_(readlink)( const HChar* path, HChar* buf, UInt bufsize );
 extern Int    VG_(getdents)( Int fd, struct vki_dirent *dirp, UInt count );
 
-extern Char*  VG_(basename)( const Char* path );
-extern Char*  VG_(dirname) ( const Char* path );
+extern HChar* VG_(basename)( const HChar* path );
+extern HChar* VG_(dirname) ( const HChar* path );
 
 /* Return the name of a directory for temporary files. */
 extern const HChar* VG_(tmpdir)(void);
 
 /* Copy the working directory at startup into buf[0 .. size-1], or return
    False if buf is too small. */
-extern Bool VG_(get_startup_wd) ( Char* buf, SizeT size );
+extern Bool VG_(get_startup_wd) ( HChar* buf, SizeT size );
 
 #endif   // __PUB_TOOL_LIBCFILE_H
 
diff --git a/include/pub_tool_libcproc.h b/include/pub_tool_libcproc.h
index c580f51..7432b82 100644
--- a/include/pub_tool_libcproc.h
+++ b/include/pub_tool_libcproc.h
@@ -36,26 +36,26 @@
    ------------------------------------------------------------------ */
 
 /* Client environment. */
-extern Char** VG_(client_envp);
+extern HChar** VG_(client_envp);
 
 /* Looks up VG_(client_envp) */
-extern Char* VG_(getenv) ( Char* name );
+extern HChar* VG_(getenv) ( const HChar* name );
 
 /* Path to all our library/aux files */
-extern const Char *VG_(libdir);
+extern const HChar *VG_(libdir);
 
 // The name of the LD_PRELOAD-equivalent variable.  It varies across
 // platforms.
-extern const Char* VG_(LD_PRELOAD_var_name);
+extern const HChar* VG_(LD_PRELOAD_var_name);
 
 /* ---------------------------------------------------------------------
    Important syscalls
    ------------------------------------------------------------------ */
 
 extern Int  VG_(waitpid)( Int pid, Int *status, Int options );
-extern Int  VG_(system) ( Char* cmd );
+extern Int  VG_(system) ( const HChar* cmd );
 extern Int  VG_(fork)   ( void);
-extern void VG_(execv)  ( Char* filename, Char** argv );
+extern void VG_(execv)  ( const HChar* filename, HChar** argv );
 
 /* ---------------------------------------------------------------------
    Resource limits and capabilities
diff --git a/include/pub_tool_mallocfree.h b/include/pub_tool_mallocfree.h
index 76167ed..ac5de77 100644
--- a/include/pub_tool_mallocfree.h
+++ b/include/pub_tool_mallocfree.h
@@ -40,8 +40,8 @@
 extern void* VG_(malloc)         ( const HChar* cc, SizeT nbytes );
 extern void  VG_(free)           ( void* p );
 extern void* VG_(calloc)         ( const HChar* cc, SizeT n, SizeT bytes_per_elem );
-extern void* VG_(realloc)        ( const HChar* cc, void* p, SizeT size );
-extern Char* VG_(strdup)         ( const HChar* cc, const Char* s );
+extern void*  VG_(realloc)       ( const HChar* cc, void* p, SizeT size );
+extern HChar* VG_(strdup)        ( const HChar* cc, const HChar* s );
 
 // Returns the usable size of a heap-block.  It's the asked-for size plus
 // possibly some more due to rounding up.
diff --git a/include/pub_tool_options.h b/include/pub_tool_options.h
index fd90f44..ef13712 100644
--- a/include/pub_tool_options.h
+++ b/include/pub_tool_options.h
@@ -51,7 +51,7 @@
 #define VG_BOOL_CLO(qq_arg, qq_option, qq_var) \
    (VG_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=") && \
     ({ \
-      Char* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
+      const HChar* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
       if      VG_STREQ(val, "yes") (qq_var) = True; \
       else if VG_STREQ(val, "no")  (qq_var) = False; \
       else VG_(fmsg_bad_option)(qq_arg, "Invalid boolean value '%s'" \
@@ -64,7 +64,7 @@
 #define VG_STR_CLO(qq_arg, qq_option, qq_var) \
    (VG_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=") && \
     ({ \
-      Char* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
+      const HChar* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
       (qq_var) = val; \
       True; \
     }) \
@@ -74,8 +74,8 @@
 #define VG_INT_CLO(qq_arg, qq_option, qq_var) \
    (VG_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=") && \
     ({ \
-      Char* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
-      Char* s; \
+      const HChar* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
+      HChar* s; \
       Long n = VG_(strtoll10)( val, &s ); \
       (qq_var) = n; \
       /* Check for non-numeralness, or overflow. */ \
@@ -89,8 +89,8 @@
 #define VG_BINTN_CLO(qq_base, qq_arg, qq_option, qq_var, qq_lo, qq_hi) \
    (VG_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=") && \
     ({ \
-      Char* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
-      Char* s; \
+      const HChar* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
+      HChar* s; \
       Long n = VG_(strtoll##qq_base)( val, &s ); \
       (qq_var) = n; \
       /* MMM: separate the two cases, and explain the problem;  likewise */ \
@@ -122,8 +122,8 @@
 #define VG_DBL_CLO(qq_arg, qq_option, qq_var) \
    (VG_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=") && \
     ({ \
-      Char* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
-      Char* s; \
+      const HChar* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
+      HChar* s; \
       double n = VG_(strtod)( val, &s ); \
       (qq_var) = n; \
       /* Check for non-numeralness */ \
@@ -161,7 +161,7 @@
 
 /* An arbitrary user-supplied string which is copied into the
    XML output, in between <usercomment> tags. */
-extern HChar* VG_(clo_xml_user_comment);
+extern const HChar* VG_(clo_xml_user_comment);
 
 /* Vex iropt control.  Tool-visible so tools can make Vex optimise
    less aggressively if that is needed (callgrind needs this). */
@@ -192,7 +192,8 @@
    merely used in printing error messages, if an error message needs
    to be printed due to malformedness of the "format" argument.
 */
-extern Char* VG_(expand_file_name)(Char* option_name, Char* format);
+extern HChar* VG_(expand_file_name)(const HChar* option_name,
+                                    const HChar* format);
 
 #endif   // __PUB_TOOL_OPTIONS_H
 
diff --git a/include/pub_tool_replacemalloc.h b/include/pub_tool_replacemalloc.h
index 3b6b927..97a9667 100644
--- a/include/pub_tool_replacemalloc.h
+++ b/include/pub_tool_replacemalloc.h
@@ -63,7 +63,7 @@
    default: VG_MIN_MALLOC_SZB */
 extern UInt VG_(clo_alignment);
 
-extern Bool VG_(replacement_malloc_process_cmd_line_option) ( Char* arg );
+extern Bool VG_(replacement_malloc_process_cmd_line_option) ( const HChar* arg );
 
 #endif   // __PUB_TOOL_REPLACEMALLOC_H
 
diff --git a/include/pub_tool_seqmatch.h b/include/pub_tool_seqmatch.h
index c095599..a62a18f 100644
--- a/include/pub_tool_seqmatch.h
+++ b/include/pub_tool_seqmatch.h
@@ -89,7 +89,7 @@
 /* Mini-regexp function.  Searches for 'pat' in 'str'.  Supports
    meta-symbols '*' and '?'.  There is no way to escape meta-symbols
    in the pattern. */
-Bool VG_(string_match) ( const Char* pat, const Char* str );
+Bool VG_(string_match) ( const HChar* pat, const HChar* str );
 
 #endif   // __PUB_TOOL_SEQMATCH_H
 
diff --git a/include/pub_tool_tooliface.h b/include/pub_tool_tooliface.h
index cdd70a4..2dd38f3 100644
--- a/include/pub_tool_tooliface.h
+++ b/include/pub_tool_tooliface.h
@@ -313,14 +313,14 @@
 
    // Return value indicates recognition.  If recognised, must set skind using
    // VG_(set_supp_kind)().
-   Bool (*recognised_suppression)(Char* name, Supp* su),
+   Bool (*recognised_suppression)(const HChar* name, Supp* su),
 
    // Read any extra info for this suppression kind.  Most likely for filling
    // in the `extra' and `string' parts (with VG_(set_supp_{extra, string})())
    // of a suppression if necessary.  Should return False if a syntax error
    // occurred, True otherwise.  bufpp and nBufp are the same as for
    // VG_(get_line).
-   Bool (*read_extra_suppression_info)(Int fd, Char** bufpp, SizeT* nBufp,
+   Bool (*read_extra_suppression_info)(Int fd, HChar** bufpp, SizeT* nBufp,
                                        Supp* su),
 
    // This should just check the kinds match and maybe some stuff in the
@@ -386,7 +386,7 @@
    // if possible rather than in post_clo_init(), and if they are bad then
    // VG_(fmsg_bad_option)() should be called.  This ensures that the
    // messaging is consistent with command line option errors from the core.
-   Bool (*process_cmd_line_option)(Char* argv),
+   Bool (*process_cmd_line_option)(const HChar* argv),
 
    // Print out command line usage for options for normal tool operation.
    void (*print_usage)(void),
diff --git a/lackey/lk_main.c b/lackey/lk_main.c
index 98f824e..42a0552 100644
--- a/lackey/lk_main.c
+++ b/lackey/lk_main.c
@@ -192,9 +192,9 @@
 /* The name of the function of which the number of calls (under
  * --basic-counts=yes) is to be counted, with default. Override with command
  * line option --fnname. */
-static HChar* clo_fnname = "main";
+static const HChar* clo_fnname = "main";
 
-static Bool lk_process_cmd_line_option(Char* arg)
+static Bool lk_process_cmd_line_option(const HChar* arg)
 {
    if VG_STR_CLO(arg, "--fnname", clo_fnname) {}
    else if VG_BOOL_CLO(arg, "--basic-counts",      clo_basic_counts) {}
@@ -321,7 +321,7 @@
    }
 }
 
-static HChar* nameOfTypeIndex ( Int i )
+static const HChar* nameOfTypeIndex ( Int i )
 {
    switch (i) {
       case 0: return "I1";   break;
@@ -467,7 +467,7 @@
 static void flushEvents(IRSB* sb)
 {
    Int        i;
-   HChar*     helperName;
+   const HChar* helperName;
    void*      helperAddr;
    IRExpr**   argv;
    IRDirty*   di;
@@ -611,7 +611,7 @@
    IRDirty*   di;
    Int        i;
    IRSB*      sbOut;
-   Char       fnname[100];
+   HChar      fnname[100];
    IRType     type;
    IRTypeEnv* tyenv = sbIn->tyenv;
    Addr       iaddr = 0, dst;
@@ -911,7 +911,7 @@
 
 static void lk_fini(Int exitcode)
 {
-   char percentify_buf[5]; /* Two digits, '%' and 0. */
+   HChar percentify_buf[5]; /* Two digits, '%' and 0. */
    const int percentify_size = sizeof(percentify_buf) - 1;
    const int percentify_decs = 0;
    
diff --git a/massif/ms_main.c b/massif/ms_main.c
index 3b7d024..32421b1 100644
--- a/massif/ms_main.c
+++ b/massif/ms_main.c
@@ -310,7 +310,7 @@
 {
    // Create the list, and add the default elements.
    alloc_fns = VG_(newXA)(VG_(malloc), "ms.main.iaf.1",
-                                       VG_(free), sizeof(Char*));
+                                       VG_(free), sizeof(HChar*));
    #define DO(x)  { HChar* s = x; VG_(addToXA)(alloc_fns, &s); }
 
    // Ordered roughly according to (presumed) frequency.
@@ -357,13 +357,13 @@
 {
    // Create the (empty) list.
    ignore_fns = VG_(newXA)(VG_(malloc), "ms.main.iif.1",
-                                        VG_(free), sizeof(Char*));
+                                        VG_(free), sizeof(HChar*));
 }
 
 // Determines if the named function is a member of the XArray.
-static Bool is_member_fn(XArray* fns, Char* fnname)
+static Bool is_member_fn(XArray* fns, HChar* fnname)
 {
-   Char** fn_ptr;
+   HChar** fn_ptr;
    Int i;
  
    // Nb: It's a linear search through the list, because we're comparing
@@ -411,13 +411,13 @@
 static Int    clo_time_unit       = TimeI;
 static Int    clo_detailed_freq   = 10;
 static Int    clo_max_snapshots   = 100;
-static HChar* clo_massif_out_file = "massif.out.%p";
+static const HChar* clo_massif_out_file = "massif.out.%p";
 
 static XArray* args_for_massif;
 
-static Bool ms_process_cmd_line_option(Char* arg)
+static Bool ms_process_cmd_line_option(const HChar* arg)
 {
-   Char* tmp_str;
+   const HChar* tmp_str;
 
    // Remember the arg for later use.
    VG_(addToXA)(args_for_massif, &arg);
@@ -845,7 +845,7 @@
 // Determine if the given IP belongs to a function that should be ignored.
 static Bool fn_should_be_ignored(Addr ip)
 {
-   static Char buf[BUF_LEN];
+   static HChar buf[BUF_LEN];
    return
       ( VG_(get_fnname)(ip, buf, BUF_LEN) && is_member_fn(ignore_fns, buf)
       ? True : False );
@@ -860,7 +860,7 @@
 static
 Int get_IPs( ThreadId tid, Bool exclude_first_entry, Addr ips[])
 {
-   static Char buf[BUF_LEN];
+   static HChar buf[BUF_LEN];
    Int n_ips, i, n_alloc_fns_removed;
    Int overestimate;
    Bool redo;
@@ -2001,7 +2001,7 @@
 
 /* Forward declaration.
    return True if request recognised, False otherwise */
-static Bool handle_gdb_monitor_command (ThreadId tid, Char *req);
+static Bool handle_gdb_monitor_command (ThreadId tid, HChar *req);
 static Bool ms_handle_client_request ( ThreadId tid, UWord* argv, UWord* ret )
 {
    switch (argv[0]) {
@@ -2029,7 +2029,7 @@
       return True;
    }
    case VG_USERREQ__GDB_MONITOR_COMMAND: {
-     Bool handled = handle_gdb_monitor_command (tid, (Char*)argv[1]);
+     Bool handled = handle_gdb_monitor_command (tid, (HChar*)argv[1]);
      if (handled)
        *ret = 1;
      else
@@ -2150,7 +2150,7 @@
 })
 
 // Nb: uses a static buffer, each call trashes the last string returned.
-static HChar* make_perc(double x)
+static const HChar* make_perc(double x)
 {
    static HChar mbuf[32];
 
@@ -2161,7 +2161,7 @@
    return mbuf;
 }
 
-static void pp_snapshot_SXPt(Int fd, SXPt* sxpt, Int depth, Char* depth_str,
+static void pp_snapshot_SXPt(Int fd, SXPt* sxpt, Int depth, HChar* depth_str,
                             Int depth_str_len,
                             SizeT snapshot_heap_szB, SizeT snapshot_total_szB)
 {
@@ -2304,8 +2304,8 @@
    if (is_detailed_snapshot(snapshot)) {
       // Detailed snapshot -- print heap tree.
       Int   depth_str_len = clo_depth + 3;
-      Char* depth_str = VG_(malloc)("ms.main.pps.1", 
-                                    sizeof(Char) * depth_str_len);
+      HChar* depth_str = VG_(malloc)("ms.main.pps.1", 
+                                     sizeof(HChar) * depth_str_len);
       SizeT snapshot_total_szB =
          snapshot->heap_szB + snapshot->heap_extra_szB + snapshot->stacks_szB;
       depth_str[0] = '\0';   // Initialise depth_str to "".
@@ -2322,7 +2322,7 @@
    }
 }
 
-static void write_snapshots_to_file(Char* massif_out_file, 
+static void write_snapshots_to_file(const HChar* massif_out_file, 
                                     Snapshot snapshots_array[], 
                                     Int nr_elements)
 {
@@ -2347,7 +2347,7 @@
    // implied genericity of "desc:" is bogus.
    FP("desc:");
    for (i = 0; i < VG_(sizeXA)(args_for_massif); i++) {
-      Char* arg = *(Char**)VG_(indexXA)(args_for_massif, i);
+      HChar* arg = *(HChar**)VG_(indexXA)(args_for_massif, i);
       FP(" %s", arg);
    }
    if (0 == i) FP(" (none)");
@@ -2383,13 +2383,14 @@
    // output file format string contains a %p (pid) specifier, both the
    // parent and child will incorrectly write to the same file;  this
    // happened in 3.3.0.
-   Char* massif_out_file =
+   HChar* massif_out_file =
       VG_(expand_file_name)("--massif-out-file", clo_massif_out_file);
    write_snapshots_to_file (massif_out_file, snapshots, next_snapshot_i);
    VG_(free)(massif_out_file);
 }
 
-static void handle_snapshot_monitor_command (Char *filename, Bool detailed)
+static void handle_snapshot_monitor_command (const HChar *filename,
+                                             Bool detailed)
 {
    Snapshot snapshot;
 
@@ -2403,17 +2404,17 @@
    clear_snapshot(&snapshot, /* do_sanity_check */ False);
    take_snapshot(&snapshot, Normal, get_time(), detailed);
    write_snapshots_to_file ((filename == NULL) ? 
-                            (Char*) "massif.vgdb.out" : filename,
+                            "massif.vgdb.out" : filename,
                             &snapshot,
                             1);
    delete_snapshot(&snapshot);
 }
 
-static Bool handle_gdb_monitor_command (ThreadId tid, Char *req)
+static Bool handle_gdb_monitor_command (ThreadId tid, HChar *req)
 {
-   Char* wcmd;
-   Char s[VG_(strlen(req))]; /* copy for strtok_r */
-   Char *ssaveptr;
+   HChar* wcmd;
+   HChar s[VG_(strlen(req))]; /* copy for strtok_r */
+   HChar *ssaveptr;
 
    VG_(strcpy) (s, req);
 
@@ -2428,13 +2429,13 @@
       print_monitor_help();
       return True;
    case  1: { /* snapshot */
-      Char* filename;
+      HChar* filename;
       filename = VG_(strtok_r) (NULL, " ", &ssaveptr);
       handle_snapshot_monitor_command (filename, False /* detailed */);
       return True;
    }
    case  2: { /* detailed_snapshot */
-      Char* filename;
+      HChar* filename;
       filename = VG_(strtok_r) (NULL, " ", &ssaveptr);
       handle_snapshot_monitor_command (filename, True /* detailed */);
       return True;
@@ -2488,9 +2489,9 @@
 static void ms_post_clo_init(void)
 {
    Int i;
-   Char* LD_PRELOAD_val;
-   Char* s;
-   Char* s2;
+   HChar* LD_PRELOAD_val;
+   HChar* s;
+   HChar* s2;
 
    // Check options.
    if (clo_pages_as_heap) {
@@ -2512,7 +2513,7 @@
    if (clo_pages_as_heap) {
       clo_heap_admin = 0;     // No heap admin on pages.
 
-      LD_PRELOAD_val = VG_(getenv)( (Char*)VG_(LD_PRELOAD_var_name) );
+      LD_PRELOAD_val = VG_(getenv)( VG_(LD_PRELOAD_var_name) );
       tl_assert(LD_PRELOAD_val);
 
       // Make sure the vgpreload_core-$PLATFORM entry is there, for sanity.
@@ -2540,7 +2541,7 @@
    if (VG_(clo_verbosity) > 1) {
       VERB(1, "alloc-fns:\n");
       for (i = 0; i < VG_(sizeXA)(alloc_fns); i++) {
-         Char** fn_ptr = VG_(indexXA)(alloc_fns, i);
+         HChar** fn_ptr = VG_(indexXA)(alloc_fns, i);
          VERB(1, "  %s\n", *fn_ptr);
       }
 
@@ -2549,7 +2550,7 @@
          VERB(1, "  <empty>\n");
       }
       for (i = 0; i < VG_(sizeXA)(ignore_fns); i++) {
-         Char** fn_ptr = VG_(indexXA)(ignore_fns, i);
+         HChar** fn_ptr = VG_(indexXA)(ignore_fns, i);
          VERB(1, "  %d: %s\n", i, *fn_ptr);
       }
    }
diff --git a/memcheck/mc_errors.c b/memcheck/mc_errors.c
index bbbc56b..b140b16 100644
--- a/memcheck/mc_errors.c
+++ b/memcheck/mc_errors.c
@@ -108,7 +108,7 @@
       // In a global .data symbol.  This holds the first 127 chars of
       // the variable's name (zero terminated), plus a (memory) offset.
       struct {
-         Char     name[128];
+         HChar    name[128];
          PtrdiffT offset;
       } DataSym;
 
@@ -121,7 +121,7 @@
       // Could only narrow it down to be the PLT/GOT/etc of a given
       // object.  Better than nothing, perhaps.
       struct {
-         Char       objname[128];
+         HChar      objname[128];
          VgSectKind kind;
       } SectKind;
 
@@ -1411,7 +1411,7 @@
    } 
    MC_SuppKind;
 
-Bool MC_(is_recognised_suppression) ( Char* name, Supp* su )
+Bool MC_(is_recognised_suppression) ( const HChar* name, Supp* su )
 {
    SuppKind skind;
 
@@ -1442,7 +1442,7 @@
    return True;
 }
 
-Bool MC_(read_extra_suppression_info) ( Int fd, Char** bufpp,
+Bool MC_(read_extra_suppression_info) ( Int fd, HChar** bufpp,
                                         SizeT* nBufp, Supp *su )
 {
    Bool eof;
diff --git a/memcheck/mc_include.h b/memcheck/mc_include.h
index 52ae577..797dce2 100644
--- a/memcheck/mc_include.h
+++ b/memcheck/mc_include.h
@@ -372,9 +372,9 @@
 void MC_(pp_Error)           ( Error* err );
 UInt MC_(update_Error_extra) ( Error* err );
 
-Bool MC_(is_recognised_suppression) ( Char* name, Supp* su );
+Bool MC_(is_recognised_suppression) ( const HChar* name, Supp* su );
 
-Bool MC_(read_extra_suppression_info) ( Int fd, Char** buf,
+Bool MC_(read_extra_suppression_info) ( Int fd, HChar** buf,
                                         SizeT* nBuf, Supp *su );
 
 Bool MC_(error_matches_suppression) ( Error* err, Supp* su );
diff --git a/memcheck/mc_leakcheck.c b/memcheck/mc_leakcheck.c
index 1e3a376..e848291 100644
--- a/memcheck/mc_leakcheck.c
+++ b/memcheck/mc_leakcheck.c
@@ -1116,8 +1116,8 @@
    }
 
    if (VG_(clo_verbosity) > 0 && !VG_(clo_xml)) {
-      char d_bytes[20];
-      char d_blocks[20];
+      HChar d_bytes[20];
+      HChar d_blocks[20];
 
       VG_(umsg)("LEAK SUMMARY:\n");
       VG_(umsg)("   definitely lost: %'lu%s bytes in %'lu%s blocks\n",
diff --git a/memcheck/mc_main.c b/memcheck/mc_main.c
index 8d3455e..812c613 100644
--- a/memcheck/mc_main.c
+++ b/memcheck/mc_main.c
@@ -410,7 +410,7 @@
    non-distinguished secondary maps referred to from the auxiliary
    primary maps. */
 
-static HChar* check_auxmap_L1_L2_sanity ( Word* n_secmaps_found )
+static const HChar* check_auxmap_L1_L2_sanity ( Word* n_secmaps_found )
 {
    Word i, j;
    /* On a 32-bit platform, the L2 and L1 tables should
@@ -1082,7 +1082,7 @@
 
 /* Parse two Addr separated by a dash, or fail. */
 
-static Bool parse_range ( UChar** ppc, Addr* result1, Addr* result2 )
+static Bool parse_range ( const HChar** ppc, Addr* result1, Addr* result2 )
 {
    Bool ok = VG_(parse_Addr) (ppc, result1);
    if (!ok)
@@ -1099,12 +1099,12 @@
 /* Parse a set of ranges separated by commas into 'ignoreRanges', or
    fail. */
 
-static Bool parse_ignore_ranges ( UChar* str0 )
+static Bool parse_ignore_ranges ( const HChar* str0 )
 {
    Addr start, end;
    Bool ok;
-   UChar*  str = str0;
-   UChar** ppc = &str;
+   const HChar*  str = str0;
+   const HChar** ppc = &str;
    ignoreRanges.used = 0;
    while (1) {
       ok = parse_range(ppc, &start, &end);
@@ -4733,7 +4733,7 @@
    Int     i;
    Word    n_secmaps_found;
    SecMap* sm;
-   HChar*  errmsg;
+   const HChar*  errmsg;
    Bool    bad = False;
 
    if (0) VG_(printf)("expensive sanity check\n");
@@ -4837,9 +4837,9 @@
 Int           MC_(clo_free_fill)              = -1;
 Int           MC_(clo_mc_level)               = 2;
 
-static Bool mc_process_cmd_line_options(Char* arg)
+static Bool mc_process_cmd_line_options(const HChar* arg)
 {
-   Char* tmp_str;
+   const HChar* tmp_str;
 
    tl_assert( MC_(clo_mc_level) >= 1 && MC_(clo_mc_level) <= 3 );
 
@@ -5098,11 +5098,11 @@
 }
 
 /* return True if request recognised, False otherwise */
-static Bool handle_gdb_monitor_command (ThreadId tid, Char *req)
+static Bool handle_gdb_monitor_command (ThreadId tid, HChar *req)
 {
-   Char* wcmd;
-   Char s[VG_(strlen(req))]; /* copy for strtok_r */
-   Char *ssaveptr;
+   HChar* wcmd;
+   HChar s[VG_(strlen(req))]; /* copy for strtok_r */
+   HChar *ssaveptr;
 
    VG_(strcpy) (s, req);
 
@@ -5160,7 +5160,7 @@
    case  2: { /* leak_check */
       Int err = 0;
       LeakCheckParams lcp;
-      Char* kw;
+      HChar* kw;
       
       lcp.mode               = LC_Full;
       lcp.show_reachable     = False;
@@ -5202,15 +5202,15 @@
          case  8: /* unlimited */
             lcp.max_loss_records_output = 999999999; break;
          case  9: { /* limited */
-            int int_value;
-            char* endptr;
+            Int int_value;
+            HChar* endptr;
 
             wcmd = VG_(strtok_r) (NULL, " ", &ssaveptr);
             if (wcmd == NULL) {
                int_value = 0;
                endptr = "empty"; /* to report an error below */
             } else {
-               int_value = VG_(strtoll10) (wcmd, (Char **)&endptr);
+               int_value = VG_(strtoll10) (wcmd, &endptr);
             }
             if (*endptr != '\0')
                VG_(gdb_printf) ("missing or malformed integer value\n");
@@ -5233,7 +5233,7 @@
    case  3: { /* make_memory */
       Addr address;
       SizeT szB = 1;
-      int kwdid = VG_(keyword_id) 
+      Int kwdid = VG_(keyword_id) 
          ("noaccess undefined defined Definedifaddressable",
           VG_(strtok_r) (NULL, " ", &ssaveptr), kwd_report_all);
       VG_(strtok_get_address_and_size) (&address, &szB, &ssaveptr);
@@ -5256,13 +5256,13 @@
       SizeT szB = 1;
       Addr bad_addr;
       UInt okind;
-      char* src;
+      HChar* src;
       UInt otag;
       UInt ecu;
       ExeContext* origin_ec;
       MC_ReadResult res;
 
-      int kwdid = VG_(keyword_id) 
+      Int kwdid = VG_(keyword_id) 
          ("addressable defined",
           VG_(strtok_r) (NULL, " ", &ssaveptr), kwd_report_all);
       VG_(strtok_get_address_and_size) (&address, &szB, &ssaveptr);
@@ -5319,8 +5319,8 @@
    }
 
    case  5: { /* block_list */
-      Char* wl;
-      Char *endptr;
+      HChar* wl;
+      HChar *endptr;
       UInt lr_nr = 0;
       wl = VG_(strtok_r) (NULL, " ", &ssaveptr);
       lr_nr = VG_(strtoull10) (wl, &endptr);
@@ -5481,7 +5481,7 @@
             /* VG_(printf)("allocated %d %p\n", i, cgbs); */
             cgbs[i].start = arg[1];
             cgbs[i].size  = arg[2];
-            cgbs[i].desc  = (HChar *)VG_(strdup)("mc.mhcr.1", (Char *)arg[3]);
+            cgbs[i].desc  = VG_(strdup)("mc.mhcr.1", (HChar *)arg[3]);
             cgbs[i].where = VG_(record_ExeContext) ( tid, 0/*first_ip_delta*/ );
             *ret = i;
          } else
@@ -5578,7 +5578,7 @@
       }
 
       case _VG_USERREQ__MEMCHECK_RECORD_OVERLAP_ERROR: {
-         Char* s   = (Char*)arg[1];
+         HChar* s  = (HChar*)arg[1];
          Addr  dst = (Addr) arg[2];
          Addr  src = (Addr) arg[3];
          SizeT len = (SizeT)arg[4];
@@ -5654,7 +5654,7 @@
       }
 
       case VG_USERREQ__GDB_MONITOR_COMMAND: {
-         Bool handled = handle_gdb_monitor_command (tid, (Char*)arg[1]);
+         Bool handled = handle_gdb_monitor_command (tid, (HChar*)arg[1]);
          if (handled)
             *ret = 1;
          else
@@ -6131,7 +6131,7 @@
       VG_(track_pre_reg_read) ( mc_pre_reg_read );
 }
 
-static void print_SM_info(char* type, int n_SMs)
+static void print_SM_info(const HChar* type, Int n_SMs)
 {
    VG_(message)(Vg_DebugMsg,
       " memcheck: SMs: %s = %d (%ldk, %ldM)\n",
diff --git a/memcheck/tests/unit_libcbase.c b/memcheck/tests/unit_libcbase.c
index e90a8e2..0b5777e 100644
--- a/memcheck/tests/unit_libcbase.c
+++ b/memcheck/tests/unit_libcbase.c
@@ -342,8 +342,8 @@
       // Nb: We test the results against strtoll() as well.
       int i;
       for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) {
-         Char* endptr1;
-         char* endptr2;
+         HChar* endptr1;
+         HChar* endptr2;
          Long      res1 = VG_(strtoll10)(a[i].str, &endptr1);
          long long res2 =     strtoll   (a[i].str, &endptr2, 10);
          //printf("res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1);
@@ -397,8 +397,8 @@
       // Nb: We test the results against strtoll() as well.
       int i;
       for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) {
-         Char* endptr1;
-         char* endptr2;
+         HChar* endptr1;
+         HChar* endptr2;
          Long      res1 = VG_(strtoll16)(a[i].str, &endptr1);
          long long res2 =     strtoll   (a[i].str, &endptr2, 16);
          //printf("  res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1);