| ... | @@ -262,76 +262,66 @@ static const char *get_mangled_name(CodeGen *g, const char *original_name, bool | ... | @@ -262,76 +262,66 @@ static const char *get_mangled_name(CodeGen *g, const char *original_name, bool |
| 262 | } | 262 | } |
| 263 | } | 263 | } |
| 264 | | 264 | |
| 265 | static LLVMCallConv get_llvm_cc(CodeGen *g, CallingConvention cc) { | 265 | static ZigLLVM_CallingConv get_llvm_cc(CodeGen *g, CallingConvention cc) { |
| 266 | switch (cc) { | 266 | switch (cc) { |
| 267 | case CallingConventionUnspecified: return LLVMFastCallConv; | 267 | case CallingConventionUnspecified: |
| 268 | case CallingConventionC: return LLVMCCallConv; | 268 | return ZigLLVM_Fast; |
| | 269 | case CallingConventionC: |
| | 270 | return ZigLLVM_C; |
| 269 | case CallingConventionCold: | 271 | case CallingConventionCold: |
| 270 | // cold calling convention only works on x86. | 272 | if ((g->zig_target->arch == ZigLLVM_x86 || |
| 271 | if (g->zig_target->arch == ZigLLVM_x86 || | 273 | g->zig_target->arch == ZigLLVM_x86_64) && |
| 272 | g->zig_target->arch == ZigLLVM_x86_64) | 274 | g->zig_target->os != OsWindows) |
| 273 | { | 275 | return ZigLLVM_Cold; |
| 274 | // cold calling convention is not supported on windows | 276 | return ZigLLVM_C; |
| 275 | if (g->zig_target->os == OsWindows) { | | |
| 276 | return LLVMCCallConv; | | |
| 277 | } else { | | |
| 278 | return LLVMColdCallConv; | | |
| 279 | } | | |
| 280 | } else { | | |
| 281 | return LLVMCCallConv; | | |
| 282 | } | | |
| 283 | break; | | |
| 284 | case CallingConventionNaked: | 277 | case CallingConventionNaked: |
| 285 | zig_unreachable(); | 278 | zig_unreachable(); |
| 286 | case CallingConventionStdcall: | 279 | case CallingConventionStdcall: |
| 287 | if (g->zig_target->arch == ZigLLVM_x86) | 280 | if (g->zig_target->arch == ZigLLVM_x86) |
| 288 | return LLVMX86StdcallCallConv; | 281 | return ZigLLVM_X86_StdCall; |
| 289 | return LLVMCCallConv; | 282 | return ZigLLVM_C; |
| 290 | case CallingConventionFastcall: | 283 | case CallingConventionFastcall: |
| 291 | if (g->zig_target->arch == ZigLLVM_x86) | 284 | if (g->zig_target->arch == ZigLLVM_x86) |
| 292 | return LLVMX86FastcallCallConv; | 285 | return ZigLLVM_X86_FastCall; |
| 293 | return LLVMCCallConv; | 286 | return ZigLLVM_C; |
| 294 | case CallingConventionVectorcall: | 287 | case CallingConventionVectorcall: |
| 295 | if (g->zig_target->arch == ZigLLVM_x86) | 288 | if (g->zig_target->arch == ZigLLVM_x86) |
| 296 | return LLVMX86VectorCallCallConv; | 289 | return ZigLLVM_X86_VectorCall; |
| 297 | // XXX Enable this when the C API exports this enum member too | | |
| 298 | #if 0 | | |
| 299 | if (target_is_arm(g->zig_target) && | 290 | if (target_is_arm(g->zig_target) && |
| 300 | target_arch_pointer_bit_width(g->zig_target->arch) == 64) | 291 | target_arch_pointer_bit_width(g->zig_target->arch) == 64) |
| 301 | return LLVMAARCH64VectorCallCallConv; | 292 | return ZigLLVM_AArch64_VectorCall; |
| 302 | #endif | 293 | return ZigLLVM_C; |
| 303 | return LLVMCCallConv; | | |
| 304 | case CallingConventionThiscall: | 294 | case CallingConventionThiscall: |
| 305 | if (g->zig_target->arch == ZigLLVM_x86) | 295 | if (g->zig_target->arch == ZigLLVM_x86) |
| 306 | return LLVMX86ThisCallCallConv; | 296 | return ZigLLVM_X86_ThisCall; |
| 307 | return LLVMCCallConv; | 297 | return ZigLLVM_C; |
| 308 | case CallingConventionAsync: | 298 | case CallingConventionAsync: |
| 309 | return LLVMFastCallConv; | 299 | return ZigLLVM_Fast; |
| 310 | case CallingConventionAPCS: | 300 | case CallingConventionAPCS: |
| 311 | if (target_is_arm(g->zig_target)) | 301 | if (target_is_arm(g->zig_target)) |
| 312 | return LLVMARMAPCSCallConv; | 302 | return ZigLLVM_ARM_APCS; |
| 313 | return LLVMCCallConv; | 303 | return ZigLLVM_C; |
| 314 | case CallingConventionAAPCS: | 304 | case CallingConventionAAPCS: |
| 315 | if (target_is_arm(g->zig_target)) | 305 | if (target_is_arm(g->zig_target)) |
| 316 | return LLVMARMAAPCSCallConv; | 306 | return ZigLLVM_ARM_AAPCS; |
| 317 | return LLVMCCallConv; | 307 | return ZigLLVM_C; |
| 318 | case CallingConventionAAPCSVFP: | 308 | case CallingConventionAAPCSVFP: |
| 319 | if (target_is_arm(g->zig_target)) | 309 | if (target_is_arm(g->zig_target)) |
| 320 | return LLVMARMAAPCSVFPCallConv; | 310 | return ZigLLVM_ARM_AAPCS_VFP; |
| 321 | return LLVMCCallConv; | 311 | return ZigLLVM_C; |
| 322 | case CallingConventionInterrupt: | 312 | case CallingConventionInterrupt: |
| 323 | if (g->zig_target->arch == ZigLLVM_x86 || | 313 | if (g->zig_target->arch == ZigLLVM_x86 || |
| 324 | g->zig_target->arch == ZigLLVM_x86_64) | 314 | g->zig_target->arch == ZigLLVM_x86_64) |
| 325 | return LLVMX86INTRCallConv; | 315 | return ZigLLVM_X86_INTR; |
| 326 | if (g->zig_target->arch == ZigLLVM_avr) | 316 | if (g->zig_target->arch == ZigLLVM_avr) |
| 327 | return LLVMAVRINTRCallConv; | 317 | return ZigLLVM_AVR_INTR; |
| 328 | if (g->zig_target->arch == ZigLLVM_msp430) | 318 | if (g->zig_target->arch == ZigLLVM_msp430) |
| 329 | return LLVMMSP430INTRCallConv; | 319 | return ZigLLVM_MSP430_INTR; |
| 330 | return LLVMCCallConv; | 320 | return ZigLLVM_C; |
| 331 | case CallingConventionSignal: | 321 | case CallingConventionSignal: |
| 332 | if (g->zig_target->arch == ZigLLVM_avr) | 322 | if (g->zig_target->arch == ZigLLVM_avr) |
| 333 | return LLVMAVRSIGNALCallConv; | 323 | return ZigLLVM_AVR_SIGNAL; |
| 334 | return LLVMCCallConv; | 324 | return ZigLLVM_C; |
| 335 | } | 325 | } |
| 336 | zig_unreachable(); | 326 | zig_unreachable(); |
| 337 | } | 327 | } |
| ... | @@ -528,7 +518,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { | ... | @@ -528,7 +518,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 528 | if (cc == CallingConventionNaked) { | 518 | if (cc == CallingConventionNaked) { |
| 529 | addLLVMFnAttr(llvm_fn, "naked"); | 519 | addLLVMFnAttr(llvm_fn, "naked"); |
| 530 | } else { | 520 | } else { |
| 531 | LLVMSetFunctionCallConv(llvm_fn, get_llvm_cc(g, fn_type->data.fn.fn_type_id.cc)); | 521 | ZigLLVMFunctionSetCallingConv(llvm_fn, get_llvm_cc(g, fn_type->data.fn.fn_type_id.cc)); |
| 532 | } | 522 | } |
| 533 | | 523 | |
| 534 | bool want_cold = fn->is_cold || cc == CallingConventionCold; | 524 | bool want_cold = fn->is_cold || cc == CallingConventionCold; |
| ... | @@ -1023,7 +1013,7 @@ static void gen_panic(CodeGen *g, LLVMValueRef msg_arg, LLVMValueRef stack_trace | ... | @@ -1023,7 +1013,7 @@ static void gen_panic(CodeGen *g, LLVMValueRef msg_arg, LLVMValueRef stack_trace |
| 1023 | { | 1013 | { |
| 1024 | assert(g->panic_fn != nullptr); | 1014 | assert(g->panic_fn != nullptr); |
| 1025 | LLVMValueRef fn_val = fn_llvm_value(g, g->panic_fn); | 1015 | LLVMValueRef fn_val = fn_llvm_value(g, g->panic_fn); |
| 1026 | LLVMCallConv llvm_cc = get_llvm_cc(g, g->panic_fn->type_entry->data.fn.fn_type_id.cc); | 1016 | ZigLLVM_CallingConv llvm_cc = get_llvm_cc(g, g->panic_fn->type_entry->data.fn.fn_type_id.cc); |
| 1027 | if (stack_trace_arg == nullptr) { | 1017 | if (stack_trace_arg == nullptr) { |
| 1028 | stack_trace_arg = LLVMConstNull(get_llvm_type(g, ptr_to_stack_trace_type(g))); | 1018 | stack_trace_arg = LLVMConstNull(get_llvm_type(g, ptr_to_stack_trace_type(g))); |
| 1029 | } | 1019 | } |
| ... | @@ -1134,7 +1124,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) { | ... | @@ -1134,7 +1124,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) { |
| 1134 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); | 1124 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); |
| 1135 | addLLVMFnAttr(fn_val, "alwaysinline"); | 1125 | addLLVMFnAttr(fn_val, "alwaysinline"); |
| 1136 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 1126 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 1137 | LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); | 1127 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 1138 | addLLVMFnAttr(fn_val, "nounwind"); | 1128 | addLLVMFnAttr(fn_val, "nounwind"); |
| 1139 | add_uwtable_attr(g, fn_val); | 1129 | add_uwtable_attr(g, fn_val); |
| 1140 | // Error return trace memory is in the stack, which is impossible to be at address 0 | 1130 | // Error return trace memory is in the stack, which is impossible to be at address 0 |
| ... | @@ -1215,7 +1205,7 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) { | ... | @@ -1215,7 +1205,7 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) { |
| 1215 | addLLVMFnAttr(fn_val, "noinline"); // so that we can look at return address | 1205 | addLLVMFnAttr(fn_val, "noinline"); // so that we can look at return address |
| 1216 | addLLVMFnAttr(fn_val, "cold"); | 1206 | addLLVMFnAttr(fn_val, "cold"); |
| 1217 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 1207 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 1218 | LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); | 1208 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 1219 | addLLVMFnAttr(fn_val, "nounwind"); | 1209 | addLLVMFnAttr(fn_val, "nounwind"); |
| 1220 | add_uwtable_attr(g, fn_val); | 1210 | add_uwtable_attr(g, fn_val); |
| 1221 | if (codegen_have_frame_pointer(g)) { | 1211 | if (codegen_have_frame_pointer(g)) { |
| ... | @@ -1299,7 +1289,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { | ... | @@ -1299,7 +1289,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { |
| 1299 | addLLVMFnAttr(fn_val, "noreturn"); | 1289 | addLLVMFnAttr(fn_val, "noreturn"); |
| 1300 | addLLVMFnAttr(fn_val, "cold"); | 1290 | addLLVMFnAttr(fn_val, "cold"); |
| 1301 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 1291 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 1302 | LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); | 1292 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 1303 | addLLVMFnAttr(fn_val, "nounwind"); | 1293 | addLLVMFnAttr(fn_val, "nounwind"); |
| 1304 | add_uwtable_attr(g, fn_val); | 1294 | add_uwtable_attr(g, fn_val); |
| 1305 | if (codegen_have_frame_pointer(g)) { | 1295 | if (codegen_have_frame_pointer(g)) { |
| ... | @@ -2195,7 +2185,7 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) { | ... | @@ -2195,7 +2185,7 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) { |
| 2195 | const char *fn_name = get_mangled_name(g, "__zig_merge_error_return_traces", false); | 2185 | const char *fn_name = get_mangled_name(g, "__zig_merge_error_return_traces", false); |
| 2196 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); | 2186 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); |
| 2197 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 2187 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 2198 | LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); | 2188 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 2199 | addLLVMFnAttr(fn_val, "nounwind"); | 2189 | addLLVMFnAttr(fn_val, "nounwind"); |
| 2200 | add_uwtable_attr(g, fn_val); | 2190 | add_uwtable_attr(g, fn_val); |
| 2201 | addLLVMArgAttr(fn_val, (unsigned)0, "noalias"); | 2191 | addLLVMArgAttr(fn_val, (unsigned)0, "noalias"); |
| ... | @@ -2372,7 +2362,7 @@ static LLVMValueRef gen_resume(CodeGen *g, LLVMValueRef fn_val, LLVMValueRef tar | ... | @@ -2372,7 +2362,7 @@ static LLVMValueRef gen_resume(CodeGen *g, LLVMValueRef fn_val, LLVMValueRef tar |
| 2372 | LLVMValueRef arg_val = LLVMConstSub(LLVMConstAllOnes(usize_type_ref), | 2362 | LLVMValueRef arg_val = LLVMConstSub(LLVMConstAllOnes(usize_type_ref), |
| 2373 | LLVMConstInt(usize_type_ref, resume_id, false)); | 2363 | LLVMConstInt(usize_type_ref, resume_id, false)); |
| 2374 | LLVMValueRef args[] = {target_frame_ptr, arg_val}; | 2364 | LLVMValueRef args[] = {target_frame_ptr, arg_val}; |
| 2375 | return ZigLLVMBuildCall(g->builder, fn_val, args, 2, LLVMFastCallConv, ZigLLVM_CallAttrAuto, ""); | 2365 | return ZigLLVMBuildCall(g->builder, fn_val, args, 2, ZigLLVM_Fast, ZigLLVM_CallAttrAuto, ""); |
| 2376 | } | 2366 | } |
| 2377 | | 2367 | |
| 2378 | static LLVMBasicBlockRef gen_suspend_begin(CodeGen *g, const char *name_hint) { | 2368 | static LLVMBasicBlockRef gen_suspend_begin(CodeGen *g, const char *name_hint) { |
| ... | @@ -4262,7 +4252,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr | ... | @@ -4262,7 +4252,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr |
| 4262 | break; | 4252 | break; |
| 4263 | } | 4253 | } |
| 4264 | | 4254 | |
| 4265 | LLVMCallConv llvm_cc = get_llvm_cc(g, cc); | 4255 | ZigLLVM_CallingConv llvm_cc = get_llvm_cc(g, cc); |
| 4266 | LLVMValueRef result; | 4256 | LLVMValueRef result; |
| 4267 | | 4257 | |
| 4268 | if (callee_is_async) { | 4258 | if (callee_is_async) { |
| ... | @@ -4972,7 +4962,7 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) { | ... | @@ -4972,7 +4962,7 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) { |
| 4972 | buf_ptr(buf_sprintf("__zig_tag_name_%s", buf_ptr(&enum_type->name))), false); | 4962 | buf_ptr(buf_sprintf("__zig_tag_name_%s", buf_ptr(&enum_type->name))), false); |
| 4973 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); | 4963 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); |
| 4974 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 4964 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 4975 | LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); | 4965 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 4976 | addLLVMFnAttr(fn_val, "nounwind"); | 4966 | addLLVMFnAttr(fn_val, "nounwind"); |
| 4977 | add_uwtable_attr(g, fn_val); | 4967 | add_uwtable_attr(g, fn_val); |
| 4978 | if (codegen_have_frame_pointer(g)) { | 4968 | if (codegen_have_frame_pointer(g)) { |