Is there a way to disable struct to integer?

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Is there a way to disable struct to integer?

Mark S. Baranowski
Hello,

I am working on a verifier for Rust, based on the generated LLVM code. I
am having an issue with code generated similar to the following

struct Point {
   pub x: u32,
   pub y: u32
}
fn double_point(p: Point) -> Point {
   Point { x: 2*p.x, y: 2*p.y }
}
fn main() {
   let p = Point { x: 2, y: 3 };
   let q = double_point(p);
   assert!(q.x == 4 && q.y == 6);
}

The call to the double_point function is what causes the issue, as shown
in the following generated llvm-ir code

%8 = bitcast %Point* %arg to i64*
%9 = load i64, i64* %8, align 4
%10 = call i64 @_ZN5point12double_point17h4b5ca79567fdc22dE(i64 %9)
store i64 %10, i64* %abi_cast

In the verifier's default mode, reads from the i64 don't work correctly,
giving an assertion violation. This code works if the Point structure
uses 64-bit ints instead, since no packing occurs.

My question is: is there is a way to prevent the compiler from
bit-casting the structure to an integer? I am using a December 2016
nightly compiler, and have tried disabling all optimizations.

Thanks,

Mark

_______________________________________________
Rust-dev mailing list
[hidden email]
https://mail.mozilla.org/listinfo/rust-dev
Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to disable struct to integer?

Malte Schütze
Hi Mark,

this list has been dead for a while now. You are probably looking for
https://users.rust-lang.org/ or https://internals.rust-lang.org/

- µ

Am 22/01/2018 um 21:42 schrieb Mark S. Baranowski:

> Hello,
>
> I am working on a verifier for Rust, based on the generated LLVM code. I
> am having an issue with code generated similar to the following
>
> struct Point {
>   pub x: u32,
>   pub y: u32
> }
> fn double_point(p: Point) -> Point {
>   Point { x: 2*p.x, y: 2*p.y }
> }
> fn main() {
>   let p = Point { x: 2, y: 3 };
>   let q = double_point(p);
>   assert!(q.x == 4 && q.y == 6);
> }
>
> The call to the double_point function is what causes the issue, as shown
> in the following generated llvm-ir code
>
> %8 = bitcast %Point* %arg to i64*
> %9 = load i64, i64* %8, align 4
> %10 = call i64 @_ZN5point12double_point17h4b5ca79567fdc22dE(i64 %9)
> store i64 %10, i64* %abi_cast
>
> In the verifier's default mode, reads from the i64 don't work correctly,
> giving an assertion violation. This code works if the Point structure
> uses 64-bit ints instead, since no packing occurs.
>
> My question is: is there is a way to prevent the compiler from
> bit-casting the structure to an integer? I am using a December 2016
> nightly compiler, and have tried disabling all optimizations.
>
> Thanks,
>
> Mark
>
> _______________________________________________
> Rust-dev mailing list
> [hidden email]
> https://mail.mozilla.org/listinfo/rust-dev

_______________________________________________
Rust-dev mailing list
[hidden email]
https://mail.mozilla.org/listinfo/rust-dev

signature.asc (836 bytes) Download Attachment