| ... | @@ -328,9 +328,9 @@ static void addLLVMArgAttr(LLVMValueRef fn_val, unsigned param_index, const char | ... | @@ -328,9 +328,9 @@ static void addLLVMArgAttr(LLVMValueRef fn_val, unsigned param_index, const char |
| 328 | return addLLVMAttr(fn_val, param_index + 1, attr_name); | 328 | return addLLVMAttr(fn_val, param_index + 1, attr_name); |
| 329 | } | 329 | } |
| 330 | | 330 | |
| 331 | static void addLLVMArgAttrInt(LLVMValueRef fn_val, unsigned param_index, const char *attr_name, uint64_t attr_val) { | 331 | //static void addLLVMArgAttrInt(LLVMValueRef fn_val, unsigned param_index, const char *attr_name, uint64_t attr_val) { |
| 332 | return addLLVMAttrInt(fn_val, param_index + 1, attr_name, attr_val); | 332 | // return addLLVMAttrInt(fn_val, param_index + 1, attr_name, attr_val); |
| 333 | } | 333 | //} |
| 334 | | 334 | |
| 335 | static void addLLVMCallsiteAttr(LLVMValueRef call_instr, unsigned param_index, const char *attr_name) { | 335 | static void addLLVMCallsiteAttr(LLVMValueRef call_instr, unsigned param_index, const char *attr_name) { |
| 336 | unsigned kind_id = LLVMGetEnumAttributeKindForName(attr_name, strlen(attr_name)); | 336 | unsigned kind_id = LLVMGetEnumAttributeKindForName(attr_name, strlen(attr_name)); |
| ... | @@ -916,33 +916,6 @@ static void gen_safety_crash(CodeGen *g, PanicMsgId msg_id) { | ... | @@ -916,33 +916,6 @@ static void gen_safety_crash(CodeGen *g, PanicMsgId msg_id) { |
| 916 | gen_panic(g, get_panic_msg_ptr_val(g, msg_id), nullptr); | 916 | gen_panic(g, get_panic_msg_ptr_val(g, msg_id), nullptr); |
| 917 | } | 917 | } |
| 918 | | 918 | |
| 919 | static LLVMValueRef get_memcpy_fn_val(CodeGen *g, uint32_t dest_align, uint32_t src_align) { | | |
| 920 | ZigLLVMFnKey key = {}; | | |
| 921 | key.id = ZigLLVMFnIdMemcpy; | | |
| 922 | key.data.memcpy.dest_align = dest_align; | | |
| 923 | key.data.memcpy.src_align = src_align; | | |
| 924 | | | |
| 925 | auto existing_entry = g->llvm_fn_table.maybe_get(key); | | |
| 926 | if (existing_entry) | | |
| 927 | return existing_entry->value; | | |
| 928 | | | |
| 929 | LLVMTypeRef param_types[] = { | | |
| 930 | LLVMPointerType(LLVMInt8Type(), 0), | | |
| 931 | LLVMPointerType(LLVMInt8Type(), 0), | | |
| 932 | LLVMIntType(g->pointer_size_bytes * 8), | | |
| 933 | LLVMInt1Type(), | | |
| 934 | }; | | |
| 935 | LLVMTypeRef fn_type = LLVMFunctionType(LLVMVoidType(), param_types, 4, false); | | |
| 936 | Buf *name = buf_sprintf("llvm.memcpy.p0i8.p0i8.i%d", g->pointer_size_bytes * 8); | | |
| 937 | LLVMValueRef fn_val = LLVMAddFunction(g->module, buf_ptr(name), fn_type); | | |
| 938 | addLLVMArgAttrInt(fn_val, 0, "align", dest_align); | | |
| 939 | addLLVMArgAttrInt(fn_val, 1, "align", src_align); | | |
| 940 | assert(LLVMGetIntrinsicID(fn_val)); | | |
| 941 | | | |
| 942 | g->llvm_fn_table.put(key, fn_val); | | |
| 943 | return fn_val; | | |
| 944 | } | | |
| 945 | | | |
| 946 | static LLVMValueRef get_coro_destroy_fn_val(CodeGen *g) { | 919 | static LLVMValueRef get_coro_destroy_fn_val(CodeGen *g) { |
| 947 | if (g->coro_destroy_fn_val) | 920 | if (g->coro_destroy_fn_val) |
| 948 | return g->coro_destroy_fn_val; | 921 | return g->coro_destroy_fn_val; |
| ... | @@ -1305,15 +1278,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { | ... | @@ -1305,15 +1278,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { |
| 1305 | LLVMValueRef len_field_ptr = LLVMBuildStructGEP(g->builder, err_name_val, slice_len_index, ""); | 1278 | LLVMValueRef len_field_ptr = LLVMBuildStructGEP(g->builder, err_name_val, slice_len_index, ""); |
| 1306 | LLVMValueRef err_name_len = gen_load_untyped(g, len_field_ptr, 0, false, ""); | 1279 | LLVMValueRef err_name_len = gen_load_untyped(g, len_field_ptr, 0, false, ""); |
| 1307 | | 1280 | |
| 1308 | LLVMValueRef memcpy_fn_val = get_memcpy_fn_val(g, u8_align_bytes, u8_align_bytes); | 1281 | ZigLLVMBuildMemCpy(g->builder, offset_buf_ptr, u8_align_bytes, err_name_ptr, u8_align_bytes, err_name_len, false); |
| 1309 | LLVMValueRef params[] = { | | |
| 1310 | offset_buf_ptr, // dest pointer | | |
| 1311 | err_name_ptr, // source pointer | | |
| 1312 | err_name_len, // size bytes | | |
| 1313 | LLVMConstNull(LLVMInt1Type()), // is volatile | | |
| 1314 | }; | | |
| 1315 | | | |
| 1316 | LLVMBuildCall(g->builder, memcpy_fn_val, params, 4, ""); | | |
| 1317 | | 1282 | |
| 1318 | LLVMValueRef const_prefix_len = LLVMConstInt(LLVMTypeOf(err_name_len), strlen(unwrap_err_msg_text), false); | 1283 | LLVMValueRef const_prefix_len = LLVMConstInt(LLVMTypeOf(err_name_len), strlen(unwrap_err_msg_text), false); |
| 1319 | LLVMValueRef full_buf_len = LLVMBuildNUWAdd(g->builder, const_prefix_len, err_name_len, ""); | 1284 | LLVMValueRef full_buf_len = LLVMBuildNUWAdd(g->builder, const_prefix_len, err_name_len, ""); |
| ... | @@ -1544,19 +1509,8 @@ static LLVMValueRef gen_assign_raw(CodeGen *g, LLVMValueRef ptr, TypeTableEntry | ... | @@ -1544,19 +1509,8 @@ static LLVMValueRef gen_assign_raw(CodeGen *g, LLVMValueRef ptr, TypeTableEntry |
| 1544 | assert(size_bytes > 0); | 1509 | assert(size_bytes > 0); |
| 1545 | assert(align_bytes > 0); | 1510 | assert(align_bytes > 0); |
| 1546 | | 1511 | |
| 1547 | LLVMValueRef volatile_bit = ptr_type->data.pointer.is_volatile ? | 1512 | ZigLLVMBuildMemCpy(g->builder, dest_ptr, align_bytes, src_ptr, align_bytes, LLVMConstInt(usize->type_ref, size_bytes, false), |
| 1548 | LLVMConstAllOnes(LLVMInt1Type()) : LLVMConstNull(LLVMInt1Type()); | 1513 | ptr_type->data.pointer.is_volatile); |
| 1549 | | | |
| 1550 | LLVMValueRef memcpy_fn_val = get_memcpy_fn_val(g, align_bytes, align_bytes); | | |
| 1551 | | | |
| 1552 | LLVMValueRef params[] = { | | |
| 1553 | dest_ptr, // dest pointer | | |
| 1554 | src_ptr, // source pointer | | |
| 1555 | LLVMConstInt(usize->type_ref, size_bytes, false), | | |
| 1556 | volatile_bit, | | |
| 1557 | }; | | |
| 1558 | | | |
| 1559 | LLVMBuildCall(g->builder, memcpy_fn_val, params, 4, ""); | | |
| 1560 | return nullptr; | 1514 | return nullptr; |
| 1561 | } | 1515 | } |
| 1562 | | 1516 | |
| ... | @@ -2496,31 +2450,6 @@ static LLVMValueRef ir_render_bool_not(CodeGen *g, IrExecutable *executable, IrI | ... | @@ -2496,31 +2450,6 @@ static LLVMValueRef ir_render_bool_not(CodeGen *g, IrExecutable *executable, IrI |
| 2496 | return LLVMBuildICmp(g->builder, LLVMIntEQ, value, zero, ""); | 2450 | return LLVMBuildICmp(g->builder, LLVMIntEQ, value, zero, ""); |
| 2497 | } | 2451 | } |
| 2498 | | 2452 | |
| 2499 | static LLVMValueRef get_memset_fn_val(CodeGen *g, uint32_t dest_align) { | | |
| 2500 | ZigLLVMFnKey key = {}; | | |
| 2501 | key.id = ZigLLVMFnIdMemset; | | |
| 2502 | key.data.memset.dest_align = dest_align; | | |
| 2503 | | | |
| 2504 | auto existing_entry = g->llvm_fn_table.maybe_get(key); | | |
| 2505 | if (existing_entry) | | |
| 2506 | return existing_entry->value; | | |
| 2507 | | | |
| 2508 | LLVMTypeRef param_types[] = { | | |
| 2509 | LLVMPointerType(LLVMInt8Type(), 0), | | |
| 2510 | LLVMInt8Type(), | | |
| 2511 | LLVMIntType(g->pointer_size_bytes * 8), | | |
| 2512 | LLVMInt1Type(), | | |
| 2513 | }; | | |
| 2514 | LLVMTypeRef fn_type = LLVMFunctionType(LLVMVoidType(), param_types, 4, false); | | |
| 2515 | Buf *name = buf_sprintf("llvm.memset.p0i8.i%d", g->pointer_size_bytes * 8); | | |
| 2516 | LLVMValueRef fn_val = LLVMAddFunction(g->module, buf_ptr(name), fn_type); | | |
| 2517 | addLLVMArgAttrInt(fn_val, 0, "align", dest_align); | | |
| 2518 | assert(LLVMGetIntrinsicID(fn_val)); | | |
| 2519 | | | |
| 2520 | g->llvm_fn_table.put(key, fn_val); | | |
| 2521 | return fn_val; | | |
| 2522 | } | | |
| 2523 | | | |
| 2524 | static LLVMValueRef ir_render_decl_var(CodeGen *g, IrExecutable *executable, | 2453 | static LLVMValueRef ir_render_decl_var(CodeGen *g, IrExecutable *executable, |
| 2525 | IrInstructionDeclVar *decl_var_instruction) | 2454 | IrInstructionDeclVar *decl_var_instruction) |
| 2526 | { | 2455 | { |
| ... | @@ -2554,21 +2483,12 @@ static LLVMValueRef ir_render_decl_var(CodeGen *g, IrExecutable *executable, | ... | @@ -2554,21 +2483,12 @@ static LLVMValueRef ir_render_decl_var(CodeGen *g, IrExecutable *executable, |
| 2554 | | 2483 | |
| 2555 | assert(var->align_bytes > 0); | 2484 | assert(var->align_bytes > 0); |
| 2556 | | 2485 | |
| 2557 | LLVMValueRef memset_fn_val = get_memset_fn_val(g, var->align_bytes); | | |
| 2558 | | | |
| 2559 | // memset uninitialized memory to 0xa | 2486 | // memset uninitialized memory to 0xa |
| 2560 | LLVMTypeRef ptr_u8 = LLVMPointerType(LLVMInt8Type(), 0); | 2487 | LLVMTypeRef ptr_u8 = LLVMPointerType(LLVMInt8Type(), 0); |
| 2561 | LLVMValueRef fill_char = LLVMConstInt(LLVMInt8Type(), 0xaa, false); | 2488 | LLVMValueRef fill_char = LLVMConstInt(LLVMInt8Type(), 0xaa, false); |
| 2562 | LLVMValueRef dest_ptr = LLVMBuildBitCast(g->builder, var->value_ref, ptr_u8, ""); | 2489 | LLVMValueRef dest_ptr = LLVMBuildBitCast(g->builder, var->value_ref, ptr_u8, ""); |
| 2563 | LLVMValueRef byte_count = LLVMConstInt(usize->type_ref, size_bytes, false); | 2490 | LLVMValueRef byte_count = LLVMConstInt(usize->type_ref, size_bytes, false); |
| 2564 | LLVMValueRef params[] = { | 2491 | ZigLLVMBuildMemSet(g->builder, dest_ptr, fill_char, byte_count, var->align_bytes, false); |
| 2565 | dest_ptr, | | |
| 2566 | fill_char, | | |
| 2567 | byte_count, | | |
| 2568 | LLVMConstNull(LLVMInt1Type()), // is volatile | | |
| 2569 | }; | | |
| 2570 | | | |
| 2571 | LLVMBuildCall(g->builder, memset_fn_val, params, 4, ""); | | |
| 2572 | } | 2492 | } |
| 2573 | } | 2493 | } |
| 2574 | | 2494 | |
| ... | @@ -3415,19 +3335,7 @@ static LLVMValueRef ir_render_memset(CodeGen *g, IrExecutable *executable, IrIns | ... | @@ -3415,19 +3335,7 @@ static LLVMValueRef ir_render_memset(CodeGen *g, IrExecutable *executable, IrIns |
| 3415 | TypeTableEntry *ptr_type = instruction->dest_ptr->value.type; | 3335 | TypeTableEntry *ptr_type = instruction->dest_ptr->value.type; |
| 3416 | assert(ptr_type->id == TypeTableEntryIdPointer); | 3336 | assert(ptr_type->id == TypeTableEntryIdPointer); |
| 3417 | | 3337 | |
| 3418 | LLVMValueRef is_volatile = ptr_type->data.pointer.is_volatile ? | 3338 | ZigLLVMBuildMemSet(g->builder, dest_ptr_casted, char_val, len_val, ptr_type->data.pointer.alignment, ptr_type->data.pointer.is_volatile); |
| 3419 | LLVMConstAllOnes(LLVMInt1Type()) : LLVMConstNull(LLVMInt1Type()); | | |
| 3420 | | | |
| 3421 | LLVMValueRef memset_fn_val = get_memset_fn_val(g, ptr_type->data.pointer.alignment); | | |
| 3422 | | | |
| 3423 | LLVMValueRef params[] = { | | |
| 3424 | dest_ptr_casted, | | |
| 3425 | char_val, | | |
| 3426 | len_val, | | |
| 3427 | is_volatile, | | |
| 3428 | }; | | |
| 3429 | | | |
| 3430 | LLVMBuildCall(g->builder, memset_fn_val, params, 4, ""); | | |
| 3431 | return nullptr; | 3339 | return nullptr; |
| 3432 | } | 3340 | } |
| 3433 | | 3341 | |
| ... | @@ -3447,20 +3355,10 @@ static LLVMValueRef ir_render_memcpy(CodeGen *g, IrExecutable *executable, IrIns | ... | @@ -3447,20 +3355,10 @@ static LLVMValueRef ir_render_memcpy(CodeGen *g, IrExecutable *executable, IrIns |
| 3447 | assert(dest_ptr_type->id == TypeTableEntryIdPointer); | 3355 | assert(dest_ptr_type->id == TypeTableEntryIdPointer); |
| 3448 | assert(src_ptr_type->id == TypeTableEntryIdPointer); | 3356 | assert(src_ptr_type->id == TypeTableEntryIdPointer); |
| 3449 | | 3357 | |
| 3450 | LLVMValueRef is_volatile = (dest_ptr_type->data.pointer.is_volatile || src_ptr_type->data.pointer.is_volatile) ? | 3358 | bool is_volatile = (dest_ptr_type->data.pointer.is_volatile || src_ptr_type->data.pointer.is_volatile); |
| 3451 | LLVMConstAllOnes(LLVMInt1Type()) : LLVMConstNull(LLVMInt1Type()); | | |
| 3452 | | | |
| 3453 | LLVMValueRef memcpy_fn_val = get_memcpy_fn_val(g, dest_ptr_type->data.pointer.alignment, | | |
| 3454 | src_ptr_type->data.pointer.alignment); | | |
| 3455 | | | |
| 3456 | LLVMValueRef params[] = { | | |
| 3457 | dest_ptr_casted, | | |
| 3458 | src_ptr_casted, | | |
| 3459 | len_val, | | |
| 3460 | is_volatile, | | |
| 3461 | }; | | |
| 3462 | | 3359 | |
| 3463 | LLVMBuildCall(g->builder, memcpy_fn_val, params, 4, ""); | 3360 | ZigLLVMBuildMemCpy(g->builder, dest_ptr_casted, dest_ptr_type->data.pointer.alignment, |
| | 3361 | src_ptr_casted, src_ptr_type->data.pointer.alignment, len_val, is_volatile); |
| 3464 | return nullptr; | 3362 | return nullptr; |
| 3465 | } | 3363 | } |
| 3466 | | 3364 | |