diff --git a/llvm/include/llvm/AsmParser/LLToken.h b/llvm/include/llvm/AsmParser/LLToken.h index e6a0eae9da30c..d976d40e5e956 100644 --- a/llvm/include/llvm/AsmParser/LLToken.h +++ b/llvm/include/llvm/AsmParser/LLToken.h @@ -187,6 +187,9 @@ enum Kind { kw_graalcc, kw_riscv_vector_cc, kw_riscv_vls_cc, + kw_cheriot_compartmentcallcc, + kw_cheriot_compartmentcalleecc, + kw_cheriot_librarycallcc, // Attributes: kw_attributes, diff --git a/llvm/include/llvm/IR/CallingConv.h b/llvm/include/llvm/IR/CallingConv.h index ef761eb1aed73..bbf9f8486f31c 100644 --- a/llvm/include/llvm/IR/CallingConv.h +++ b/llvm/include/llvm/IR/CallingConv.h @@ -287,6 +287,16 @@ namespace CallingConv { // Calling convention for AMDGPU whole wave functions. AMDGPU_Gfx_WholeWave = 124, + /// Calling convention used for CHERIoT when crossing a protection boundary. + CHERIoT_CompartmentCall = 125, + /// Calling convention used for the callee of CHERIoT_CompartmentCall. + /// Ignores the first two capability arguments and the first integer + /// argument, zeroes all unused return registers on return. + CHERIoT_CompartmentCallee = 126, + /// Calling convention used for CHERIoT for cross-library calls to a + /// stateless compartment. + CHERIoT_LibraryCall = 127, + /// The highest possible ID. Must be some 2^k - 1. MaxID = 1023 }; diff --git a/llvm/lib/AsmParser/LLLexer.cpp b/llvm/lib/AsmParser/LLLexer.cpp index 3d5bd6155536e..f6937d38eb38c 100644 --- a/llvm/lib/AsmParser/LLLexer.cpp +++ b/llvm/lib/AsmParser/LLLexer.cpp @@ -685,6 +685,9 @@ lltok::Kind LLLexer::LexIdentifier() { KEYWORD(graalcc); KEYWORD(riscv_vector_cc); KEYWORD(riscv_vls_cc); + KEYWORD(cheriot_compartmentcallcc); + KEYWORD(cheriot_compartmentcalleecc); + KEYWORD(cheriot_librarycallcc); KEYWORD(cc); KEYWORD(c); diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 1bc2906f63b07..209b0f577b784 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -2312,6 +2312,15 @@ bool LLParser::parseOptionalCallingConv(unsigned &CC) { #undef CC_VLS_CASE } return false; + case lltok::kw_cheriot_compartmentcallcc: + CC = CallingConv::CHERIoT_CompartmentCall; + break; + case lltok::kw_cheriot_compartmentcalleecc: + CC = CallingConv::CHERIoT_CompartmentCallee; + break; + case lltok::kw_cheriot_librarycallcc: + CC = CallingConv::CHERIoT_LibraryCall; + break; case lltok::kw_cc: { Lex.Lex(); return parseUInt32(CC); diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp index 094678f32af2b..c638d063eb3c8 100644 --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -430,6 +430,15 @@ static void PrintCallingConv(unsigned cc, raw_ostream &Out) { CC_VLS_CASE(32768) CC_VLS_CASE(65536) #undef CC_VLS_CASE + case CallingConv::CHERIoT_CompartmentCall: + Out << "cheriot_compartmentcallcc"; + break; + case CallingConv::CHERIoT_CompartmentCallee: + Out << "cheriot_compartmentcalleecc"; + break; + case CallingConv::CHERIoT_LibraryCall: + Out << "cheriot_librarycallcc"; + break; } }