From 24fce21d9055ac4cd2124c0fe5396f430e99f24f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 28 Apr 2021 10:49:30 +0100 Subject: [PATCH] Add "naked" calling convention (removes prologue and epilogue) --- core/runtime/core.odin | 1 + src/docs_writer.cpp | 3 +++ src/llvm_backend.cpp | 4 ++++ src/llvm_backend.hpp | 1 + src/parser.cpp | 1 + src/parser.hpp | 3 ++- src/types.cpp | 3 +++ 7 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/runtime/core.odin b/core/runtime/core.odin index 0033aad9a..5f016579f 100644 --- a/core/runtime/core.odin +++ b/core/runtime/core.odin @@ -32,6 +32,7 @@ Calling_Convention :: enum u8 { Fast_Call = 5, None = 6, + Naked = 7, } Type_Info_Enum_Value :: distinct i64; diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index f4fd02376..03ea25930 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -697,6 +697,9 @@ OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type) { case ProcCC_None: calling_convention = str_lit("none"); break; + case ProcCC_Naked: + calling_convention = str_lit("naked"); + break; case ProcCC_InlineAsm: calling_convention = str_lit("inline-assembly"); break; diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 74d5bbe01..f81077b47 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2588,6 +2588,10 @@ lbProcedure *lb_create_procedure(lbModule *m, Entity *entity) { lb_add_attribute_to_proc(m, p->value, "noreturn"); } + if (pt->Proc.calling_convention == ProcCC_Naked) { + lb_add_attribute_to_proc(m, p->value, "naked"); + } + switch (p->inlining) { case ProcInlining_inline: lb_add_attribute_to_proc(m, p->value, "alwaysinline"); diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index e8811a91e..cd6a99c20 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -472,6 +472,7 @@ lbCallingConventionKind const lb_calling_convention_map[ProcCC_MAX] = { lbCallingConvention_X86_FastCall, // ProcCC_FastCall, lbCallingConvention_C, // ProcCC_None, + lbCallingConvention_C, // ProcCC_Naked, lbCallingConvention_C, // ProcCC_InlineAsm, }; diff --git a/src/parser.cpp b/src/parser.cpp index a7e4c9162..a6764de08 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -3220,6 +3220,7 @@ ProcCallingConvention string_to_calling_convention(String s) { if (s == "fastcall") return ProcCC_FastCall; if (s == "fast") return ProcCC_FastCall; if (s == "none") return ProcCC_None; + if (s == "naked") return ProcCC_Naked; return ProcCC_Invalid; } diff --git a/src/parser.hpp b/src/parser.hpp index 8c2eadb46..93c0363ab 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -215,8 +215,9 @@ enum ProcCallingConvention { ProcCC_FastCall = 5, ProcCC_None = 6, + ProcCC_Naked = 7, - ProcCC_InlineAsm = 7, + ProcCC_InlineAsm = 8, ProcCC_MAX, diff --git a/src/types.cpp b/src/types.cpp index 56081acc8..7b5b81c43 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -3618,6 +3618,9 @@ gbString write_type_to_string(gbString str, Type *type) { case ProcCC_None: str = gb_string_appendc(str, " \"none\" "); break; + case ProcCC_Naked: + str = gb_string_appendc(str, " \"naked\" "); + break; // case ProcCC_VectorCall: // str = gb_string_appendc(str, " \"vectorcall\" "); // break;