@@ -6,13 +6,15 @@ type abi = {
6
6
crate_ty : Llvm .lltype ;
7
7
task_ty : Llvm .lltype ;
8
8
word_ty : Llvm .lltype ;
9
+ tydesc_ty : Llvm .lltype ;
9
10
rust_start : Llvm .llvalue ;
10
11
};;
11
12
12
13
let declare_abi (llctx :Llvm.llcontext ) (llmod :Llvm.llmodule ) : abi =
13
14
let i32 = Llvm. i32_type llctx in
14
15
(* FIXME: Use Llvm_target.intptr_type for more platform support. *)
15
16
let word_ty = i32 in
17
+ let p ty = Llvm. pointer_type ty in
16
18
17
19
let crate_ty =
18
20
(* TODO: other architectures besides x86 *)
@@ -53,6 +55,27 @@ let declare_abi (llctx:Llvm.llcontext) (llmod:Llvm.llmodule) : abi =
53
55
in
54
56
ignore (Llvm. define_type_name " rust_task" task_ty llmod);
55
57
58
+ (* This is the type_desc struct in rust_internal.h *)
59
+ let tydesc_ty =
60
+ (* TODO: other architectures besides x86 *)
61
+ let tydesc_opaque_ty = Llvm. opaque_type llctx in
62
+ let tydesc_tyhandle = Llvm. handle_to_type (Llvm. struct_type llctx [|
63
+ p (p tydesc_opaque_ty); (* const type_desc **first_param *)
64
+ word_ty; (* size_t size *)
65
+ word_ty; (* size_t align *)
66
+ word_ty; (* uintptr_t copy_glue_off *)
67
+ word_ty; (* uintptr_t drop_glue_off *)
68
+ word_ty; (* uintptr_t free_glue_off *)
69
+ word_ty; (* uintptr_t sever_glue_off *)
70
+ word_ty; (* uintptr_t mark_glue_off *)
71
+ word_ty; (* uintptr_t obj_drop_glue_off *)
72
+ |])
73
+ in
74
+ Llvm. refine_type tydesc_opaque_ty (Llvm. type_of_handle tydesc_tyhandle);
75
+ Llvm. type_of_handle tydesc_tyhandle
76
+ in
77
+ ignore (Llvm. define_type_name " type_desc" tydesc_ty llmod);
78
+
56
79
let rust_start_ty =
57
80
(* Rust's main function can have several types, so we cast them
58
81
all to uintptr_t. *)
@@ -64,6 +87,7 @@ let declare_abi (llctx:Llvm.llcontext) (llmod:Llvm.llmodule) : abi =
64
87
crate_ty = crate_ty;
65
88
task_ty = task_ty;
66
89
word_ty = word_ty;
90
+ tydesc_ty = tydesc_ty;
67
91
rust_start = Llvm. declare_function " rust_start" rust_start_ty llmod
68
92
}
69
93
;;
0 commit comments