Skip to content

Commit 22a5b0e

Browse files
committed
fixup! Add all 32-65536 calling conventions and remove log2ABIVLen
1 parent 9d1f138 commit 22a5b0e

26 files changed

+564
-187
lines changed

clang/include/clang-c/Index.h

+12-1
Original file line numberDiff line numberDiff line change
@@ -3053,7 +3053,18 @@ enum CXCallingConv {
30533053
CXCallingConv_M68kRTD = 19,
30543054
CXCallingConv_PreserveNone = 20,
30553055
CXCallingConv_RISCVVectorCall = 21,
3056-
CXCallingConv_RISCVVLSCall = 22,
3056+
CXCallingConv_RISCVVLSCall_32 = 22,
3057+
CXCallingConv_RISCVVLSCall_64 = 23,
3058+
CXCallingConv_RISCVVLSCall_128 = 24,
3059+
CXCallingConv_RISCVVLSCall_256 = 25,
3060+
CXCallingConv_RISCVVLSCall_512 = 26,
3061+
CXCallingConv_RISCVVLSCall_1024 = 27,
3062+
CXCallingConv_RISCVVLSCall_2048 = 28,
3063+
CXCallingConv_RISCVVLSCall_4096 = 29,
3064+
CXCallingConv_RISCVVLSCall_8192 = 30,
3065+
CXCallingConv_RISCVVLSCall_16384 = 31,
3066+
CXCallingConv_RISCVVLSCall_32768 = 32,
3067+
CXCallingConv_RISCVVLSCall_65536 = 33,
30573068

30583069
CXCallingConv_Invalid = 100,
30593070
CXCallingConv_Unexposed = 200

clang/include/clang/AST/Type.h

+14-30
Original file line numberDiff line numberDiff line change
@@ -1946,7 +1946,7 @@ class alignas(TypeAlignment) Type : public ExtQualsTypeCommonBase {
19461946
/// Extra information which affects how the function is called, like
19471947
/// regparm and the calling convention.
19481948
LLVM_PREFERRED_TYPE(CallingConv)
1949-
unsigned ExtInfo : 18;
1949+
unsigned ExtInfo : 14;
19501950

19511951
/// The ref-qualifier associated with a \c FunctionProtoType.
19521952
///
@@ -4437,40 +4437,36 @@ class FunctionType : public Type {
44374437
// Type::FunctionTypeBitfields::ExtInfo as well.
44384438

44394439
// | CC |noreturn|produces|nocallersavedregs|regparm|nocfcheck|cmsenscall|
4440-
// |0 .. 4| 5 | 6 | 7 |8 .. 10| 11 | 12 |
4441-
// |RISCV-ABI-VLEN|
4442-
// |13 .. 17|
4440+
// |0 .. 5| 6 | 7 | 8 |9 .. 11| 12 | 13 |
44434441
//
44444442
// regparm is either 0 (no regparm attribute) or the regparm value+1.
4445-
enum { CallConvMask = 0x1F };
4446-
enum { NoReturnMask = 0x20 };
4447-
enum { ProducesResultMask = 0x40 };
4448-
enum { NoCallerSavedRegsMask = 0x80 };
4443+
enum { CallConvMask = 0x3F };
4444+
enum { NoReturnMask = 0x40 };
4445+
enum { ProducesResultMask = 0x80 };
4446+
enum { NoCallerSavedRegsMask = 0x100 };
44494447
enum {
4450-
RegParmMask = 0x700,
4451-
RegParmOffset = 8
4448+
RegParmMask = 0xe00,
4449+
RegParmOffset = 9
44524450
};
4453-
enum { NoCfCheckMask = 0x800 };
4454-
enum { CmseNSCallMask = 0x1000 };
4455-
enum { Log2RISCVABIVLenMask = 0x3E000, Log2RISCVABIVLenOffset = 13 };
4456-
uint32_t Bits = CC_C;
4451+
enum { NoCfCheckMask = 0x1000 };
4452+
enum { CmseNSCallMask = 0x2000 };
4453+
uint16_t Bits = CC_C;
44574454

4458-
ExtInfo(unsigned Bits) : Bits(static_cast<uint32_t>(Bits)) {}
4455+
ExtInfo(unsigned Bits) : Bits(static_cast<uint16_t>(Bits)) {}
44594456

44604457
public:
44614458
// Constructor with no defaults. Use this when you know that you
44624459
// have all the elements (when reading an AST file for example).
44634460
ExtInfo(bool noReturn, bool hasRegParm, unsigned regParm, CallingConv cc,
44644461
bool producesResult, bool noCallerSavedRegs, bool NoCfCheck,
4465-
bool cmseNSCall, unsigned Log2RISCVABIVLen) {
4462+
bool cmseNSCall) {
44664463
assert((!hasRegParm || regParm < 7) && "Invalid regparm value");
44674464
Bits = ((unsigned)cc) | (noReturn ? NoReturnMask : 0) |
44684465
(producesResult ? ProducesResultMask : 0) |
44694466
(noCallerSavedRegs ? NoCallerSavedRegsMask : 0) |
44704467
(hasRegParm ? ((regParm + 1) << RegParmOffset) : 0) |
44714468
(NoCfCheck ? NoCfCheckMask : 0) |
4472-
(cmseNSCall ? CmseNSCallMask : 0) |
4473-
(Log2RISCVABIVLen << Log2RISCVABIVLenOffset);
4469+
(cmseNSCall ? CmseNSCallMask : 0);
44744470
}
44754471

44764472
// Constructor with all defaults. Use when for example creating a
@@ -4497,10 +4493,6 @@ class FunctionType : public Type {
44974493

44984494
CallingConv getCC() const { return CallingConv(Bits & CallConvMask); }
44994495

4500-
unsigned getLog2RISCVABIVLen() const {
4501-
return (Bits & Log2RISCVABIVLenMask) >> Log2RISCVABIVLenOffset;
4502-
}
4503-
45044496
bool operator==(ExtInfo Other) const {
45054497
return Bits == Other.Bits;
45064498
}
@@ -4556,11 +4548,6 @@ class FunctionType : public Type {
45564548
return ExtInfo((Bits & ~CallConvMask) | (unsigned) cc);
45574549
}
45584550

4559-
ExtInfo withLog2RISCVABIVLen(unsigned Log2RISCVABIVLen) const {
4560-
return ExtInfo((Bits & ~Log2RISCVABIVLenMask) |
4561-
(Log2RISCVABIVLen << Log2RISCVABIVLenOffset));
4562-
}
4563-
45644551
void Profile(llvm::FoldingSetNodeID &ID) const {
45654552
ID.AddInteger(Bits);
45664553
}
@@ -4670,9 +4657,6 @@ class FunctionType : public Type {
46704657

46714658
bool getCmseNSCallAttr() const { return getExtInfo().getCmseNSCall(); }
46724659
CallingConv getCallConv() const { return getExtInfo().getCC(); }
4673-
unsigned getLog2RISCVABIVLen() const {
4674-
return getExtInfo().getLog2RISCVABIVLen();
4675-
}
46764660
ExtInfo getExtInfo() const { return ExtInfo(FunctionTypeBits.ExtInfo); }
46774661

46784662
static_assert((~Qualifiers::FastMask & Qualifiers::CVRMask) == 0,

clang/include/clang/AST/TypeProperties.td

+2-5
Original file line numberDiff line numberDiff line change
@@ -313,17 +313,14 @@ let Class = FunctionType in {
313313
def : Property<"cmseNSCall", Bool> {
314314
let Read = [{ node->getExtInfo().getCmseNSCall() }];
315315
}
316-
def : Property<"Log2RISCVABIVLen", UInt32> {
317-
let Read = [{ node->getExtInfo().getLog2RISCVABIVLen() }];
318-
}
319316
}
320317

321318
let Class = FunctionNoProtoType in {
322319
def : Creator<[{
323320
auto extInfo = FunctionType::ExtInfo(noReturn, hasRegParm, regParm,
324321
callingConvention, producesResult,
325322
noCallerSavedRegs, noCfCheck,
326-
cmseNSCall, Log2RISCVABIVLen);
323+
cmseNSCall);
327324
return ctx.getFunctionNoProtoType(returnType, extInfo);
328325
}]>;
329326
}
@@ -366,7 +363,7 @@ let Class = FunctionProtoType in {
366363
auto extInfo = FunctionType::ExtInfo(noReturn, hasRegParm, regParm,
367364
callingConvention, producesResult,
368365
noCallerSavedRegs, noCfCheck,
369-
cmseNSCall, Log2RISCVABIVLen);
366+
cmseNSCall);
370367
FunctionProtoType::ExtProtoInfo epi;
371368
epi.ExtInfo = extInfo;
372369
epi.Variadic = variadic;

clang/include/clang/Basic/Specifiers.h

+37-25
Original file line numberDiff line numberDiff line change
@@ -276,31 +276,43 @@ namespace clang {
276276

277277
/// CallingConv - Specifies the calling convention that a function uses.
278278
enum CallingConv {
279-
CC_C, // __attribute__((cdecl))
280-
CC_X86StdCall, // __attribute__((stdcall))
281-
CC_X86FastCall, // __attribute__((fastcall))
282-
CC_X86ThisCall, // __attribute__((thiscall))
283-
CC_X86VectorCall, // __attribute__((vectorcall))
284-
CC_X86Pascal, // __attribute__((pascal))
285-
CC_Win64, // __attribute__((ms_abi))
286-
CC_X86_64SysV, // __attribute__((sysv_abi))
287-
CC_X86RegCall, // __attribute__((regcall))
288-
CC_AAPCS, // __attribute__((pcs("aapcs")))
289-
CC_AAPCS_VFP, // __attribute__((pcs("aapcs-vfp")))
290-
CC_IntelOclBicc, // __attribute__((intel_ocl_bicc))
291-
CC_SpirFunction, // default for OpenCL functions on SPIR target
292-
CC_OpenCLKernel, // inferred for OpenCL kernels
293-
CC_Swift, // __attribute__((swiftcall))
294-
CC_SwiftAsync, // __attribute__((swiftasynccall))
295-
CC_PreserveMost, // __attribute__((preserve_most))
296-
CC_PreserveAll, // __attribute__((preserve_all))
297-
CC_AArch64VectorCall, // __attribute__((aarch64_vector_pcs))
298-
CC_AArch64SVEPCS, // __attribute__((aarch64_sve_pcs))
299-
CC_AMDGPUKernelCall, // __attribute__((amdgpu_kernel))
300-
CC_M68kRTD, // __attribute__((m68k_rtd))
301-
CC_PreserveNone, // __attribute__((preserve_none))
302-
CC_RISCVVectorCall, // __attribute__((riscv_vector_cc))
303-
CC_RISCVVLSCall, // __attribute__((riscv_vls_cc))
279+
CC_C, // __attribute__((cdecl))
280+
CC_X86StdCall, // __attribute__((stdcall))
281+
CC_X86FastCall, // __attribute__((fastcall))
282+
CC_X86ThisCall, // __attribute__((thiscall))
283+
CC_X86VectorCall, // __attribute__((vectorcall))
284+
CC_X86Pascal, // __attribute__((pascal))
285+
CC_Win64, // __attribute__((ms_abi))
286+
CC_X86_64SysV, // __attribute__((sysv_abi))
287+
CC_X86RegCall, // __attribute__((regcall))
288+
CC_AAPCS, // __attribute__((pcs("aapcs")))
289+
CC_AAPCS_VFP, // __attribute__((pcs("aapcs-vfp")))
290+
CC_IntelOclBicc, // __attribute__((intel_ocl_bicc))
291+
CC_SpirFunction, // default for OpenCL functions on SPIR target
292+
CC_OpenCLKernel, // inferred for OpenCL kernels
293+
CC_Swift, // __attribute__((swiftcall))
294+
CC_SwiftAsync, // __attribute__((swiftasynccall))
295+
CC_PreserveMost, // __attribute__((preserve_most))
296+
CC_PreserveAll, // __attribute__((preserve_all))
297+
CC_AArch64VectorCall, // __attribute__((aarch64_vector_pcs))
298+
CC_AArch64SVEPCS, // __attribute__((aarch64_sve_pcs))
299+
CC_AMDGPUKernelCall, // __attribute__((amdgpu_kernel))
300+
CC_M68kRTD, // __attribute__((m68k_rtd))
301+
CC_PreserveNone, // __attribute__((preserve_none))
302+
CC_RISCVVectorCall, // __attribute__((riscv_vector_cc))
303+
CC_RISCVVLSCall_32, // __attribute__((riscv_vls_cc(32)))
304+
CC_RISCVVLSCall_64, // __attribute__((riscv_vls_cc(64)))
305+
CC_RISCVVLSCall_128, // __attribute__((riscv_vls_cc)) or
306+
// __attribute__((riscv_vls_cc(128)))
307+
CC_RISCVVLSCall_256, // __attribute__((riscv_vls_cc(256)))
308+
CC_RISCVVLSCall_512, // __attribute__((riscv_vls_cc(512)))
309+
CC_RISCVVLSCall_1024, // __attribute__((riscv_vls_cc(1024)))
310+
CC_RISCVVLSCall_2048, // __attribute__((riscv_vls_cc(2048)))
311+
CC_RISCVVLSCall_4096, // __attribute__((riscv_vls_cc(4096)))
312+
CC_RISCVVLSCall_8192, // __attribute__((riscv_vls_cc(8192)))
313+
CC_RISCVVLSCall_16384, // __attribute__((riscv_vls_cc(16384)))
314+
CC_RISCVVLSCall_32768, // __attribute__((riscv_vls_cc(32768)))
315+
CC_RISCVVLSCall_65536, // __attribute__((riscv_vls_cc(65536)))
304316
};
305317

306318
/// Checks whether the given calling convention supports variadic

clang/include/clang/CodeGen/CGFunctionInfo.h

+1-8
Original file line numberDiff line numberDiff line change
@@ -625,9 +625,6 @@ class CGFunctionInfo final
625625
/// Log 2 of the maximum vector width.
626626
unsigned MaxVectorWidth : 4;
627627

628-
/// Log2 of ABI_VLEN used in RISCV VLS calling convention.
629-
unsigned Log2RISCVABIVLen : 5;
630-
631628
RequiredArgs Required;
632629

633630
/// The struct representing all arguments passed in memory. Only used when
@@ -738,13 +735,11 @@ class CGFunctionInfo final
738735
bool getHasRegParm() const { return HasRegParm; }
739736
unsigned getRegParm() const { return RegParm; }
740737

741-
unsigned getLog2RISCVABIVLen() const { return Log2RISCVABIVLen; }
742-
743738
FunctionType::ExtInfo getExtInfo() const {
744739
return FunctionType::ExtInfo(isNoReturn(), getHasRegParm(), getRegParm(),
745740
getASTCallingConvention(), isReturnsRetained(),
746741
isNoCallerSavedRegs(), isNoCfCheck(),
747-
isCmseNSCall(), getLog2RISCVABIVLen());
742+
isCmseNSCall());
748743
}
749744

750745
CanQualType getReturnType() const { return getArgsBuffer()[0].type; }
@@ -798,7 +793,6 @@ class CGFunctionInfo final
798793
ID.AddInteger(RegParm);
799794
ID.AddBoolean(NoCfCheck);
800795
ID.AddBoolean(CmseNSCall);
801-
ID.AddInteger(Log2RISCVABIVLen);
802796
ID.AddInteger(Required.getOpaqueData());
803797
ID.AddBoolean(HasExtParameterInfos);
804798
if (HasExtParameterInfos) {
@@ -826,7 +820,6 @@ class CGFunctionInfo final
826820
ID.AddInteger(info.getRegParm());
827821
ID.AddBoolean(info.getNoCfCheck());
828822
ID.AddBoolean(info.getCmseNSCall());
829-
ID.AddInteger(info.getLog2RISCVABIVLen());
830823
ID.AddInteger(required.getOpaqueData());
831824
ID.AddBoolean(!paramInfos.empty());
832825
if (!paramInfos.empty()) {

clang/lib/AST/ASTContext.cpp

-2
Original file line numberDiff line numberDiff line change
@@ -11108,8 +11108,6 @@ QualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs,
1110811108
return {};
1110911109
if (lbaseInfo.getNoCfCheck() != rbaseInfo.getNoCfCheck())
1111011110
return {};
11111-
if (lbaseInfo.getLog2RISCVABIVLen() != rbaseInfo.getLog2RISCVABIVLen())
11112-
return {};
1111311111

1111411112
// When merging declarations, it's common for supplemental information like
1111511113
// attributes to only be present in one of the declarations, and we generally

clang/lib/AST/ItaniumMangle.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -3489,7 +3489,20 @@ StringRef CXXNameMangler::getCallingConvQualifierName(CallingConv CC) {
34893489
case CC_M68kRTD:
34903490
case CC_PreserveNone:
34913491
case CC_RISCVVectorCall:
3492-
case CC_RISCVVLSCall:
3492+
#define CC_VLS_CASE(ABI_VLEN) case CC_RISCVVLSCall_##ABI_VLEN:
3493+
CC_VLS_CASE(32)
3494+
CC_VLS_CASE(64)
3495+
CC_VLS_CASE(128)
3496+
CC_VLS_CASE(256)
3497+
CC_VLS_CASE(512)
3498+
CC_VLS_CASE(1024)
3499+
CC_VLS_CASE(2048)
3500+
CC_VLS_CASE(4096)
3501+
CC_VLS_CASE(8192)
3502+
CC_VLS_CASE(16384)
3503+
CC_VLS_CASE(32768)
3504+
CC_VLS_CASE(65536)
3505+
#undef CC_VLS_CASE
34933506
// FIXME: we should be mangling all of the above.
34943507
return "";
34953508

clang/lib/AST/Type.cpp

+15-1
Original file line numberDiff line numberDiff line change
@@ -3561,7 +3561,21 @@ StringRef FunctionType::getNameForCallConv(CallingConv CC) {
35613561
case CC_PreserveNone: return "preserve_none";
35623562
// clang-format off
35633563
case CC_RISCVVectorCall: return "riscv_vector_cc";
3564-
case CC_RISCVVLSCall: return "riscv_vls_cc";
3564+
#define CC_VLS_CASE(ABI_VLEN) \
3565+
case CC_RISCVVLSCall_##ABI_VLEN: return "riscv_vls_cc(" #ABI_VLEN ")";
3566+
CC_VLS_CASE(32)
3567+
CC_VLS_CASE(64)
3568+
CC_VLS_CASE(128)
3569+
CC_VLS_CASE(256)
3570+
CC_VLS_CASE(512)
3571+
CC_VLS_CASE(1024)
3572+
CC_VLS_CASE(2048)
3573+
CC_VLS_CASE(4096)
3574+
CC_VLS_CASE(8192)
3575+
CC_VLS_CASE(16384)
3576+
CC_VLS_CASE(32768)
3577+
CC_VLS_CASE(65536)
3578+
#undef CC_VLS_CASE
35653579
// clang-format on
35663580
}
35673581

clang/lib/AST/TypePrinter.cpp

+17-3
Original file line numberDiff line numberDiff line change
@@ -1136,9 +1136,23 @@ void TypePrinter::printFunctionAfter(const FunctionType::ExtInfo &Info,
11361136
case CC_RISCVVectorCall:
11371137
OS << "__attribute__((riscv_vector_cc))";
11381138
break;
1139-
case CC_RISCVVLSCall:
1140-
OS << "__attribute__((riscv_vls_cc))";
1141-
break;
1139+
#define CC_VLS_CASE(ABI_VLEN) \
1140+
case CC_RISCVVLSCall_##ABI_VLEN: \
1141+
OS << "__attribute__((riscv_vls_cc" #ABI_VLEN "))"; \
1142+
break;
1143+
CC_VLS_CASE(32)
1144+
CC_VLS_CASE(64)
1145+
CC_VLS_CASE(128)
1146+
CC_VLS_CASE(256)
1147+
CC_VLS_CASE(512)
1148+
CC_VLS_CASE(1024)
1149+
CC_VLS_CASE(2048)
1150+
CC_VLS_CASE(4096)
1151+
CC_VLS_CASE(8192)
1152+
CC_VLS_CASE(16384)
1153+
CC_VLS_CASE(32768)
1154+
CC_VLS_CASE(65536)
1155+
#undef CC_VLS_CASE
11421156
}
11431157
}
11441158

clang/lib/Basic/Targets/RISCV.cpp

+12-1
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,18 @@ RISCVTargetInfo::checkCallingConvention(CallingConv CC) const {
516516
return CCCR_Warning;
517517
case CC_C:
518518
case CC_RISCVVectorCall:
519-
case CC_RISCVVLSCall:
519+
case CC_RISCVVLSCall_32:
520+
case CC_RISCVVLSCall_64:
521+
case CC_RISCVVLSCall_128:
522+
case CC_RISCVVLSCall_256:
523+
case CC_RISCVVLSCall_512:
524+
case CC_RISCVVLSCall_1024:
525+
case CC_RISCVVLSCall_2048:
526+
case CC_RISCVVLSCall_4096:
527+
case CC_RISCVVLSCall_8192:
528+
case CC_RISCVVLSCall_16384:
529+
case CC_RISCVVLSCall_32768:
530+
case CC_RISCVVLSCall_65536:
520531
return CCCR_OK;
521532
}
522533
}

0 commit comments

Comments
 (0)