Fix undefined behaviours when shifting.
Found by libubsan.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14913 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/callgrind/sim.c b/callgrind/sim.c
index fe1e81e..7478a32 100644
--- a/callgrind/sim.c
+++ b/callgrind/sim.c
@@ -183,8 +183,8 @@
    c->sets           = (c->size / c->line_size) / c->assoc;
    c->sets_min_1     = c->sets - 1;
    c->line_size_bits = VG_(log2)(c->line_size);
-   c->tag_shift      = c->line_size_bits + VG_(log2)(c->sets);
-   c->tag_mask       = ~((1<<c->tag_shift)-1);
+   c->tag_shift     = c->line_size_bits + VG_(log2)(c->sets);
+   c->tag_mask       = ~((1u<<c->tag_shift)-1);
 
    /* Can bits in tag entries be used for flags?
     * Should be always true as MIN_LINE_SIZE >= 16 */
@@ -650,7 +650,7 @@
     else {
 	int bytes_per_bit = c->line_size/32;
 	start_mask = 1;
-	end_mask   = 1 << 31;
+	end_mask   = 1u << 31;
 	for(i=0;i<c->line_size;i++) {
 	    c->line_start_mask[i] = start_val;
 	    c->line_end_mask[c->line_size-i-1] = end_val;
diff --git a/coregrind/m_debuginfo/readdwarf.c b/coregrind/m_debuginfo/readdwarf.c
index 66ffd93..d20748f 100644
--- a/coregrind/m_debuginfo/readdwarf.c
+++ b/coregrind/m_debuginfo/readdwarf.c
@@ -2534,12 +2534,13 @@
 
 static Long step_le_s_encoded_literal ( DiCursor* data, UInt size )
 {
-   Long s64 = step_le_u_encoded_literal( data, size );
+   ULong u64 = step_le_u_encoded_literal( data, size );
+   Long s64;
    switch (size) {
       case 8:  break;
-      case 4:  s64 <<= 32; s64 >>= 32; break;
-      case 2:  s64 <<= 48; s64 >>= 48; break;
-      case 1:  s64 <<= 56; s64 >>= 56; break;
+      case 4:  s64 = u64 << 32; s64 >>= 32; break;
+      case 2:  s64 = u64 << 48; s64 >>= 48; break;
+      case 1:  s64 = u64 << 56; s64 >>= 56; break;
       default: vg_assert(0); /*NOTREACHED*/ return 0;
    }
    return s64;
diff --git a/coregrind/m_gdbserver/target.c b/coregrind/m_gdbserver/target.c
index 4a738d2..68a450c 100644
--- a/coregrind/m_gdbserver/target.c
+++ b/coregrind/m_gdbserver/target.c
@@ -554,7 +554,7 @@
    static Bool getplatformoffset_called = False;
 
    static Bool lm_modid_offset_found = False;
-   static SizeT lm_modid_offset = 1<<31; // Rubbish initial value.
+   static SizeT lm_modid_offset = 1u << 31; // Rubbish initial value.
    // lm_modid_offset is a magic offset, retrieved using an external program.
 
    if (!getplatformoffset_called) {
diff --git a/memcheck/tests/vbit-test/Makefile.am b/memcheck/tests/vbit-test/Makefile.am
index db6f6f5..2884331 100644
--- a/memcheck/tests/vbit-test/Makefile.am
+++ b/memcheck/tests/vbit-test/Makefile.am
@@ -40,4 +40,4 @@
 vbit_test_CFLAGS       = $(AM_CFLAGS_PRI) -std=c99
 vbit_test_DEPENDENCIES = 
 vbit_test_LDADD        = 
-vbit_test_LDFLAGS      = $(AM_CFLAGS_PRI) -std=c99
+vbit_test_LDFLAGS      = $(AM_CFLAGS_PRI) -std=c99 -static-libubsan
diff --git a/memcheck/tests/vbit-test/vbits.c b/memcheck/tests/vbit-test/vbits.c
index 3182f8e..95c1adf 100644
--- a/memcheck/tests/vbit-test/vbits.c
+++ b/memcheck/tests/vbit-test/vbits.c
@@ -408,9 +408,11 @@
    vbits_t new = { .num_bits = v1.num_bits * 2 };
 
    switch (v1.num_bits) {
-   case 8:   new.bits.u16 = (v1.bits.u8 << 8)    | v2.bits.u8;  break;
-   case 16:  new.bits.u32 = (v1.bits.u16 << 16)  | v2.bits.u16; break;
-   case 32:  new.bits.u64 =  v1.bits.u32;
+   case 8:   new.bits.u16 = v1.bits.u8;
+             new.bits.u16 = (new.bits.u16 << 8)  | v2.bits.u8;  break;
+   case 16:  new.bits.u32 = v1.bits.u16;
+             new.bits.u32 = (new.bits.u32 << 16) | v2.bits.u16; break;
+   case 32:  new.bits.u64 = v1.bits.u32;
              new.bits.u64 = (new.bits.u64 << 32) | v2.bits.u32; break;
    case 64:
       if (__BYTE_ORDER == __LITTLE_ENDIAN) {