I'm working on a proof-of-concept implementation for https://github.com/rust-lang/rfcs/pull/44 [Linker placement attribute], and I actually got code that is working, but the outcome is worse than I expected.
Consider the following snippet: #[unsafe_override_address] static Tinst : T = 1000; What it is expected to do is to create a '1000 as *T' with the semantics of T (the reasons for that are in RFC). My patch actually works as expected in this regard, I evaluate the expr as uint, and store a LLVMConstIntToPtr made from that uint in ccx.const_values. The results in the following IR: @Tinst = internal constant %struct.T* inttoptr (i32 1000 to %struct.T*) The problem is that llvm never inlines the constant (even with #[address_insignificant]), so instead of making the binary smaller as llvm can optimize integer addresses better (as it knows them) it makes the binary bigger, as it takes 4 bytes to store address value in .rodata, and two instructions to fetch it. Any ideas on what I could be missing? -- Sincerely, Vladimir "Farcaller" Pouzanov http://farcaller.net/
_______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
