Skip to content

Commit

Permalink
Improve compressed point bit manipulation
Browse files Browse the repository at this point in the history
gcc/rust/ChangeLog:

	* checks/errors/borrowck/polonius/rust-polonius.h (struct FullPoint):
	Added comments and made extraction of statement more verbose for
	better understanding.
	* checks/errors/borrowck/ffi-polonius/src/lib.rs: Likewise.

Signed-off-by: Kushal Pal <[email protected]>
  • Loading branch information
braw-lee authored and P-E-P committed Jul 31, 2024
1 parent a395a81 commit d6a7e71
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 3 deletions.
17 changes: 16 additions & 1 deletion gcc/rust/checks/errors/borrowck/ffi-polonius/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,24 @@ impl From<gccrs_ffi::FactsView> for AllFacts<GccrsFacts> {

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);
}

Expand Down
21 changes: 19 additions & 2 deletions gcc/rust/checks/errors/borrowck/polonius/rust-polonius.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)),
Expand All @@ -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; }

Expand Down

0 comments on commit d6a7e71

Please sign in to comment.