aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp57
1 files changed, 50 insertions, 7 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index 734fc3be2b..c5611f3e2c 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -284,14 +284,43 @@ static LLVMCallConv get_llvm_cc(CodeGen *g, CallingConvention cc) {
case CallingConventionNaked:
zig_unreachable();
case CallingConventionStdcall:
- // stdcall calling convention only works on x86.
- if (g->zig_target->arch == ZigLLVM_x86) {
+ if (g->zig_target->arch == ZigLLVM_x86)
return LLVMX86StdcallCallConv;
- } else {
- return LLVMCCallConv;
- }
+ return LLVMCCallConv;
+ case CallingConventionFastcall:
+ if (g->zig_target->arch == ZigLLVM_x86)
+ return LLVMX86FastcallCallConv;
+ return LLVMFastCallConv;
+ case CallingConventionVectorcall:
+ if (g->zig_target->arch == ZigLLVM_x86)
+ return LLVMX86VectorCallCallConv;
+ return LLVMCCallConv;
case CallingConventionAsync:
return LLVMFastCallConv;
+ case CallingConventionAPCS:
+ if (target_is_arm(g->zig_target))
+ return LLVMARMAPCSCallConv;
+ return LLVMCCallConv;
+ case CallingConventionAAPCS:
+ if (target_is_arm(g->zig_target))
+ return LLVMARMAAPCSCallConv;
+ return LLVMCCallConv;
+ case CallingConventionAAPCSVFP:
+ if (target_is_arm(g->zig_target))
+ return LLVMARMAAPCSVFPCallConv;
+ return LLVMCCallConv;
+ case CallingConventionInterrupt:
+ if (g->zig_target->arch == ZigLLVM_x86 || g->zig_target->arch == ZigLLVM_x86_64)
+ return LLVMX86INTRCallConv;
+ if (g->zig_target->arch == ZigLLVM_avr)
+ return LLVMAVRINTRCallConv;
+ if (g->zig_target->arch == ZigLLVM_msp430)
+ return LLVMMSP430INTRCallConv;
+ return LLVMCCallConv;
+ case CallingConventionSignal:
+ if (g->zig_target->arch == ZigLLVM_avr)
+ return LLVMAVRSIGNALCallConv;
+ return LLVMCCallConv;
}
zig_unreachable();
}
@@ -383,7 +412,14 @@ static bool cc_want_sret_attr(CallingConvention cc) {
zig_unreachable();
case CallingConventionC:
case CallingConventionCold:
+ case CallingConventionInterrupt:
+ case CallingConventionSignal:
case CallingConventionStdcall:
+ case CallingConventionFastcall:
+ case CallingConventionVectorcall:
+ case CallingConventionAPCS:
+ case CallingConventionAAPCS:
+ case CallingConventionAAPCSVFP:
return true;
case CallingConventionAsync:
case CallingConventionUnspecified:
@@ -8463,8 +8499,15 @@ Buf *codegen_generate_builtin_source(CodeGen *g) {
static_assert(CallingConventionC == 1, "");
static_assert(CallingConventionCold == 2, "");
static_assert(CallingConventionNaked == 3, "");
- static_assert(CallingConventionStdcall == 4, "");
- static_assert(CallingConventionAsync == 5, "");
+ static_assert(CallingConventionAsync == 4, "");
+ static_assert(CallingConventionInterrupt == 5, "");
+ static_assert(CallingConventionSignal == 6, "");
+ static_assert(CallingConventionStdcall == 7, "");
+ static_assert(CallingConventionFastcall == 8, "");
+ static_assert(CallingConventionVectorcall == 9, "");
+ static_assert(CallingConventionAPCS == 10, "");
+ static_assert(CallingConventionAAPCS == 11, "");
+ static_assert(CallingConventionAAPCSVFP == 12, "");
static_assert(FnInlineAuto == 0, "");
static_assert(FnInlineAlways == 1, "");