From 5902263d0af99fba3f286f589ac864ad9ccffc42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Steinbrink?= Date: Tue, 14 Jan 2014 18:01:24 +0100 Subject: [PATCH] Fix the representation of C void pointers in LLVM IR Currently, we have c_void defined to be represented as an empty struct, but LLVM expects C's void* to be represented as i8*. That means we currently generate code in which LLVM doesn't recognize malloc() and free() and can't apply certain optimization that would remove calls to those functions. --- src/libstd/libc.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/libstd/libc.rs b/src/libstd/libc.rs index ac4be8fec93..6b54a176e89 100644 --- a/src/libstd/libc.rs +++ b/src/libstd/libc.rs @@ -194,8 +194,19 @@ pub mod types { This type is only useful as a pointer target. Do not use it as a return type for FFI functions which have the `void` return type in C. Use the unit type `()` or omit the return type instead. + + For LLVM to recognize the void pointer type and by extension + functions like malloc(), we need to have it represented as i8* in + LLVM bitcode. The enum used here ensures this and prevents misuse + of the "raw" type by only having private variants.. We need two + variants, because the compiler complains about the repr attribute + otherwise. */ - pub enum c_void {} + #[repr(u8)] + pub enum c_void { + priv variant1, + priv variant2 + } pub enum FILE {} pub enum fpos_t {} }