Cheng Shao pushed to branch wip/ubsan at Glasgow Haskell Compiler / GHC

Commits:

1 changed file:

Changes:

  • rts/Interpreter.c
    ... ... @@ -2904,6 +2904,8 @@ run_BCO:
    2904 2904
             NEXT_INSTRUCTION;                                              \
    
    2905 2905
         }
    
    2906 2906
     
    
    2907
    +#define TYPE_IS_SIGNED(ty) ((ty)-1 < (ty)1)
    
    2908
    +
    
    2907 2909
     // op :: ty -> ty -> ty
    
    2908 2910
     #define SIZED_BIN_OP(op,ty)                                                     \
    
    2909 2911
             {                                                                       \
    
    ... ... @@ -2911,8 +2913,12 @@ run_BCO:
    2911 2913
                     ty r = ((ty) ReadSpW64(0)) op ((ty) ReadSpW64(1));                  \
    
    2912 2914
                     Sp_addW64(1);                                                   \
    
    2913 2915
                     SpW64(0) = (StgWord64) r;                                       \
    
    2916
    +            } else if (TYPE_IS_SIGNED(ty)) {                                    \
    
    2917
    +                ty r = ((StgInt)(ty)ReadSpW(0)) op ((StgInt)(ty)ReadSpW(1));    \
    
    2918
    +                Sp_addW(1);                                                     \
    
    2919
    +                SpW(0) = (StgWord) r;                                           \
    
    2914 2920
                 } else {                                                            \
    
    2915
    -                ty r = ((ty) ReadSpW(0)) op ((ty) ReadSpW(1));                  \
    
    2921
    +                ty r = ((StgWord)(ty)ReadSpW(0)) op ((StgWord)(ty)ReadSpW(1));  \
    
    2916 2922
                     Sp_addW(1);                                                     \
    
    2917 2923
                     SpW(0) = (StgWord) r;                                           \
    
    2918 2924
                 };                                                                  \
    
    ... ... @@ -2949,12 +2955,12 @@ run_BCO:
    2949 2955
         NEXT_INSTRUCTION;                                                      \
    
    2950 2956
     }
    
    2951 2957
     
    
    2952
    -        INSTRUCTION(bci_OP_ADD_64): SIZED_BIN_OP(+, StgInt64)
    
    2953
    -        INSTRUCTION(bci_OP_SUB_64): SIZED_BIN_OP(-, StgInt64)
    
    2954
    -        INSTRUCTION(bci_OP_AND_64): SIZED_BIN_OP(&, StgInt64)
    
    2955
    -        INSTRUCTION(bci_OP_XOR_64): SIZED_BIN_OP(^, StgInt64)
    
    2956
    -        INSTRUCTION(bci_OP_OR_64):  SIZED_BIN_OP(|, StgInt64)
    
    2957
    -        INSTRUCTION(bci_OP_MUL_64): SIZED_BIN_OP(*, StgInt64)
    
    2958
    +        INSTRUCTION(bci_OP_ADD_64): SIZED_BIN_OP(+, StgWord64)
    
    2959
    +        INSTRUCTION(bci_OP_SUB_64): SIZED_BIN_OP(-, StgWord64)
    
    2960
    +        INSTRUCTION(bci_OP_AND_64): SIZED_BIN_OP(&, StgWord64)
    
    2961
    +        INSTRUCTION(bci_OP_XOR_64): SIZED_BIN_OP(^, StgWord64)
    
    2962
    +        INSTRUCTION(bci_OP_OR_64):  SIZED_BIN_OP(|, StgWord64)
    
    2963
    +        INSTRUCTION(bci_OP_MUL_64): SIZED_BIN_OP(*, StgWord64)
    
    2958 2964
             INSTRUCTION(bci_OP_SHL_64): SIZED_BIN_OP_TY_INT(<<, StgWord64)
    
    2959 2965
             INSTRUCTION(bci_OP_LSR_64): SIZED_BIN_OP_TY_INT(>>, StgWord64)
    
    2960 2966
             INSTRUCTION(bci_OP_ASR_64): SIZED_BIN_OP_TY_INT(>>, StgInt64)
    
    ... ... @@ -2972,15 +2978,15 @@ run_BCO:
    2972 2978
             INSTRUCTION(bci_OP_S_LE_64): SIZED_BIN_OP_TY_TY_INT(<=, StgInt64)
    
    2973 2979
     
    
    2974 2980
             INSTRUCTION(bci_OP_NOT_64): UN_SIZED_OP(~, StgWord64)
    
    2975
    -        INSTRUCTION(bci_OP_NEG_64): UN_SIZED_OP(-, StgInt64)
    
    2981
    +        INSTRUCTION(bci_OP_NEG_64): UN_SIZED_OP(-, StgWord64)
    
    2976 2982
     
    
    2977 2983
     
    
    2978
    -        INSTRUCTION(bci_OP_ADD_32): SIZED_BIN_OP(+, StgInt32)
    
    2979
    -        INSTRUCTION(bci_OP_SUB_32): SIZED_BIN_OP(-, StgInt32)
    
    2980
    -        INSTRUCTION(bci_OP_AND_32): SIZED_BIN_OP(&, StgInt32)
    
    2981
    -        INSTRUCTION(bci_OP_XOR_32): SIZED_BIN_OP(^, StgInt32)
    
    2982
    -        INSTRUCTION(bci_OP_OR_32):  SIZED_BIN_OP(|, StgInt32)
    
    2983
    -        INSTRUCTION(bci_OP_MUL_32): SIZED_BIN_OP(*, StgInt32)
    
    2984
    +        INSTRUCTION(bci_OP_ADD_32): SIZED_BIN_OP(+, StgWord32)
    
    2985
    +        INSTRUCTION(bci_OP_SUB_32): SIZED_BIN_OP(-, StgWord32)
    
    2986
    +        INSTRUCTION(bci_OP_AND_32): SIZED_BIN_OP(&, StgWord32)
    
    2987
    +        INSTRUCTION(bci_OP_XOR_32): SIZED_BIN_OP(^, StgWord32)
    
    2988
    +        INSTRUCTION(bci_OP_OR_32):  SIZED_BIN_OP(|, StgWord32)
    
    2989
    +        INSTRUCTION(bci_OP_MUL_32): SIZED_BIN_OP(*, StgWord32)
    
    2984 2990
             INSTRUCTION(bci_OP_SHL_32): SIZED_BIN_OP_TY_INT(<<, StgWord32)
    
    2985 2991
             INSTRUCTION(bci_OP_LSR_32): SIZED_BIN_OP_TY_INT(>>, StgWord32)
    
    2986 2992
             INSTRUCTION(bci_OP_ASR_32): SIZED_BIN_OP_TY_INT(>>, StgInt32)
    
    ... ... @@ -2998,15 +3004,15 @@ run_BCO:
    2998 3004
             INSTRUCTION(bci_OP_S_LE_32): SIZED_BIN_OP_TY_TY_INT(<=, StgInt32)
    
    2999 3005
     
    
    3000 3006
             INSTRUCTION(bci_OP_NOT_32): UN_SIZED_OP(~, StgWord32)
    
    3001
    -        INSTRUCTION(bci_OP_NEG_32): UN_SIZED_OP(-, StgInt32)
    
    3007
    +        INSTRUCTION(bci_OP_NEG_32): UN_SIZED_OP(-, StgWord32)
    
    3002 3008
     
    
    3003 3009
     
    
    3004
    -        INSTRUCTION(bci_OP_ADD_16): SIZED_BIN_OP(+, StgInt16)
    
    3005
    -        INSTRUCTION(bci_OP_SUB_16): SIZED_BIN_OP(-, StgInt16)
    
    3006
    -        INSTRUCTION(bci_OP_AND_16): SIZED_BIN_OP(&, StgInt16)
    
    3007
    -        INSTRUCTION(bci_OP_XOR_16): SIZED_BIN_OP(^, StgInt16)
    
    3008
    -        INSTRUCTION(bci_OP_OR_16):  SIZED_BIN_OP(|, StgInt16)
    
    3009
    -        INSTRUCTION(bci_OP_MUL_16): SIZED_BIN_OP(*, StgInt16)
    
    3010
    +        INSTRUCTION(bci_OP_ADD_16): SIZED_BIN_OP(+, StgWord16)
    
    3011
    +        INSTRUCTION(bci_OP_SUB_16): SIZED_BIN_OP(-, StgWord16)
    
    3012
    +        INSTRUCTION(bci_OP_AND_16): SIZED_BIN_OP(&, StgWord16)
    
    3013
    +        INSTRUCTION(bci_OP_XOR_16): SIZED_BIN_OP(^, StgWord16)
    
    3014
    +        INSTRUCTION(bci_OP_OR_16):  SIZED_BIN_OP(|, StgWord16)
    
    3015
    +        INSTRUCTION(bci_OP_MUL_16): SIZED_BIN_OP(*, StgWord16)
    
    3010 3016
             INSTRUCTION(bci_OP_SHL_16): SIZED_BIN_OP_TY_INT(<<, StgWord16)
    
    3011 3017
             INSTRUCTION(bci_OP_LSR_16): SIZED_BIN_OP_TY_INT(>>, StgWord16)
    
    3012 3018
             INSTRUCTION(bci_OP_ASR_16): SIZED_BIN_OP_TY_INT(>>, StgInt16)
    
    ... ... @@ -3024,15 +3030,15 @@ run_BCO:
    3024 3030
             INSTRUCTION(bci_OP_S_LE_16): SIZED_BIN_OP(<=, StgInt16)
    
    3025 3031
     
    
    3026 3032
             INSTRUCTION(bci_OP_NOT_16): UN_SIZED_OP(~, StgWord16)
    
    3027
    -        INSTRUCTION(bci_OP_NEG_16): UN_SIZED_OP(-, StgInt16)
    
    3033
    +        INSTRUCTION(bci_OP_NEG_16): UN_SIZED_OP(-, StgWord16)
    
    3028 3034
     
    
    3029 3035
     
    
    3030
    -        INSTRUCTION(bci_OP_ADD_08): SIZED_BIN_OP(+, StgInt8)
    
    3031
    -        INSTRUCTION(bci_OP_SUB_08): SIZED_BIN_OP(-, StgInt8)
    
    3032
    -        INSTRUCTION(bci_OP_AND_08): SIZED_BIN_OP(&, StgInt8)
    
    3033
    -        INSTRUCTION(bci_OP_XOR_08): SIZED_BIN_OP(^, StgInt8)
    
    3034
    -        INSTRUCTION(bci_OP_OR_08):  SIZED_BIN_OP(|, StgInt8)
    
    3035
    -        INSTRUCTION(bci_OP_MUL_08): SIZED_BIN_OP(*, StgInt8)
    
    3036
    +        INSTRUCTION(bci_OP_ADD_08): SIZED_BIN_OP(+, StgWord8)
    
    3037
    +        INSTRUCTION(bci_OP_SUB_08): SIZED_BIN_OP(-, StgWord8)
    
    3038
    +        INSTRUCTION(bci_OP_AND_08): SIZED_BIN_OP(&, StgWord8)
    
    3039
    +        INSTRUCTION(bci_OP_XOR_08): SIZED_BIN_OP(^, StgWord8)
    
    3040
    +        INSTRUCTION(bci_OP_OR_08):  SIZED_BIN_OP(|, StgWord8)
    
    3041
    +        INSTRUCTION(bci_OP_MUL_08): SIZED_BIN_OP(*, StgWord8)
    
    3036 3042
             INSTRUCTION(bci_OP_SHL_08): SIZED_BIN_OP_TY_INT(<<, StgWord8)
    
    3037 3043
             INSTRUCTION(bci_OP_LSR_08): SIZED_BIN_OP_TY_INT(>>, StgWord8)
    
    3038 3044
             INSTRUCTION(bci_OP_ASR_08): SIZED_BIN_OP_TY_INT(>>, StgInt8)
    
    ... ... @@ -3050,7 +3056,7 @@ run_BCO:
    3050 3056
             INSTRUCTION(bci_OP_S_LE_08): SIZED_BIN_OP_TY_TY_INT(<=, StgInt8)
    
    3051 3057
     
    
    3052 3058
             INSTRUCTION(bci_OP_NOT_08): UN_SIZED_OP(~, StgWord8)
    
    3053
    -        INSTRUCTION(bci_OP_NEG_08): UN_SIZED_OP(-, StgInt8)
    
    3059
    +        INSTRUCTION(bci_OP_NEG_08): UN_SIZED_OP(-, StgWord8)
    
    3054 3060
     
    
    3055 3061
             INSTRUCTION(bci_OP_INDEX_ADDR_64):
    
    3056 3062
             {