@@ -387,6 +387,18 @@ CAMLprim LLVMTypeRef llvm_label_type(LLVMContextRef Context) {
387
387
return LLVMLabelTypeInContext (Context);
388
388
}
389
389
390
+ CAMLprim value llvm_type_by_name (LLVMModuleRef M, value Name)
391
+ {
392
+ CAMLparam1 (Name);
393
+ LLVMTypeRef Ty = LLVMGetTypeByName (M, String_val (Name));
394
+ if (Ty) {
395
+ value Option = alloc (1 , 0 );
396
+ Field (Option, 0 ) = (value) Ty;
397
+ CAMLreturn (Option);
398
+ }
399
+ CAMLreturn (Val_int (0 ));
400
+ }
401
+
390
402
/* ===-- VALUES ------------------------------------------------------------===*/
391
403
392
404
/* llvalue -> lltype */
@@ -1098,6 +1110,19 @@ CAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) {
1098
1110
DEFINE_ITERATORS (
1099
1111
block, BasicBlock, LLVMValueRef, LLVMBasicBlockRef, LLVMGetBasicBlockParent)
1100
1112
1113
+ /* llbasicblock -> llvalue option */
1114
+ CAMLprim value llvm_block_terminator(LLVMBasicBlockRef Block)
1115
+ {
1116
+ CAMLparam0 ();
1117
+ LLVMValueRef Term = LLVMGetBasicBlockTerminator (Block);
1118
+ if (Term) {
1119
+ value Option = alloc (1 , 0 );
1120
+ Field (Option, 0 ) = (value) Term;
1121
+ CAMLreturn (Option);
1122
+ }
1123
+ CAMLreturn (Val_int (0 ));
1124
+ }
1125
+
1101
1126
/* llvalue -> llbasicblock array */
1102
1127
CAMLprim value llvm_basic_blocks (LLVMValueRef Fn) {
1103
1128
value MLArray = alloc (LLVMCountBasicBlocks (Fn), 0 );
@@ -1232,6 +1257,11 @@ CAMLprim value llvm_incoming(LLVMValueRef PhiNode) {
1232
1257
CAMLreturn (Tl);
1233
1258
}
1234
1259
1260
+ /* llvalue -> unit */
1261
+ CAMLprim value llvm_delete_instruction (LLVMValueRef Instruction) {
1262
+ LLVMInstructionEraseFromParent (Instruction);
1263
+ return Val_unit;
1264
+ }
1235
1265
1236
1266
/* ===-- Instruction builders ----------------------------------------------===*/
1237
1267
@@ -1359,6 +1389,27 @@ CAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of,
1359
1389
return LLVMBuildSwitch (Builder_val (B), Of, Else, Int_val (EstimatedCount));
1360
1390
}
1361
1391
1392
+ /* lltype -> string -> llbuilder -> llvalue */
1393
+ CAMLprim LLVMValueRef llvm_build_malloc (LLVMTypeRef Ty, value Name,
1394
+ value B)
1395
+ {
1396
+ return LLVMBuildMalloc (Builder_val (B), Ty, String_val (Name));
1397
+ }
1398
+
1399
+ /* lltype -> llvalue -> string -> llbuilder -> llvalue */
1400
+ CAMLprim LLVMValueRef llvm_build_array_malloc (LLVMTypeRef Ty,
1401
+ LLVMValueRef Val,
1402
+ value Name, value B)
1403
+ {
1404
+ return LLVMBuildArrayMalloc (Builder_val (B), Ty, Val, String_val (Name));
1405
+ }
1406
+
1407
+ /* llvalue -> llbuilder -> llvalue */
1408
+ CAMLprim LLVMValueRef llvm_build_free (LLVMValueRef P, value B)
1409
+ {
1410
+ return LLVMBuildFree (Builder_val (B), P);
1411
+ }
1412
+
1362
1413
/* llvalue -> llvalue -> llbasicblock -> unit */
1363
1414
CAMLprim value llvm_add_case (LLVMValueRef Switch, LLVMValueRef OnVal,
1364
1415
LLVMBasicBlockRef Dest) {
@@ -1399,19 +1450,35 @@ CAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) {
1399
1450
Args[4 ], Args[5 ]);
1400
1451
}
1401
1452
1453
+ /* lltype -> llvalue -> int -> string -> llbuilder -> llvalue */
1402
1454
CAMLprim LLVMValueRef llvm_build_landingpad (LLVMTypeRef Ty, LLVMValueRef PersFn,
1403
1455
value NumClauses, value Name,
1404
1456
value B) {
1405
1457
return LLVMBuildLandingPad (Builder_val (B), Ty, PersFn, Int_val (NumClauses),
1406
1458
String_val (Name));
1407
1459
}
1408
1460
1461
+ /* llvalue -> llvalue -> unit */
1462
+ CAMLprim value llvm_add_clause (LLVMValueRef LandingPadInst, LLVMValueRef ClauseVal)
1463
+ {
1464
+ LLVMAddClause (LandingPadInst, ClauseVal);
1465
+ return Val_unit;
1466
+ }
1467
+
1468
+
1469
+ /* llvalue -> bool -> unit */
1409
1470
CAMLprim value llvm_set_cleanup (LLVMValueRef LandingPadInst, value flag)
1410
1471
{
1411
1472
LLVMSetCleanup (LandingPadInst, Bool_val (flag));
1412
1473
return Val_unit;
1413
1474
}
1414
1475
1476
+ /* llvalue -> llbuilder -> llvalue */
1477
+ CAMLprim LLVMValueRef llvm_build_resume (LLVMValueRef Exn, value B)
1478
+ {
1479
+ return LLVMBuildResume (Builder_val (B), Exn);
1480
+ }
1481
+
1415
1482
/* llbuilder -> llvalue */
1416
1483
CAMLprim LLVMValueRef llvm_build_unreachable (value B) {
1417
1484
return LLVMBuildUnreachable (Builder_val (B));
0 commit comments