Skip to content

Commit d257da7

Browse files
committed
[IR][AArch64] Add 'swiftcoro' parameter attribute.
It doesn't have any really interesting treatment, other than being passed in a fixed register. In most of our AArch64 calling conventions, that's X23. In effect, this is mostly similar to swiftself. rdar://135984630
1 parent 1bbe5a2 commit d257da7

File tree

21 files changed

+140
-7
lines changed

21 files changed

+140
-7
lines changed

llvm/include/llvm/Bitcode/LLVMBitCodes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,7 @@ enum AttributeKindCodes {
758758
ATTR_KIND_SANITIZE_NUMERICAL_STABILITY = 93,
759759
ATTR_KIND_INITIALIZES = 94,
760760
ATTR_KIND_HYBRID_PATCHABLE = 95,
761+
ATTR_KIND_SWIFT_CORO = 103,
761762
};
762763

763764
enum ComdatSelectionKindCodes {

llvm/include/llvm/CodeGen/TargetCallingConv.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ namespace ISD {
4040
unsigned IsSplitEnd : 1; ///< Last part of a split
4141
unsigned IsSwiftSelf : 1; ///< Swift self parameter
4242
unsigned IsSwiftAsync : 1; ///< Swift async context parameter
43+
unsigned IsSwiftCoro : 1; ///< Swift coro parameter
4344
unsigned IsSwiftError : 1; ///< Swift error parameter
4445
unsigned IsCFGuardTarget : 1; ///< Control Flow Guard target
4546
unsigned IsHva : 1; ///< HVA field for
@@ -63,6 +64,7 @@ namespace ISD {
6364
: IsZExt(0), IsSExt(0), IsInReg(0), IsSRet(0), IsByVal(0), IsByRef(0),
6465
IsNest(0), IsReturned(0), IsSplit(0), IsInAlloca(0),
6566
IsPreallocated(0), IsSplitEnd(0), IsSwiftSelf(0), IsSwiftAsync(0),
67+
IsSwiftCoro(0),
6668
IsSwiftError(0), IsCFGuardTarget(0), IsHva(0), IsHvaStart(0),
6769
IsSecArgPass(0), MemAlign(0), OrigAlign(0),
6870
IsInConsecutiveRegsLast(0), IsInConsecutiveRegs(0),
@@ -100,6 +102,9 @@ namespace ISD {
100102
bool isSwiftAsync() const { return IsSwiftAsync; }
101103
void setSwiftAsync() { IsSwiftAsync = 1; }
102104

105+
bool isSwiftCoro() const { return IsSwiftCoro; }
106+
void setSwiftCoro() { IsSwiftCoro = 1; }
107+
103108
bool isSwiftError() const { return IsSwiftError; }
104109
void setSwiftError() { IsSwiftError = 1; }
105110

llvm/include/llvm/CodeGen/TargetLowering.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ class TargetLoweringBase {
313313
bool IsSwiftSelf : 1;
314314
bool IsSwiftAsync : 1;
315315
bool IsSwiftError : 1;
316+
bool IsSwiftCoro : 1;
316317
bool IsCFGuardTarget : 1;
317318
MaybeAlign Alignment = std::nullopt;
318319
Type *IndirectType = nullptr;
@@ -321,7 +322,8 @@ class TargetLoweringBase {
321322
: IsSExt(false), IsZExt(false), IsInReg(false), IsSRet(false),
322323
IsNest(false), IsByVal(false), IsByRef(false), IsInAlloca(false),
323324
IsPreallocated(false), IsReturned(false), IsSwiftSelf(false),
324-
IsSwiftAsync(false), IsSwiftError(false), IsCFGuardTarget(false) {}
325+
IsSwiftAsync(false), IsSwiftError(false), IsSwiftCoro(false),
326+
IsCFGuardTarget(false) {}
325327

326328
void setAttributes(const CallBase *Call, unsigned ArgIdx);
327329
};

llvm/include/llvm/IR/Attributes.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,9 @@ def SwiftSelf : EnumAttr<"swiftself", [ParamAttr]>;
315315
/// Argument is swift async context.
316316
def SwiftAsync : EnumAttr<"swiftasync", [ParamAttr]>;
317317

318+
/// Argument is swift coro allocator.
319+
def SwiftCoro : EnumAttr<"swiftcoro", [ParamAttr]>;
320+
318321
/// Function must be in a unwind table.
319322
def UWTable : IntAttr<"uwtable", [FnAttr]>;
320323

llvm/include/llvm/Target/TargetCallingConv.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ class CCIfSwiftAsync<CCAction A> : CCIf<"ArgFlags.isSwiftAsync()", A> {
6161
class CCIfSwiftError<CCAction A> : CCIf<"ArgFlags.isSwiftError()", A> {
6262
}
6363

64+
/// CCIfSwiftCoro - If the current argument has swiftcoro parameter attribute,
65+
/// apply Action A.
66+
class CCIfSwiftCoro<CCAction A> : CCIf<"ArgFlags.isSwiftCoro()", A> {
67+
}
68+
6469
/// CCIfCFGuardTarget - If the current argument has cfguardtarget parameter
6570
/// attribute, apply Action A.
6671
class CCIfCFGuardTarget<CCAction A> : CCIf<"ArgFlags.isCFGuardTarget()", A> {

llvm/lib/Bitcode/Reader/BitcodeReader.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2149,6 +2149,8 @@ static Attribute::AttrKind getAttrFromCode(uint64_t Code) {
21492149
return Attribute::SwiftSelf;
21502150
case bitc::ATTR_KIND_SWIFT_ASYNC:
21512151
return Attribute::SwiftAsync;
2152+
case bitc::ATTR_KIND_SWIFT_CORO:
2153+
return Attribute::SwiftCoro;
21522154
case bitc::ATTR_KIND_UW_TABLE:
21532155
return Attribute::UWTable;
21542156
case bitc::ATTR_KIND_VSCALE_RANGE:

llvm/lib/Bitcode/Writer/BitcodeWriter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,8 @@ static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind) {
852852
return bitc::ATTR_KIND_SWIFT_SELF;
853853
case Attribute::SwiftAsync:
854854
return bitc::ATTR_KIND_SWIFT_ASYNC;
855+
case Attribute::SwiftCoro:
856+
return bitc::ATTR_KIND_SWIFT_CORO;
855857
case Attribute::UWTable:
856858
return bitc::ATTR_KIND_UW_TABLE;
857859
case Attribute::VScaleRange:

llvm/lib/CodeGen/GlobalISel/CallLowering.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ addFlagsUsingAttrFn(ISD::ArgFlagsTy &Flags,
6363
Flags.setSwiftAsync();
6464
if (AttrFn(Attribute::SwiftError))
6565
Flags.setSwiftError();
66+
if (AttrFn(Attribute::SwiftCoro))
67+
Flags.setSwiftCoro();
6668
}
6769

6870
ISD::ArgFlagsTy CallLowering::getAttributesForArgIdx(const CallBase &Call,

llvm/lib/CodeGen/SelectionDAG/FastISel.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,6 +1053,8 @@ bool FastISel::lowerCallTo(CallLoweringInfo &CLI) {
10531053
Flags.setSwiftAsync();
10541054
if (Arg.IsSwiftError)
10551055
Flags.setSwiftError();
1056+
if (Arg.IsSwiftCoro)
1057+
Flags.setSwiftCoro();
10561058
if (Arg.IsCFGuardTarget)
10571059
Flags.setCFGuardTarget();
10581060
if (Arg.IsByVal)

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10860,6 +10860,7 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
1086010860
Entry.IsSwiftSelf = false;
1086110861
Entry.IsSwiftAsync = false;
1086210862
Entry.IsSwiftError = false;
10863+
Entry.IsSwiftCoro = false;
1086310864
Entry.IsCFGuardTarget = false;
1086410865
Entry.Alignment = Alignment;
1086510866
CLI.getArgs().insert(CLI.getArgs().begin(), Entry);
@@ -10977,6 +10978,8 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
1097710978
Flags.setSwiftAsync();
1097810979
if (Args[i].IsSwiftError)
1097910980
Flags.setSwiftError();
10981+
if (Args[i].IsSwiftCoro)
10982+
Flags.setSwiftCoro();
1098010983
if (Args[i].IsCFGuardTarget)
1098110984
Flags.setCFGuardTarget();
1098210985
if (Args[i].IsByVal)
@@ -11522,6 +11525,8 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
1152211525
Flags.setSwiftAsync();
1152311526
if (Arg.hasAttribute(Attribute::SwiftError))
1152411527
Flags.setSwiftError();
11528+
if (Arg.hasAttribute(Attribute::SwiftCoro))
11529+
Flags.setSwiftCoro();
1152511530
if (Arg.hasAttribute(Attribute::ByVal))
1152611531
Flags.setByVal();
1152711532
if (Arg.hasAttribute(Attribute::ByRef))

0 commit comments

Comments
 (0)