Skip to content

Commit 3feaecd

Browse files
committed
intrinsics: Move the call to upcall_fail out of rust_intrinsic_cast
1 parent 44aebb9 commit 3feaecd

File tree

4 files changed

+12
-48
lines changed

4 files changed

+12
-48
lines changed

src/lib/unsafe.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,14 @@ Function: reinterpret_cast
1919
2020
Casts the value at `src` to U. The two types must have the same length.
2121
*/
22-
unsafe fn reinterpret_cast<T, U>(src: T) -> U { ret rusti::cast(src); }
22+
unsafe fn reinterpret_cast<T, U>(src: T) -> U {
23+
let t1 = sys::get_type_desc::<T>();
24+
let t2 = sys::get_type_desc::<U>();
25+
if (*t1).size != (*t2).size {
26+
fail "attempt to cast values of differing sizes";
27+
}
28+
ret rusti::cast(src);
29+
}
2330

2431
/*
2532
Function: leak

src/rt/intrinsics/intrinsics.cpp

+2-9
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66
#include <cstdlib>
77
#include <cstring>
88

9-
extern "C" CDECL void
10-
upcall_fail(char const *expr, char const *file, size_t line);
11-
129
extern "C" CDECL void
1310
port_recv(uintptr_t *dptr, rust_port *port);
1411

@@ -41,12 +38,8 @@ rust_intrinsic_cast(void *retptr,
4138
type_desc *t2,
4239
void *src)
4340
{
44-
if (t1->size != t2->size) {
45-
upcall_fail("attempt to cast values of differing sizes",
46-
__FILE__, __LINE__);
47-
return;
48-
}
49-
41+
// assert t1->size == t2->size
42+
// FIXME: This should be easily expressible in rust
5043
memmove(retptr, src, t1->size);
5144
}
5245

src/rt/intrinsics/intrinsics.i386.ll.in

+1-19
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ target triple = "@CFG_TARGET_TRIPLE@"
5757
%"struct.hash_map<int, rust_task *>::map_entry" = type opaque
5858
%class.circular_buffer = type { %class.rust_kernel*, i32, i32, i32, i32, i8* }
5959

60-
@.str = private unnamed_addr constant [42 x i8] c"attempt to cast values of differing sizes\00", align 1
61-
@.str1 = private unnamed_addr constant [33 x i8] c"src/rt/intrinsics/intrinsics.cpp\00", align 1
62-
6360
define void @rust_intrinsic_vec_len(i32* nocapture %retptr, i8* nocapture %env, %struct.type_desc* nocapture %ty, %struct.rust_vec** nocapture %vp) nounwind {
6461
%1 = load %struct.rust_vec** %vp, align 4, !tbaa !0
6562
%2 = getelementptr inbounds %struct.rust_vec* %1, i32 0, i32 0
@@ -80,28 +77,13 @@ define void @rust_intrinsic_ptr_offset(i8** nocapture %retptr, i8* nocapture %en
8077
ret void
8178
}
8279

83-
define void @rust_intrinsic_cast(i8* nocapture %retptr, i8* nocapture %env, %struct.type_desc* nocapture %t1, %struct.type_desc* nocapture %t2, i8* nocapture %src) {
80+
define void @rust_intrinsic_cast(i8* nocapture %retptr, i8* nocapture %env, %struct.type_desc* nocapture %t1, %struct.type_desc* nocapture %t2, i8* nocapture %src) nounwind {
8481
%1 = getelementptr inbounds %struct.type_desc* %t1, i32 0, i32 1
8582
%2 = load i32* %1, align 4, !tbaa !3
86-
%3 = getelementptr inbounds %struct.type_desc* %t2, i32 0, i32 1
87-
%4 = load i32* %3, align 4, !tbaa !3
88-
%5 = icmp eq i32 %2, %4
89-
br i1 %5, label %7, label %6
90-
91-
; <label>:6 ; preds = %0
92-
tail call void @upcall_fail(i8* getelementptr inbounds ([42 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([33 x i8]* @.str1, i32 0, i32 0), i32 46)
93-
br label %8
94-
95-
; <label>:7 ; preds = %0
9683
tail call void @llvm.memmove.p0i8.p0i8.i32(i8* %retptr, i8* %src, i32 %2, i32 1, i1 false)
97-
br label %8
98-
99-
; <label>:8 ; preds = %7, %6
10084
ret void
10185
}
10286

103-
declare void @upcall_fail(i8*, i8*, i32)
104-
10587
declare void @llvm.memmove.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind
10688

10789
define void @rust_intrinsic_addr_of(i8** nocapture %retptr, i8* nocapture %env, %struct.type_desc* nocapture %ty, i8* %valptr) nounwind {

src/rt/intrinsics/intrinsics.x86_64.ll.in

+1-19
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ target triple = "@CFG_TARGET_TRIPLE@"
5757
%"struct.hash_map<long, rust_task *>::map_entry" = type opaque
5858
%class.circular_buffer = type { %class.rust_kernel*, i64, i64, i64, i64, i8* }
5959

60-
@.str = private unnamed_addr constant [42 x i8] c"attempt to cast values of differing sizes\00", align 1
61-
@.str1 = private unnamed_addr constant [33 x i8] c"src/rt/intrinsics/intrinsics.cpp\00", align 1
62-
6360
define void @rust_intrinsic_vec_len(i64* nocapture %retptr, i8* nocapture %env, %struct.type_desc* nocapture %ty, %struct.rust_vec** nocapture %vp) nounwind uwtable {
6461
%1 = load %struct.rust_vec** %vp, align 8, !tbaa !0
6562
%2 = getelementptr inbounds %struct.rust_vec* %1, i64 0, i32 0
@@ -80,28 +77,13 @@ define void @rust_intrinsic_ptr_offset(i8** nocapture %retptr, i8* nocapture %en
8077
ret void
8178
}
8279

83-
define void @rust_intrinsic_cast(i8* nocapture %retptr, i8* nocapture %env, %struct.type_desc* nocapture %t1, %struct.type_desc* nocapture %t2, i8* nocapture %src) uwtable {
80+
define void @rust_intrinsic_cast(i8* nocapture %retptr, i8* nocapture %env, %struct.type_desc* nocapture %t1, %struct.type_desc* nocapture %t2, i8* nocapture %src) nounwind uwtable {
8481
%1 = getelementptr inbounds %struct.type_desc* %t1, i64 0, i32 1
8582
%2 = load i64* %1, align 8, !tbaa !3
86-
%3 = getelementptr inbounds %struct.type_desc* %t2, i64 0, i32 1
87-
%4 = load i64* %3, align 8, !tbaa !3
88-
%5 = icmp eq i64 %2, %4
89-
br i1 %5, label %7, label %6
90-
91-
; <label>:6 ; preds = %0
92-
tail call void @upcall_fail(i8* getelementptr inbounds ([42 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([33 x i8]* @.str1, i64 0, i64 0), i64 46)
93-
br label %8
94-
95-
; <label>:7 ; preds = %0
9683
tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %retptr, i8* %src, i64 %2, i32 1, i1 false)
97-
br label %8
98-
99-
; <label>:8 ; preds = %7, %6
10084
ret void
10185
}
10286

103-
declare void @upcall_fail(i8*, i8*, i64)
104-
10587
declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
10688

10789
define void @rust_intrinsic_addr_of(i8** nocapture %retptr, i8* nocapture %env, %struct.type_desc* nocapture %ty, i8* %valptr) nounwind uwtable {

0 commit comments

Comments
 (0)