Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.
/ swift-llvm Public archive

Commit a6b7c20

Browse files
committed
Add 'swiftisa' argument attribute
1 parent 266994f commit a6b7c20

27 files changed

+74
-9
lines changed

include/llvm/Bitcode/LLVMBitCodes.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,8 @@ enum AttributeKindCodes {
558558
ATTR_KIND_INACCESSIBLEMEM_OR_ARGMEMONLY = 50,
559559
ATTR_KIND_ALLOC_SIZE = 51,
560560
ATTR_KIND_WRITEONLY = 52,
561-
ATTR_KIND_SPECULATABLE = 53
561+
ATTR_KIND_SPECULATABLE = 53,
562+
ATTR_KIND_SWIFT_ISA = 54,
562563
};
563564

564565
enum ComdatSelectionKindCodes {

include/llvm/IR/Argument.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ class Argument final : public Value {
6969
/// Return true if this argument has the swiftself attribute.
7070
bool hasSwiftSelfAttr() const;
7171

72+
/// Return true if this argument has the swiftisa attribute.
73+
bool hasSwiftIsaAttr() const;
74+
7275
/// Return true if this argument has the swifterror attribute.
7376
bool hasSwiftErrorAttr() const;
7477

include/llvm/IR/Attributes.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,9 @@ def SwiftError : EnumAttr<"swifterror">;
167167
/// Argument is swift self/context.
168168
def SwiftSelf : EnumAttr<"swiftself">;
169169

170+
/// Argument is swift isa pointer.
171+
def SwiftIsa : EnumAttr<"swiftisa">;
172+
170173
/// Function must be in a unwind table.
171174
def UWTable : EnumAttr<"uwtable">;
172175

include/llvm/Target/TargetCallingConv.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ namespace ISD {
3838
unsigned IsSplitEnd : 1; ///< Last part of a split
3939
unsigned IsSwiftSelf : 1; ///< Swift self parameter
4040
unsigned IsSwiftError : 1; ///< Swift error parameter
41+
unsigned IsSwiftIsa : 1; ///< Swift isa parameter
4142
unsigned IsHva : 1; ///< HVA field for
4243
unsigned IsHvaStart : 1; ///< HVA structure start
4344
unsigned IsSecArgPass : 1; ///< Second argument
@@ -53,7 +54,7 @@ namespace ISD {
5354
ArgFlagsTy()
5455
: IsZExt(0), IsSExt(0), IsInReg(0), IsSRet(0), IsByVal(0), IsNest(0),
5556
IsReturned(0), IsSplit(0), IsInAlloca(0), IsSplitEnd(0),
56-
IsSwiftSelf(0), IsSwiftError(0), IsHva(0), IsHvaStart(0),
57+
IsSwiftSelf(0), IsSwiftError(0), IsSwiftIsa(0), IsHva(0), IsHvaStart(0),
5758
IsSecArgPass(0), ByValAlign(0), OrigAlign(0),
5859
IsInConsecutiveRegsLast(0), IsInConsecutiveRegs(0),
5960
IsCopyElisionCandidate(0), ByValSize(0) {
@@ -84,6 +85,9 @@ namespace ISD {
8485
bool isSwiftError() const { return IsSwiftError; }
8586
void setSwiftError() { IsSwiftError = 1; }
8687

88+
bool isSwiftIsa() const { return IsSwiftIsa; }
89+
void setSwiftIsa() { IsSwiftIsa = 1; }
90+
8791
bool isHva() const { return IsHva; }
8892
void setHva() { IsHva = 1; }
8993

include/llvm/Target/TargetCallingConv.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ class CCIfByVal<CCAction A> : CCIf<"ArgFlags.isByVal()", A> {
4747
class CCIfSwiftSelf<CCAction A> : CCIf<"ArgFlags.isSwiftSelf()", A> {
4848
}
4949

50+
/// CCIfSwiftIsa - If the current argument has swiftisa parameter attribute,
51+
/// apply Action A.
52+
class CCIfSwiftIsa<CCAction A> : CCIf<"ArgFlags.isSwiftIsa()", A> {
53+
}
54+
5055
/// CCIfSwiftError - If the current argument has swifterror parameter attribute,
5156
/// apply Action A.
5257
class CCIfSwiftError<CCAction A> : CCIf<"ArgFlags.isSwiftError()", A> {

include/llvm/Target/TargetLowering.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,13 @@ class TargetLoweringBase {
186186
bool IsReturned : 1;
187187
bool IsSwiftSelf : 1;
188188
bool IsSwiftError : 1;
189+
bool IsSwiftIsa : 1;
189190
uint16_t Alignment = 0;
190191

191192
ArgListEntry()
192193
: IsSExt(false), IsZExt(false), IsInReg(false), IsSRet(false),
193194
IsNest(false), IsByVal(false), IsInAlloca(false), IsReturned(false),
194-
IsSwiftSelf(false), IsSwiftError(false) {}
195+
IsSwiftSelf(false), IsSwiftError(false), IsSwiftIsa(false) {}
195196

196197
void setAttributes(ImmutableCallSite *CS, unsigned ArgIdx);
197198
};

lib/AsmParser/LLLexer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,7 @@ lltok::Kind LLLexer::LexIdentifier() {
660660
KEYWORD(sanitize_memory);
661661
KEYWORD(swifterror);
662662
KEYWORD(swiftself);
663+
KEYWORD(swiftisa);
663664
KEYWORD(uwtable);
664665
KEYWORD(writeonly);
665666
KEYWORD(zeroext);

lib/AsmParser/LLParser.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,6 +1152,7 @@ bool LLParser::ParseFnAttributeValuePairs(AttrBuilder &B,
11521152
case lltok::kw_sret:
11531153
case lltok::kw_swifterror:
11541154
case lltok::kw_swiftself:
1155+
case lltok::kw_swiftisa:
11551156
HaveError |=
11561157
Error(Lex.getLoc(),
11571158
"invalid use of parameter-only attribute on a function");
@@ -1425,6 +1426,7 @@ bool LLParser::ParseOptionalParamAttrs(AttrBuilder &B) {
14251426
case lltok::kw_sret: B.addAttribute(Attribute::StructRet); break;
14261427
case lltok::kw_swifterror: B.addAttribute(Attribute::SwiftError); break;
14271428
case lltok::kw_swiftself: B.addAttribute(Attribute::SwiftSelf); break;
1429+
case lltok::kw_swiftisa: B.addAttribute(Attribute::SwiftIsa); break;
14281430
case lltok::kw_writeonly: B.addAttribute(Attribute::WriteOnly); break;
14291431
case lltok::kw_zeroext: B.addAttribute(Attribute::ZExt); break;
14301432

@@ -1515,6 +1517,7 @@ bool LLParser::ParseOptionalReturnAttrs(AttrBuilder &B) {
15151517
case lltok::kw_sret:
15161518
case lltok::kw_swifterror:
15171519
case lltok::kw_swiftself:
1520+
case lltok::kw_swiftisa:
15181521
HaveError |= Error(Lex.getLoc(), "invalid use of parameter-only attribute");
15191522
break;
15201523

lib/AsmParser/LLToken.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ enum Kind {
209209
kw_sanitize_memory,
210210
kw_swifterror,
211211
kw_swiftself,
212+
kw_swiftisa,
212213
kw_uwtable,
213214
kw_writeonly,
214215
kw_zeroext,

lib/Bitcode/Reader/BitcodeReader.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,7 @@ static uint64_t getRawAttributeMask(Attribute::AttrKind Val) {
11281128
case Attribute::SwiftError: return 1ULL << 52;
11291129
case Attribute::WriteOnly: return 1ULL << 53;
11301130
case Attribute::Speculatable: return 1ULL << 54;
1131+
case Attribute::SwiftIsa: return 1ULL << 55;
11311132
case Attribute::Dereferenceable:
11321133
llvm_unreachable("dereferenceable attribute not supported in raw format");
11331134
break;
@@ -1348,6 +1349,8 @@ static Attribute::AttrKind getAttrFromCode(uint64_t Code) {
13481349
return Attribute::SwiftError;
13491350
case bitc::ATTR_KIND_SWIFT_SELF:
13501351
return Attribute::SwiftSelf;
1352+
case bitc::ATTR_KIND_SWIFT_ISA:
1353+
return Attribute::SwiftIsa;
13511354
case bitc::ATTR_KIND_UW_TABLE:
13521355
return Attribute::UWTable;
13531356
case bitc::ATTR_KIND_WRITEONLY:

lib/Bitcode/Writer/BitcodeWriter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,8 @@ static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind) {
607607
return bitc::ATTR_KIND_SWIFT_ERROR;
608608
case Attribute::SwiftSelf:
609609
return bitc::ATTR_KIND_SWIFT_SELF;
610+
case Attribute::SwiftIsa:
611+
return bitc::ATTR_KIND_SWIFT_ISA;
610612
case Attribute::UWTable:
611613
return bitc::ATTR_KIND_UW_TABLE;
612614
case Attribute::WriteOnly:

lib/CodeGen/GlobalISel/CallLowering.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ void CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx,
7272
Arg.Flags.setSwiftSelf();
7373
if (Attrs.hasAttribute(OpIdx, Attribute::SwiftError))
7474
Arg.Flags.setSwiftError();
75+
if (Attrs.hasAttribute(OpIdx, Attribute::SwiftIsa))
76+
Arg.Flags.setSwiftIsa();
7577
if (Attrs.hasAttribute(OpIdx, Attribute::ByVal))
7678
Arg.Flags.setByVal();
7779
if (Attrs.hasAttribute(OpIdx, Attribute::InAlloca))

lib/CodeGen/SelectionDAG/FastISel.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -992,6 +992,8 @@ bool FastISel::lowerCallTo(CallLoweringInfo &CLI) {
992992
Flags.setSwiftSelf();
993993
if (Arg.IsSwiftError)
994994
Flags.setSwiftError();
995+
if (Arg.IsSwiftIsa)
996+
Flags.setSwiftIsa();
995997
if (Arg.IsByVal)
996998
Flags.setByVal();
997999
if (Arg.IsInAlloca) {

lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8021,6 +8021,7 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
80218021
Entry.IsReturned = false;
80228022
Entry.IsSwiftSelf = false;
80238023
Entry.IsSwiftError = false;
8024+
Entry.IsSwiftIsa = false;
80248025
Entry.Alignment = Align;
80258026
CLI.getArgs().insert(CLI.getArgs().begin(), Entry);
80268027
CLI.RetTy = Type::getVoidTy(CLI.RetTy->getContext());
@@ -8113,6 +8114,8 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
81138114
Flags.setSwiftSelf();
81148115
if (Args[i].IsSwiftError)
81158116
Flags.setSwiftError();
8117+
if (Args[i].IsSwiftIsa)
8118+
Flags.setSwiftIsa();
81168119
if (Args[i].IsByVal)
81178120
Flags.setByVal();
81188121
if (Args[i].IsInAlloca) {
@@ -8595,6 +8598,8 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
85958598
Flags.setSwiftSelf();
85968599
if (Arg.hasAttribute(Attribute::SwiftError))
85978600
Flags.setSwiftError();
8601+
if (Arg.hasAttribute(Attribute::SwiftIsa))
8602+
Flags.setSwiftIsa();
85988603
if (Arg.hasAttribute(Attribute::ByVal))
85998604
Flags.setByVal();
86008605
if (Arg.hasAttribute(Attribute::InAlloca)) {

lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ void TargetLoweringBase::ArgListEntry::setAttributes(ImmutableCallSite *CS,
110110
IsReturned = CS->paramHasAttr(ArgIdx, Attribute::Returned);
111111
IsSwiftSelf = CS->paramHasAttr(ArgIdx, Attribute::SwiftSelf);
112112
IsSwiftError = CS->paramHasAttr(ArgIdx, Attribute::SwiftError);
113+
IsSwiftIsa = CS->paramHasAttr(ArgIdx, Attribute::SwiftIsa);
113114
Alignment = CS->getParamAlignment(ArgIdx);
114115
}
115116

lib/IR/Attributes.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,8 @@ std::string Attribute::getAsString(bool InAttrGrp) const {
259259
return "swifterror";
260260
if (hasAttribute(Attribute::SwiftSelf))
261261
return "swiftself";
262+
if (hasAttribute(Attribute::SwiftIsa))
263+
return "swiftisa";
262264
if (hasAttribute(Attribute::InaccessibleMemOnly))
263265
return "inaccessiblememonly";
264266
if (hasAttribute(Attribute::InaccessibleMemOrArgMemOnly))

lib/IR/Verifier.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1529,6 +1529,7 @@ void Verifier::verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs,
15291529
bool SawReturned = false;
15301530
bool SawSRet = false;
15311531
bool SawSwiftSelf = false;
1532+
bool SawSwiftIsa = false;
15321533
bool SawSwiftError = false;
15331534

15341535
// Verify return value attributes.
@@ -1540,10 +1541,11 @@ void Verifier::verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs,
15401541
!RetAttrs.hasAttribute(Attribute::Returned) &&
15411542
!RetAttrs.hasAttribute(Attribute::InAlloca) &&
15421543
!RetAttrs.hasAttribute(Attribute::SwiftSelf) &&
1544+
!RetAttrs.hasAttribute(Attribute::SwiftIsa) &&
15431545
!RetAttrs.hasAttribute(Attribute::SwiftError)),
15441546
"Attributes 'byval', 'inalloca', 'nest', 'sret', 'nocapture', "
1545-
"'returned', 'swiftself', and 'swifterror' do not apply to return "
1546-
"values!",
1547+
"'returned', 'swiftself', 'swiftisa' and 'swifterror' do not "
1548+
"apply to return values!",
15471549
V);
15481550
Assert((!RetAttrs.hasAttribute(Attribute::ReadOnly) &&
15491551
!RetAttrs.hasAttribute(Attribute::WriteOnly) &&
@@ -1586,6 +1588,11 @@ void Verifier::verifyFunctionAttrs(FunctionType *FT, AttributeList Attrs,
15861588
SawSwiftSelf = true;
15871589
}
15881590

1591+
if (ArgAttrs.hasAttribute(Attribute::SwiftIsa)) {
1592+
Assert(!SawSwiftIsa, "Cannot have multiple 'swiftisa' parameters!", V);
1593+
SawSwiftIsa = true;
1594+
}
1595+
15891596
if (ArgAttrs.hasAttribute(Attribute::SwiftError)) {
15901597
Assert(!SawSwiftError, "Cannot have multiple 'swifterror' parameters!",
15911598
V);

lib/Target/AArch64/AArch64FastISel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3177,7 +3177,7 @@ bool AArch64FastISel::fastLowerCall(CallLoweringInfo &CLI) {
31773177

31783178
for (auto Flag : CLI.OutFlags)
31793179
if (Flag.isInReg() || Flag.isSRet() || Flag.isNest() || Flag.isByVal() ||
3180-
Flag.isSwiftSelf() || Flag.isSwiftError())
3180+
Flag.isSwiftSelf() || Flag.isSwiftError() || Flag.isSwiftIsa())
31813181
return false;
31823182

31833183
// Set up the argument vectors.

lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3333,7 +3333,7 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
33333333

33343334
if (VA.isRegLoc()) {
33353335
if (realArgIdx == 0 && Flags.isReturned() && !Flags.isSwiftSelf() &&
3336-
Outs[0].VT == MVT::i64) {
3336+
!Flags.isSwiftIsa() && Outs[0].VT == MVT::i64) {
33373337
assert(VA.getLocVT() == MVT::i64 &&
33383338
"unexpected calling convention register assignment");
33393339
assert(!Ins.empty() && Ins[0].VT == MVT::i64 &&

lib/Target/ARM/ARMCallingConv.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ def CC_ARM_APCS : CallingConv<[
2323

2424
CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
2525

26+
// Pass SwiftIsa in a callee saved register.
27+
CCIfSwiftIsa<CCIfType<[i32], CCAssignToReg<[R11]>>>,
28+
2629
// Pass SwiftSelf in a callee saved register.
2730
CCIfSwiftSelf<CCIfType<[i32], CCAssignToReg<[R10]>>>,
2831

lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1875,7 +1875,7 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
18751875
}
18761876
} else if (VA.isRegLoc()) {
18771877
if (realArgIdx == 0 && Flags.isReturned() && !Flags.isSwiftSelf() &&
1878-
Outs[0].VT == MVT::i32) {
1878+
!Flags.isSwiftIsa() && Outs[0].VT == MVT::i32) {
18791879
assert(VA.getLocVT() == MVT::i32 &&
18801880
"unexpected calling convention register assignment");
18811881
assert(!Ins.empty() && Ins[0].VT == MVT::i32 &&

lib/Target/SystemZ/SystemZISelLowering.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1130,7 +1130,8 @@ static bool canUseSiblingCall(const CCState &ArgCCInfo,
11301130
unsigned Reg = VA.getLocReg();
11311131
if (Reg == SystemZ::R6H || Reg == SystemZ::R6L || Reg == SystemZ::R6D)
11321132
return false;
1133-
if (Outs[I].Flags.isSwiftSelf() || Outs[I].Flags.isSwiftError())
1133+
if (Outs[I].Flags.isSwiftSelf() || Outs[I].Flags.isSwiftError() ||
1134+
Outs[I].Flags.isSwiftIsa())
11341135
return false;
11351136
}
11361137
return true;

lib/Target/X86/X86CallLowering.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ bool X86CallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
267267
Arg.hasAttribute(Attribute::StructRet) ||
268268
Arg.hasAttribute(Attribute::SwiftSelf) ||
269269
Arg.hasAttribute(Attribute::SwiftError) ||
270+
Arg.hasAttribute(Attribute::SwiftIsa) ||
270271
Arg.hasAttribute(Attribute::Nest))
271272
return false;
272273

lib/Target/X86/X86CallingConv.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,9 @@ def CC_X86_64_C : CallingConv<[
494494
CCIfNest<CCIfSubtarget<"isTarget64BitILP32()", CCAssignToReg<[R10D]>>>,
495495
CCIfNest<CCAssignToReg<[R10]>>,
496496

497+
// Pass SwiftIsa in a callee saved register.
498+
CCIfSwiftIsa<CCIfType<[i64], CCAssignToReg<[R14]>>>,
499+
497500
// Pass SwiftSelf in a callee saved register.
498501
CCIfSwiftSelf<CCIfType<[i64], CCAssignToReg<[R13]>>>,
499502

lib/Target/X86/X86FastISel.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3051,6 +3051,7 @@ bool X86FastISel::fastLowerArguments() {
30513051
Arg.hasAttribute(Attribute::StructRet) ||
30523052
Arg.hasAttribute(Attribute::SwiftSelf) ||
30533053
Arg.hasAttribute(Attribute::SwiftError) ||
3054+
Arg.hasAttribute(Attribute::SwiftIsa) ||
30543055
Arg.hasAttribute(Attribute::Nest))
30553056
return false;
30563057

test/Bitcode/attributes.ll

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,12 @@ define i32 @f52(i32, i8** swifterror)
305305
ret i32 0
306306
}
307307

308+
; CHECK: define void @f52a(i8* swiftisa)
309+
define void @f52a(i8* swiftisa)
310+
{
311+
ret void;
312+
}
313+
308314
%swift_error = type {i64, i8}
309315
declare float @foo(%swift_error** swifterror %error_ptr_ref)
310316

test/Verifier/swiftisa.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s
2+
3+
declare void @a(i32* swiftisa %a, i32* swiftisa %b)
4+
; CHECK: Cannot have multiple 'swiftisa' parameters!

0 commit comments

Comments
 (0)