rustllvm: Add LLVMRustArrayType
LLVM internally uses `uint64_t` for array size, but the corresponding C API (`LLVMArrayType`) uses `unsigned int` so ths value is truncated. Therefore rustc generates wrong type for fixed-sized large vector e.g. `[0 x i8]` for `[0u8, ..(1 << 32)]`. This patch adds `LLVMRustArrayType` function for `uint64_t` support.
This commit is contained in:
parent
6878039c12
commit
9f7caed202
4 changed files with 21 additions and 4 deletions
|
@ -398,8 +398,7 @@ pub mod llvm {
|
||||||
pub fn LLVMIsPackedStruct(StructTy: TypeRef) -> Bool;
|
pub fn LLVMIsPackedStruct(StructTy: TypeRef) -> Bool;
|
||||||
|
|
||||||
/* Operations on array, pointer, and vector types (sequence types) */
|
/* Operations on array, pointer, and vector types (sequence types) */
|
||||||
pub fn LLVMArrayType(ElementType: TypeRef, ElementCount: c_uint)
|
pub fn LLVMRustArrayType(ElementType: TypeRef, ElementCount: u64) -> TypeRef;
|
||||||
-> TypeRef;
|
|
||||||
pub fn LLVMPointerType(ElementType: TypeRef, AddressSpace: c_uint)
|
pub fn LLVMPointerType(ElementType: TypeRef, AddressSpace: c_uint)
|
||||||
-> TypeRef;
|
-> TypeRef;
|
||||||
pub fn LLVMVectorType(ElementType: TypeRef, ElementCount: c_uint)
|
pub fn LLVMVectorType(ElementType: TypeRef, ElementCount: c_uint)
|
||||||
|
|
|
@ -207,7 +207,7 @@ impl Type {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn array(ty: &Type, len: u64) -> Type {
|
pub fn array(ty: &Type, len: u64) -> Type {
|
||||||
ty!(llvm::LLVMArrayType(ty.to_ref(), len as c_uint))
|
ty!(llvm::LLVMRustArrayType(ty.to_ref(), len))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn vector(ty: &Type, len: u64) -> Type {
|
pub fn vector(ty: &Type, len: u64) -> Type {
|
||||||
|
|
|
@ -754,3 +754,9 @@ LLVMRustGetSectionName(LLVMSectionIteratorRef SI, const char **ptr) {
|
||||||
*ptr = ret.data();
|
*ptr = ret.data();
|
||||||
return ret.size();
|
return ret.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LLVMArrayType function does not support 64-bit ElementCount
|
||||||
|
extern "C" LLVMTypeRef
|
||||||
|
LLVMRustArrayType(LLVMTypeRef ElementType, uint64_t ElementCount) {
|
||||||
|
return wrap(ArrayType::get(unwrap(ElementType), ElementCount));
|
||||||
|
}
|
||||||
|
|
|
@ -8,7 +8,19 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
use std::mem::size_of;
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
let x: [int, ..4] = [1, 2, 3, 4];
|
let x: [int, ..4] = [1, 2, 3, 4];
|
||||||
println!("{}", x[0]);
|
assert_eq!(x[0], 1);
|
||||||
|
assert_eq!(x[1], 2);
|
||||||
|
assert_eq!(x[2], 3);
|
||||||
|
assert_eq!(x[3], 4);
|
||||||
|
|
||||||
|
assert_eq!(size_of::<[u8, ..4]>(), 4u);
|
||||||
|
|
||||||
|
// FIXME #10183
|
||||||
|
if cfg!(target_word_size = "64") {
|
||||||
|
assert_eq!(size_of::<[u8, ..(1 << 32)]>(), (1u << 32));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue