diff --git a/gcc/rust/checks/errors/borrowck/ffi-polonius/src/lib.rs b/gcc/rust/checks/errors/borrowck/ffi-polonius/src/lib.rs index e254238bc4c5..a54e9421912e 100644 --- a/gcc/rust/checks/errors/borrowck/ffi-polonius/src/lib.rs +++ b/gcc/rust/checks/errors/borrowck/ffi-polonius/src/lib.rs @@ -105,9 +105,24 @@ impl From for AllFacts { fn print_point(point: GccrsAtom) { let val: usize = point.into(); + // Point is a 32 bit unsigned integer + // 16 15 1 + // xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxx x + // ^~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~~ ^ + // | | | + // basic_block | start/mid + // statement + // the left most 16 bits store the basic block number + // the right most bit, represents the start/mid status + // the remaining 15 bits between these two represent the statement let mid = val % 2 == 1; let bb = val >> 16; - let stmt = (val >> 1) & ((1 << 15) - 1); + // firstly we can get rid of right most bit by performing left shift once + let hide_left_most_bit = val >> 1; + // now we only need the 15 bits on the right + // we can mask the remaining bits by performing bitwise AND with fifteen + // 1's which in hexadecimal is 0x7FFF + let stmt = hide_left_most_bit & 0x7FFF; eprint!("{}(bb{}[{}])", if mid { "Mid" } else { "Start" }, bb, stmt); } diff --git a/gcc/rust/checks/errors/borrowck/polonius/rust-polonius.h b/gcc/rust/checks/errors/borrowck/polonius/rust-polonius.h index 71dbf46f6da1..aaa18e451695 100644 --- a/gcc/rust/checks/errors/borrowck/polonius/rust-polonius.h +++ b/gcc/rust/checks/errors/borrowck/polonius/rust-polonius.h @@ -35,7 +35,7 @@ struct FullPoint bool mid; /** Expands a compressed `Point` into its components. - * See `Point` docs for encoding details. + * See `Point` docs for encoding details in ./rust-polonius-ffi.h */ explicit FullPoint (Point point) : bb (extract_bb (point)), stmt (extract_stmt (point)), @@ -45,7 +45,24 @@ struct FullPoint static uint32_t extract_bb (Point point) { return point >> 16; } static uint32_t extract_stmt (Point point) { - return (point >> 1) & ((1 << 15) - 1); + // Point is a 32 bit unsigned integer + // 16 15 1 + // xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxx x + // ^~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~~ ^ + // | | | + // basic_block | start/mid + // statement + // the left most 16 bits store the basic block number + // the right most bit, represents the start/mid status + // the remaining 15 bits between these two represent the statement number + // which we need to extract in this fucntion + // + // firstly we can get rid of right most bit by performing left shift once + auto hide_left_most_bit = point >> 1; + // now we only need the 15 bits on the right + // we can mask the remaining bits by performing bitwise AND with fifteen + // 1's which in hexadecimal is 0x7FFF + return hide_left_most_bit & 0x7FFF; } static bool extract_mid (Point point) { return point & 1; }